diff -Nrcpad gcc-17-20260517/LAST_UPDATED gcc-17-20260524/LAST_UPDATED
*** gcc-17-20260517/LAST_UPDATED	Sun May 17 22:32:19 2026
--- gcc-17-20260524/LAST_UPDATED	Sun May 24 22:32:19 2026
***************
*** 1 ****
! Obtained from git: master revision 6f3c04e20625dee7c32b1ec43cb0812e38f4394b
--- 1 ----
! Obtained from git: master revision 9742769e0d72a98988bf151d6674ab597be43493
diff -Nrcpad gcc-17-20260517/MD5SUMS gcc-17-20260524/MD5SUMS
*** gcc-17-20260517/MD5SUMS	Sun May 17 22:32:24 2026
--- gcc-17-20260524/MD5SUMS	Sun May 24 22:32:23 2026
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-17-20260517.tar.xz tarball.
  #
  # Besides verifying that all files in the tarball were correctly expanded,
  # it also can be used to determine if any files have changed since the
--- 1,5 ----
  # This file contains the MD5 checksums of the files in the
! # gcc-17-20260524.tar.xz tarball.
  #
  # Besides verifying that all files in the tarball were correctly expanded,
  # it also can be used to determine if any files have changed since the
*************** d32239bcb673463ab874e80d47fae504  COPYIN
*** 28,34 ****
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! a30704a12549be4f1ae5344eda98c5ee  LAST_UPDATED
  61bf72bff3874773b972d926e1ba2360  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  734342371d8ccc2c81cb2d8b3d040f33  Makefile.in
--- 28,34 ----
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 73cbce57c94d55906281d398fe1314d1  LAST_UPDATED
  61bf72bff3874773b972d926e1ba2360  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  734342371d8ccc2c81cb2d8b3d040f33  Makefile.in
*************** f15bc3c5de22eac0bdd4f611502139a0  gcc/AB
*** 531,537 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 3175d93953b64d2640a12f19c3d2891e  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 531,537 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! be5fc70911bd8aa2aef774a64f7be4fd  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 569,575 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 7a18d5e6ca2a5e059bebce6f99af79b5  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
--- 569,575 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 3e51d2121d14076411403b058bff585c  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
*************** c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/RE
*** 581,587 ****
  cbbaecdd6decdf00007bbdb344d2b282  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 0e32b64210280edde67cd4cdcecf63e1  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 581,587 ----
  cbbaecdd6decdf00007bbdb344d2b282  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! b5fd1b030d59a0189a05f8574737a291  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** d85ae3414350bfbea61abc984dace37a  gcc/ad
*** 2589,2595 ****
  e30f86b7d1ebcb37017f9ba6714fdb35  gcc/ada/libgnat/s-regexp.adb
  ca60b6be232a2891d4a65288e7579118  gcc/ada/libgnat/s-regexp.ads
  0f8b86a6f70c29154c574f83aa8a7650  gcc/ada/libgnat/s-regpat.adb
! c0aaca2af3245967793cd9574262cd4a  gcc/ada/libgnat/s-regpat.ads
  1a9c3572e1c7cb8146cdf7ee29c246e7  gcc/ada/libgnat/s-resfil.adb
  0be39b0cc94d8e3840d44a2f4d70f8d3  gcc/ada/libgnat/s-resfil.ads
  e7b92fe5e5c842cb7008602ddadd20cb  gcc/ada/libgnat/s-restri.adb
--- 2589,2595 ----
  e30f86b7d1ebcb37017f9ba6714fdb35  gcc/ada/libgnat/s-regexp.adb
  ca60b6be232a2891d4a65288e7579118  gcc/ada/libgnat/s-regexp.ads
  0f8b86a6f70c29154c574f83aa8a7650  gcc/ada/libgnat/s-regpat.adb
! abd026d640cd5191a53504dee335ee22  gcc/ada/libgnat/s-regpat.ads
  1a9c3572e1c7cb8146cdf7ee29c246e7  gcc/ada/libgnat/s-resfil.adb
  0be39b0cc94d8e3840d44a2f4d70f8d3  gcc/ada/libgnat/s-resfil.ads
  e7b92fe5e5c842cb7008602ddadd20cb  gcc/ada/libgnat/s-restri.adb
*************** d22c314f3748309f812d78f5217dda61  gcc/ad
*** 3072,3085 ****
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! 49d2f9f73880ddb015da1f9dc8ac69d9  gcc/algol68/ChangeLog
  66ab60a51bd61854d9b2898856651b15  gcc/algol68/Make-lang.in
  3d3f2f95b917d0f77d57d977f3eb93d8  gcc/algol68/README
  43ae40e82c1a7a144e905d40b101214e  gcc/algol68/a68-diagnostics.cc
  27119d3e1e8fce1677a27ca87cc9de1e  gcc/algol68/a68-exports.cc
  1728385ce5089a9ad9f2eed20fd65927  gcc/algol68/a68-imports-archive.cc
  561de2b43ba921e2b9573777fade7021  gcc/algol68/a68-imports.cc
! 0904dc65c8116eaecb8d99576391c5dc  gcc/algol68/a68-lang.cc
  6430e67f3d47b364ff04181a73b26fea  gcc/algol68/a68-low-bits.cc
  284cf6c8827f78791575949cc1f634ef  gcc/algol68/a68-low-bools.cc
  421c70a781dc2c00722aa019bc39f683  gcc/algol68/a68-low-builtins.cc
--- 3072,3085 ----
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! e7b2f0201a5e24cbfe4c87cb55287ec3  gcc/algol68/ChangeLog
  66ab60a51bd61854d9b2898856651b15  gcc/algol68/Make-lang.in
  3d3f2f95b917d0f77d57d977f3eb93d8  gcc/algol68/README
  43ae40e82c1a7a144e905d40b101214e  gcc/algol68/a68-diagnostics.cc
  27119d3e1e8fce1677a27ca87cc9de1e  gcc/algol68/a68-exports.cc
  1728385ce5089a9ad9f2eed20fd65927  gcc/algol68/a68-imports-archive.cc
  561de2b43ba921e2b9573777fade7021  gcc/algol68/a68-imports.cc
! 1dac1ca86874d9b7205cbcd76a3a083b  gcc/algol68/a68-lang.cc
  6430e67f3d47b364ff04181a73b26fea  gcc/algol68/a68-low-bits.cc
  284cf6c8827f78791575949cc1f634ef  gcc/algol68/a68-low-bools.cc
  421c70a781dc2c00722aa019bc39f683  gcc/algol68/a68-low-builtins.cc
*************** a4c0eb1b198b6316de80141fb16e341f  gcc/al
*** 3121,3128 ****
  eb200628692c30c1ade0eaeabcddf008  gcc/algol68/a68-parser-moids-coerce.cc
  3789b4b4b2b84341d4e2c050f5f10acf  gcc/algol68/a68-parser-moids-equivalence.cc
  7264507a5832537766582e01e375c299  gcc/algol68/a68-parser-pragmat.cc
! f91e068f5bebeeb403dde2649036a024  gcc/algol68/a68-parser-prelude.cc
! 66c161c03f5c103b8442e38420158113  gcc/algol68/a68-parser-scanner.cc
  3e6a35051de9ec13b96de4c1070096c5  gcc/algol68/a68-parser-scope.cc
  d259fcdbab02c9c536b330f7111ae7cf  gcc/algol68/a68-parser-serial-dsa.cc
  f80e8322004d204fb7ac80c0957025f2  gcc/algol68/a68-parser-taxes.cc
--- 3121,3128 ----
  eb200628692c30c1ade0eaeabcddf008  gcc/algol68/a68-parser-moids-coerce.cc
  3789b4b4b2b84341d4e2c050f5f10acf  gcc/algol68/a68-parser-moids-equivalence.cc
  7264507a5832537766582e01e375c299  gcc/algol68/a68-parser-pragmat.cc
! 3f96a1ffb5f93148ca11e03db6df3d68  gcc/algol68/a68-parser-prelude.cc
! 36817c236130df9135e9652e8a7a9856  gcc/algol68/a68-parser-scanner.cc
  3e6a35051de9ec13b96de4c1070096c5  gcc/algol68/a68-parser-scope.cc
  d259fcdbab02c9c536b330f7111ae7cf  gcc/algol68/a68-parser-serial-dsa.cc
  f80e8322004d204fb7ac80c0957025f2  gcc/algol68/a68-parser-taxes.cc
*************** ca4abac71b91773df74abdea22798551  gcc/al
*** 3140,3146 ****
  b4939444e954db57c114bb14d3b5f57e  gcc/algol68/ga68-coding-guidelines.texi
  9c3d535a7da271c49e76b9709e556383  gcc/algol68/ga68-exports.pk
  f150e2c760036b980e94ec7bb14e1172  gcc/algol68/ga68-internals.texi
! 0eb0fcd0aeea94a1755451b65b8aa2fe  gcc/algol68/ga68.texi
  6e162644e83dbcfbcfbacd36f1e64f3c  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  55e32b4ac4d7a159a683785bd5ee4c7a  gcc/algol68/lang.opt
--- 3140,3146 ----
  b4939444e954db57c114bb14d3b5f57e  gcc/algol68/ga68-coding-guidelines.texi
  9c3d535a7da271c49e76b9709e556383  gcc/algol68/ga68-exports.pk
  f150e2c760036b980e94ec7bb14e1172  gcc/algol68/ga68-internals.texi
! 7de567d9eea7475e738a22ed796cef95  gcc/algol68/ga68.texi
  6e162644e83dbcfbcfbacd36f1e64f3c  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  55e32b4ac4d7a159a683785bd5ee4c7a  gcc/algol68/lang.opt
*************** b7dd8bd2dd68f81643704bf0b73553a1  gcc/al
*** 3150,3156 ****
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  cf0ba254039ee9f743497f42fc9f8630  gcc/alloc-pool.h
! 2b6cb185944f05b9d362546c56ee3c3e  gcc/analyzer/ChangeLog
  b683bd21b51974e986d25ee5f8e77fd5  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
--- 3150,3156 ----
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  cf0ba254039ee9f743497f42fc9f8630  gcc/alloc-pool.h
! 9aeb8b0de12aa0895d573f84d3ba84a6  gcc/analyzer/ChangeLog
  b683bd21b51974e986d25ee5f8e77fd5  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
*************** bedbea78751b139538f4c906011432fe  gcc/an
*** 3165,3171 ****
  380f2a7c04a014441f78569ef397a8a4  gcc/analyzer/analyzer-selftests.cc
  e87a9090a957efa1653cc5a6e36ec346  gcc/analyzer/analyzer-selftests.h
  2239335aee0be8f30a46cf37217cd3d6  gcc/analyzer/analyzer.cc
! 4d2784a790bbb8637d0d7a90fd6d8773  gcc/analyzer/analyzer.opt
  5847f7da212ee502959192dec8edf0e2  gcc/analyzer/analyzer.opt.urls
  4a17f3766ca5b4ec528ac459c519fc61  gcc/analyzer/bar-chart.cc
  745aa2e3472448c5c97fb4908c8d4397  gcc/analyzer/bar-chart.h
--- 3165,3171 ----
  380f2a7c04a014441f78569ef397a8a4  gcc/analyzer/analyzer-selftests.cc
  e87a9090a957efa1653cc5a6e36ec346  gcc/analyzer/analyzer-selftests.h
  2239335aee0be8f30a46cf37217cd3d6  gcc/analyzer/analyzer.cc
! 1708e1bf7b93e19f073cc11833cd2725  gcc/analyzer/analyzer.opt
  5847f7da212ee502959192dec8edf0e2  gcc/analyzer/analyzer.opt.urls
  4a17f3766ca5b4ec528ac459c519fc61  gcc/analyzer/bar-chart.cc
  745aa2e3472448c5c97fb4908c8d4397  gcc/analyzer/bar-chart.h
*************** bc77cd1e5aec40e5623c49cb8974b3d4  gcc/an
*** 3183,3199 ****
  ba0e3f8ef30941728a1363efc633fa00  gcc/analyzer/checker-event.h
  27f8555a4210038eaa81c4f1f66b0d6b  gcc/analyzer/checker-path.cc
  29924be6344174d2253288429074c0f4  gcc/analyzer/checker-path.h
! cf037c6a3b2bcdd06aea3d7a071bf860  gcc/analyzer/common.h
  5ff0274ed0a527fd34bb3ec30c36543f  gcc/analyzer/complexity.cc
  f945a407a1ad45be621e572190f6e11f  gcc/analyzer/complexity.h
  49f1f27a8c444849f43eeb17ebbd14a4  gcc/analyzer/constraint-manager.cc
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  bda4c50e98e4d1baea149a392d2c0bad  gcc/analyzer/diagnostic-manager.cc
  aea57c4b6c3a068535cb535affc9baca  gcc/analyzer/diagnostic-manager.h
! 1b83b87d64a13df93e40df56fb994948  gcc/analyzer/engine.cc
  42e3e00aa33d20f2e141615939577290  gcc/analyzer/engine.h
  f92fa0decedca974c9333bb42a774446  gcc/analyzer/event-loc-info.h
! 6beed0699d115d6cdd16e63dd365279d  gcc/analyzer/exploded-graph.h
  69b742266f7ceef039ee3c2253b1dde9  gcc/analyzer/exploded-path.cc
  e772e96cf6e4982837d0cd1d02d11c7c  gcc/analyzer/exploded-path.h
  6632fec5f435233ff5eb77335287ebd3  gcc/analyzer/feasible-graph.cc
--- 3183,3199 ----
  ba0e3f8ef30941728a1363efc633fa00  gcc/analyzer/checker-event.h
  27f8555a4210038eaa81c4f1f66b0d6b  gcc/analyzer/checker-path.cc
  29924be6344174d2253288429074c0f4  gcc/analyzer/checker-path.h
! b80a4cbfffb740548c8d1606ca22aba9  gcc/analyzer/common.h
  5ff0274ed0a527fd34bb3ec30c36543f  gcc/analyzer/complexity.cc
  f945a407a1ad45be621e572190f6e11f  gcc/analyzer/complexity.h
  49f1f27a8c444849f43eeb17ebbd14a4  gcc/analyzer/constraint-manager.cc
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  bda4c50e98e4d1baea149a392d2c0bad  gcc/analyzer/diagnostic-manager.cc
  aea57c4b6c3a068535cb535affc9baca  gcc/analyzer/diagnostic-manager.h
! 52acee5279af8c440ec483d1469e26c0  gcc/analyzer/engine.cc
  42e3e00aa33d20f2e141615939577290  gcc/analyzer/engine.h
  f92fa0decedca974c9333bb42a774446  gcc/analyzer/event-loc-info.h
! 3325e5ad81c0f036bfc22a430d9509e9  gcc/analyzer/exploded-graph.h
  69b742266f7ceef039ee3c2253b1dde9  gcc/analyzer/exploded-path.cc
  e772e96cf6e4982837d0cd1d02d11c7c  gcc/analyzer/exploded-path.h
  6632fec5f435233ff5eb77335287ebd3  gcc/analyzer/feasible-graph.cc
*************** a8c275843686611dd10e89cc7569f89d  gcc/an
*** 3224,3236 ****
  4df6e8532c302bc59b4e417ab38a741a  gcc/analyzer/record-layout.cc
  f93ef89d263e02c779ec129aeead8a28  gcc/analyzer/record-layout.h
  8998fc6abdaaf4914e8f43f86a20d895  gcc/analyzer/region-model-asm.cc
! 25c61776e161dd2079990904c40ca133  gcc/analyzer/region-model-manager.cc
  40d67196cea5adf495b1ff0a0d26039c  gcc/analyzer/region-model-manager.h
  bd7b3b87348aab71c19df788f0817233  gcc/analyzer/region-model-reachability.cc
  93431d9eca086e4c7811afc3a66197ea  gcc/analyzer/region-model-reachability.h
! d304102d70e01a6527d7985f760c15e5  gcc/analyzer/region-model.cc
  b800670e2c207717abac4f5c5e48e330  gcc/analyzer/region-model.h
! a53604ef1839c1bc4e0b56b7019d5057  gcc/analyzer/region.cc
  4282b6abcc1e39df9d5727003ce6c000  gcc/analyzer/region.h
  869bedacb3fc18e51d302e89fdc9ba7f  gcc/analyzer/setjmp-longjmp.cc
  988372b793dca064b45719144289a046  gcc/analyzer/shift-diagnostics.cc
--- 3224,3236 ----
  4df6e8532c302bc59b4e417ab38a741a  gcc/analyzer/record-layout.cc
  f93ef89d263e02c779ec129aeead8a28  gcc/analyzer/record-layout.h
  8998fc6abdaaf4914e8f43f86a20d895  gcc/analyzer/region-model-asm.cc
! fa5a2dbbece7e674ee0ba490d0777420  gcc/analyzer/region-model-manager.cc
  40d67196cea5adf495b1ff0a0d26039c  gcc/analyzer/region-model-manager.h
  bd7b3b87348aab71c19df788f0817233  gcc/analyzer/region-model-reachability.cc
  93431d9eca086e4c7811afc3a66197ea  gcc/analyzer/region-model-reachability.h
! b7f4277b764c93010586ba3073b695f4  gcc/analyzer/region-model.cc
  b800670e2c207717abac4f5c5e48e330  gcc/analyzer/region-model.h
! 172ce849c7a1bc9435fa24c365b784a3  gcc/analyzer/region.cc
  4282b6abcc1e39df9d5727003ce6c000  gcc/analyzer/region.h
  869bedacb3fc18e51d302e89fdc9ba7f  gcc/analyzer/setjmp-longjmp.cc
  988372b793dca064b45719144289a046  gcc/analyzer/shift-diagnostics.cc
*************** b667de4f07c660c4cd4e91834ea39073  gcc/an
*** 3250,3265 ****
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
  342070c44286a1b8585700c8e7c11036  gcc/analyzer/state-transition.cc
  761c24e1a703c19fd79fca90ffbae541  gcc/analyzer/state-transition.h
! b624ff443fe17cb862daacc1cd2f4513  gcc/analyzer/store.cc
! b7fb344faae1952c995d18cba9b7355f  gcc/analyzer/store.h
  33d9be73a4d262226af82d56d077167b  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
  466a7599dd2372bf97c1a40ec8d04feb  gcc/analyzer/supergraph-simplify.cc
  fa9e08e646a34adeb4f02012756b3d74  gcc/analyzer/supergraph-sorting.cc
  a016ed244edf8129b300a1ef13e7f736  gcc/analyzer/supergraph.cc
  f293986107b306a212dc86f6411f2241  gcc/analyzer/supergraph.h
! 5e19dd93fa87f248c9311ce19f363577  gcc/analyzer/svalue.cc
! ae9175534d716370a7f70a072c0c23fe  gcc/analyzer/svalue.h
  643152b22a5c7ffccb9633bf2c517f1b  gcc/analyzer/symbol.cc
  bb281e65b69be53cd8eab73e448bb9c1  gcc/analyzer/symbol.h
  f9d4a813f2e42ce32c3296184cdf91a8  gcc/analyzer/trimmed-graph.cc
--- 3250,3265 ----
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
  342070c44286a1b8585700c8e7c11036  gcc/analyzer/state-transition.cc
  761c24e1a703c19fd79fca90ffbae541  gcc/analyzer/state-transition.h
! 89c286acd93f6718b8b24cb6a8c54084  gcc/analyzer/store.cc
! 39be33b082de86673a3f56032b2b74a6  gcc/analyzer/store.h
  33d9be73a4d262226af82d56d077167b  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
  466a7599dd2372bf97c1a40ec8d04feb  gcc/analyzer/supergraph-simplify.cc
  fa9e08e646a34adeb4f02012756b3d74  gcc/analyzer/supergraph-sorting.cc
  a016ed244edf8129b300a1ef13e7f736  gcc/analyzer/supergraph.cc
  f293986107b306a212dc86f6411f2241  gcc/analyzer/supergraph.h
! 8c04d96f82b5879ee50cb15ea7675353  gcc/analyzer/svalue.cc
! fbf8b9a9f90917b87f80e4d67aa69bcb  gcc/analyzer/svalue.h
  643152b22a5c7ffccb9633bf2c517f1b  gcc/analyzer/symbol.cc
  bb281e65b69be53cd8eab73e448bb9c1  gcc/analyzer/symbol.h
  f9d4a813f2e42ce32c3296184cdf91a8  gcc/analyzer/trimmed-graph.cc
*************** bd317e24faffad6f2106396f1c3401b1  gcc/au
*** 3281,3287 ****
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
  a4c64459b3b4fb8ef116716a051874f1  gcc/auto-profile.cc
  d290a68be0a787113b46b8c5ec98f710  gcc/auto-profile.h
! 0ec313d8a3741cea7ca7b0151291cbdb  gcc/avoid-store-forwarding.cc
  df8fff5733f0af601cd10d3e2611b94a  gcc/avoid-store-forwarding.h
  8ec9314e9edefe43a037289f48e6602a  gcc/backend.h
  836731448e64bbca8b5b1aa56ca90cdd  gcc/basic-block.h
--- 3281,3287 ----
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
  a4c64459b3b4fb8ef116716a051874f1  gcc/auto-profile.cc
  d290a68be0a787113b46b8c5ec98f710  gcc/auto-profile.h
! 2ceed9a94ac67d13f1ed146a4fb07b7f  gcc/avoid-store-forwarding.cc
  df8fff5733f0af601cd10d3e2611b94a  gcc/avoid-store-forwarding.h
  8ec9314e9edefe43a037289f48e6602a  gcc/backend.h
  836731448e64bbca8b5b1aa56ca90cdd  gcc/basic-block.h
*************** ebb1ceb69d6cf8ac2cdc227ae45f0eca  gcc/bi
*** 3293,3310 ****
  392eecf8142b4edd3c482f461232166f  gcc/btfout.cc
  6da486aac72d8ac53fc6618dea4dcf2e  gcc/builtin-attrs.def
  199995f5aa749f6b6a1170f2307d8e3b  gcc/builtin-types.def
! 224330323c2d3335c4db7660b79dd58d  gcc/builtins.cc
  eca54bea4455692736159661d9bb9ea9  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 3aa2429581698a50fbd141ceb52b2e30  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  aaea141fd41a559841cb76e33800c289  gcc/c-family/c-ada-spec.cc
  f60a13b470e8e51db83383bf9f9f921e  gcc/c-family/c-ada-spec.h
  070946aa1b55a55d613bad8af07ad174  gcc/c-family/c-attribs.cc
  42561a3faabfdfd137738b2311baf58c  gcc/c-family/c-common.cc
  6522339cd83ff225a1ff9e0eab971eab  gcc/c-family/c-common.def
! a93db167d6d3c021153923ea5398b039  gcc/c-family/c-common.h
! e3a0d862a25764bc4242ad90ba85db86  gcc/c-family/c-cppbuiltin.cc
  0b9194e38297d00cf3fac80365cc07af  gcc/c-family/c-dump.cc
  6ae3bdb693669aee234a91cd79302dcf  gcc/c-family/c-format.cc
  1adde7951b864b565a2b79c5461d43fa  gcc/c-family/c-format.h
--- 3293,3310 ----
  392eecf8142b4edd3c482f461232166f  gcc/btfout.cc
  6da486aac72d8ac53fc6618dea4dcf2e  gcc/builtin-attrs.def
  199995f5aa749f6b6a1170f2307d8e3b  gcc/builtin-types.def
! 20cee46127d343d580bbd5d19e691e9f  gcc/builtins.cc
  eca54bea4455692736159661d9bb9ea9  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 7be183e6c42408b298b10e4fe902db9f  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  aaea141fd41a559841cb76e33800c289  gcc/c-family/c-ada-spec.cc
  f60a13b470e8e51db83383bf9f9f921e  gcc/c-family/c-ada-spec.h
  070946aa1b55a55d613bad8af07ad174  gcc/c-family/c-attribs.cc
  42561a3faabfdfd137738b2311baf58c  gcc/c-family/c-common.cc
  6522339cd83ff225a1ff9e0eab971eab  gcc/c-family/c-common.def
! faa816260bd768905e411e926657028e  gcc/c-family/c-common.h
! 5121366799fa054c10e3cedd4409d4fb  gcc/c-family/c-cppbuiltin.cc
  0b9194e38297d00cf3fac80365cc07af  gcc/c-family/c-dump.cc
  6ae3bdb693669aee234a91cd79302dcf  gcc/c-family/c-format.cc
  1adde7951b864b565a2b79c5461d43fa  gcc/c-family/c-format.h
*************** e3a0d862a25764bc4242ad90ba85db86  gcc/c-
*** 3313,3319 ****
  382fde18b48d137c66c91e21de978037  gcc/c-family/c-indentation.h
  4893d50b962d5e680a44bb72d2097469  gcc/c-family/c-lex.cc
  eb6a10cfada98679dc204a82e929e9e3  gcc/c-family/c-objc.h
! b84620929e53b69a3e41c57809a001ab  gcc/c-family/c-omp.cc
  a93a54bd451fefbd21f9b288d5530d33  gcc/c-family/c-opts.cc
  a7304c009aa63ce6c8e80612b426724a  gcc/c-family/c-pch.cc
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
--- 3313,3319 ----
  382fde18b48d137c66c91e21de978037  gcc/c-family/c-indentation.h
  4893d50b962d5e680a44bb72d2097469  gcc/c-family/c-lex.cc
  eb6a10cfada98679dc204a82e929e9e3  gcc/c-family/c-objc.h
! 02afe8f06e7808a1ae9ca6cc87714d14  gcc/c-family/c-omp.cc
  a93a54bd451fefbd21f9b288d5530d33  gcc/c-family/c-opts.cc
  a7304c009aa63ce6c8e80612b426724a  gcc/c-family/c-pch.cc
  cb9706138b571f810527200a1e24035c  gcc/c-family/c-ppoutput.cc
*************** f7be2688a5d3b3987de70c31a6a5e374  gcc/c-
*** 3329,3337 ****
  38a6ba552ef0b2855739836a1238dc30  gcc/c-family/c-target.h
  d5acf2497b583d0fedcf4e2ac5f4ac4a  gcc/c-family/c-type-mismatch.cc
  ea821c9d267c64dd8b74aad9d0189834  gcc/c-family/c-type-mismatch.h
! 6f9f322124625df8d051fb8538679e17  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
! 29b7425b7315dcfbd0c9f89296e90df0  gcc/c-family/c-warn.cc
  33cadbf9fb4856643a6a29b3332ca38d  gcc/c-family/c.opt
  e0eb5a70f81cc829fe7d9d9164d0b11f  gcc/c-family/c.opt.urls
  6453e733397a8ab931434f4f73ee7d7b  gcc/c-family/cppspec.cc
--- 3329,3337 ----
  38a6ba552ef0b2855739836a1238dc30  gcc/c-family/c-target.h
  d5acf2497b583d0fedcf4e2ac5f4ac4a  gcc/c-family/c-type-mismatch.cc
  ea821c9d267c64dd8b74aad9d0189834  gcc/c-family/c-type-mismatch.h
! d65f75ab58c67521c48b77deb73f5ad7  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
! b04c53afbd10f0830045ea40d0c5c194  gcc/c-family/c-warn.cc
  33cadbf9fb4856643a6a29b3332ca38d  gcc/c-family/c.opt
  e0eb5a70f81cc829fe7d9d9164d0b11f  gcc/c-family/c.opt.urls
  6453e733397a8ab931434f4f73ee7d7b  gcc/c-family/cppspec.cc
*************** e0eb5a70f81cc829fe7d9d9164d0b11f  gcc/c-
*** 3339,3345 ****
  377686cbbf62a7d61d251d3f74cddb5b  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! e220408bf5a26cc9bfc8c8ccd37de341  gcc/c/ChangeLog
  cbffb341640e7c4b16792e0951fffeca  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
--- 3339,3345 ----
  377686cbbf62a7d61d251d3f74cddb5b  gcc/c-family/known-headers.h
  431045382c41554804be1959c1596be4  gcc/c-family/name-hint.h
  3bae9e281cc87b35f63e906373f3b446  gcc/c-family/stub-objc.cc
! 7f2e677d11064fc357b774c2a54d0d8a  gcc/c/ChangeLog
  cbffb341640e7c4b16792e0951fffeca  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
*************** a59a5f126151616976b68fde0c703dd4  gcc/c/
*** 3350,3360 ****
  62012039da265ed806754029f67a24a9  gcc/c/c-lang.h
  1c2de79d0807af2a767aa7abefb07c3a  gcc/c/c-objc-common.cc
  cbfdd140f14c43c01a6bdf8b1c24b317  gcc/c/c-objc-common.h
! b921c85a69b3e9e68f842c402ba13e4d  gcc/c/c-parser.cc
  f6b634d7c0204c419cf4fb7b48193fad  gcc/c/c-parser.h
  4db955734effe2d0c9aac0379d2e6a8c  gcc/c/c-tree.def
  0e7daedf1e35ced06dd99e10dcc9a68e  gcc/c/c-tree.h
! 2c5fd8545a103843363322c21a54c5f5  gcc/c/c-typeck.cc
  5804f7ee3eccdfb7c9a64e40b20ccc79  gcc/c/config-lang.in
  58370619d5c4739b7d81d5f899913a0c  gcc/c/gccspec.cc
  3ae90e1d8085765b7e7488ac9673a927  gcc/c/gimple-parser.cc
--- 3350,3360 ----
  62012039da265ed806754029f67a24a9  gcc/c/c-lang.h
  1c2de79d0807af2a767aa7abefb07c3a  gcc/c/c-objc-common.cc
  cbfdd140f14c43c01a6bdf8b1c24b317  gcc/c/c-objc-common.h
! 64d04ef394101a55c05ad12b051302cd  gcc/c/c-parser.cc
  f6b634d7c0204c419cf4fb7b48193fad  gcc/c/c-parser.h
  4db955734effe2d0c9aac0379d2e6a8c  gcc/c/c-tree.def
  0e7daedf1e35ced06dd99e10dcc9a68e  gcc/c/c-tree.h
! fb10560f4c46d3de4f8d2ad4bb2041c3  gcc/c/c-typeck.cc
  5804f7ee3eccdfb7c9a64e40b20ccc79  gcc/c/config-lang.in
  58370619d5c4739b7d81d5f899913a0c  gcc/c/gccspec.cc
  3ae90e1d8085765b7e7488ac9673a927  gcc/c/gimple-parser.cc
*************** e401a5a5a7e802aea0c860de79cf4639  gcc/cf
*** 3382,3392 ****
  f18b9392122c866e0f6862690656ebd5  gcc/cfgloopanal.cc
  c3fd49f98e00cb189ccabdf43ad76909  gcc/cfgloopmanip.cc
  f06c849f4ab033a8269f676731b08388  gcc/cfgloopmanip.h
! 4aaec97d264485b728d269420e5fc3a1  gcc/cfgrtl.cc
  c41525a1de6e78cabd4414d6a8c3dac9  gcc/cfgrtl.h
  23b9aa75531c001cb377f7909d709c80  gcc/cgraph.cc
  d61fe81ae621d346985061a794ecfd03  gcc/cgraph.h
! 0e01d226aed9a7a844ec0cec027e8bd4  gcc/cgraphbuild.cc
  1a06be3556807c21f91d629f5878d022  gcc/cgraphclones.cc
  a9229e8ac3f0d366e296e57756becd23  gcc/cgraphunit.cc
  45b21ab7ea818c3a3ce60bf8d3cbd252  gcc/channels.h
--- 3382,3392 ----
  f18b9392122c866e0f6862690656ebd5  gcc/cfgloopanal.cc
  c3fd49f98e00cb189ccabdf43ad76909  gcc/cfgloopmanip.cc
  f06c849f4ab033a8269f676731b08388  gcc/cfgloopmanip.h
! bf51c09e81eb3433da948582cff58444  gcc/cfgrtl.cc
  c41525a1de6e78cabd4414d6a8c3dac9  gcc/cfgrtl.h
  23b9aa75531c001cb377f7909d709c80  gcc/cgraph.cc
  d61fe81ae621d346985061a794ecfd03  gcc/cgraph.h
! b50dcacbe77c96809023aa599a556717  gcc/cgraphbuild.cc
  1a06be3556807c21f91d629f5878d022  gcc/cgraphclones.cc
  a9229e8ac3f0d366e296e57756becd23  gcc/cgraphunit.cc
  45b21ab7ea818c3a3ce60bf8d3cbd252  gcc/channels.h
*************** d8186ca60d88fc455c403eb87d6e59e7  gcc/co
*** 3501,3508 ****
  67a4e50b29a50485cecd1c144965e97d  gcc/common/config/pa/pa-common.cc
  500435c25f1e8769a7838c3e187195c1  gcc/common/config/pdp11/pdp11-common.cc
  3fe10d934c16b0a06d492096be6d8ee1  gcc/common/config/pru/pru-common.cc
! 96ef8adfff37da3edbe71ab6e67eceed  gcc/common/config/riscv/riscv-common.cc
! e45dc963ab3b2c665885256617dae5db  gcc/common/config/riscv/riscv-ext-bitmask.def
  c5805e3cf6610b64324ce388e3f5f855  gcc/common/config/rs6000/rs6000-common.cc
  b6c011cb2596e87fbedc97081867b691  gcc/common/config/rx/rx-common.cc
  69998ad4853297d8db89b57ff246a41d  gcc/common/config/s390/s390-common.cc
--- 3501,3508 ----
  67a4e50b29a50485cecd1c144965e97d  gcc/common/config/pa/pa-common.cc
  500435c25f1e8769a7838c3e187195c1  gcc/common/config/pdp11/pdp11-common.cc
  3fe10d934c16b0a06d492096be6d8ee1  gcc/common/config/pru/pru-common.cc
! 57eaad2fb617ff24b49f3eae71662a6a  gcc/common/config/riscv/riscv-common.cc
! d0f5525bd704195674a68288e7443aad  gcc/common/config/riscv/riscv-ext-bitmask.def
  c5805e3cf6610b64324ce388e3f5f855  gcc/common/config/rs6000/rs6000-common.cc
  b6c011cb2596e87fbedc97081867b691  gcc/common/config/rx/rx-common.cc
  69998ad4853297d8db89b57ff246a41d  gcc/common/config/s390/s390-common.cc
*************** b824341b8f6fdb8eb1667425adf63db8  gcc/co
*** 3568,3574 ****
  da15606bcbef7961db958c042bf81c05  gcc/config/aarch64/aarch64-simd-builtin-types.def
  9a92557ac11986ea17d11d6ca82c01e6  gcc/config/aarch64/aarch64-simd-builtins.def
  8f0acfd5455d9572e381b98441bf47a5  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
! 2824d5fdc2090b21b3caba179868aec6  gcc/config/aarch64/aarch64-simd.md
  f27b31555e077ce25b7e0120a532cfdf  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
  b7abc20f0caf90f086591527696134c1  gcc/config/aarch64/aarch64-sve-builtins-base.cc
--- 3568,3574 ----
  da15606bcbef7961db958c042bf81c05  gcc/config/aarch64/aarch64-simd-builtin-types.def
  9a92557ac11986ea17d11d6ca82c01e6  gcc/config/aarch64/aarch64-simd-builtins.def
  8f0acfd5455d9572e381b98441bf47a5  gcc/config/aarch64/aarch64-simd-pragma-builtins.def
! 5af2e02c1bdc4b8473552574ebbaa6b2  gcc/config/aarch64/aarch64-simd.md
  f27b31555e077ce25b7e0120a532cfdf  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
  b7abc20f0caf90f086591527696134c1  gcc/config/aarch64/aarch64-sve-builtins-base.cc
*************** e101bed95b5d0264c364d8bcf1a7705f  gcc/co
*** 3593,3601 ****
  dec4c8fd03ac5636ba08d9523bee06be  gcc/config/aarch64/aarch64-tuning-enums.def
  95775c91d04e9c5cacdd63e6802ca879  gcc/config/aarch64/aarch64-tuning-flags.def
  0eec0dd3dbc5fa83349625d27ac091df  gcc/config/aarch64/aarch64-vxworks.h
! 08c18aa54c61ef559ac8a9785ec2c106  gcc/config/aarch64/aarch64.cc
  1e57040281ba3f62b216c58733a820f5  gcc/config/aarch64/aarch64.h
! bd813cb7dfa70cb6c970d78d27ead783  gcc/config/aarch64/aarch64.md
  ebc45c78d8d52bdcabec46514f44ad2d  gcc/config/aarch64/aarch64.opt
  5bc2d62d910e1c00bd6eed6ffaa5a18d  gcc/config/aarch64/aarch64.opt.urls
  854a2fd8965d477c5b064388ed354bf1  gcc/config/aarch64/arm_acle.h
--- 3593,3601 ----
  dec4c8fd03ac5636ba08d9523bee06be  gcc/config/aarch64/aarch64-tuning-enums.def
  95775c91d04e9c5cacdd63e6802ca879  gcc/config/aarch64/aarch64-tuning-flags.def
  0eec0dd3dbc5fa83349625d27ac091df  gcc/config/aarch64/aarch64-vxworks.h
! 4bd73afaa26bd27cbca408f435ea4e36  gcc/config/aarch64/aarch64.cc
  1e57040281ba3f62b216c58733a820f5  gcc/config/aarch64/aarch64.h
! 5235dbc81e1259b72a76cae493eb917d  gcc/config/aarch64/aarch64.md
  ebc45c78d8d52bdcabec46514f44ad2d  gcc/config/aarch64/aarch64.opt
  5bc2d62d910e1c00bd6eed6ffaa5a18d  gcc/config/aarch64/aarch64.opt.urls
  854a2fd8965d477c5b064388ed354bf1  gcc/config/aarch64/arm_acle.h
*************** ed370a07e382245b4edbac85d9fe2487  gcc/co
*** 3712,3718 ****
  277b2da416fe84d9286ecaf175c75304  gcc/config/arc/arc-simd.h
  c6acf03bc43070e9c61e14fa7a4a0cb6  gcc/config/arc/arc-tables.opt
  6704645d075bf670b5ed5d77f0a88b86  gcc/config/arc/arc-tables.opt.urls
! 8c523fdbeba6e4a4a87be6a051b0d60f  gcc/config/arc/arc.cc
  208ecc54b090b0bf3d9fb8f776587a0c  gcc/config/arc/arc.h
  ea5a9b331d0504b04c1fa274239c18d9  gcc/config/arc/arc.md
  f79a52d46acb2409a7cb46770b80e1e6  gcc/config/arc/arc.opt
--- 3712,3718 ----
  277b2da416fe84d9286ecaf175c75304  gcc/config/arc/arc-simd.h
  c6acf03bc43070e9c61e14fa7a4a0cb6  gcc/config/arc/arc-tables.opt
  6704645d075bf670b5ed5d77f0a88b86  gcc/config/arc/arc-tables.opt.urls
! 233efc76025589cb15f3114136bec898  gcc/config/arc/arc.cc
  208ecc54b090b0bf3d9fb8f776587a0c  gcc/config/arc/arc.h
  ea5a9b331d0504b04c1fa274239c18d9  gcc/config/arc/arc.md
  f79a52d46acb2409a7cb46770b80e1e6  gcc/config/arc/arc.opt
*************** d58398b8674211171ea210f8d3f3883b  gcc/co
*** 3757,3763 ****
  357d99c16ccb55530e3c4bc802988cde  gcc/config/arm/arm-ldmstm.ml
  7550204b1316d145890d079b35b59fbd  gcc/config/arm/arm-mlib.h
  93f3f601901fb6c23a6f561427065cd1  gcc/config/arm/arm-modes.def
! 337902eda3308af81fa1302566cbfc2a  gcc/config/arm/arm-mve-builtins-base.cc
  dd68b000194684be096bab7e439eae6d  gcc/config/arm/arm-mve-builtins-base.def
  b89eb2d819ab7b39687f97a2e620112b  gcc/config/arm/arm-mve-builtins-base.h
  76c9ba52f5b1e8b2d2fe7e3750adbcbb  gcc/config/arm/arm-mve-builtins-functions.h
--- 3757,3763 ----
  357d99c16ccb55530e3c4bc802988cde  gcc/config/arm/arm-ldmstm.ml
  7550204b1316d145890d079b35b59fbd  gcc/config/arm/arm-mlib.h
  93f3f601901fb6c23a6f561427065cd1  gcc/config/arm/arm-modes.def
! 13b42fc7ece0708b0998dc41334477be  gcc/config/arm/arm-mve-builtins-base.cc
  dd68b000194684be096bab7e439eae6d  gcc/config/arm/arm-mve-builtins-base.def
  b89eb2d819ab7b39687f97a2e620112b  gcc/config/arm/arm-mve-builtins-base.h
  76c9ba52f5b1e8b2d2fe7e3750adbcbb  gcc/config/arm/arm-mve-builtins-functions.h
*************** b05978bd2969a943265d3549c23b8b59  gcc/co
*** 3889,3895 ****
  4ee8705558d223eb1da7a1266af8c799  gcc/config/avr/avr-stdint.h
  a9586cfcef72e5e02e3b584251e6542d  gcc/config/avr/avr.cc
  a4c128a5989d02ad75000ddce5204e45  gcc/config/avr/avr.h
! b90ae914b2f6999e93154cd4ee679348  gcc/config/avr/avr.md
  952a12d62229d3077f49f68614cf8be4  gcc/config/avr/avr.opt
  f10f1d2141cba9ac792b02771cf4e3ae  gcc/config/avr/avr.opt.urls
  a2e6c4bc09c4af90d1c01745985baff7  gcc/config/avr/avrlibc.h
--- 3889,3895 ----
  4ee8705558d223eb1da7a1266af8c799  gcc/config/avr/avr-stdint.h
  a9586cfcef72e5e02e3b584251e6542d  gcc/config/avr/avr.cc
  a4c128a5989d02ad75000ddce5204e45  gcc/config/avr/avr.h
! 0d578fc0108ded3430e2bcfabad80de3  gcc/config/avr/avr.md
  952a12d62229d3077f49f68614cf8be4  gcc/config/avr/avr.opt
  f10f1d2141cba9ac792b02771cf4e3ae  gcc/config/avr/avr.opt.urls
  a2e6c4bc09c4af90d1c01745985baff7  gcc/config/avr/avrlibc.h
*************** be7f06e3ea032dfb39fcda012c812683  gcc/co
*** 4302,4308 ****
  b4003ec8a83a5b025fb5f9d5334af62e  gcc/config/i386/i386-c.cc
  a0261d6cc006fb86b99f338bdc94ae04  gcc/config/i386/i386-d.cc
  e9c7eebd4e344796f248c93990aa5166  gcc/config/i386/i386-d.h
! 333feb817f8ba42d58167ca5495f50b3  gcc/config/i386/i386-expand.cc
  386e1be7f608621b79970d4d036694f8  gcc/config/i386/i386-expand.h
  8ffc8b40d0d0ec3efbfafc3b6e069bab  gcc/config/i386/i386-features.cc
  473c35b162be3bcf222c90a16f72b948  gcc/config/i386/i386-features.h
--- 4302,4308 ----
  b4003ec8a83a5b025fb5f9d5334af62e  gcc/config/i386/i386-c.cc
  a0261d6cc006fb86b99f338bdc94ae04  gcc/config/i386/i386-d.cc
  e9c7eebd4e344796f248c93990aa5166  gcc/config/i386/i386-d.h
! 670d7afe378831e21f8838293a467d26  gcc/config/i386/i386-expand.cc
  386e1be7f608621b79970d4d036694f8  gcc/config/i386/i386-expand.h
  8ffc8b40d0d0ec3efbfafc3b6e069bab  gcc/config/i386/i386-features.cc
  473c35b162be3bcf222c90a16f72b948  gcc/config/i386/i386-features.h
*************** c20b5abeadf9bf0c148bd3cee43dabbf  gcc/co
*** 4314,4326 ****
  106bb7043496820d393f0522178e1287  gcc/config/i386/i386-options.h
  2db6ec1e569468279f31d11379fe9d8f  gcc/config/i386/i386-opts.h
  9a75f0c116528508f4f48d128eceac38  gcc/config/i386/i386-passes.def
! 599c3a0da7643105c19e7d0f2fcf6e17  gcc/config/i386/i386-protos.h
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  91b8b50cba997aef17a61929b5b55a87  gcc/config/i386/i386-rust.cc
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  accb7c9ce90c2c96438bce0121b855b8  gcc/config/i386/i386.cc
! ef379db3f4eba90bca6b04e4d5abc753  gcc/config/i386/i386.h
! c930b483d95e4c0a1b171c4460e5e4e1  gcc/config/i386/i386.md
  7f5e2eb20e3b7ca8af1b3ee7416e8eaf  gcc/config/i386/i386.opt
  b9e680863ab278314c1f2990d2d04fcc  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
--- 4314,4326 ----
  106bb7043496820d393f0522178e1287  gcc/config/i386/i386-options.h
  2db6ec1e569468279f31d11379fe9d8f  gcc/config/i386/i386-opts.h
  9a75f0c116528508f4f48d128eceac38  gcc/config/i386/i386-passes.def
! 331a40abbc6a04f61b36fddb948545a0  gcc/config/i386/i386-protos.h
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  91b8b50cba997aef17a61929b5b55a87  gcc/config/i386/i386-rust.cc
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  accb7c9ce90c2c96438bce0121b855b8  gcc/config/i386/i386.cc
! d3b1172e95acad712d89f06edafac116  gcc/config/i386/i386.h
! 2f0adf41e512f9eb3dd2243ae28dca76  gcc/config/i386/i386.md
  7f5e2eb20e3b7ca8af1b3ee7416e8eaf  gcc/config/i386/i386.opt
  b9e680863ab278314c1f2990d2d04fcc  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
*************** c22e895e5b7e6b98c7223b26982a5d20  gcc/co
*** 4435,4441 ****
  7bfce4f9fdee1dc1db1e668b10d9d8e2  gcc/config/i386/x86-tune-sched-bd.cc
  864e537089cc92c5002cefd76ede977a  gcc/config/i386/x86-tune-sched-core.cc
  4fddfbe9b1f3fe846e29534aa8c76823  gcc/config/i386/x86-tune-sched.cc
! 07c1eb8a04b320a61f9146e094bec1aa  gcc/config/i386/x86-tune.def
  75b1f0e8f79cfd04f898a4099aff669d  gcc/config/i386/x86gprintrin.h
  e5335d55cec73bd3270862ccac7a02e8  gcc/config/i386/x86intrin.h
  76f88cf5ac857d392ddb81b244c5b9b0  gcc/config/i386/xm-cygwin.h
--- 4435,4441 ----
  7bfce4f9fdee1dc1db1e668b10d9d8e2  gcc/config/i386/x86-tune-sched-bd.cc
  864e537089cc92c5002cefd76ede977a  gcc/config/i386/x86-tune-sched-core.cc
  4fddfbe9b1f3fe846e29534aa8c76823  gcc/config/i386/x86-tune-sched.cc
! 21ab93c7756c5a3673e40bead3646f1c  gcc/config/i386/x86-tune.def
  75b1f0e8f79cfd04f898a4099aff669d  gcc/config/i386/x86gprintrin.h
  e5335d55cec73bd3270862ccac7a02e8  gcc/config/i386/x86intrin.h
  76f88cf5ac857d392ddb81b244c5b9b0  gcc/config/i386/xm-cygwin.h
*************** fc623524d75c7561f85f81615ecad0ac  gcc/co
*** 4556,4562 ****
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
  f4bb410c49842101038ee7fdf2cba0c8  gcc/config/loongarch/loongarch.cc
  44710020cadd48029a693da29d33aaf0  gcc/config/loongarch/loongarch.h
! 85a37c8daac160ef96a38bd9a5bc6e7f  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
  387011bb9dde5e25493f3602b2fd17bb  gcc/config/loongarch/loongarch.opt.urls
  561a66379ab213d1901626005734b467  gcc/config/loongarch/lsx.md
--- 4556,4562 ----
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
  f4bb410c49842101038ee7fdf2cba0c8  gcc/config/loongarch/loongarch.cc
  44710020cadd48029a693da29d33aaf0  gcc/config/loongarch/loongarch.h
! 1dc53acac3e8175c35aefd3e06c58b8b  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
  387011bb9dde5e25493f3602b2fd17bb  gcc/config/loongarch/loongarch.opt.urls
  561a66379ab213d1901626005734b467  gcc/config/loongarch/lsx.md
*************** fe51977e0ac69b0829287b1c8d3f5060  gcc/co
*** 4566,4572 ****
  f91faa5449d6dd76f5957fa796f00464  gcc/config/loongarch/simd.md
  2e69737d13e1bfc019d62d20daa42769  gcc/config/loongarch/sync.md
  70d4362e3209c6d2b4d8ad4c79d65a4c  gcc/config/loongarch/t-linux
! 25160036fbe9a14f0cfa6539925bfa8a  gcc/config/loongarch/t-loongarch
  2077777e56c76bfdc49229a85745bfe6  gcc/config/loongarch/t-multilib
  a52ea9773b8048a300f52875af013b56  gcc/config/lynx.h
  64951ee8dbab997dcf5b958908500593  gcc/config/lynx.opt
--- 4566,4572 ----
  f91faa5449d6dd76f5957fa796f00464  gcc/config/loongarch/simd.md
  2e69737d13e1bfc019d62d20daa42769  gcc/config/loongarch/sync.md
  70d4362e3209c6d2b4d8ad4c79d65a4c  gcc/config/loongarch/t-linux
! 19a269e2bff5187b276f7e58f79c667c  gcc/config/loongarch/t-loongarch
  2077777e56c76bfdc49229a85745bfe6  gcc/config/loongarch/t-multilib
  a52ea9773b8048a300f52875af013b56  gcc/config/lynx.h
  64951ee8dbab997dcf5b958908500593  gcc/config/lynx.opt
*************** c11972bf63fa008aee2bbef33d586f7b  gcc/co
*** 4984,4999 ****
  5f3fb55682992ef6da7e6abea4d74afd  gcc/config/picolibc.opt.urls
  fcbf9f8c84143f4aa31a271f8995d1ce  gcc/config/print-sysroot-suffix.sh
  56ef02d6b54083626b640d0ba8bc078c  gcc/config/pru/alu-zext.md
! ce800bdc606a2ae4d19900976be4ecf4  gcc/config/pru/constraints.md
! cb24ad36efa20d24b9e6292b70355252  gcc/config/pru/predicates.md
  812687b07083ac89dfceeb422109764f  gcc/config/pru/pru-opts.h
  12253ff8bacfa8875cba3d54e74339e1  gcc/config/pru/pru-passes.cc
  c98ff9301dd655a05d911274b87b8a60  gcc/config/pru/pru-passes.def
  95854bd9d43b089d9e485c55890d86f9  gcc/config/pru/pru-pragma.cc
  ad743ffd510350de1ccc398970040dc3  gcc/config/pru/pru-protos.h
  23b664357be90c32a2e613c5f890813b  gcc/config/pru/pru.cc
! e0e2473537aec2bbee6be2b07e3b3ecc  gcc/config/pru/pru.h
! f4bcd512aee9c63ac876027f329af5ae  gcc/config/pru/pru.md
  07fb21318d917df2d4ba319221cb730c  gcc/config/pru/pru.opt
  ef116c044d43c2dfc0d66c90cb68f1e4  gcc/config/pru/pru.opt.urls
  c767f7420ba1d03bdc9c8683304f60b9  gcc/config/pru/t-multilib
--- 4984,4999 ----
  5f3fb55682992ef6da7e6abea4d74afd  gcc/config/picolibc.opt.urls
  fcbf9f8c84143f4aa31a271f8995d1ce  gcc/config/print-sysroot-suffix.sh
  56ef02d6b54083626b640d0ba8bc078c  gcc/config/pru/alu-zext.md
! ec10a442862a52c2a15b04b57350e27d  gcc/config/pru/constraints.md
! fd9af49194bb58a1d62ad95f54a30b86  gcc/config/pru/predicates.md
  812687b07083ac89dfceeb422109764f  gcc/config/pru/pru-opts.h
  12253ff8bacfa8875cba3d54e74339e1  gcc/config/pru/pru-passes.cc
  c98ff9301dd655a05d911274b87b8a60  gcc/config/pru/pru-passes.def
  95854bd9d43b089d9e485c55890d86f9  gcc/config/pru/pru-pragma.cc
  ad743ffd510350de1ccc398970040dc3  gcc/config/pru/pru-protos.h
  23b664357be90c32a2e613c5f890813b  gcc/config/pru/pru.cc
! 2e308610c272bc751c01348cbda71cb8  gcc/config/pru/pru.h
! 48a0101c7837fadd452c52a1853228b3  gcc/config/pru/pru.md
  07fb21318d917df2d4ba319221cb730c  gcc/config/pru/pru.opt
  ef116c044d43c2dfc0d66c90cb68f1e4  gcc/config/pru/pru.opt.urls
  c767f7420ba1d03bdc9c8683304f60b9  gcc/config/pru/t-multilib
*************** fe7787cb1ccac5b6c4c75d7da3aef619  gcc/co
*** 5005,5021 ****
  30b1cd3f2169a2b09667ad9a57817b33  gcc/config/riscv/andes-vector-builtins-bases.h
  f913aafadf901518cfbd1709bf303845  gcc/config/riscv/andes-vector-builtins-functions.def
  66ab8d65f2dba7e08954bcbbba736f90  gcc/config/riscv/andes-vector.md
! ccf120397e978f8cd4ed98cbe2c0d4f5  gcc/config/riscv/andes.def
  3781b6037a5c704d1ff44bb98a38265e  gcc/config/riscv/andes.md
! f4143eaeb6de99083ec3a0020c13454c  gcc/config/riscv/andes_vector.h
  3a8a73bef77551ee151fb28603e3a02a  gcc/config/riscv/arch-canonicalize
  b7544a05ff53accc3d2defcb758626a9  gcc/config/riscv/arcv-rhx100.md
  4a634d8ec9f394f560c8538634cd937a  gcc/config/riscv/arcv-rmx100.md
  e210fc922126036076267892b159c6e3  gcc/config/riscv/autovec-opt.md
! 49d1bc6364b4c8e48fa9de0f145a0997  gcc/config/riscv/autovec.md
! 0547d5cab732d04311880463065a6184  gcc/config/riscv/bitmanip.md
  9a8c3c567d897ebcb2cfe1b14c449222  gcc/config/riscv/constraints.md
! 4e0968dc35562b151fd162778542718f  gcc/config/riscv/corev.def
  3541ce4817aa1b4ca8a8e3799ba716d8  gcc/config/riscv/corev.md
  7756abda53649ea4167327df7a1dd51a  gcc/config/riscv/crypto.md
  cf2f4b49f9a1b3787b92baf7d5a969f7  gcc/config/riscv/elf.h
--- 5005,5021 ----
  30b1cd3f2169a2b09667ad9a57817b33  gcc/config/riscv/andes-vector-builtins-bases.h
  f913aafadf901518cfbd1709bf303845  gcc/config/riscv/andes-vector-builtins-functions.def
  66ab8d65f2dba7e08954bcbbba736f90  gcc/config/riscv/andes-vector.md
! 8d50880f7d63f8f9ccbabf76a8de5cff  gcc/config/riscv/andes.def
  3781b6037a5c704d1ff44bb98a38265e  gcc/config/riscv/andes.md
! 4a021a2fda3f1fcb2ebb0b295d676d96  gcc/config/riscv/andes_vector.h
  3a8a73bef77551ee151fb28603e3a02a  gcc/config/riscv/arch-canonicalize
  b7544a05ff53accc3d2defcb758626a9  gcc/config/riscv/arcv-rhx100.md
  4a634d8ec9f394f560c8538634cd937a  gcc/config/riscv/arcv-rmx100.md
  e210fc922126036076267892b159c6e3  gcc/config/riscv/autovec-opt.md
! a5e692feb7ce6b3415cc59b56d695d26  gcc/config/riscv/autovec.md
! 241fbffe6687f2114c1b50096fe2f912  gcc/config/riscv/bitmanip.md
  9a8c3c567d897ebcb2cfe1b14c449222  gcc/config/riscv/constraints.md
! cea5b702841429deff64e2e6fd0b626f  gcc/config/riscv/corev.def
  3541ce4817aa1b4ca8a8e3799ba716d8  gcc/config/riscv/corev.md
  7756abda53649ea4167327df7a1dd51a  gcc/config/riscv/crypto.md
  cf2f4b49f9a1b3787b92baf7d5a969f7  gcc/config/riscv/elf.h
*************** bcda2f5a4a2728d5f6bc53cbbd26f90c  gcc/co
*** 5037,5049 ****
  71bb6b628401a63410f99976d969ed4a  gcc/config/riscv/peephole.md
  16cf6e3ed290820f3a87012495b1227b  gcc/config/riscv/pic.md
  5259023ff7c1538fe8f46ddc8b9a51f2  gcc/config/riscv/pipeline-checker
! 7aca54a777435134e2d351b52836b2c7  gcc/config/riscv/predicates.md
  fbba4e9f3f0e00cdc072f9a3d399d0d1  gcc/config/riscv/riscv-avlprop.cc
  28bce4c8c28ba8acca9ceede4540540c  gcc/config/riscv/riscv-bclr-lowest-set-bit.cc
! 7f7d3639030a4672597f5ffcc2083cd0  gcc/config/riscv/riscv-builtins.cc
  5cb39713c38f481ef65328ccacfc067e  gcc/config/riscv/riscv-c.cc
! 3b7012a7d47b9aaf163e890d3e29013e  gcc/config/riscv/riscv-cmo.def
! adc488b7af3a668ee1cdd7f21ea749f6  gcc/config/riscv/riscv-cores.def
  165a5d0020971e2616fa7c9198c56338  gcc/config/riscv/riscv-d.cc
  c5d537324bd78e2ade1cf59d04fc1f54  gcc/config/riscv/riscv-d.h
  6078aa631d1c71fd215d51e4edcec963  gcc/config/riscv/riscv-ext-andes.def
--- 5037,5049 ----
  71bb6b628401a63410f99976d969ed4a  gcc/config/riscv/peephole.md
  16cf6e3ed290820f3a87012495b1227b  gcc/config/riscv/pic.md
  5259023ff7c1538fe8f46ddc8b9a51f2  gcc/config/riscv/pipeline-checker
! 562cd33a1fed3a3435db5f372d892258  gcc/config/riscv/predicates.md
  fbba4e9f3f0e00cdc072f9a3d399d0d1  gcc/config/riscv/riscv-avlprop.cc
  28bce4c8c28ba8acca9ceede4540540c  gcc/config/riscv/riscv-bclr-lowest-set-bit.cc
! 5108deda32a010f8df8d518a2417ba81  gcc/config/riscv/riscv-builtins.cc
  5cb39713c38f481ef65328ccacfc067e  gcc/config/riscv/riscv-c.cc
! 33dd09c63fb051a37d26d97469c451d9  gcc/config/riscv/riscv-cmo.def
! 2cd79da1a40d7dec7cc6899d5ab01704  gcc/config/riscv/riscv-cores.def
  165a5d0020971e2616fa7c9198c56338  gcc/config/riscv/riscv-d.cc
  c5d537324bd78e2ade1cf59d04fc1f54  gcc/config/riscv/riscv-d.h
  6078aa631d1c71fd215d51e4edcec963  gcc/config/riscv/riscv-ext-andes.def
*************** bdea5a038db730633426d4ab8652a37c  gcc/co
*** 5053,5059 ****
  6aef0384f848e091b1f84d7e64ab667c  gcc/config/riscv/riscv-ext-spacemit.def
  0d561344b80507521c8e686db17fd207  gcc/config/riscv/riscv-ext-thead.def
  ca88603cd61372d621963af0d282a93b  gcc/config/riscv/riscv-ext-ventana.def
! 3a0ca04e7e2a2ff6aa0b5bd9d81feb9d  gcc/config/riscv/riscv-ext.def
  4f872ac7917638dfea26aad68db4e9e6  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  055aff307d7b174891aad40963ef1a9f  gcc/config/riscv/riscv-feature-bits.h
--- 5053,5059 ----
  6aef0384f848e091b1f84d7e64ab667c  gcc/config/riscv/riscv-ext-spacemit.def
  0d561344b80507521c8e686db17fd207  gcc/config/riscv/riscv-ext-thead.def
  ca88603cd61372d621963af0d282a93b  gcc/config/riscv/riscv-ext-ventana.def
! 200d4cfec7a32568436dd537434e5ff3  gcc/config/riscv/riscv-ext.def
  4f872ac7917638dfea26aad68db4e9e6  gcc/config/riscv/riscv-ext.opt
  8463b74f5d66e1a7f0d58a7ae087d8ad  gcc/config/riscv/riscv-ext.opt.urls
  055aff307d7b174891aad40963ef1a9f  gcc/config/riscv/riscv-feature-bits.h
*************** ca88603cd61372d621963af0d282a93b  gcc/co
*** 5061,5078 ****
  d0bbeee24eccae51546e551a0235140a  gcc/config/riscv/riscv-fusion.cc
  6fdf4beed9fb8574216b376cd1779eba  gcc/config/riscv/riscv-modes.def
  846d400b827fb358869c936715c16c82  gcc/config/riscv/riscv-opt-popretz.cc
! cc1a6f4948a99d7cf0b785c01cf0a063  gcc/config/riscv/riscv-opts.h
  b8f6d36a9d7d3ef28a80c20bec990411  gcc/config/riscv/riscv-passes.def
  8fcaaf812bb193e0fad76d6b5f82f2af  gcc/config/riscv/riscv-profiles.def
! af7c5ae858fe2f10c9a63d15c8cdea40  gcc/config/riscv/riscv-protos.h
! 0f5bf394cade69aeff5c57f69d880d00  gcc/config/riscv/riscv-scalar-crypto.def
  c171108cfab16c74097a841489b04298  gcc/config/riscv/riscv-selftests.cc
  41d585e61cee0deacc33bd07c93e79e2  gcc/config/riscv/riscv-shorten-memrefs.cc
  62b31689063eeeca8f0e7ae25da92d0a  gcc/config/riscv/riscv-sr.cc
  f57a4d1f0a5a49304e07ae38a6990bc8  gcc/config/riscv/riscv-string.cc
  83bc8b8b85874456078c4c683d82a3e6  gcc/config/riscv/riscv-subset.h
  da26032fa71bbdaccc0766633e3f86bb  gcc/config/riscv/riscv-target-attr.cc
! 845610fe668c7dee69ccc0586a0638e1  gcc/config/riscv/riscv-v.cc
  23f9fe60c9f6f052bd55875310c01b0e  gcc/config/riscv/riscv-v.h
  3d17a86fd1ba10efb8809c613d1eb6cf  gcc/config/riscv/riscv-vect-permconst.cc
  5c3100beef34fe1879075f8cfb95e70e  gcc/config/riscv/riscv-vector-builtins-bases.cc
--- 5061,5078 ----
  d0bbeee24eccae51546e551a0235140a  gcc/config/riscv/riscv-fusion.cc
  6fdf4beed9fb8574216b376cd1779eba  gcc/config/riscv/riscv-modes.def
  846d400b827fb358869c936715c16c82  gcc/config/riscv/riscv-opt-popretz.cc
! 3afafb1ad4ed41430d9cfb9d276058b0  gcc/config/riscv/riscv-opts.h
  b8f6d36a9d7d3ef28a80c20bec990411  gcc/config/riscv/riscv-passes.def
  8fcaaf812bb193e0fad76d6b5f82f2af  gcc/config/riscv/riscv-profiles.def
! 197398b505af1b647aa991184967a7a5  gcc/config/riscv/riscv-protos.h
! 2b6774d7dd7980d9eb3f4f24ed1b3e45  gcc/config/riscv/riscv-scalar-crypto.def
  c171108cfab16c74097a841489b04298  gcc/config/riscv/riscv-selftests.cc
  41d585e61cee0deacc33bd07c93e79e2  gcc/config/riscv/riscv-shorten-memrefs.cc
  62b31689063eeeca8f0e7ae25da92d0a  gcc/config/riscv/riscv-sr.cc
  f57a4d1f0a5a49304e07ae38a6990bc8  gcc/config/riscv/riscv-string.cc
  83bc8b8b85874456078c4c683d82a3e6  gcc/config/riscv/riscv-subset.h
  da26032fa71bbdaccc0766633e3f86bb  gcc/config/riscv/riscv-target-attr.cc
! 1ba47eb9e093f0992f2bc8812aa2f7f3  gcc/config/riscv/riscv-v.cc
  23f9fe60c9f6f052bd55875310c01b0e  gcc/config/riscv/riscv-v.h
  3d17a86fd1ba10efb8809c613d1eb6cf  gcc/config/riscv/riscv-vect-permconst.cc
  5c3100beef34fe1879075f8cfb95e70e  gcc/config/riscv/riscv-vector-builtins-bases.cc
*************** a6642c27cbc8f18cf3cab4881911ed3f  gcc/co
*** 5084,5104 ****
  8fe75d6009ec6dac9babd319503bb3f6  gcc/config/riscv/riscv-vector-builtins.cc
  6f087b25674ebed60ebd0e55c4fe30e1  gcc/config/riscv/riscv-vector-builtins.def
  b65281b3d979c9c774d30d65281a07ab  gcc/config/riscv/riscv-vector-builtins.h
! 013e38b27837342297d21ff86bd83bdf  gcc/config/riscv/riscv-vector-costs.cc
  8c1680c1bc7e171e4992d3aa9ea64d18  gcc/config/riscv/riscv-vector-costs.h
  4dd506c7e0c9b67fb2b6c5acdf4f44b7  gcc/config/riscv/riscv-vector-switch.def
  75866c86ec05a7abe2fa3f55828938b0  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! 3ac3401805cce0eda84d0b4f10f48218  gcc/config/riscv/riscv.cc
  162190a7bb8bb544480bfc4ec576c934  gcc/config/riscv/riscv.h
! 00a13f090d9eac7b32611a8e51fe6692  gcc/config/riscv/riscv.md
! e308091c87a21c63c81c369a708bc67b  gcc/config/riscv/riscv.opt
! c46d0bd22d91fa2b15da3c7c1e942c5a  gcc/config/riscv/riscv.opt.urls
! fab1eef01628cdb4fc6f7a48edf3ff51  gcc/config/riscv/riscv_bitmanip.h
! 3458c159fa70b8544ae65132baa36477  gcc/config/riscv/riscv_crypto.h
  919b77d98a332a298929861b56886aaa  gcc/config/riscv/riscv_th_vector.h
! cc0a878ac04b90ccd9fbf7a018c4cc50  gcc/config/riscv/riscv_vector.h
  1f4b9062bebe7b602fd14e727d6d7e80  gcc/config/riscv/rtems.h
  e7f78ee77ae8bd53e7956fe2fcc08ea3  gcc/config/riscv/sfb.md
  4d8c5cb8b6b14b70cf371eb6c7351259  gcc/config/riscv/sifive-7.md
--- 5084,5104 ----
  8fe75d6009ec6dac9babd319503bb3f6  gcc/config/riscv/riscv-vector-builtins.cc
  6f087b25674ebed60ebd0e55c4fe30e1  gcc/config/riscv/riscv-vector-builtins.def
  b65281b3d979c9c774d30d65281a07ab  gcc/config/riscv/riscv-vector-builtins.h
! 2bb470dc813885effb54174396002b2d  gcc/config/riscv/riscv-vector-costs.cc
  8c1680c1bc7e171e4992d3aa9ea64d18  gcc/config/riscv/riscv-vector-costs.h
  4dd506c7e0c9b67fb2b6c5acdf4f44b7  gcc/config/riscv/riscv-vector-switch.def
  75866c86ec05a7abe2fa3f55828938b0  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! d2dfd8651a6f77a6eaa0a0e8696953c0  gcc/config/riscv/riscv.cc
  162190a7bb8bb544480bfc4ec576c934  gcc/config/riscv/riscv.h
! e20b61289502f7662456841b6929766b  gcc/config/riscv/riscv.md
! 889bc6068f70f03b008968821d92ad40  gcc/config/riscv/riscv.opt
! 712042d47c904acf7307129ab3a48df3  gcc/config/riscv/riscv.opt.urls
! 68c8996d7ac73df46c6c1d49d8839ee0  gcc/config/riscv/riscv_bitmanip.h
! 99deccc8c27a840823251f8715c89d95  gcc/config/riscv/riscv_crypto.h
  919b77d98a332a298929861b56886aaa  gcc/config/riscv/riscv_th_vector.h
! 8d30807c5dde2940e316dc646edc71e8  gcc/config/riscv/riscv_vector.h
  1f4b9062bebe7b602fd14e727d6d7e80  gcc/config/riscv/rtems.h
  e7f78ee77ae8bd53e7956fe2fcc08ea3  gcc/config/riscv/sfb.md
  4d8c5cb8b6b14b70cf371eb6c7351259  gcc/config/riscv/sifive-7.md
*************** ef8111b151f28f36d377df7b23b6b46f  gcc/co
*** 5108,5114 ****
  5ff33a97f2dbb8ace0988a9736c5c046  gcc/config/riscv/sifive-vector-builtins-bases.h
  bc8a03f06cb925e5c1277e5ccd2f0314  gcc/config/riscv/sifive-vector-builtins-functions.def
  656879fa6da6ce5e2212ef2a731ee479  gcc/config/riscv/sifive-vector.md
! a7dca5c8a6f1208b84f278bbe9cff066  gcc/config/riscv/sifive_vector.h
  2e96ca539246ed14fc65d98d04f3765a  gcc/config/riscv/spacemit-x60.md
  111ac91ac2c2470d509802a9db215a92  gcc/config/riscv/sync-rvwmo.md
  72d32429c93bff2b2b8283cbca220b9a  gcc/config/riscv/sync-ztso.md
--- 5108,5114 ----
  5ff33a97f2dbb8ace0988a9736c5c046  gcc/config/riscv/sifive-vector-builtins-bases.h
  bc8a03f06cb925e5c1277e5ccd2f0314  gcc/config/riscv/sifive-vector-builtins-functions.def
  656879fa6da6ce5e2212ef2a731ee479  gcc/config/riscv/sifive-vector.md
! dbf013604da8f85f0c7c2d544750ef75  gcc/config/riscv/sifive_vector.h
  2e96ca539246ed14fc65d98d04f3765a  gcc/config/riscv/spacemit-x60.md
  111ac91ac2c2470d509802a9db215a92  gcc/config/riscv/sync-rvwmo.md
  72d32429c93bff2b2b8283cbca220b9a  gcc/config/riscv/sync-ztso.md
*************** bc9e0f6e45851cb27855fbd19172bf5e  gcc/co
*** 5128,5134 ****
  a95321fbec5a4da32a9ee8145b8b0c6d  gcc/config/riscv/tt-ascalon-d8.md
  dcbac9d3c6831ff1cd18effca9c7bb28  gcc/config/riscv/vector-bfloat16.md
  1efc7e76b1f8a6c41de01fba7e0d33b9  gcc/config/riscv/vector-crypto.md
! 604805ea8530b1a6391150e8388a63fb  gcc/config/riscv/vector-iterators.md
  9da46a6ebcde869935ad8f8549accf3e  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  39ba96197510d4ac114a827d7ffbf806  gcc/config/riscv/zc.md
--- 5128,5134 ----
  a95321fbec5a4da32a9ee8145b8b0c6d  gcc/config/riscv/tt-ascalon-d8.md
  dcbac9d3c6831ff1cd18effca9c7bb28  gcc/config/riscv/vector-bfloat16.md
  1efc7e76b1f8a6c41de01fba7e0d33b9  gcc/config/riscv/vector-crypto.md
! c78bb4f6b9379604f64af243304b4a95  gcc/config/riscv/vector-iterators.md
  9da46a6ebcde869935ad8f8549accf3e  gcc/config/riscv/vector.md
  18d213c106fe52eebc74017d5ff892ce  gcc/config/riscv/xiangshan.md
  39ba96197510d4ac114a827d7ffbf806  gcc/config/riscv/zc.md
*************** efc4d9cc6fcf24af7ea6e89c0c82127f  gcc/co
*** 5171,5177 ****
  1d313bdc511e984bdf559d61807bde14  gcc/config/rs6000/aix73.h
  ae4bd752599ffdd2833c6e78d03d39f0  gcc/config/rs6000/altivec.h
  f03bdef1224a610cfb7130f3c687b87f  gcc/config/rs6000/altivec.md
! 059307efbb31814d946437a40ade09c1  gcc/config/rs6000/amo.h
  2b409a82a1747675112a04705e01d157  gcc/config/rs6000/biarch64.h
  f83fd3bf0d9fbc30c9401eec549fdc2c  gcc/config/rs6000/bmi2intrin.h
  161814e9f6f10782769302881ac26227  gcc/config/rs6000/bmiintrin.h
--- 5171,5177 ----
  1d313bdc511e984bdf559d61807bde14  gcc/config/rs6000/aix73.h
  ae4bd752599ffdd2833c6e78d03d39f0  gcc/config/rs6000/altivec.h
  f03bdef1224a610cfb7130f3c687b87f  gcc/config/rs6000/altivec.md
! 763da8b6742a2397a31b57728140d44f  gcc/config/rs6000/amo.h
  2b409a82a1747675112a04705e01d157  gcc/config/rs6000/biarch64.h
  f83fd3bf0d9fbc30c9401eec549fdc2c  gcc/config/rs6000/bmi2intrin.h
  161814e9f6f10782769302881ac26227  gcc/config/rs6000/bmiintrin.h
*************** d3a1c98fd13be04e1250b073cb8dcef2  gcc/co
*** 5259,5265 ****
  835f22c956cc4deb83970ee9a9b5b79b  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
  4e95fc675ae78a931fed1e8424322497  gcc/config/rs6000/rs6000.cc
! 1fe32d82d416dcd84f66e1535442f5be  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
  e407423336f12658b509205c3e8f7130  gcc/config/rs6000/rs6000.opt
  80708ca71755b0d8d354f113f0617617  gcc/config/rs6000/rs6000.opt.urls
--- 5259,5265 ----
  835f22c956cc4deb83970ee9a9b5b79b  gcc/config/rs6000/rs6000-tables.opt
  ce8de9a27f36b759a69194616c02eb38  gcc/config/rs6000/rs6000-tables.opt.urls
  4e95fc675ae78a931fed1e8424322497  gcc/config/rs6000/rs6000.cc
! 59b4ee08f651c3f48e6a52091e6911f0  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
  e407423336f12658b509205c3e8f7130  gcc/config/rs6000/rs6000.opt
  80708ca71755b0d8d354f113f0617617  gcc/config/rs6000/rs6000.opt.urls
*************** be88b902c0fc07fc260a843e527ad245  gcc/co
*** 5324,5330 ****
  59ddeb68971245eee8a59e9be4929548  gcc/config/rx/rx-modes.def
  c7cc18c3c6e80f769c4e27296c120108  gcc/config/rx/rx-opts.h
  32245191419a45d03aadb4ced52df7db  gcc/config/rx/rx-protos.h
! d0c6f5a09c1c53eaf8ccf2b5113fce61  gcc/config/rx/rx.cc
  86ad9c6dae7eb8996bb9acae9eccff8d  gcc/config/rx/rx.h
  b13db7b01f1e7237be69d6d38b7a41a1  gcc/config/rx/rx.md
  0329c06217618ce2a83cd6bbd4458da8  gcc/config/rx/rx.opt
--- 5324,5330 ----
  59ddeb68971245eee8a59e9be4929548  gcc/config/rx/rx-modes.def
  c7cc18c3c6e80f769c4e27296c120108  gcc/config/rx/rx-opts.h
  32245191419a45d03aadb4ced52df7db  gcc/config/rx/rx-protos.h
! 633e64c754756983e8a15fc510f949f5  gcc/config/rx/rx.cc
  86ad9c6dae7eb8996bb9acae9eccff8d  gcc/config/rx/rx.h
  b13db7b01f1e7237be69d6d38b7a41a1  gcc/config/rx/rx.md
  0329c06217618ce2a83cd6bbd4458da8  gcc/config/rx/rx.opt
*************** c5ad0142a191862e3e81ecd3573754b3  gcc/co
*** 5639,5645 ****
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  c10700723a41c720aada0096f369147e  gcc/coverage.cc
  d27317cee558d7c78afbdb6529e36649  gcc/coverage.h
! a2a4f641e4f726e6957801a846f5763c  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5639,5645 ----
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  c10700723a41c720aada0096f369147e  gcc/coverage.cc
  d27317cee558d7c78afbdb6529e36649  gcc/coverage.h
! a7d29c4e60d8c613a8a112cf23c71e85  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** d9b8a76735523ab737e8778b90397d97  gcc/cp
*** 5679,5691 ****
  b1ea0d0ed485b0b4279a7cacc155dd5e  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
! c4bf6272ee9cceeb6e34829ccb897c20  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! ed32e34464fd7bb2f88fd544984a7c96  gcc/cp/constexpr.cc
  44493039c741da0cbddb5a8d6d93701a  gcc/cp/constraint.cc
  ab81cc984e2b72c49098e64c4e798924  gcc/cp/contracts.cc
  e77a681f560f3e9500f126febdc67ef6  gcc/cp/contracts.h
! 09f3bdbdbcddf3dc68d265ab0a59a38e  gcc/cp/coroutines.cc
  1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
  b272581f7dd151ffe535478341d8cd91  gcc/cp/cp-gimplify.cc
  5deb6a9935508ca534b8ee8e84b2a1cc  gcc/cp/cp-lang.cc
--- 5679,5691 ----
  b1ea0d0ed485b0b4279a7cacc155dd5e  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
! 0e4d1cefd3c955c0eb5653b4fd9d708e  gcc/cp/class.cc
  e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! 653211caae6d6eadba46b3ed266e88e8  gcc/cp/constexpr.cc
  44493039c741da0cbddb5a8d6d93701a  gcc/cp/constraint.cc
  ab81cc984e2b72c49098e64c4e798924  gcc/cp/contracts.cc
  e77a681f560f3e9500f126febdc67ef6  gcc/cp/contracts.h
! 2c739bee3062dd41503bb96cf36f8028  gcc/cp/coroutines.cc
  1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
  b272581f7dd151ffe535478341d8cd91  gcc/cp/cp-gimplify.cc
  5deb6a9935508ca534b8ee8e84b2a1cc  gcc/cp/cp-lang.cc
*************** eba8d8a1725223519fba5d4d69afd5c9  gcc/cp
*** 5694,5700 ****
  a2555a7340b152d673783c07a3d102bb  gcc/cp/cp-objcp-common.h
  ffdd05782c93c0567486bb7ed7eee65a  gcc/cp/cp-trait.def
  bc9b29434f2e35fa68caf656161b5c0f  gcc/cp/cp-tree.def
! 0564f01ad8c6a35c8b8e66de3d08697e  gcc/cp/cp-tree.h
  e2854dfa428fab45fc41bf58fef71e61  gcc/cp/cp-ubsan.cc
  0f660920514d4f51007f6841a25e3af6  gcc/cp/cvt.cc
  f067718cf3d629084d8347c4e017afd4  gcc/cp/cxx-pretty-print.cc
--- 5694,5700 ----
  a2555a7340b152d673783c07a3d102bb  gcc/cp/cp-objcp-common.h
  ffdd05782c93c0567486bb7ed7eee65a  gcc/cp/cp-trait.def
  bc9b29434f2e35fa68caf656161b5c0f  gcc/cp/cp-tree.def
! fa2fb628e3a95909bd2ebcc177bd27f9  gcc/cp/cp-tree.h
  e2854dfa428fab45fc41bf58fef71e61  gcc/cp/cp-ubsan.cc
  0f660920514d4f51007f6841a25e3af6  gcc/cp/cvt.cc
  f067718cf3d629084d8347c4e017afd4  gcc/cp/cxx-pretty-print.cc
*************** ba2d3d3cac80668633567991a4d6b77c  gcc/cp
*** 5706,5717 ****
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
  e5cd674ba89cede50da369b84db82527  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
! 70f36ac126d5a18ee7be5d40cf58c2c9  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
  014d3891b4172014c0ad5386223c4f4c  gcc/cp/g++spec.cc
  a29b3e9192657e81a1574fb99466348d  gcc/cp/gen-cxxapi-file.py
  b9032a113a137533247a90fda508e897  gcc/cp/init.cc
! 99eccf5dfaca355dd6a7dc943793429f  gcc/cp/lambda.cc
  bc388fb8287f2de7cdf4d78eb8f5d998  gcc/cp/lang-specs.h
  ae7c1d49c3ae546f4a980c3ebc22690d  gcc/cp/lex.cc
  e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp/logic.cc
--- 5706,5717 ----
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
  e5cd674ba89cede50da369b84db82527  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
! 2e851309e83b69af8e26686d1973a6ac  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
  014d3891b4172014c0ad5386223c4f4c  gcc/cp/g++spec.cc
  a29b3e9192657e81a1574fb99466348d  gcc/cp/gen-cxxapi-file.py
  b9032a113a137533247a90fda508e897  gcc/cp/init.cc
! 3cc97a4224ad8d5294fa1a55f8777b44  gcc/cp/lambda.cc
  bc388fb8287f2de7cdf4d78eb8f5d998  gcc/cp/lang-specs.h
  ae7c1d49c3ae546f4a980c3ebc22690d  gcc/cp/lex.cc
  e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp/logic.cc
*************** e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp
*** 5721,5740 ****
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
  54609938d396496c7c5bf3f4cbfddaec  gcc/cp/metafns.gperf
  04fe5bec0bf79fcb3680aec9913ebc29  gcc/cp/metafns.h
! db73ab5285dd3810cd91cb42aa475df5  gcc/cp/method.cc
  eb53b711377a0f71ba9361d9eda0ba85  gcc/cp/module.cc
  494ca3762571a1d445b5a971b5030667  gcc/cp/name-lookup.cc
  b166c2ce3d5ccd4de4e0c5910947ae41  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! b45715501a78fd237bfa8ce5b0880fb0  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! 4b55194cee4c39f6a32146b667a79b17  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
  72fcee9ba0fb3b355f46ca101677c03f  gcc/cp/reflect.cc
  6ae3f1ff3ba804579da14445501f9181  gcc/cp/rtti.cc
  0cfaf9712b89bed5d7abc7832ea0bf8b  gcc/cp/search.cc
! bd1dcbac0dc7624ca4cb36430a3c35b9  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
  ea0423d5516e1f1e195b6f19be779643  gcc/cp/tree.cc
--- 5721,5740 ----
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
  54609938d396496c7c5bf3f4cbfddaec  gcc/cp/metafns.gperf
  04fe5bec0bf79fcb3680aec9913ebc29  gcc/cp/metafns.h
! 825d20cde6e92a291621480c8008782d  gcc/cp/method.cc
  eb53b711377a0f71ba9361d9eda0ba85  gcc/cp/module.cc
  494ca3762571a1d445b5a971b5030667  gcc/cp/name-lookup.cc
  b166c2ce3d5ccd4de4e0c5910947ae41  gcc/cp/name-lookup.h
  b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! e2aa80d45acfe84107bca9828fcf2ab6  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! e235a1cb2a66154f12d34e02469056c7  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
  72fcee9ba0fb3b355f46ca101677c03f  gcc/cp/reflect.cc
  6ae3f1ff3ba804579da14445501f9181  gcc/cp/rtti.cc
  0cfaf9712b89bed5d7abc7832ea0bf8b  gcc/cp/search.cc
! 145d5fe985d755faeb6dd39d4985b33f  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
  ea0423d5516e1f1e195b6f19be779643  gcc/cp/tree.cc
*************** ea0423d5516e1f1e195b6f19be779643  gcc/cp
*** 5750,5757 ****
  bb146ea57855f57a97f23f7c748b05ed  gcc/crc-verification.cc
  b7bf54d1a28938f620902d5d360e7000  gcc/crc-verification.h
  49974d59646cd203c929fb8809ee8812  gcc/cse.cc
! d8e63039ff02f156025e0e64f467b032  gcc/cselib.cc
! f4482f497f6e3a2eae101f16c79b4b27  gcc/cselib.h
  1ded054093de910d9786c62bc4fe8cc6  gcc/cstamp-h.in
  4d5ff4ad7f83cad2fff66caccde0780f  gcc/ctfc.cc
  21aa4df3b0a04c61dfb56d24a5e49e90  gcc/ctfc.h
--- 5750,5757 ----
  bb146ea57855f57a97f23f7c748b05ed  gcc/crc-verification.cc
  b7bf54d1a28938f620902d5d360e7000  gcc/crc-verification.h
  49974d59646cd203c929fb8809ee8812  gcc/cse.cc
! 0ff312105ad547eae1f9fee00b33c178  gcc/cselib.cc
! a992c36510202d05f89b17b2c68d4694  gcc/cselib.h
  1ded054093de910d9786c62bc4fe8cc6  gcc/cstamp-h.in
  4d5ff4ad7f83cad2fff66caccde0780f  gcc/ctfc.cc
  21aa4df3b0a04c61dfb56d24a5e49e90  gcc/ctfc.h
*************** c1ba108db39c2659b939d1a8a6cba51d  gcc/di
*** 6108,6114 ****
  80cd25171e4056b26c59c89d93ca6249  gcc/diagnostics/url.h
  0956a36149562ea551a09ab40c4ebe4b  gcc/digraph.cc
  d6ecd8aebafe1dbfb0bbadb8dd0883f9  gcc/digraph.h
! 31a6e794b23ff241bcbf29afa6a07b83  gcc/doc/analyzer.texi
  cc657ccd366b9f0e48a9558ccdd011f7  gcc/doc/avr-mmcu.texi
  2581a0356eecad7492c6033a42d08375  gcc/doc/bugreport.texi
  07178e2656fefca3307281845df4b4dd  gcc/doc/cfg.texi
--- 6108,6114 ----
  80cd25171e4056b26c59c89d93ca6249  gcc/diagnostics/url.h
  0956a36149562ea551a09ab40c4ebe4b  gcc/digraph.cc
  d6ecd8aebafe1dbfb0bbadb8dd0883f9  gcc/digraph.h
! dd4c6bc90aeb0a46549b30e86a6ce098  gcc/doc/analyzer.texi
  cc657ccd366b9f0e48a9558ccdd011f7  gcc/doc/avr-mmcu.texi
  2581a0356eecad7492c6033a42d08375  gcc/doc/bugreport.texi
  07178e2656fefca3307281845df4b4dd  gcc/doc/cfg.texi
*************** ee65c9e3e7c3fb1fd0128c23f4130e51  gcc/do
*** 6124,6130 ****
  301ed7e567732d1f0d5899a624068bdd  gcc/doc/cppinternals.texi
  421cc3b7d98386e0eb0abba4242dd54a  gcc/doc/cppopts.texi
  d8b2becdc7d9c570f256e19e1b1ac4f1  gcc/doc/cppwarnopts.texi
! 6157b0f85cc0d578d6a4711c34ffccd1  gcc/doc/extend.texi
  483a7b956113f0370528460e842ff7b0  gcc/doc/fragments.texi
  7fb1e4199b2e70228fda69b8065d83c4  gcc/doc/frontends.texi
  66d5868616d429f3e34b575b3efc6ccc  gcc/doc/gcc.texi
--- 6124,6130 ----
  301ed7e567732d1f0d5899a624068bdd  gcc/doc/cppinternals.texi
  421cc3b7d98386e0eb0abba4242dd54a  gcc/doc/cppopts.texi
  d8b2becdc7d9c570f256e19e1b1ac4f1  gcc/doc/cppwarnopts.texi
! ac539ce01ddbd1c39073f4a43e42859c  gcc/doc/extend.texi
  483a7b956113f0370528460e842ff7b0  gcc/doc/fragments.texi
  7fb1e4199b2e70228fda69b8065d83c4  gcc/doc/frontends.texi
  66d5868616d429f3e34b575b3efc6ccc  gcc/doc/gcc.texi
*************** bde53a0a190c3a74b047eb2b53c080eb  gcc/do
*** 6147,6155 ****
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! 32f1a3db712ba5b76d74729eef677eda  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 0cbe2b9bef34f74917051c77019ea095  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 6147,6155 ----
  37d898a82683588b62cca104098ad182  gcc/doc/include/gcc-common.texi
  95c90bf85d3eab67f348ee3ce0bf4050  gcc/doc/include/gpl_v3.texi
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
! 270ba5ad2dc45adcd14baf5eee8e36e1  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! da8d322cc4d84b4c2d81e6364bd93604  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** f7e932ab983b28cd4bef523021fa9eb0  gcc/do
*** 6191,6204 ****
  afaf0b9b413500a77920c3963dcd3978  gcc/doc/objc.texi
  79e8babebb4a40553fc011874ac21cbb  gcc/doc/optinfo.texi
  3abb75ff788f5434702f351bf7a279c9  gcc/doc/options.texi
! f18e2b6805fc6e4c9bdcf09d37e2d83c  gcc/doc/params.texi
  4f849b8e491aa0fa8b80c3cefe9dc5ec  gcc/doc/passes.texi
  e54937e427a2584ac4045286c725fab1  gcc/doc/plugins.texi
  88abde052db83cafaf5aaa6be0471613  gcc/doc/poly-int.texi
  213ccf5a355e5d07fc0dcef29825d6dd  gcc/doc/portability.texi
  b309bd48592e052da0d197f2de333d20  gcc/doc/riscv-ext.texi
! 223ad6aa09ad7d9a5bdba4f529e06349  gcc/doc/riscv-mcpu.texi
! f49c748c83e03c288e9ae95bffd4bfba  gcc/doc/riscv-mtune.texi
  3057c119b16a51b960d234c71641cd8c  gcc/doc/rtl.texi
  b12261ad56bcabd07b4a1b739f271527  gcc/doc/service.texi
  f7ed55f72c884c3d87eeef4192401eaf  gcc/doc/sourcebuild.texi
--- 6191,6204 ----
  afaf0b9b413500a77920c3963dcd3978  gcc/doc/objc.texi
  79e8babebb4a40553fc011874ac21cbb  gcc/doc/optinfo.texi
  3abb75ff788f5434702f351bf7a279c9  gcc/doc/options.texi
! 7d9ddf963eb00b03f21fb0ed3956dd00  gcc/doc/params.texi
  4f849b8e491aa0fa8b80c3cefe9dc5ec  gcc/doc/passes.texi
  e54937e427a2584ac4045286c725fab1  gcc/doc/plugins.texi
  88abde052db83cafaf5aaa6be0471613  gcc/doc/poly-int.texi
  213ccf5a355e5d07fc0dcef29825d6dd  gcc/doc/portability.texi
  b309bd48592e052da0d197f2de333d20  gcc/doc/riscv-ext.texi
! b956a94b6aa45d1ba82e9e5e22386cc2  gcc/doc/riscv-mcpu.texi
! 0a0e5a4479873eec073ad440f5a5ec5b  gcc/doc/riscv-mtune.texi
  3057c119b16a51b960d234c71641cd8c  gcc/doc/rtl.texi
  b12261ad56bcabd07b4a1b739f271527  gcc/doc/service.texi
  f7ed55f72c884c3d87eeef4192401eaf  gcc/doc/sourcebuild.texi
*************** c84360f0ac80eeea4d03d024a7641faf  gcc/do
*** 6218,6225 ****
  50c271e098547a346cc0c60c44429606  gcc/double-int.cc
  f5408da3ae295306d302b711e20589dd  gcc/double-int.h
  3e504c158ca95274231f719168303b88  gcc/dse.cc
! ca6a1fb79f0e812d961d3fcb6398aa54  gcc/dump-context.h
! 2a26e65e7e022371aacb41a45aafc234  gcc/dumpfile.cc
  92a769cfebe5826f371d353067aa45fa  gcc/dumpfile.h
  47fa43c05c1d54137379611522cdaa28  gcc/dwarf2asm.cc
  3e33ddcae27cd933ce3db85c55b25274  gcc/dwarf2asm.h
--- 6218,6225 ----
  50c271e098547a346cc0c60c44429606  gcc/double-int.cc
  f5408da3ae295306d302b711e20589dd  gcc/double-int.h
  3e504c158ca95274231f719168303b88  gcc/dse.cc
! 2d5aa8f576bf21bd67a37a9ad393918e  gcc/dump-context.h
! 5bd0366d25235123df3e7bf87b005dfc  gcc/dumpfile.cc
  92a769cfebe5826f371d353067aa45fa  gcc/dumpfile.h
  47fa43c05c1d54137379611522cdaa28  gcc/dwarf2asm.cc
  3e33ddcae27cd933ce3db85c55b25274  gcc/dwarf2asm.h
*************** a6c484f3c915c3d2ca47c185e95fbba4  gcc/dw
*** 6231,6237 ****
  dff5b9260564a82b1706e5fb186081f2  gcc/dwarf2out.cc
  5df3b4a58dc58c2bfafddd393d55496b  gcc/dwarf2out.h
  5f6d1c1c6b68b50c4051ffa41f4aed26  gcc/early-remat.cc
! db4d79959e99b05eb2b5704c5e7c3bcb  gcc/emit-rtl.cc
  3a8bc8b3a566860136261e030d4ea6fa  gcc/emit-rtl.h
  ebdcfebb5ff512939950e137b9ec8877  gcc/errors.cc
  9b42baa30cba169cfdb199b0368ebbff  gcc/errors.h
--- 6231,6237 ----
  dff5b9260564a82b1706e5fb186081f2  gcc/dwarf2out.cc
  5df3b4a58dc58c2bfafddd393d55496b  gcc/dwarf2out.h
  5f6d1c1c6b68b50c4051ffa41f4aed26  gcc/early-remat.cc
! 7123ceef1a8541a7ed43b2846ee4b5ac  gcc/emit-rtl.cc
  3a8bc8b3a566860136261e030d4ea6fa  gcc/emit-rtl.h
  ebdcfebb5ff512939950e137b9ec8877  gcc/errors.cc
  9b42baa30cba169cfdb199b0368ebbff  gcc/errors.h
*************** d61f76c4b55102abe0d6908ab60489e7  gcc/ex
*** 6245,6253 ****
  9542db78094e70fd18442ce8a2b02264  gcc/explow.h
  a1086b579ca0cf41bca92db8032dd9b7  gcc/expmed.cc
  2431f17e1f416ef0b9c38b1b975942a4  gcc/expmed.h
! 3f088ab79926ed4fb59cd6ff66a8f29b  gcc/expr.cc
! 69a1518b8526107d4b43d02a5920898b  gcc/expr.h
! 9f248454f2ad0895075965174d32b045  gcc/ext-dce.cc
  8ca3dbbcb4ffeb7bd2c8f46140869732  gcc/fibonacci_heap.cc
  3c351443d52500c559f1f91eb65b96c2  gcc/fibonacci_heap.h
  e0210f6d49bd9ceab84ba5169fbcfc99  gcc/file-find.cc
--- 6245,6253 ----
  9542db78094e70fd18442ce8a2b02264  gcc/explow.h
  a1086b579ca0cf41bca92db8032dd9b7  gcc/expmed.cc
  2431f17e1f416ef0b9c38b1b975942a4  gcc/expmed.h
! afbd1e926b92074ac27962e47155fec8  gcc/expr.cc
! ca4a759ee689223d3551cae34e997224  gcc/expr.h
! b5fd57ebab33a457723926798d94c49d  gcc/ext-dce.cc
  8ca3dbbcb4ffeb7bd2c8f46140869732  gcc/fibonacci_heap.cc
  3c351443d52500c559f1f91eb65b96c2  gcc/fibonacci_heap.h
  e0210f6d49bd9ceab84ba5169fbcfc99  gcc/file-find.cc
*************** b4a18c8d0dacb99b95b772e94f976754  gcc/fi
*** 6261,6270 ****
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  ba649054d339863338ad87cb27555a9e  gcc/fold-const-call.cc
  0b4405bca4b699887c6a47e1d25b216c  gcc/fold-const-call.h
! 2fb6ace934b6ce40a167c32aae14cc4f  gcc/fold-const.cc
! 0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  503251519661f1768b70d9b424bdc12b  gcc/fold-mem-offsets.cc
! 616875bb874dec6652e03bdcdd790b6d  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6261,6270 ----
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  ba649054d339863338ad87cb27555a9e  gcc/fold-const-call.cc
  0b4405bca4b699887c6a47e1d25b216c  gcc/fold-const-call.h
! 3f13f0cb854ab1bf617663770dfcc452  gcc/fold-const.cc
! 6cfa2279468aef932ad5b38161676a4a  gcc/fold-const.h
  503251519661f1768b70d9b424bdc12b  gcc/fold-mem-offsets.cc
! c7ba3294c06b7c6319958a5829e67bb4  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** ac7321680382b23989a6637e02dfb80e  gcc/fo
*** 6309,6330 ****
  5a7ed10c5ba4df056e9493db69e95e52  gcc/fortran/decl.cc
  92ac8b7c0f5e7976d4cd1297e9eb18c1  gcc/fortran/dependency.cc
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
! 3d1d73c0ff90501d54be1a709f85d957  gcc/fortran/dump-parse-tree.cc
  65aa25da09bdeee948cdad39cfc4d960  gcc/fortran/error.cc
  8b02343f75ef7cf3f9a4b9e0599abadc  gcc/fortran/expr.cc
  354927f6cb797cd538c0ab8ab0e552bb  gcc/fortran/f95-lang.cc
! 8deeb2cd64fc2b8bf4cf1cd6a550e5da  gcc/fortran/frontend-passes.cc
  c85c9309a4274609c6ff6466621c90f6  gcc/fortran/gfc-diagnostic.def
  afb07146daad7f36a59c52e053f6772f  gcc/fortran/gfc-internals.texi
! fb340ceb83b10b02014df97dbfc1a623  gcc/fortran/gfortran.h
! 4b41c64e656ca5096ae5a265ff7b2116  gcc/fortran/gfortran.texi
  99d4834014e20be40fdfc7584b7256af  gcc/fortran/gfortranspec.cc
  71e194a5a481bd98cbc9644668c8cebb  gcc/fortran/interface.cc
  7e06cc5337aba27172fe64c673314c64  gcc/fortran/intrinsic.cc
  285cce3e348dd08fbaf339358ac57d51  gcc/fortran/intrinsic.h
! 84d7151d1a1767da191af24883d28b18  gcc/fortran/intrinsic.texi
! c0b28df69feb22bcafd8aac543dd4fba  gcc/fortran/invoke.texi
! 381e1132c2b9f3171ccfce24fbd47ba2  gcc/fortran/io.cc
  02af2e093ad4f92649a6370fa6dc3215  gcc/fortran/ioparm.def
  1e9a62cdd76fcac49d91728090a8b2f6  gcc/fortran/iresolve.cc
  943be43e521f4084734d183ff4a4fe5e  gcc/fortran/iso-c-binding.def
--- 6309,6330 ----
  5a7ed10c5ba4df056e9493db69e95e52  gcc/fortran/decl.cc
  92ac8b7c0f5e7976d4cd1297e9eb18c1  gcc/fortran/dependency.cc
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
! 831f7a72321d9311f543bb976cc466b3  gcc/fortran/dump-parse-tree.cc
  65aa25da09bdeee948cdad39cfc4d960  gcc/fortran/error.cc
  8b02343f75ef7cf3f9a4b9e0599abadc  gcc/fortran/expr.cc
  354927f6cb797cd538c0ab8ab0e552bb  gcc/fortran/f95-lang.cc
! 51a6693c56a7d604b57ea86b0365f060  gcc/fortran/frontend-passes.cc
  c85c9309a4274609c6ff6466621c90f6  gcc/fortran/gfc-diagnostic.def
  afb07146daad7f36a59c52e053f6772f  gcc/fortran/gfc-internals.texi
! 59c416c3b53ff154370b8dfc307af1b5  gcc/fortran/gfortran.h
! 8fe0c8cc43e7ed982c602f58b4086351  gcc/fortran/gfortran.texi
  99d4834014e20be40fdfc7584b7256af  gcc/fortran/gfortranspec.cc
  71e194a5a481bd98cbc9644668c8cebb  gcc/fortran/interface.cc
  7e06cc5337aba27172fe64c673314c64  gcc/fortran/intrinsic.cc
  285cce3e348dd08fbaf339358ac57d51  gcc/fortran/intrinsic.h
! 829931e933b68aff1a07db22d5069fce  gcc/fortran/intrinsic.texi
! 08173dc36d9f81571538f5851a28ce44  gcc/fortran/invoke.texi
! b08b0f68a74bf3f059116de701943352  gcc/fortran/io.cc
  02af2e093ad4f92649a6370fa6dc3215  gcc/fortran/ioparm.def
  1e9a62cdd76fcac49d91728090a8b2f6  gcc/fortran/iresolve.cc
  943be43e521f4084734d183ff4a4fe5e  gcc/fortran/iso-c-binding.def
*************** e5c0565c05cf7375c9978273f2e553e7  gcc/fo
*** 6333,6355 ****
  60c89ecec65ed7cb49e8feee80963cee  gcc/fortran/lang.opt
  d00392d3f6683071d547134f20687f32  gcc/fortran/lang.opt.urls
  c35102e7caaf40998fe2ead86d2716da  gcc/fortran/libgfortran.h
! 65f90f9c2a688a7522b81ce17d81ae93  gcc/fortran/match.cc
! f7735c64af748cdef5caffae58a94749  gcc/fortran/match.h
  bf54232c4c950ed772f4964c4f79629e  gcc/fortran/matchexp.cc
  915f6b30a8c22a5fea18690269a5a4a4  gcc/fortran/mathbuiltins.def
  9687294592a5ccef5d0b8254ab33816b  gcc/fortran/misc.cc
  a465af66dbc504ea8aab1ad5d516072d  gcc/fortran/module.cc
! e2a44896b23e988d9494957a8fa9b066  gcc/fortran/openmp.cc
  7baca4fc0a6fcd712dcbccab22987c74  gcc/fortran/options.cc
! 22050427a75e58c301664b6859f72718  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
  f8f17e966c9b06f3143a910582383fb7  gcc/fortran/primary.cc
! 8eb968b92162a0e7c50a4b370bc31fd6  gcc/fortran/resolve.cc
  e23f6eefa51bb3b4caa3d75c0409cfcd  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  664f19f5a29de9abc4642568f758c47c  gcc/fortran/simplify.cc
  2155dafc4405ccdc4c41df7a1a31a496  gcc/fortran/st.cc
! ef5ff085d6f19e0b84135e46b7281b70  gcc/fortran/symbol.cc
  4fa06f769be3f1b439a574ee842c82ca  gcc/fortran/target-memory.cc
  ea8837444e2a08a95a3ea747c94b8106  gcc/fortran/target-memory.h
  40cb236ccb42c8f778d277fc59baaae9  gcc/fortran/trans-array.cc
--- 6333,6355 ----
  60c89ecec65ed7cb49e8feee80963cee  gcc/fortran/lang.opt
  d00392d3f6683071d547134f20687f32  gcc/fortran/lang.opt.urls
  c35102e7caaf40998fe2ead86d2716da  gcc/fortran/libgfortran.h
! 2eb2009dd3b44153bd97a223b3facfa0  gcc/fortran/match.cc
! 0971e0098b3cb0240602494090ed164b  gcc/fortran/match.h
  bf54232c4c950ed772f4964c4f79629e  gcc/fortran/matchexp.cc
  915f6b30a8c22a5fea18690269a5a4a4  gcc/fortran/mathbuiltins.def
  9687294592a5ccef5d0b8254ab33816b  gcc/fortran/misc.cc
  a465af66dbc504ea8aab1ad5d516072d  gcc/fortran/module.cc
! 0d9c24e806a25e78eef88ad83978fd48  gcc/fortran/openmp.cc
  7baca4fc0a6fcd712dcbccab22987c74  gcc/fortran/options.cc
! b40c17cd1d9a12d2e21b95f8bf7415d5  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
  f8f17e966c9b06f3143a910582383fb7  gcc/fortran/primary.cc
! ea3aa90b54f7eda5021a8465d75e012d  gcc/fortran/resolve.cc
  e23f6eefa51bb3b4caa3d75c0409cfcd  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  664f19f5a29de9abc4642568f758c47c  gcc/fortran/simplify.cc
  2155dafc4405ccdc4c41df7a1a31a496  gcc/fortran/st.cc
! dd23a8a9fb10b9d827d59834b76ab375  gcc/fortran/symbol.cc
  4fa06f769be3f1b439a574ee842c82ca  gcc/fortran/target-memory.cc
  ea8837444e2a08a95a3ea747c94b8106  gcc/fortran/target-memory.h
  40cb236ccb42c8f778d277fc59baaae9  gcc/fortran/trans-array.cc
*************** a0c40b654df0b5c5213047d26e48e97a  gcc/fo
*** 6358,6372 ****
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
  8122b7fcee76ae037d67925b0b8cd603  gcc/fortran/trans-decl.cc
! 7587366d5466b3ccf2ecc3152adf9e0c  gcc/fortran/trans-expr.cc
  cf1cd2d936d63b4a12209bc73b627e02  gcc/fortran/trans-intrinsic.cc
  269d2b121570a82898b133a3274071a7  gcc/fortran/trans-io.cc
! c4ba88375ce7b5ce186cabd6fe8f515b  gcc/fortran/trans-openmp.cc
  974f8aeec761eac4ee1be974addd51d5  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  f8cac5e2268c177aff676d2dbb690f51  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
! 4cfc28dee8f1def4055b24dcd44fe9b9  gcc/fortran/trans.cc
  a5464198aa6b5015fdf27b2e0f276290  gcc/fortran/trans.h
  95f35aeb3293f3036414b45c9c749d61  gcc/fortran/trigd_fe.inc
  57ebe36e9e77bcb8eab87809d044e0f1  gcc/fortran/types.def
--- 6358,6372 ----
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
  8122b7fcee76ae037d67925b0b8cd603  gcc/fortran/trans-decl.cc
! 9a100cde4a4242cae5a422461de8a1e4  gcc/fortran/trans-expr.cc
  cf1cd2d936d63b4a12209bc73b627e02  gcc/fortran/trans-intrinsic.cc
  269d2b121570a82898b133a3274071a7  gcc/fortran/trans-io.cc
! 1904a94ad6abf7e05b8007368192d4d4  gcc/fortran/trans-openmp.cc
  974f8aeec761eac4ee1be974addd51d5  gcc/fortran/trans-stmt.cc
  6fbc90714f9730e84515bbaadff313f9  gcc/fortran/trans-stmt.h
  f8cac5e2268c177aff676d2dbb690f51  gcc/fortran/trans-types.cc
  6b00c9b76b80a96feb87d86b4b06102b  gcc/fortran/trans-types.h
! ecdc6bc7300ce96c67547c6f3af18597  gcc/fortran/trans.cc
  a5464198aa6b5015fdf27b2e0f276290  gcc/fortran/trans.h
  95f35aeb3293f3036414b45c9c749d61  gcc/fortran/trigd_fe.inc
  57ebe36e9e77bcb8eab87809d044e0f1  gcc/fortran/types.def
*************** e8ef831ecab58724c781ef6c239eb959  gcc/gi
*** 6456,6463 ****
  98c92461c94c7a7e1f7c09e62e05167f  gcc/gimple-crc-optimization.cc
  e33888307c479ce11d601ebd8fc8f0af  gcc/gimple-expr.cc
  61721564f913cdbebe438f7c378b316e  gcc/gimple-expr.h
! e78fee3b3e034e6f9747efbb63ec2633  gcc/gimple-fold.cc
! d4285bef3fb661843b5d37c21e759c95  gcc/gimple-fold.h
  109e0f96a9d27a8a25bb73d61b701bbc  gcc/gimple-harden-conditionals.cc
  ebf0fc6c9a10c730d10710fdec206805  gcc/gimple-harden-control-flow.cc
  d84e22c142fb0213a6e5c1fcee858bb7  gcc/gimple-if-to-switch.cc
--- 6456,6463 ----
  98c92461c94c7a7e1f7c09e62e05167f  gcc/gimple-crc-optimization.cc
  e33888307c479ce11d601ebd8fc8f0af  gcc/gimple-expr.cc
  61721564f913cdbebe438f7c378b316e  gcc/gimple-expr.h
! e20e41ef01b376af7bd7320578cbf4b4  gcc/gimple-fold.cc
! ae37e021ec4849550d7598ecdd2faeb4  gcc/gimple-fold.h
  109e0f96a9d27a8a25bb73d61b701bbc  gcc/gimple-harden-conditionals.cc
  ebf0fc6c9a10c730d10710fdec206805  gcc/gimple-harden-control-flow.cc
  d84e22c142fb0213a6e5c1fcee858bb7  gcc/gimple-if-to-switch.cc
*************** cc3bc9f050d83e91dde135d1aaa4aa45  gcc/gi
*** 6484,6490 ****
  fed39c5b7ccbe9fef78cb20fe5a094d8  gcc/gimple-range-cache.h
  d69dec8fe89be66b09721beced1a6f07  gcc/gimple-range-edge.cc
  1001ed4a3c498c8d659f609b65b1b127  gcc/gimple-range-edge.h
! 8460db5e163737abbfe8e969a2f48e81  gcc/gimple-range-fold.cc
  c84294b3bbebf60858449ae953fae160  gcc/gimple-range-fold.h
  314d9122c0deb103438e02976c279fff  gcc/gimple-range-gori.cc
  3f397ecbcf642d6d782fe5e774680054  gcc/gimple-range-gori.h
--- 6484,6490 ----
  fed39c5b7ccbe9fef78cb20fe5a094d8  gcc/gimple-range-cache.h
  d69dec8fe89be66b09721beced1a6f07  gcc/gimple-range-edge.cc
  1001ed4a3c498c8d659f609b65b1b127  gcc/gimple-range-edge.h
! 6a5982046b25df0a70a983f9ea49a38e  gcc/gimple-range-fold.cc
  c84294b3bbebf60858449ae953fae160  gcc/gimple-range-fold.h
  314d9122c0deb103438e02976c279fff  gcc/gimple-range-gori.cc
  3f397ecbcf642d6d782fe5e774680054  gcc/gimple-range-gori.h
*************** fd706cd70d2b5c6a514eef109a117112  gcc/gi
*** 6528,6535 ****
  bdfa24068b8a667b864afec3aab3c472  gcc/gimple.h
  46bdb18976fdb25accadbfdc07f14a8e  gcc/gimplify-me.cc
  cc5b43d0554c69571cd007e727fbb7d1  gcc/gimplify-me.h
! c87d3648bc8fa060860e0df18d371aae  gcc/gimplify.cc
! 00b4fa5f2537547bcddd508fd61459ca  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  83f82d6779ea9f6500c863169abfca55  gcc/ginclude/float.h
  c2c3fd478ee78ae88547e1fc4d165018  gcc/ginclude/iso646.h
--- 6528,6535 ----
  bdfa24068b8a667b864afec3aab3c472  gcc/gimple.h
  46bdb18976fdb25accadbfdc07f14a8e  gcc/gimplify-me.cc
  cc5b43d0554c69571cd007e727fbb7d1  gcc/gimplify-me.h
! 589dd8e3fb88626d93e5437ecacdd38c  gcc/gimplify.cc
! 5015d194d6aebf6d8d4bbb3945a77e27  gcc/gimplify.h
  ba3039c0ed9645080c52c0d4bc46096f  gcc/gimplify_reg_info.h
  83f82d6779ea9f6500c863169abfca55  gcc/ginclude/float.h
  c2c3fd478ee78ae88547e1fc4d165018  gcc/ginclude/iso646.h
*************** ea168cbe279a9f5955218fc5d10d09c5  gcc/in
*** 6666,6678 ****
  80bc6558521a56fa4936fc0de8d01aca  gcc/insn-addr.h
  7b76bd07f7eca4ab18a5cb546ce1c919  gcc/insn-notes.def
  c7c9628cd16fe3e0263939ceb0a865fa  gcc/int-vector-builder.h
! 467334ce1af8fb3e604c10cbab34aeb2  gcc/internal-fn.cc
  4c5494dff903825d1d305853c27e1d1c  gcc/internal-fn.def
  0e20e6632437546e842299f8f436cfdf  gcc/internal-fn.h
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! 646e45f0d3905809ea8ace7bf74a6df9  gcc/ipa-cp.cc
  bff71bc7b721a547da3a7ddc6b208fb9  gcc/ipa-cp.h
  0951d893930a76f52aa7e3f0fbd7201e  gcc/ipa-devirt.cc
  0f5f3d9b3c56e80eb4660f2cc0778ff7  gcc/ipa-fnsummary.cc
--- 6666,6678 ----
  80bc6558521a56fa4936fc0de8d01aca  gcc/insn-addr.h
  7b76bd07f7eca4ab18a5cb546ce1c919  gcc/insn-notes.def
  c7c9628cd16fe3e0263939ceb0a865fa  gcc/int-vector-builder.h
! d0eed7f15614bd534595073a81804787  gcc/internal-fn.cc
  4c5494dff903825d1d305853c27e1d1c  gcc/internal-fn.def
  0e20e6632437546e842299f8f436cfdf  gcc/internal-fn.h
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! 679eb4629aa1da4dd7fbb38e3d54505f  gcc/ipa-cp.cc
  bff71bc7b721a547da3a7ddc6b208fb9  gcc/ipa-cp.h
  0951d893930a76f52aa7e3f0fbd7201e  gcc/ipa-devirt.cc
  0f5f3d9b3c56e80eb4660f2cc0778ff7  gcc/ipa-fnsummary.cc
*************** cdf80ca29c90f97b4cca06b029f8353b  gcc/ip
*** 6698,6704 ****
  80b4cc7719c703dfe60955dfb86002ae  gcc/ipa-predicate.cc
  a25a62951e49120c7882ca20d2486581  gcc/ipa-predicate.h
  7e00759eeb8f2ddaa2f77da1db8adf24  gcc/ipa-profile.cc
! 6a19540cd67ba1c3f095f81eded40ebf  gcc/ipa-prop.cc
  ab51096414a0554c4c1069e327ad7801  gcc/ipa-prop.h
  14aace4627625a58b2f0a8aec7cd94f5  gcc/ipa-pure-const.cc
  f2d87c9921ca158119d238ee8d50abb6  gcc/ipa-ref.cc
--- 6698,6704 ----
  80b4cc7719c703dfe60955dfb86002ae  gcc/ipa-predicate.cc
  a25a62951e49120c7882ca20d2486581  gcc/ipa-predicate.h
  7e00759eeb8f2ddaa2f77da1db8adf24  gcc/ipa-profile.cc
! 6b4bde2bc9275bdba6d37f49fd856e16  gcc/ipa-prop.cc
  ab51096414a0554c4c1069e327ad7801  gcc/ipa-prop.h
  14aace4627625a58b2f0a8aec7cd94f5  gcc/ipa-pure-const.cc
  f2d87c9921ca158119d238ee8d50abb6  gcc/ipa-ref.cc
*************** ceb6470c2a3157ee691a6bcd9c8b0c31  gcc/ir
*** 6724,6730 ****
  788d1861bee2322ed419d2c51e2f738e  gcc/ira.h
  9542ea2b8797fa5a935893fafae08ef3  gcc/is-a.h
  090239f8ee6f441be82d0c8cbeaa00de  gcc/iterator-utils.h
! c43323e41604e8c2432907d21f2cd4b2  gcc/jit/ChangeLog
  6071bdf04fb356c5ac99a99ec00c9a12  gcc/jit/ChangeLog.jit
  7228cd4eb7d36930c98343aa4d8186bb  gcc/jit/Make-lang.in
  fd0d76b6467c987f813d430a35d4760a  gcc/jit/TODO.rst
--- 6724,6730 ----
  788d1861bee2322ed419d2c51e2f738e  gcc/ira.h
  9542ea2b8797fa5a935893fafae08ef3  gcc/is-a.h
  090239f8ee6f441be82d0c8cbeaa00de  gcc/iterator-utils.h
! 64d1417c0b0cfa4325763861afd430dd  gcc/jit/ChangeLog
  6071bdf04fb356c5ac99a99ec00c9a12  gcc/jit/ChangeLog.jit
  7228cd4eb7d36930c98343aa4d8186bb  gcc/jit/Make-lang.in
  fd0d76b6467c987f813d430a35d4760a  gcc/jit/TODO.rst
*************** a715b5bfc0dc5899735d2ab4b8cf81a0  gcc/ji
*** 6779,6785 ****
  9ed69e3498858f6108906526c30ecee0  gcc/jit/docs/topics/asm.rst
  7369be8996b98e00db86123974082085  gcc/jit/docs/topics/compatibility.rst
  d30a79357cf7309b8e043c0336e190e4  gcc/jit/docs/topics/compilation.rst
! f854ba98c63b222a9aee0b73ce9ab221  gcc/jit/docs/topics/contexts.rst
  5b524b918afaef8400ed74b72c23d026  gcc/jit/docs/topics/expressions.rst
  ce9aaa7891f48c2d12ba4a831dabb7e5  gcc/jit/docs/topics/function-pointers.rst
  21a676842ec3ea4c60d3805dae2a2449  gcc/jit/docs/topics/functions.rst
--- 6779,6785 ----
  9ed69e3498858f6108906526c30ecee0  gcc/jit/docs/topics/asm.rst
  7369be8996b98e00db86123974082085  gcc/jit/docs/topics/compatibility.rst
  d30a79357cf7309b8e043c0336e190e4  gcc/jit/docs/topics/compilation.rst
! 5d52559fc6cb25b6509d8d70f490dc8e  gcc/jit/docs/topics/contexts.rst
  5b524b918afaef8400ed74b72c23d026  gcc/jit/docs/topics/expressions.rst
  ce9aaa7891f48c2d12ba4a831dabb7e5  gcc/jit/docs/topics/function-pointers.rst
  21a676842ec3ea4c60d3805dae2a2449  gcc/jit/docs/topics/functions.rst
*************** e0d99466f393722c3e10caf535614ff7  gcc/lt
*** 6902,6908 ****
  351e06833ea0ad58238533d76ea0c2cf  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! 0f81f1eef8f67179bc1dda59eda73cec  gcc/m2/ChangeLog
  6c64ada2deff17585163556dd3634dc4  gcc/m2/Make-lang.in
  ed6143d60ab8fbfb423b65ba791d1faf  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
--- 6902,6908 ----
  351e06833ea0ad58238533d76ea0c2cf  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! a848e0f521c22d33b791f762ce431b74  gcc/m2/ChangeLog
  6c64ada2deff17585163556dd3634dc4  gcc/m2/Make-lang.in
  ed6143d60ab8fbfb423b65ba791d1faf  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
*************** e62a368ad1402d4621a0e52a68a7f6b1  gcc/m2
*** 6963,6969 ****
  d8b31d49a5389a5b3fd9cfb8c6d0e20a  gcc/m2/gm2-compiler/M2GCCDeclare.def
  1c36a89a70a1e1e7aa3f331d2c70582d  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  55b623d045f983abc3b3127741836cb8  gcc/m2/gm2-compiler/M2GenGCC.def
! a017c41f9b737804ee83f95b75d0912d  gcc/m2/gm2-compiler/M2GenGCC.mod
  8e10b9228b005171cffbfaf29c0b39ca  gcc/m2/gm2-compiler/M2Graph.def
  3a603290f463cb67ee6075bf663e58f5  gcc/m2/gm2-compiler/M2Graph.mod
  6922dd2ebc05d1540cde23cd0a9cad00  gcc/m2/gm2-compiler/M2LangDump.def
--- 6963,6969 ----
  d8b31d49a5389a5b3fd9cfb8c6d0e20a  gcc/m2/gm2-compiler/M2GCCDeclare.def
  1c36a89a70a1e1e7aa3f331d2c70582d  gcc/m2/gm2-compiler/M2GCCDeclare.mod
  55b623d045f983abc3b3127741836cb8  gcc/m2/gm2-compiler/M2GenGCC.def
! 8c3f73a878bf9aa15b5f08ee8e68f02d  gcc/m2/gm2-compiler/M2GenGCC.mod
  8e10b9228b005171cffbfaf29c0b39ca  gcc/m2/gm2-compiler/M2Graph.def
  3a603290f463cb67ee6075bf663e58f5  gcc/m2/gm2-compiler/M2Graph.mod
  6922dd2ebc05d1540cde23cd0a9cad00  gcc/m2/gm2-compiler/M2LangDump.def
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7878,7884 ****
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
  691acd36e3b6385e31c2985e983dfaf9  gcc/match-sat-alu.pd
! 8dc2333776cc40e0e43d347eaaf95bef  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
--- 7878,7884 ----
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
  691acd36e3b6385e31c2985e983dfaf9  gcc/match-sat-alu.pd
! e0ac1cd6ea4669aee5e47a7394e2c297  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
*************** b53e19ed2e5aad878bc3422b5ed77de8  gcc/om
*** 7922,7930 ****
  cdc26bd8ead0ef188e59165e859c822d  gcc/omp-builtins.def
  69a9c2c8d43088e61b046c23efb7f450  gcc/omp-expand.cc
  2f6456a4cc816c9b75844b1625b26349  gcc/omp-expand.h
! b558942a55a437de9828beb484fb8d75  gcc/omp-general.cc
! 21041ab3bbd9eb02d136e1856bf2feb4  gcc/omp-general.h
! 5d74c55d460ae0aeed5cce6c65b59974  gcc/omp-low.cc
  1c84cef0613c186032b0fc0682b72ab8  gcc/omp-low.h
  e15278003e18a529caf759e00fbb8140  gcc/omp-oacc-kernels-decompose.cc
  e46559b06f0c63bac8a2626dcddfb876  gcc/omp-oacc-neuter-broadcast.cc
--- 7922,7930 ----
  cdc26bd8ead0ef188e59165e859c822d  gcc/omp-builtins.def
  69a9c2c8d43088e61b046c23efb7f450  gcc/omp-expand.cc
  2f6456a4cc816c9b75844b1625b26349  gcc/omp-expand.h
! c22ffb16a56aa66e925e1b9d40bfa51f  gcc/omp-general.cc
! 23ef2077fc947478cfb1d807aff87bee  gcc/omp-general.h
! 5767699b1f3506606c448b60393ef333  gcc/omp-low.cc
  1c84cef0613c186032b0fc0682b72ab8  gcc/omp-low.h
  e15278003e18a529caf759e00fbb8140  gcc/omp-oacc-kernels-decompose.cc
  e46559b06f0c63bac8a2626dcddfb876  gcc/omp-oacc-neuter-broadcast.cc
*************** df4d718a9c9934a10272384f58351e0f  gcc/op
*** 7947,7961 ****
  e45c50053d2064312ea73720cdb8e5d9  gcc/optabs-query.h
  0135b6d221cd61d59fecebf7206e304e  gcc/optabs-tree.cc
  201b2569727bf062f908121f208a860f  gcc/optabs-tree.h
! 2dc916dc48ce46ffc6bc1a284dd8c473  gcc/optabs.cc
  e41b2d12060d81ec0196a849b4956aab  gcc/optabs.def
  81371a1b977075ff9a2b9637ac88cfa3  gcc/optabs.h
  10284dae2b1b50618cee778ef473c34c  gcc/optc-gen.awk
  a7feb127a9364786f997ccacfe9fece2  gcc/optc-save-gen.awk
  2e0cbbfb09b3e9fdd531f7896db0cf49  gcc/opth-gen.awk
! 1649992f0d9bf5143e5762f35095d0aa  gcc/optinfo-emit-json.cc
! a5efbd4e14a4756cdc7ef8e2022b96b6  gcc/optinfo-emit-json.h
! 40b4d682be889b0e5f2029c08c2dea2e  gcc/optinfo.cc
  7ec7e028f1593086047c8dfc9221321e  gcc/optinfo.h
  1f257e67c4c2e5601e53988fa5cb42d8  gcc/options-urls-cc-gen.awk
  cdbb58e9722acd3ea6e5f46b3fdab810  gcc/opts-common.cc
--- 7947,7961 ----
  e45c50053d2064312ea73720cdb8e5d9  gcc/optabs-query.h
  0135b6d221cd61d59fecebf7206e304e  gcc/optabs-tree.cc
  201b2569727bf062f908121f208a860f  gcc/optabs-tree.h
! 93076289590d19fd45a8e3070ef29137  gcc/optabs.cc
  e41b2d12060d81ec0196a849b4956aab  gcc/optabs.def
  81371a1b977075ff9a2b9637ac88cfa3  gcc/optabs.h
  10284dae2b1b50618cee778ef473c34c  gcc/optc-gen.awk
  a7feb127a9364786f997ccacfe9fece2  gcc/optc-save-gen.awk
  2e0cbbfb09b3e9fdd531f7896db0cf49  gcc/opth-gen.awk
! e1eabe04b9238c59307c6afde1038549  gcc/optinfo-emit-json.cc
! 455886365d1689be46461e74e2f0e695  gcc/optinfo-emit-json.h
! b8ea5cc8fc796c7d794e5fc3cf1feb87  gcc/optinfo.cc
  7ec7e028f1593086047c8dfc9221321e  gcc/optinfo.h
  1f257e67c4c2e5601e53988fa5cb42d8  gcc/options-urls-cc-gen.awk
  cdbb58e9722acd3ea6e5f46b3fdab810  gcc/opts-common.cc
*************** fef443de1557117f8c2847206a2ea8f5  gcc/or
*** 7970,7976 ****
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! 1357ef9ef57f321e37acd681b6ce8f71  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  23b3f227e4a3edb6df0c76124df99274  gcc/passes.cc
--- 7970,7976 ----
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! 6c13607270a8afe1edb03d80a657a846  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  23b3f227e4a3edb6df0c76124df99274  gcc/passes.cc
*************** b2f9b18f946c2e60e4f6cba0ab2df54e  gcc/pe
*** 7981,7987 ****
  51380e9db88b682bc96a35cc4bce56a5  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! dd1fe4b56dbd7bb57ceaf0d29f2e518c  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  73ae249e691da38b778718022db3bbde  gcc/po/be.po
  dc880fdf00071de200d0a050acab2d15  gcc/po/da.po
--- 7981,7987 ----
  51380e9db88b682bc96a35cc4bce56a5  gcc/plugin.cc
  af6268dd53154434eb4c4d1c299e0ee2  gcc/plugin.def
  5678cfbc9cf98f9e69bee1118c787a42  gcc/plugin.h
! 3400fea3b23f6357e8e4c1b496944dc4  gcc/po/ChangeLog
  2c2fbc71d2acc1ddfb9fb9501458921b  gcc/po/EXCLUDES
  73ae249e691da38b778718022db3bbde  gcc/po/be.po
  dc880fdf00071de200d0a050acab2d15  gcc/po/da.po
*************** e9987665273e0c01f7765daa54b51eab  gcc/po
*** 7999,8005 ****
  239809f691f93907e451f1d0f64745fe  gcc/po/nl.po
  507b7a1756b6e3059bd7db5749cfea8f  gcc/po/ru.po
  31d0120d3a8f12b7e983b802a76d9bd8  gcc/po/sr.po
! 793516ee5eb832b5ac9315b2b8688181  gcc/po/sv.po
  5c4cbac95eff9049f30bdd9bb4be7b4e  gcc/po/tr.po
  b33f539d1d64f0e68a3b776164ca1f59  gcc/po/uk.po
  a98a8f0aa188fa14ae528dfe8be52db4  gcc/po/vi.po
--- 7999,8005 ----
  239809f691f93907e451f1d0f64745fe  gcc/po/nl.po
  507b7a1756b6e3059bd7db5749cfea8f  gcc/po/ru.po
  31d0120d3a8f12b7e983b802a76d9bd8  gcc/po/sr.po
! da772b8dc4fd323f2c28d1196ef96d3e  gcc/po/sv.po
  5c4cbac95eff9049f30bdd9bb4be7b4e  gcc/po/tr.po
  b33f539d1d64f0e68a3b776164ca1f59  gcc/po/uk.po
  a98a8f0aa188fa14ae528dfe8be52db4  gcc/po/vi.po
*************** a98a8f0aa188fa14ae528dfe8be52db4  gcc/po
*** 8010,8016 ****
  8fb747d77281aa1c6e2fbc0f106ef7f5  gcc/poly-int-types.h
  8e1ad60e1364794de50c869dcc263271  gcc/poly-int.h
  a76391e64013dd91801b9ed642b3c817  gcc/postreload-gcse.cc
! ba4c53fadd2e92e3f30ae3b8a953c340  gcc/postreload.cc
  93fa12f13036c5d9952405e984cc24cd  gcc/predict.cc
  94064e652fd0a138c0dc656a3d96a966  gcc/predict.def
  c6b043ce6b64f82009d2f3763b6360db  gcc/predict.h
--- 8010,8016 ----
  8fb747d77281aa1c6e2fbc0f106ef7f5  gcc/poly-int-types.h
  8e1ad60e1364794de50c869dcc263271  gcc/poly-int.h
  a76391e64013dd91801b9ed642b3c817  gcc/postreload-gcse.cc
! 4691cef63f7b2f9321545a30af1dde82  gcc/postreload.cc
  93fa12f13036c5d9952405e984cc24cd  gcc/predict.cc
  94064e652fd0a138c0dc656a3d96a966  gcc/predict.def
  c6b043ce6b64f82009d2f3763b6360db  gcc/predict.h
*************** f24751f278bee1ac8dc861467d9f96a3  gcc/ta
*** 8725,8731 ****
  2b5ed5f473de31fccbd53235aa79d207  gcc/targhooks.cc
  b1068b0d3d77d5a55802a29a9f8a08d7  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 0c04814c740c1a1cae4b81f08471cac7  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8725,8731 ----
  2b5ed5f473de31fccbd53235aa79d207  gcc/targhooks.cc
  b1068b0d3d77d5a55802a29a9f8a08d7  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 67a8a682db5785bf932f3e1db675a837  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** c10fc254098370506be3ac2011766359  gcc/te
*** 17111,17116 ****
--- 17111,17117 ----
  72248df16145567bf3d86de44324d099  gcc/testsuite/algol68/compile/error-widening-7.a68
  0fec66df6dda72eb37e7257941a058bd  gcc/testsuite/algol68/compile/error-widening-8.a68
  cb076d039affa49f256d588c4171e17e  gcc/testsuite/algol68/compile/error-widening-9.a68
+ 39adce046da45b370e65c92b424bff83  gcc/testsuite/algol68/compile/floor-1.a68
  291ee42852cd8c1f62d2aae6a67fb348  gcc/testsuite/algol68/compile/formal-bounds-expected-1.a68
  c05ab27ab53e7f2af37255a03019264b  gcc/testsuite/algol68/compile/formal-hole-1.a68
  a6dda753b5811f78e3c8167773ebb877  gcc/testsuite/algol68/compile/formal-hole-2.a68
*************** dbb9ce5fac64eac51f7ab061078195fc  gcc/te
*** 17330,17336 ****
  eb377fcf51134d65c7dbf4e75b35f626  gcc/testsuite/algol68/execute/elem-bits-1.a68
  d28bd86683318749921d33768b05e672  gcc/testsuite/algol68/execute/elems-1.a68
  87bf22672af7e0a9d3a3f7caabba50eb  gcc/testsuite/algol68/execute/elems-2.a68
! 7ea390807313649507d885669fdea01c  gcc/testsuite/algol68/execute/entier-1.a68
  51404f0b5276bbc5b7e3b762b09318df  gcc/testsuite/algol68/execute/environment-enquiries-1.a68
  3961a8cfc448bde31af41a37a3c22c16  gcc/testsuite/algol68/execute/environment-enquiries-2.a68
  e98f6711fdde351ab7cb182c5f5ad2d8  gcc/testsuite/algol68/execute/environment-enquiries-3.a68
--- 17331,17337 ----
  eb377fcf51134d65c7dbf4e75b35f626  gcc/testsuite/algol68/execute/elem-bits-1.a68
  d28bd86683318749921d33768b05e672  gcc/testsuite/algol68/execute/elems-1.a68
  87bf22672af7e0a9d3a3f7caabba50eb  gcc/testsuite/algol68/execute/elems-2.a68
! b77049cd593bc66e1a8c644a7056ec42  gcc/testsuite/algol68/execute/entier-1.a68
  51404f0b5276bbc5b7e3b762b09318df  gcc/testsuite/algol68/execute/environment-enquiries-1.a68
  3961a8cfc448bde31af41a37a3c22c16  gcc/testsuite/algol68/execute/environment-enquiries-2.a68
  e98f6711fdde351ab7cb182c5f5ad2d8  gcc/testsuite/algol68/execute/environment-enquiries-3.a68
*************** c67fd7150c48c2cbde13c569af42d724  gcc/te
*** 18236,18242 ****
  166367f89bddb5b54a71a7870a8f1fe1  gcc/testsuite/c-c++-common/analyzer/feasibility-pr107948.c
  1461e7b4d80bbbc9eaca84c3c53e4ced  gcc/testsuite/c-c++-common/analyzer/ferror-1.c
  23bc59087d794c1b065cef050c3433d2  gcc/testsuite/c-c++-common/analyzer/fgets-1.c
! 48b6882b3ff2facd9adb190fa277743f  gcc/testsuite/c-c++-common/analyzer/fibonacci.c
  badf258f6f3121025b0d3b8332fda51f  gcc/testsuite/c-c++-common/analyzer/fields.c
  7556950b9334c6e70b7075b1ee29d5fe  gcc/testsuite/c-c++-common/analyzer/file-1.c
  7e6205779b03916212dd157742d257bf  gcc/testsuite/c-c++-common/analyzer/file-3.c
--- 18237,18243 ----
  166367f89bddb5b54a71a7870a8f1fe1  gcc/testsuite/c-c++-common/analyzer/feasibility-pr107948.c
  1461e7b4d80bbbc9eaca84c3c53e4ced  gcc/testsuite/c-c++-common/analyzer/ferror-1.c
  23bc59087d794c1b065cef050c3433d2  gcc/testsuite/c-c++-common/analyzer/fgets-1.c
! 2fdcd338c8816bbeaf45e6adaa322ac6  gcc/testsuite/c-c++-common/analyzer/fibonacci.c
  badf258f6f3121025b0d3b8332fda51f  gcc/testsuite/c-c++-common/analyzer/fields.c
  7556950b9334c6e70b7075b1ee29d5fe  gcc/testsuite/c-c++-common/analyzer/file-1.c
  7e6205779b03916212dd157742d257bf  gcc/testsuite/c-c++-common/analyzer/file-3.c
*************** d762e4f29fc0603fdeb824f4133502c6  gcc/te
*** 18445,18450 ****
--- 18446,18456 ----
  b818695de20677346ff28a3913c7b163  gcc/testsuite/c-c++-common/analyzer/pattern-test-1.c
  5f92a63a3a47c94b25c8524b202fe4b4  gcc/testsuite/c-c++-common/analyzer/phi-1.c
  504cd57ec0a0e6b768eaedede8d25c6c  gcc/testsuite/c-c++-common/analyzer/pipe-pr107486.c
+ 768899948cf62885927b85cc2e2fd350  gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-eq.c
+ df8db95a93e5e58d5a3a4f384ce1cf5b  gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-ge.c
+ 160888e30516ae29c2af6075cb205b25  gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-gt.c
+ 8f0c824a35f6bcb81c832cba2c51bd86  gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-le.c
+ 58202538a5ca042fa47049cd9ef63eb4  gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-lt.c
  8704d0b888bfd7cbf5c7f8dfbb9f5610  gcc/testsuite/c-c++-common/analyzer/pointer-merging.c
  2a829c368b1b687fbe16de043fb0b895  gcc/testsuite/c-c++-common/analyzer/pr100546.c
  2f2b6e5d8817e12fa71f64b20aa73db1  gcc/testsuite/c-c++-common/analyzer/pr100615.c
*************** e7ec58c8488f858c6b9c88105194899a  gcc/te
*** 18559,18566 ****
  606573ca71b3befc49dfdedc5e6a6866  gcc/testsuite/c-c++-common/analyzer/pragma-1.c
  997c97dd61ef110d7d5db435db020682  gcc/testsuite/c-c++-common/analyzer/pragma-2.c
  9430d0208459224bc903d37da0409ad1  gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-1.c
  02794dd36e015d38e92b34ce4f665725  gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-CWE-469-example.c
! 30de4cdd701224f68022d2999b05915c  gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c
  86f639ec8d0b8277d748c42c89e3cd35  gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-2.c
  ed19bd6035c229c80a63f4ee4d655992  gcc/testsuite/c-c++-common/analyzer/realloc-1.c
  9934b5785f041976924e22e94abcc411  gcc/testsuite/c-c++-common/analyzer/realloc-2.c
--- 18565,18573 ----
  606573ca71b3befc49dfdedc5e6a6866  gcc/testsuite/c-c++-common/analyzer/pragma-1.c
  997c97dd61ef110d7d5db435db020682  gcc/testsuite/c-c++-common/analyzer/pragma-2.c
  9430d0208459224bc903d37da0409ad1  gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-1.c
+ 278225ee2bac60712bfd80fd26ea0bcb  gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-2.c
  02794dd36e015d38e92b34ce4f665725  gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-CWE-469-example.c
! 07cb77dad26ca03588840b9b244657ca  gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c
  86f639ec8d0b8277d748c42c89e3cd35  gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-2.c
  ed19bd6035c229c80a63f4ee4d655992  gcc/testsuite/c-c++-common/analyzer/realloc-1.c
  9934b5785f041976924e22e94abcc411  gcc/testsuite/c-c++-common/analyzer/realloc-2.c
*************** fc18dca9ca9c5db3a9297405a01b1376  gcc/te
*** 19634,19640 ****
  192802715f9a6395e2ccf6ce992c4fee  gcc/testsuite/c-c++-common/gomp/cancel-2.c
  777f4addf7c7d758291b4583ce759cbe  gcc/testsuite/c-c++-common/gomp/clause-dups-1.c
  1d2b3f731ff41e629e59d5e531c2696d  gcc/testsuite/c-c++-common/gomp/clauses-1.c
! d5ffe3929242394b820f074d90b6869f  gcc/testsuite/c-c++-common/gomp/clauses-2.c
  cab7710efed273c604884629ac042306  gcc/testsuite/c-c++-common/gomp/clauses-3.c
  8d9ef02ce9840a58a8c64026e4df30b2  gcc/testsuite/c-c++-common/gomp/clauses-4.c
  4495a5b525e167ab62035c686fc8d83b  gcc/testsuite/c-c++-common/gomp/clauses-5.c
--- 19641,19647 ----
  192802715f9a6395e2ccf6ce992c4fee  gcc/testsuite/c-c++-common/gomp/cancel-2.c
  777f4addf7c7d758291b4583ce759cbe  gcc/testsuite/c-c++-common/gomp/clause-dups-1.c
  1d2b3f731ff41e629e59d5e531c2696d  gcc/testsuite/c-c++-common/gomp/clauses-1.c
! a4fc1384577b814647e4ccdcd073055e  gcc/testsuite/c-c++-common/gomp/clauses-2.c
  cab7710efed273c604884629ac042306  gcc/testsuite/c-c++-common/gomp/clauses-3.c
  8d9ef02ce9840a58a8c64026e4df30b2  gcc/testsuite/c-c++-common/gomp/clauses-4.c
  4495a5b525e167ab62035c686fc8d83b  gcc/testsuite/c-c++-common/gomp/clauses-5.c
*************** de8b721b2a72aa22dcc85aab85b9358f  gcc/te
*** 19651,19656 ****
--- 19658,19664 ----
  0d02d0e8e17b4fefe4b09fbe081e9ecf  gcc/testsuite/c-c++-common/gomp/declare-mapper-16.c
  3251583f6af9d77fcf59ecb8690e9b0a  gcc/testsuite/c-c++-common/gomp/declare-mapper-17.c
  7322f7e0eb4982ddf131f0e6172d0f23  gcc/testsuite/c-c++-common/gomp/declare-mapper-18.c
+ f461c63b229b1f64fb248390ef2bc81e  gcc/testsuite/c-c++-common/gomp/declare-mapper-19.c
  82cfee0d130968ddf4974bc29da1aa48  gcc/testsuite/c-c++-common/gomp/declare-mapper-3.c
  dc978c04bd962929e54d5abee2d5bb67  gcc/testsuite/c-c++-common/gomp/declare-mapper-4.c
  f8dc659137869e2f5861c7755d376cfc  gcc/testsuite/c-c++-common/gomp/declare-mapper-5.c
*************** c344f817350996173949d094733f67be  gcc/te
*** 19805,19815 ****
  42caca9fac0b797494697225f198c522  gcc/testsuite/c-c++-common/gomp/map-3.c
  db038278199fc73220fb4647e0497ea0  gcc/testsuite/c-c++-common/gomp/map-4.c
  277cedbcd2effa8734f83ed409ddc325  gcc/testsuite/c-c++-common/gomp/map-5.c
! 814e1f038b9c7666d70236f83f92fa5a  gcc/testsuite/c-c++-common/gomp/map-6.c
  2692678faa474fcf195a2428df6fb5e5  gcc/testsuite/c-c++-common/gomp/map-7.c
  44f82c91ea0443cfcfe48ff2e2ad3f49  gcc/testsuite/c-c++-common/gomp/map-8.c
  3e29caf558ff43e0252f11af669e8da4  gcc/testsuite/c-c++-common/gomp/map-9.c
  69ff77fd1a974b1db18e0d998cb08b86  gcc/testsuite/c-c++-common/gomp/map-incomplete-type.c
  d5ee74feb13dd8875f12132dccfe8126  gcc/testsuite/c-c++-common/gomp/masked-1.c
  c8a1a97bda2a787e6f55c68563e256b6  gcc/testsuite/c-c++-common/gomp/masked-2.c
  cfaa12085558b78e5edbdb4a338479d2  gcc/testsuite/c-c++-common/gomp/masked-combined-1.c
--- 19813,19825 ----
  42caca9fac0b797494697225f198c522  gcc/testsuite/c-c++-common/gomp/map-3.c
  db038278199fc73220fb4647e0497ea0  gcc/testsuite/c-c++-common/gomp/map-4.c
  277cedbcd2effa8734f83ed409ddc325  gcc/testsuite/c-c++-common/gomp/map-5.c
! d95e5beb9a42582e039445cc2f91e1c7  gcc/testsuite/c-c++-common/gomp/map-6.c
  2692678faa474fcf195a2428df6fb5e5  gcc/testsuite/c-c++-common/gomp/map-7.c
  44f82c91ea0443cfcfe48ff2e2ad3f49  gcc/testsuite/c-c++-common/gomp/map-8.c
  3e29caf558ff43e0252f11af669e8da4  gcc/testsuite/c-c++-common/gomp/map-9.c
  69ff77fd1a974b1db18e0d998cb08b86  gcc/testsuite/c-c++-common/gomp/map-incomplete-type.c
+ 5b565c65a09b9269ab6bc6f30d6b419a  gcc/testsuite/c-c++-common/gomp/map-multi-1.c
+ e14d7592233bc253d3d0251ac861eb79  gcc/testsuite/c-c++-common/gomp/map-multi-2.c
  d5ee74feb13dd8875f12132dccfe8126  gcc/testsuite/c-c++-common/gomp/masked-1.c
  c8a1a97bda2a787e6f55c68563e256b6  gcc/testsuite/c-c++-common/gomp/masked-2.c
  cfaa12085558b78e5edbdb4a338479d2  gcc/testsuite/c-c++-common/gomp/masked-combined-1.c
*************** d290e10563b5dcd9cbe022f9ce9d118d  gcc/te
*** 20053,20059 ****
  2ac7469e11f49a373777f14d12d0458a  gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c
  5d53b03c5014dede6e0f732cc32d3856  gcc/testsuite/c-c++-common/gomp/target-teams-1.c
  ecaf3261edcbdf06b45669d051546ad3  gcc/testsuite/c-c++-common/gomp/target-update-1.c
! e807b465f51f25bc3e564cb1576543d7  gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c
  0f6b04454d158c1ca276ecc2763de98f  gcc/testsuite/c-c++-common/gomp/target-update-iterators-2.c
  5a3145767cf31c903624fc08a8be5e8a  gcc/testsuite/c-c++-common/gomp/target-update-iterators-3.c
  3e94cc26d4b0039e4d3efc66900f1480  gcc/testsuite/c-c++-common/gomp/task-detach-1.c
--- 20063,20069 ----
  2ac7469e11f49a373777f14d12d0458a  gcc/testsuite/c-c++-common/gomp/target-map-iterators-6.c
  5d53b03c5014dede6e0f732cc32d3856  gcc/testsuite/c-c++-common/gomp/target-teams-1.c
  ecaf3261edcbdf06b45669d051546ad3  gcc/testsuite/c-c++-common/gomp/target-update-1.c
! a0c1e1ba060b836459e43d7d7d5c973f  gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c
  0f6b04454d158c1ca276ecc2763de98f  gcc/testsuite/c-c++-common/gomp/target-update-iterators-2.c
  5a3145767cf31c903624fc08a8be5e8a  gcc/testsuite/c-c++-common/gomp/target-update-iterators-3.c
  3e94cc26d4b0039e4d3efc66900f1480  gcc/testsuite/c-c++-common/gomp/task-detach-1.c
*************** bd92bb263ce3f4e8ba38942b69777545  gcc/te
*** 22016,22023 ****
  8fb8f015a13dbb924ae0963f603ff37a  gcc/testsuite/g++.dg/DRs/dr2578.C
  69abd62027a5c141b392afc212fa4271  gcc/testsuite/g++.dg/DRs/dr2579.C
  578ff8885e47476743d05b756870ddb1  gcc/testsuite/g++.dg/DRs/dr2580.C
! 4aeb7f22ce169e340d1ea6c0fc562a54  gcc/testsuite/g++.dg/DRs/dr2581-1.C
! 64db403594d810b2269ab59049167973  gcc/testsuite/g++.dg/DRs/dr2581-2.C
  b0dfa04b7b53aefdac18e143994883bd  gcc/testsuite/g++.dg/DRs/dr2583.C
  f2f3b031e1cbc5967efb4a8bda8a5660  gcc/testsuite/g++.dg/DRs/dr2604.C
  725e812bcb1bb89bd0a89930ca5524eb  gcc/testsuite/g++.dg/DRs/dr2627.C
--- 22026,22033 ----
  8fb8f015a13dbb924ae0963f603ff37a  gcc/testsuite/g++.dg/DRs/dr2578.C
  69abd62027a5c141b392afc212fa4271  gcc/testsuite/g++.dg/DRs/dr2579.C
  578ff8885e47476743d05b756870ddb1  gcc/testsuite/g++.dg/DRs/dr2580.C
! 3206169f7b96294bfcbc4ea1737ceae9  gcc/testsuite/g++.dg/DRs/dr2581-1.C
! 559c33d1428fe3adc7544cc55134ed94  gcc/testsuite/g++.dg/DRs/dr2581-2.C
  b0dfa04b7b53aefdac18e143994883bd  gcc/testsuite/g++.dg/DRs/dr2583.C
  f2f3b031e1cbc5967efb4a8bda8a5660  gcc/testsuite/g++.dg/DRs/dr2604.C
  725e812bcb1bb89bd0a89930ca5524eb  gcc/testsuite/g++.dg/DRs/dr2627.C
*************** e1defbf7b06586f89d6b2e9006b558f6  gcc/te
*** 22470,22475 ****
--- 22480,22486 ----
  154cef97930d4b392059ba0eb566928e  gcc/testsuite/g++.dg/analyzer/out-of-bounds-placement-new.C
  8413eed4b939dd84aff079c383eb6bb6  gcc/testsuite/g++.dg/analyzer/placement-new-size.C
  4336313eae16e86d135b8982798efa70  gcc/testsuite/g++.dg/analyzer/placement-new.C
+ a8a27f23f9c6354939e3134825671086  gcc/testsuite/g++.dg/analyzer/pointer-casts-pr125304.C
  9740438440ab651939b2a10e2a3fb9f1  gcc/testsuite/g++.dg/analyzer/pr100244.C
  d4bc63615a492ebed26cfe6dcaccf3f8  gcc/testsuite/g++.dg/analyzer/pr101522.C
  f196621f1d8a0f8a5cd5899222a61f1b  gcc/testsuite/g++.dg/analyzer/pr102662.C
*************** b693ff6f9735fca106feba8f26ea7569  gcc/te
*** 22495,22500 ****
--- 22506,22518 ----
  93a16b4e27481524ed286fec0ffd5b36  gcc/testsuite/g++.dg/analyzer/std-unexpected.C
  987cfa86290bc36c48063e15a43ae459  gcc/testsuite/g++.dg/analyzer/std-unique_ptr-1.C
  467b81263f3c9fb6ddf0a2fb9500917a  gcc/testsuite/g++.dg/analyzer/std-unique_ptr-2.C
+ c73ec2a7bfb10f9f5cdfb1784f13d4df  gcc/testsuite/g++.dg/analyzer/torture/README.txt
+ b06ffddcac2ef9196412cb2cecb3eccb  gcc/testsuite/g++.dg/analyzer/torture/analyzer-torture.exp
+ 3f493743b27e100e406ec7acb5f20602  gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-large-literal.C
+ 2b6731fc2698a87239b4d54770ff161b  gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-small-literal.C
+ 03e7a04756f784b41ddff76ed678a864  gcc/testsuite/g++.dg/analyzer/torture/std-string-default-ctor.C
+ 5b104b1fa949b74c82c68ac36b17a4e5  gcc/testsuite/g++.dg/analyzer/torture/std-string-pr125304.C
+ 2546c4174cb46fb15b4f5f2e74ea97bd  gcc/testsuite/g++.dg/analyzer/torture/std-unique-ptr-1.C
  b355f66bf32fab6d4e4348cbfdd707d2  gcc/testsuite/g++.dg/analyzer/vfunc-1.C
  ae4362b6e0f5c4a5254b627bcef29e36  gcc/testsuite/g++.dg/analyzer/vfunc-2.C
  7af30611c97f31c197651cfc7de2bd24  gcc/testsuite/g++.dg/analyzer/vfunc-3.C
*************** a086058df225e5fda842f4ebd12d6dbd  gcc/te
*** 23212,23217 ****
--- 23230,23236 ----
  5e0a6f554522f0537a21112c91d33895  gcc/testsuite/g++.dg/coroutines/pr120495.C
  cf70192c32f53d0ffe102b573d4080be  gcc/testsuite/g++.dg/coroutines/pr121643.C
  81dd0f7a2283cf853dddabb957fce0eb  gcc/testsuite/g++.dg/coroutines/pr123975.C
+ 0ca0846ef4e8c067a077207372df0fa3  gcc/testsuite/g++.dg/coroutines/pr125376.C
  cbb42d13b1660a8eb1d40a3d88308140  gcc/testsuite/g++.dg/coroutines/pr93458-1-missing-traits.C
  d9151fc224e4913ed7ffacd748769917  gcc/testsuite/g++.dg/coroutines/pr93458-2-bad-traits.C
  e9b715cb41c54f5b179b4725b788e338  gcc/testsuite/g++.dg/coroutines/pr93458-3-missing-handle.C
*************** c5cfd7dcc71474b03e84af97fcd2efb6  gcc/te
*** 24442,24448 ****
  e428af51adeb48463d87e7d9991db47e  gcc/testsuite/g++.dg/cpp0x/defaulted18.C
  06b4b5f3e4775bbcad5ef3d2f9697ff0  gcc/testsuite/g++.dg/cpp0x/defaulted19.C
  c6c23dba60439877ea9d4ecd95b6716b  gcc/testsuite/g++.dg/cpp0x/defaulted19a.C
! 0f031c0ec3728513afccc81ade7c988d  gcc/testsuite/g++.dg/cpp0x/defaulted2.C
  402df00ef452a091463327eb186f03fe  gcc/testsuite/g++.dg/cpp0x/defaulted20.C
  ab2ec53e6f43a87c7a2ce0dc95e5e40e  gcc/testsuite/g++.dg/cpp0x/defaulted21.C
  761773e20736e514dc3f9f126c6b1284  gcc/testsuite/g++.dg/cpp0x/defaulted22.C
--- 24461,24467 ----
  e428af51adeb48463d87e7d9991db47e  gcc/testsuite/g++.dg/cpp0x/defaulted18.C
  06b4b5f3e4775bbcad5ef3d2f9697ff0  gcc/testsuite/g++.dg/cpp0x/defaulted19.C
  c6c23dba60439877ea9d4ecd95b6716b  gcc/testsuite/g++.dg/cpp0x/defaulted19a.C
! 1b0277b867d71aeb5154a2cddbcbf76d  gcc/testsuite/g++.dg/cpp0x/defaulted2.C
  402df00ef452a091463327eb186f03fe  gcc/testsuite/g++.dg/cpp0x/defaulted20.C
  ab2ec53e6f43a87c7a2ce0dc95e5e40e  gcc/testsuite/g++.dg/cpp0x/defaulted21.C
  761773e20736e514dc3f9f126c6b1284  gcc/testsuite/g++.dg/cpp0x/defaulted22.C
*************** db5b7de6305a8e21e1ae9042d5338dd3  gcc/te
*** 24787,24792 ****
--- 24806,24812 ----
  f99332ecdcdb0ac304db6ae97b1cbf57  gcc/testsuite/g++.dg/cpp0x/implicit15.C
  ce06536a3636f3bfcf7185513e507086  gcc/testsuite/g++.dg/cpp0x/implicit16.C
  ee0eabd6260ea7e1f0a0c8813e38b8c2  gcc/testsuite/g++.dg/cpp0x/implicit17.C
+ 90782a40665ed40707d67012e5377e04  gcc/testsuite/g++.dg/cpp0x/implicit18.C
  7a0c0404140f8be4c4780850aaea27d4  gcc/testsuite/g++.dg/cpp0x/implicit2.C
  bb3cecf4f0926b6e97d681a7ac6375b4  gcc/testsuite/g++.dg/cpp0x/implicit3.C
  25f074057f9be4abafc2e63b15388fe3  gcc/testsuite/g++.dg/cpp0x/implicit4.C
*************** ec931fac17f763f1bc84069e03ca53fa  gcc/te
*** 25117,25122 ****
--- 25137,25145 ----
  26a3a7d7fa8662de4df1454d0f3eea85  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const10.C
  692c149205d32e7263c8778ba131c9dc  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11.C
  99ebbe9d836593c488474457d9b14620  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const11a.C
+ 674b3bb5af1820205388893e1687a8b8  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const12.C
+ 68fc577716375324fd3a027200790db9  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const13.C
+ 879cf0b6c65c36738373aabc6563c567  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const14.C
  64bc761abc3783521fdfb26f930f3410  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const2.C
  4ab1af5d985b8826bae1c4a9b6996605  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const3.C
  1ced7b3231f38cc9948cc247893ffec1  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const4.C
*************** cc4765893caa87184d413c00dfcebbdf  gcc/te
*** 25316,25321 ****
--- 25339,25345 ----
  b6ddea01d88ae9c7b77c9063bd626372  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this20.C
  6049913bbade35678c9dba1f34363ef1  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this21.C
  d4a7c0282d34c2c497a49bad70439414  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this22.C
+ 5c526202e1e8db5dea0ac6db316c82e2  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this23.C
  4d206d41378a3a22959ec8c2c1439014  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C
  63fdeead97cb6030e039c864293a278b  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C
  a1527f0e0a6049284f314faba2a6a27f  gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C
*************** c356edd2c2bc03f0ec05d9977cb511eb  gcc/te
*** 26251,26260 ****
  40f2b102868307c1ed39ab3e851121ca  gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
  7b5b13150491de321ee0523e3fe39c9a  gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
  1845fbfbc9545fe11c956f3f06772a16  gcc/testsuite/g++.dg/cpp0x/udlit_system_header
! 334c8dcebc42b37885e8f695c3285534  gcc/testsuite/g++.dg/cpp0x/union1.C
  e5a0ae678823eb39ec542d492d5607d1  gcc/testsuite/g++.dg/cpp0x/union2.C
  39e0408b5a8eba9b12dddc3f82f30f6c  gcc/testsuite/g++.dg/cpp0x/union3.C
! 566ec8deaf0d4514e0f098efe055b913  gcc/testsuite/g++.dg/cpp0x/union4.C
  d628aec947fb9383000669568fb54fe3  gcc/testsuite/g++.dg/cpp0x/union5.C
  8bf1f01c5c9a4acaf371226221dc8d31  gcc/testsuite/g++.dg/cpp0x/union6.C
  2ba8015512089b81fdf68ee5e452e37b  gcc/testsuite/g++.dg/cpp0x/union7.C
--- 26275,26284 ----
  40f2b102868307c1ed39ab3e851121ca  gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
  7b5b13150491de321ee0523e3fe39c9a  gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
  1845fbfbc9545fe11c956f3f06772a16  gcc/testsuite/g++.dg/cpp0x/udlit_system_header
! 7eaccbcf0927378a49a95d73e68ad965  gcc/testsuite/g++.dg/cpp0x/union1.C
  e5a0ae678823eb39ec542d492d5607d1  gcc/testsuite/g++.dg/cpp0x/union2.C
  39e0408b5a8eba9b12dddc3f82f30f6c  gcc/testsuite/g++.dg/cpp0x/union3.C
! fe80ae90960073d772b110bdf845f818  gcc/testsuite/g++.dg/cpp0x/union4.C
  d628aec947fb9383000669568fb54fe3  gcc/testsuite/g++.dg/cpp0x/union5.C
  8bf1f01c5c9a4acaf371226221dc8d31  gcc/testsuite/g++.dg/cpp0x/union6.C
  2ba8015512089b81fdf68ee5e452e37b  gcc/testsuite/g++.dg/cpp0x/union7.C
*************** e98b7a63d6e3d9d44285db784c6b81cf  gcc/te
*** 27905,27910 ****
--- 27929,27936 ----
  741abbe15f9dce96344af440f71cd51e  gcc/testsuite/g++.dg/cpp1z/using-variadic1c.C
  a09ad82525aa7c9f93cdbaea3b4abc3a  gcc/testsuite/g++.dg/cpp1z/using-variadic2.C
  bb012172207ca9da13842f645907e099  gcc/testsuite/g++.dg/cpp1z/using-variadic3.C
+ 3a940718f1c041645df0df410c357e08  gcc/testsuite/g++.dg/cpp1z/using-variadic4.C
+ d22d64cf18491ac31fdf9504394b5988  gcc/testsuite/g++.dg/cpp1z/using-variadic5.C
  8b42f989b463e7c2006209a46478b1ae  gcc/testsuite/g++.dg/cpp1z/using1.C
  fc52ea62e2ecaeb1c4cf7f35a542b61c  gcc/testsuite/g++.dg/cpp1z/using2.C
  c5f6b89265916b0fda61728cb9e20fb8  gcc/testsuite/g++.dg/cpp1z/using3.C
*************** e737a77051d24d173d2bb52643590d75  gcc/te
*** 28036,28041 ****
--- 28062,28068 ----
  7225222aa173afe8868619cad54c27a1  gcc/testsuite/g++.dg/cpp23/explicit-obj-basic5.C
  bad48adbcea1b5ab74746df31c07ae84  gcc/testsuite/g++.dg/cpp23/explicit-obj-basic6.C
  e1c6b3f77b5cd8798df16271a5de7653  gcc/testsuite/g++.dg/cpp23/explicit-obj-basic7.C
+ 4be866ef07adad8cce4ec10b224444ac  gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C
  c59130e695f389c4f5f3948b6907a29e  gcc/testsuite/g++.dg/cpp23/explicit-obj-by-value1.C
  27180f1240f480ec1ce5767599879d49  gcc/testsuite/g++.dg/cpp23/explicit-obj-by-value2.C
  c0225ef79d14425aa04c26d9c3f9838f  gcc/testsuite/g++.dg/cpp23/explicit-obj-by-value3.C
*************** c52edd0a13ff5fb8338be44eb349b17c  gcc/te
*** 28327,28333 ****
  f3b34592f993c84838b0ef36dad5ed5e  gcc/testsuite/g++.dg/cpp26/expansion-stmt7.C
  68e2c6d50bfacacb8479c70ed9ed0ddc  gcc/testsuite/g++.dg/cpp26/expansion-stmt8.C
  fab75ccc959cbef8fb3183a88990faa8  gcc/testsuite/g++.dg/cpp26/expansion-stmt9.C
! 46820e80cc60be5c51c0901dcf4fb55c  gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
  e439504634b8fdea668e10d9fc930c63  gcc/testsuite/g++.dg/cpp26/literals1.C
  3572f5ef732defbaed672decde98fc83  gcc/testsuite/g++.dg/cpp26/literals2.C
  8f5e59e0f7c8cbf6a6ab946370b7128b  gcc/testsuite/g++.dg/cpp26/name-independent-decl1.C
--- 28354,28360 ----
  f3b34592f993c84838b0ef36dad5ed5e  gcc/testsuite/g++.dg/cpp26/expansion-stmt7.C
  68e2c6d50bfacacb8479c70ed9ed0ddc  gcc/testsuite/g++.dg/cpp26/expansion-stmt8.C
  fab75ccc959cbef8fb3183a88990faa8  gcc/testsuite/g++.dg/cpp26/expansion-stmt9.C
! 37a7ca60d4f4ed14152fd3863633ba0d  gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
  e439504634b8fdea668e10d9fc930c63  gcc/testsuite/g++.dg/cpp26/literals1.C
  3572f5ef732defbaed672decde98fc83  gcc/testsuite/g++.dg/cpp26/literals2.C
  8f5e59e0f7c8cbf6a6ab946370b7128b  gcc/testsuite/g++.dg/cpp26/name-independent-decl1.C
*************** f38816c5a8056b8342707cc96758d50e  gcc/te
*** 28383,28388 ****
--- 28410,28417 ----
  a4e3473e8199aabb6d134042640d65a2  gcc/testsuite/g++.dg/cpp26/trivial-infinite-loop1.C
  75514778d36a15b80b9b9646139f59a7  gcc/testsuite/g++.dg/cpp26/trivial-infinite-loop2.C
  b4519bce844d0325d874901a172f6d25  gcc/testsuite/g++.dg/cpp26/trivial-infinite-loop3.C
+ f2a138ab8d14e09ff0dcf5003b21b3bd  gcc/testsuite/g++.dg/cpp26/trivial-union1.C
+ 26e6f09dd9a8a82bd33d4fb5ddb2dcbd  gcc/testsuite/g++.dg/cpp26/trivial-union2.C
  1687bafdc0722a8e005f9480f9563026  gcc/testsuite/g++.dg/cpp26/type-order1.C
  a3a8cba4fbee69e46ecf1bdb30c7d924  gcc/testsuite/g++.dg/cpp26/type-order2.C
  5ab0a02e85909d35b1a2b95731935c0c  gcc/testsuite/g++.dg/cpp26/type-order3.C
*************** dd49d8873bb047040bf7f60deb8f644f  gcc/te
*** 29419,29424 ****
--- 29448,29455 ----
  10563ae733ee31b86846cfb852d66d9d  gcc/testsuite/g++.dg/cpp2a/no_unique_address14.C
  9c8ff2d9f37699b8813711a0c20c7e07  gcc/testsuite/g++.dg/cpp2a/no_unique_address15.C
  46008c21cb7f7725a5bfe2a87f3b255d  gcc/testsuite/g++.dg/cpp2a/no_unique_address16.C
+ d49ea9e2404bf3d93fd50f35fe2280da  gcc/testsuite/g++.dg/cpp2a/no_unique_address17.C
+ fd72e9f0c4f4e15ed6312ba6521c19cb  gcc/testsuite/g++.dg/cpp2a/no_unique_address18.C
  c94ac6fb1a99bf541b66d604620fa09b  gcc/testsuite/g++.dg/cpp2a/no_unique_address2.C
  67a61649264fea12fb7cc5c31bc5313e  gcc/testsuite/g++.dg/cpp2a/no_unique_address3.C
  ca2c81baf4111b5e8e15980b5237a344  gcc/testsuite/g++.dg/cpp2a/no_unique_address4.C
*************** b8f980c062ec4b3f73dffbda8276ec70  gcc/te
*** 32549,32555 ****
  aa579892dca36d8b110a8b13f1664a4a  gcc/testsuite/g++.dg/init/pr20039.C
  769411a1c7958778a3d38ee85b470169  gcc/testsuite/g++.dg/init/pr25811-3.C
  677f7b38b3959f7edf25e66789e0a86a  gcc/testsuite/g++.dg/init/pr25811-4.C
! b16f434e40791ffa8cb8791c621a89dd  gcc/testsuite/g++.dg/init/pr25811.C
  85782d5ef8b1f167eda4d2f6167a8f03  gcc/testsuite/g++.dg/init/pr29043.C
  8ec941f80b1661f99f6cd682d5d469dc  gcc/testsuite/g++.dg/init/pr29571.C
  e6aa309a87de688020673480763c4211  gcc/testsuite/g++.dg/init/pr35878_1.C
--- 32580,32586 ----
  aa579892dca36d8b110a8b13f1664a4a  gcc/testsuite/g++.dg/init/pr20039.C
  769411a1c7958778a3d38ee85b470169  gcc/testsuite/g++.dg/init/pr25811-3.C
  677f7b38b3959f7edf25e66789e0a86a  gcc/testsuite/g++.dg/init/pr25811-4.C
! dd7c51670252e4834d01b7be474e377b  gcc/testsuite/g++.dg/init/pr25811.C
  85782d5ef8b1f167eda4d2f6167a8f03  gcc/testsuite/g++.dg/init/pr29043.C
  8ec941f80b1661f99f6cd682d5d469dc  gcc/testsuite/g++.dg/init/pr29571.C
  e6aa309a87de688020673480763c4211  gcc/testsuite/g++.dg/init/pr35878_1.C
*************** f1538253537779bf466c8d9c117f1ee9  gcc/te
*** 32562,32568 ****
  70ed9e061ee1cb44f807f10567f1ff1a  gcc/testsuite/g++.dg/init/pr43064-2.C
  24b4ea9d126b54359f2cc64275eba9a5  gcc/testsuite/g++.dg/init/pr43064-3.C
  b25b382db37739c81869b75df02687cf  gcc/testsuite/g++.dg/init/pr43453.C
! 95729a9174015584f1d2ee154d2815f6  gcc/testsuite/g++.dg/init/pr43719.C
  89bc34eae0365b381ab82e8d4ca5957f  gcc/testsuite/g++.dg/init/pr43890.C
  f660de16a9cf160558064bb92eb21901  gcc/testsuite/g++.dg/init/pr44086.C
  880ee6b08cc835f2a1db0bae613e7a23  gcc/testsuite/g++.dg/init/pr48859.C
--- 32593,32599 ----
  70ed9e061ee1cb44f807f10567f1ff1a  gcc/testsuite/g++.dg/init/pr43064-2.C
  24b4ea9d126b54359f2cc64275eba9a5  gcc/testsuite/g++.dg/init/pr43064-3.C
  b25b382db37739c81869b75df02687cf  gcc/testsuite/g++.dg/init/pr43453.C
! f85325776882ec1dcb484a7a1e98a77f  gcc/testsuite/g++.dg/init/pr43719.C
  89bc34eae0365b381ab82e8d4ca5957f  gcc/testsuite/g++.dg/init/pr43890.C
  f660de16a9cf160558064bb92eb21901  gcc/testsuite/g++.dg/init/pr44086.C
  880ee6b08cc835f2a1db0bae613e7a23  gcc/testsuite/g++.dg/init/pr48859.C
*************** a3ef5649648039007c89bf5cb9fe814b  gcc/te
*** 32669,32675 ****
  6dcf4578bc9c92f114c8c61ef2660571  gcc/testsuite/g++.dg/ipa/devirt-17.C
  4b23a4e562c19810f0c55f0817916933  gcc/testsuite/g++.dg/ipa/devirt-18.C
  738b02e35a19328285cb21b4ce45b66f  gcc/testsuite/g++.dg/ipa/devirt-19.C
! 50039ab7ea5e1a15882ae4b338ad0dcc  gcc/testsuite/g++.dg/ipa/devirt-2.C
  38cc93e595d53663e7624f3bf745ba39  gcc/testsuite/g++.dg/ipa/devirt-20.C
  67e019ff1f3d279e2c6b5f223b061ebc  gcc/testsuite/g++.dg/ipa/devirt-21.C
  ef2c20211e1e4ece4ec9e3d8ea3d585f  gcc/testsuite/g++.dg/ipa/devirt-22.C
--- 32700,32706 ----
  6dcf4578bc9c92f114c8c61ef2660571  gcc/testsuite/g++.dg/ipa/devirt-17.C
  4b23a4e562c19810f0c55f0817916933  gcc/testsuite/g++.dg/ipa/devirt-18.C
  738b02e35a19328285cb21b4ce45b66f  gcc/testsuite/g++.dg/ipa/devirt-19.C
! 23935838e0c160239734540a73a85940  gcc/testsuite/g++.dg/ipa/devirt-2.C
  38cc93e595d53663e7624f3bf745ba39  gcc/testsuite/g++.dg/ipa/devirt-20.C
  67e019ff1f3d279e2c6b5f223b061ebc  gcc/testsuite/g++.dg/ipa/devirt-21.C
  ef2c20211e1e4ece4ec9e3d8ea3d585f  gcc/testsuite/g++.dg/ipa/devirt-22.C
*************** e6a4785ed0b7c7e727981cc2ee9613cb  gcc/te
*** 36020,36026 ****
  9badaf0d3171514f4d628f2da49a35a9  gcc/testsuite/g++.dg/other/access3.C
  4a525e9796838f38d9c7110a0140c8eb  gcc/testsuite/g++.dg/other/anon-struct.C
  e7bda64a0fd9d0057a48814a978e1851  gcc/testsuite/g++.dg/other/anon-union.C
! a0196ebfddfdcb265613530b34c75302  gcc/testsuite/g++.dg/other/anon-union2.C
  662c11d709b6ca85c73287be5207f3ac  gcc/testsuite/g++.dg/other/anon-union3.C
  7ea92f81a45b2537512cf880ee35fe92  gcc/testsuite/g++.dg/other/anon-union4.C
  d0b5965b4982fc2453056380914a719f  gcc/testsuite/g++.dg/other/anon-union5.C
--- 36051,36057 ----
  9badaf0d3171514f4d628f2da49a35a9  gcc/testsuite/g++.dg/other/access3.C
  4a525e9796838f38d9c7110a0140c8eb  gcc/testsuite/g++.dg/other/anon-struct.C
  e7bda64a0fd9d0057a48814a978e1851  gcc/testsuite/g++.dg/other/anon-union.C
! 32ee20005b9fd362c0b62111c117ffa1  gcc/testsuite/g++.dg/other/anon-union2.C
  662c11d709b6ca85c73287be5207f3ac  gcc/testsuite/g++.dg/other/anon-union3.C
  7ea92f81a45b2537512cf880ee35fe92  gcc/testsuite/g++.dg/other/anon-union4.C
  d0b5965b4982fc2453056380914a719f  gcc/testsuite/g++.dg/other/anon-union5.C
*************** e787aed23c696a86456b0bb63c55c905  gcc/te
*** 37783,37789 ****
  49cc91ffb05d6a9ba6ef6b45d3e540b6  gcc/testsuite/g++.dg/reflect/is_complete_type2.C
  907a9b51160c4994e0564b44dda5824d  gcc/testsuite/g++.dg/reflect/is_concept1.C
  38a31d7e4824271d0377098550b08aa7  gcc/testsuite/g++.dg/reflect/is_const1.C
! 64df49905b691d820e4d1acd6536884c  gcc/testsuite/g++.dg/reflect/is_constructible_type1.C
  edcf11d1d04e007df81b6c1b604ade38  gcc/testsuite/g++.dg/reflect/is_constructible_type2.C
  bd09d4860633e0abef89800db481ef7b  gcc/testsuite/g++.dg/reflect/is_constructor_template1.C
  f4a56a950a2bd5cb78ade91ca7986fe8  gcc/testsuite/g++.dg/reflect/is_constuctor1.C
--- 37814,37820 ----
  49cc91ffb05d6a9ba6ef6b45d3e540b6  gcc/testsuite/g++.dg/reflect/is_complete_type2.C
  907a9b51160c4994e0564b44dda5824d  gcc/testsuite/g++.dg/reflect/is_concept1.C
  38a31d7e4824271d0377098550b08aa7  gcc/testsuite/g++.dg/reflect/is_const1.C
! c0b58a9a095b4820fd16d6e6cd4904e0  gcc/testsuite/g++.dg/reflect/is_constructible_type1.C
  edcf11d1d04e007df81b6c1b604ade38  gcc/testsuite/g++.dg/reflect/is_constructible_type2.C
  bd09d4860633e0abef89800db481ef7b  gcc/testsuite/g++.dg/reflect/is_constructor_template1.C
  f4a56a950a2bd5cb78ade91ca7986fe8  gcc/testsuite/g++.dg/reflect/is_constuctor1.C
*************** bad9d4a9d39f990c8a9aeecbfc28f07e  gcc/te
*** 38060,38065 ****
--- 38091,38097 ----
  78bf7ef59fdf5c4f4b28ea75eaa5f4d4  gcc/testsuite/g++.dg/reflect/template_of2.C
  89e96f6ffe32cd4e10add49c5348c9d4  gcc/testsuite/g++.dg/reflect/template_of3.C
  5ff33f8b7b91d646ec538fe100609b93  gcc/testsuite/g++.dg/reflect/test.json
+ 80f840918be8b8e990611e8105db8a21  gcc/testsuite/g++.dg/reflect/trivial-union1.C
  64112525decdfd942b3bb45931514e96  gcc/testsuite/g++.dg/reflect/tuple1.C
  ff49ad2327b77188c9be7008d37b0fa1  gcc/testsuite/g++.dg/reflect/tuple2.C
  108c9f28791a9fec38b31b04cf7ec18f  gcc/testsuite/g++.dg/reflect/type1.C
*************** bc0bf40e9258e25c6c46ff13963f154e  gcc/te
*** 38089,38095 ****
  c957460ae45089ece9b5352a7de1f5fc  gcc/testsuite/g++.dg/reflect/type_trait3.C
  6a48574284311a70358d27e1b45595b3  gcc/testsuite/g++.dg/reflect/type_trait4.C
  0fec151174dbffb695ffa7fb194523bf  gcc/testsuite/g++.dg/reflect/type_trait5.C
! 7c9280bc78006b6ed6b75ff5c1c9facc  gcc/testsuite/g++.dg/reflect/type_trait6.C
  0cb8ffc5aa03364efe260c9bc9c2a638  gcc/testsuite/g++.dg/reflect/type_trait8.C
  d9fed6fe6bccb0abd2890360744d1a95  gcc/testsuite/g++.dg/reflect/type_trait9.C
  edcec8a84ae93d9cffb3a7cd96c90b7d  gcc/testsuite/g++.dg/reflect/u8display_string_of1.C
--- 38121,38127 ----
  c957460ae45089ece9b5352a7de1f5fc  gcc/testsuite/g++.dg/reflect/type_trait3.C
  6a48574284311a70358d27e1b45595b3  gcc/testsuite/g++.dg/reflect/type_trait4.C
  0fec151174dbffb695ffa7fb194523bf  gcc/testsuite/g++.dg/reflect/type_trait5.C
! 3442ef4d830cf79080f138828169b159  gcc/testsuite/g++.dg/reflect/type_trait6.C
  0cb8ffc5aa03364efe260c9bc9c2a638  gcc/testsuite/g++.dg/reflect/type_trait8.C
  d9fed6fe6bccb0abd2890360744d1a95  gcc/testsuite/g++.dg/reflect/type_trait9.C
  edcec8a84ae93d9cffb3a7cd96c90b7d  gcc/testsuite/g++.dg/reflect/u8display_string_of1.C
*************** d9981244f2f8fd4e74d52397db28fe14  gcc/te
*** 38998,39003 ****
--- 39030,39036 ----
  2b0aaea042d19245e7e8611f526bdba8  gcc/testsuite/g++.dg/template/local-var1.C
  97787b0149d1c2ccd1052e2a39deabcc  gcc/testsuite/g++.dg/template/local1.C
  e1775095cd3b911959d05eaf433a998e  gcc/testsuite/g++.dg/template/local10.C
+ 7098270bbb927fc93f572fed611a3716  gcc/testsuite/g++.dg/template/local11.C
  d32b0f4cfabbf7cf6a3f55db155096d2  gcc/testsuite/g++.dg/template/local2.C
  e254df20b082728d0e04a8e1b3b18557  gcc/testsuite/g++.dg/template/local3.C
  a014c1dc8c12fc5b1125d98db2cd0ca2  gcc/testsuite/g++.dg/template/local4.C
*************** b8b52e8f02c4a8a36a13b5243b69bbe6  gcc/te
*** 47443,47448 ****
--- 47476,47482 ----
  39f558958106fc6454b8884cf937791f  gcc/testsuite/gcc.c-torture/compile/pr124643.c
  5ac4ade7a6a5945ebcf534694df7f5fc  gcc/testsuite/gcc.c-torture/compile/pr125039.c
  33c7141fcf5b1add3ddd2be0100f1f0d  gcc/testsuite/gcc.c-torture/compile/pr12517.c
+ dd5e4aadce0950a644e82414ff1f1b95  gcc/testsuite/gcc.c-torture/compile/pr125373.c
  ec16b12ab11c499bf321be18ea59da33  gcc/testsuite/gcc.c-torture/compile/pr12578.c
  86f3d5cf87d24e97aa663b79f2d0ac5d  gcc/testsuite/gcc.c-torture/compile/pr12899.c
  313f6ef65060506dfdf8ff0552bcf22a  gcc/testsuite/gcc.c-torture/compile/pr13066-1.c
*************** b52d121e1316dbd9e52693b569b05bc6  gcc/te
*** 51024,51042 ****
  9391f3a448b1237ff2144b2525ab77a0  gcc/testsuite/gcc.dg/Wstrict-overflow-2.c
  ee8039d5d07f67c24878cd6c0c5c5feb  gcc/testsuite/gcc.dg/Wstrict-overflow-20.c
  167ebb1c270e158c31f713ca1543922e  gcc/testsuite/gcc.dg/Wstrict-overflow-21.c
- c6b34215adb77d2d1d506195471e2c42  gcc/testsuite/gcc.dg/Wstrict-overflow-22.c
  bfc663ffe6e57f766fa3d5ea61094f45  gcc/testsuite/gcc.dg/Wstrict-overflow-23.c
- 3b6ef5e52e800d297a469573a036037e  gcc/testsuite/gcc.dg/Wstrict-overflow-24.c
  1183e3a61062495f2a2c7d53c3304fc4  gcc/testsuite/gcc.dg/Wstrict-overflow-25.c
  2ae95adea145503dd29f9ab2e813f13e  gcc/testsuite/gcc.dg/Wstrict-overflow-26.c
  1e3318a6af245b949f1c505b7e8b1ab4  gcc/testsuite/gcc.dg/Wstrict-overflow-27.c
- bb2099f1da2a18a8306bbf5e15b7e411  gcc/testsuite/gcc.dg/Wstrict-overflow-3.c
  43d27c6b3c5f95da1becd819eb01bc7c  gcc/testsuite/gcc.dg/Wstrict-overflow-4.c
- 9ca3aae585d863804dc429242e24bdea  gcc/testsuite/gcc.dg/Wstrict-overflow-5.c
  78e163530595bd814f038df2ea425bbd  gcc/testsuite/gcc.dg/Wstrict-overflow-6.c
  9370d40d57e04c6abd79b41e84b18923  gcc/testsuite/gcc.dg/Wstrict-overflow-7.c
  dca4d071a83223262a2d5fa630b1dce7  gcc/testsuite/gcc.dg/Wstrict-overflow-8.c
- c31d451fdf70251ea95a67385daae0da  gcc/testsuite/gcc.dg/Wstrict-overflow-9.c
  d16c4746f11d3c8c32ad67a5f38a857d  gcc/testsuite/gcc.dg/Wstring-compare-2.c
  f386e62f0368675c818d0680e43238c1  gcc/testsuite/gcc.dg/Wstring-compare-3.c
  1af01381c92736dc6947178cfbe38286  gcc/testsuite/gcc.dg/Wstring-compare.c
--- 51058,51071 ----
*************** e6bc4fed874db05f3443af4850c6afe2  gcc/te
*** 51332,51338 ****
  1a591c30c1046ec5f0fabf382eb15991  gcc/testsuite/gcc.dg/analyzer/event-links-unicode.c
  ff72443bf2e662f8008604b236bcb901  gcc/testsuite/gcc.dg/analyzer/explode-1.c
  521af64119d2db5f3e14c297cb177b2a  gcc/testsuite/gcc.dg/analyzer/explode-2.c
! 6e0e82d3dccb93752bd0cdb45f686bd1  gcc/testsuite/gcc.dg/analyzer/explode-2a.c
  9e318b6725be489d6ffa48842f71ae89  gcc/testsuite/gcc.dg/analyzer/explode-3.c
  8f62b5cf7a905c691d35760f70585093  gcc/testsuite/gcc.dg/analyzer/explode-4.c
  2389d74c6edc9a181e7bb75a5f9b3f82  gcc/testsuite/gcc.dg/analyzer/fd-4.c
--- 51361,51367 ----
  1a591c30c1046ec5f0fabf382eb15991  gcc/testsuite/gcc.dg/analyzer/event-links-unicode.c
  ff72443bf2e662f8008604b236bcb901  gcc/testsuite/gcc.dg/analyzer/explode-1.c
  521af64119d2db5f3e14c297cb177b2a  gcc/testsuite/gcc.dg/analyzer/explode-2.c
! 2b0331ef7058c4b72b5610cd53fec70c  gcc/testsuite/gcc.dg/analyzer/explode-2a.c
  9e318b6725be489d6ffa48842f71ae89  gcc/testsuite/gcc.dg/analyzer/explode-3.c
  8f62b5cf7a905c691d35760f70585093  gcc/testsuite/gcc.dg/analyzer/explode-4.c
  2389d74c6edc9a181e7bb75a5f9b3f82  gcc/testsuite/gcc.dg/analyzer/fd-4.c
*************** c5aaf610718cba5c59ae6937f43eb7db  gcc/te
*** 51472,51479 ****
  12cfe5485a3c7938cc01216a44d4866e  gcc/testsuite/gcc.dg/analyzer/pr110882.c
  64c9d1e955b493cfb0d775e89b36b0d6  gcc/testsuite/gcc.dg/analyzer/pr113505.c
  d69ed87a55d888352718347a2a8941ed  gcc/testsuite/gcc.dg/analyzer/pr61861.c
! 55d0467249f5ef62758368bddf750f0e  gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c
! 8cc3898af0a69e855c7e410e054bcdc7  gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c
  cc4f1b774a13c67a9f8bbca94a00ad9f  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c
  f89e5ecde804b807979bb260986f6283  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility.c
  7a157f71154c27cccf447319b7894134  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias.c
--- 51501,51508 ----
  12cfe5485a3c7938cc01216a44d4866e  gcc/testsuite/gcc.dg/analyzer/pr110882.c
  64c9d1e955b493cfb0d775e89b36b0d6  gcc/testsuite/gcc.dg/analyzer/pr113505.c
  d69ed87a55d888352718347a2a8941ed  gcc/testsuite/gcc.dg/analyzer/pr61861.c
! 3ffe0c9db64b6e0a8cfd810161642f36  gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c
! 707f4f267367f111a715d8ac77507366  gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c
  cc4f1b774a13c67a9f8bbca94a00ad9f  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility-2.c
  f89e5ecde804b807979bb260986f6283  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias-feasibility.c
  7a157f71154c27cccf447319b7894134  gcc/testsuite/gcc.dg/analyzer/pr93355-localealias.c
*************** e1b404ff3b34ca8f09597bbb3eaff8bb  gcc/te
*** 52363,52369 ****
  cc40c0416c18523670c53c6055ab0ae6  gcc/testsuite/gcc.dg/builtin-bitreverse-1.c
  df78809a032feb3dbd25fdeb182c2652  gcc/testsuite/gcc.dg/builtin-bitreverse-2.c
  a336dc31ea8309dddd692f972b2a0536  gcc/testsuite/gcc.dg/builtin-bitreverse-3.c
! 8a860a52d2b41b8ae1fa021cae3c5181  gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
  e37f4aca281a2c82829d2bf1650d5193  gcc/testsuite/gcc.dg/builtin-bswap-1.c
  8c6c4e4a58a4f180971e576b4fabe804  gcc/testsuite/gcc.dg/builtin-bswap-10.c
  999414d3fa6e5bfeb2e073f6ae328e91  gcc/testsuite/gcc.dg/builtin-bswap-11.c
--- 52392,52402 ----
  cc40c0416c18523670c53c6055ab0ae6  gcc/testsuite/gcc.dg/builtin-bitreverse-1.c
  df78809a032feb3dbd25fdeb182c2652  gcc/testsuite/gcc.dg/builtin-bitreverse-2.c
  a336dc31ea8309dddd692f972b2a0536  gcc/testsuite/gcc.dg/builtin-bitreverse-3.c
! 8742c7730237e192e79d7666626caaea  gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
! fee170cf339868acb33c5715149bf98a  gcc/testsuite/gcc.dg/builtin-bitreverse-5.c
! dae16d12a9f56b20b1808543f1a55935  gcc/testsuite/gcc.dg/builtin-bitreverse-6.c
! 7505a0dbfea2d68b89433cf3c99285b7  gcc/testsuite/gcc.dg/builtin-bitreverse-7.c
! 2efbeca97298b1779f871b0bca6dc438  gcc/testsuite/gcc.dg/builtin-bitreverse-8.c
  e37f4aca281a2c82829d2bf1650d5193  gcc/testsuite/gcc.dg/builtin-bswap-1.c
  8c6c4e4a58a4f180971e576b4fabe804  gcc/testsuite/gcc.dg/builtin-bswap-10.c
  999414d3fa6e5bfeb2e073f6ae328e91  gcc/testsuite/gcc.dg/builtin-bswap-11.c
*************** febe83ee27f0e3494e3bd4484d6a7d21  gcc/te
*** 54311,54318 ****
  e283abc5c7ec3171392ff96f4b1a8745  gcc/testsuite/gcc.dg/cr-decimal-dig-1.c
  14e08c1242ea5fbad863730494e299f5  gcc/testsuite/gcc.dg/cr-decimal-dig-2.c
  5b0486b5bce3482ffaecc4ab080f8c83  gcc/testsuite/gcc.dg/cr-decimal-dig-3.c
! 29ba17c70baec8c0bf1a40c905efbb46  gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c
! 090b514113adbe98ef82447a705bf772  gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c
  80c36f9259c16cb249337830f67459c6  gcc/testsuite/gcc.dg/crc-builtin-target32.c
  c16e6539fd7b8905741473868caceef9  gcc/testsuite/gcc.dg/crc-builtin-target64.c
  eaa0b5d40e0a3c148ebc883fbc9dc31d  gcc/testsuite/gcc.dg/crc-from-fedora-packages-1.c
--- 54344,54351 ----
  e283abc5c7ec3171392ff96f4b1a8745  gcc/testsuite/gcc.dg/cr-decimal-dig-1.c
  14e08c1242ea5fbad863730494e299f5  gcc/testsuite/gcc.dg/cr-decimal-dig-2.c
  5b0486b5bce3482ffaecc4ab080f8c83  gcc/testsuite/gcc.dg/cr-decimal-dig-3.c
! b086a823dce1af0d3c495598cf2b7677  gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c
! 079c61f031d75e10625db4d228e67e5c  gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c
  80c36f9259c16cb249337830f67459c6  gcc/testsuite/gcc.dg/crc-builtin-target32.c
  c16e6539fd7b8905741473868caceef9  gcc/testsuite/gcc.dg/crc-builtin-target64.c
  eaa0b5d40e0a3c148ebc883fbc9dc31d  gcc/testsuite/gcc.dg/crc-from-fedora-packages-1.c
*************** a37478860517cdafde8ff3d3f2a58d1c  gcc/te
*** 55231,55237 ****
  bc4dc77fe0d5a497c4f5a8fedce878ef  gcc/testsuite/gcc.dg/fold-condcmpconv-1.c
  2c2601a7fc4c7b7ab5ef5af7d6cca601  gcc/testsuite/gcc.dg/fold-condcmpconv-2.c
  f2542628fe46ccc65fd442a53e80df5f  gcc/testsuite/gcc.dg/fold-condneg-1.c
! 116ea0254352f300c63ccce760bd3eda  gcc/testsuite/gcc.dg/fold-condneg-2.c
  715c50b0cfa6c9e3ba0963335de6e6d0  gcc/testsuite/gcc.dg/fold-condnot-1.c
  66ff2dcff0e3fb3f8a572d1cb5e1df62  gcc/testsuite/gcc.dg/fold-convlshift-1.c
  7b2a2b6daa6df9af392a37843c445308  gcc/testsuite/gcc.dg/fold-convlshift-2.c
--- 55264,55270 ----
  bc4dc77fe0d5a497c4f5a8fedce878ef  gcc/testsuite/gcc.dg/fold-condcmpconv-1.c
  2c2601a7fc4c7b7ab5ef5af7d6cca601  gcc/testsuite/gcc.dg/fold-condcmpconv-2.c
  f2542628fe46ccc65fd442a53e80df5f  gcc/testsuite/gcc.dg/fold-condneg-1.c
! 0100a11de420be8a1346be34237c017f  gcc/testsuite/gcc.dg/fold-condneg-2.c
  715c50b0cfa6c9e3ba0963335de6e6d0  gcc/testsuite/gcc.dg/fold-condnot-1.c
  66ff2dcff0e3fb3f8a572d1cb5e1df62  gcc/testsuite/gcc.dg/fold-convlshift-1.c
  7b2a2b6daa6df9af392a37843c445308  gcc/testsuite/gcc.dg/fold-convlshift-2.c
*************** c686dca1473baeadaf2f166d4c96e4ef  gcc/te
*** 56611,56617 ****
  38fd7e66d9e9047306640ae6d027b37c  gcc/testsuite/gcc.dg/iftrap-2.c
  f77f4e1b3820c0e1099e7438eb895d42  gcc/testsuite/gcc.dg/imag-1.c
  0b9c32da80718012a226452338fe25a6  gcc/testsuite/gcc.dg/incomplete-typedef-1.c
! f56673c5900fb2e39c7f865e95e75d5a  gcc/testsuite/gcc.dg/independent-cloneids-1.c
  350b6d19c60e3c8fc95fbe1f5c7284db  gcc/testsuite/gcc.dg/infinite-loop.c
  a8e73dad51c27093137a3277030c89c6  gcc/testsuite/gcc.dg/init-bad-1.c
  8ebc06d113217979033e4c477f963464  gcc/testsuite/gcc.dg/init-bad-2.c
--- 56644,56650 ----
  38fd7e66d9e9047306640ae6d027b37c  gcc/testsuite/gcc.dg/iftrap-2.c
  f77f4e1b3820c0e1099e7438eb895d42  gcc/testsuite/gcc.dg/imag-1.c
  0b9c32da80718012a226452338fe25a6  gcc/testsuite/gcc.dg/incomplete-typedef-1.c
! 99d7a7992946f762e8394d0e0ad2d33e  gcc/testsuite/gcc.dg/independent-cloneids-1.c
  350b6d19c60e3c8fc95fbe1f5c7284db  gcc/testsuite/gcc.dg/infinite-loop.c
  a8e73dad51c27093137a3277030c89c6  gcc/testsuite/gcc.dg/init-bad-1.c
  8ebc06d113217979033e4c477f963464  gcc/testsuite/gcc.dg/init-bad-2.c
*************** c67f7d13d068efa64db24e8e8dc7a1f8  gcc/te
*** 56737,56743 ****
  459cdd64eb0d00fa2c0c66393f340c61  gcc/testsuite/gcc.dg/ipa/ipa-2.c
  6b1b99d9576860b04d3ff15be4c0aff2  gcc/testsuite/gcc.dg/ipa/ipa-3.c
  bb7d96d7f48f11cecd08a2ded088257e  gcc/testsuite/gcc.dg/ipa/ipa-4.c
! b23171d1fac1f82e590a6e196db0996d  gcc/testsuite/gcc.dg/ipa/ipa-5.c
  fae4e127bf18f2b79e20c299fc32e930  gcc/testsuite/gcc.dg/ipa/ipa-6.c
  6c2f25da23de51d6cd02d42910cb6239  gcc/testsuite/gcc.dg/ipa/ipa-7.c
  e6abb860376b654b78c23a68c2741729  gcc/testsuite/gcc.dg/ipa/ipa-8.c
--- 56770,56776 ----
  459cdd64eb0d00fa2c0c66393f340c61  gcc/testsuite/gcc.dg/ipa/ipa-2.c
  6b1b99d9576860b04d3ff15be4c0aff2  gcc/testsuite/gcc.dg/ipa/ipa-3.c
  bb7d96d7f48f11cecd08a2ded088257e  gcc/testsuite/gcc.dg/ipa/ipa-4.c
! 581e4dfe76c064fe6be0e86c4ae17603  gcc/testsuite/gcc.dg/ipa/ipa-5.c
  fae4e127bf18f2b79e20c299fc32e930  gcc/testsuite/gcc.dg/ipa/ipa-6.c
  6c2f25da23de51d6cd02d42910cb6239  gcc/testsuite/gcc.dg/ipa/ipa-7.c
  e6abb860376b654b78c23a68c2741729  gcc/testsuite/gcc.dg/ipa/ipa-8.c
*************** e01a56e39b5dd5c338e771a1ce6d38a2  gcc/te
*** 57075,57080 ****
--- 57108,57114 ----
  fd615ddc837f30eb837c3252a93097a5  gcc/testsuite/gcc.dg/loop-unswitch-16.c
  5a560b88a3c9daa4246febcd97af4bfb  gcc/testsuite/gcc.dg/loop-unswitch-17.c
  d7918e0526893bb36ea04d7229ead772  gcc/testsuite/gcc.dg/loop-unswitch-18.c
+ e89649aa1e8266caba8cbb2bb1de11f7  gcc/testsuite/gcc.dg/loop-unswitch-19.c
  44b490988cc0f0544b4081ca49ca2822  gcc/testsuite/gcc.dg/loop-unswitch-2.c
  ff181fa6e4548d47aa84367f90ad303f  gcc/testsuite/gcc.dg/loop-unswitch-3.c
  f819e34fb5a7f733d4b5bc72ef4a1cf9  gcc/testsuite/gcc.dg/loop-unswitch-4.c
*************** f85e3805a900aeb94e96e6ea1712a125  gcc/te
*** 58882,58891 ****
--- 58916,58927 ----
  ee48fe70797eb5503b9b8767efccd315  gcc/testsuite/gcc.dg/pr124947.c
  7de6d79dfadd35bbdff0e2c5faa767a3  gcc/testsuite/gcc.dg/pr124985.c
  4ac96a747a32d5c51b5be5c05cdd21c5  gcc/testsuite/gcc.dg/pr125019.c
+ d05e4c7e8a6e722440c3fa08495a5de7  gcc/testsuite/gcc.dg/pr125050.c
  192df6769f6f110bb8f33708a1ceeea9  gcc/testsuite/gcc.dg/pr125117.c
  39e77ec3d93c3445ad8a73fa3d9fab87  gcc/testsuite/gcc.dg/pr125206.c
  402e7c0c2fa603af9c7bac556e8d71a8  gcc/testsuite/gcc.dg/pr125209.c
  8fcad4427391662fae9297f1c3447a78  gcc/testsuite/gcc.dg/pr125261.c
+ b9e821b448b2a7ca97d76e3b0edfe9cf  gcc/testsuite/gcc.dg/pr125375.c
  bc5ddfbbc46f4e0cce1629d1b58d3090  gcc/testsuite/gcc.dg/pr12603.c
  72a2fca76cb69617ae36bab93c7ec0d7  gcc/testsuite/gcc.dg/pr12625-1.c
  6f0ef61e5a12db5f11da839b2988c5e1  gcc/testsuite/gcc.dg/pr13519-1.c
*************** d49dc3b48eaa905ccfaa6054fcbc7232  gcc/te
*** 59788,59794 ****
  b0bca21fde329a6739491ad61629bde7  gcc/testsuite/gcc.dg/pr56341-1.c
  f21905f3056d5edda991e23e59faeded  gcc/testsuite/gcc.dg/pr56341-2.c
  4918ad6d182ccdedb702520d01efe48a  gcc/testsuite/gcc.dg/pr56350.c
- e9ac39b80f16ec7e365cd0777999d0b9  gcc/testsuite/gcc.dg/pr56355-1.c
  997e829332fa190a23e76f366e2c19ef  gcc/testsuite/gcc.dg/pr56396.c
  f3aafc1ac1826a17da4a7cda0097be39  gcc/testsuite/gcc.dg/pr56424.c
  5fe3b94bbfcd5530885239928c02bd49  gcc/testsuite/gcc.dg/pr56436.c
--- 59824,59829 ----
*************** a4e7912ba45315f15f41a05f18653c74  gcc/te
*** 61414,61420 ****
  3eb20a070e129b9f71ad84ec481fe8df  gcc/testsuite/gcc.dg/stack-layout-1.c
  d5355400a72402c33417096b04dc2a5d  gcc/testsuite/gcc.dg/stack-layout-2.c
  07e6a63f5ceb593a5ec396e028fd341c  gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c
! 2fc7a54e6e7a910c04f974413edfe394  gcc/testsuite/gcc.dg/stack-usage-1.c
  198c846924d490e8eba17829d0caf626  gcc/testsuite/gcc.dg/stack-usage-2.c
  3375b039bdaf5a1d18366c0c2f11f507  gcc/testsuite/gcc.dg/stackprotectexplicit1.c
  6e9664759f9a2a278adb8639495ec2e1  gcc/testsuite/gcc.dg/stdckdint-1.c
--- 61449,61455 ----
  3eb20a070e129b9f71ad84ec481fe8df  gcc/testsuite/gcc.dg/stack-layout-1.c
  d5355400a72402c33417096b04dc2a5d  gcc/testsuite/gcc.dg/stack-layout-2.c
  07e6a63f5ceb593a5ec396e028fd341c  gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c
! 37bc180d71e72229e3d48d77381916ab  gcc/testsuite/gcc.dg/stack-usage-1.c
  198c846924d490e8eba17829d0caf626  gcc/testsuite/gcc.dg/stack-usage-2.c
  3375b039bdaf5a1d18366c0c2f11f507  gcc/testsuite/gcc.dg/stackprotectexplicit1.c
  6e9664759f9a2a278adb8639495ec2e1  gcc/testsuite/gcc.dg/stdckdint-1.c
*************** f04a0ca1134a2f6b7f28283527f4394b  gcc/te
*** 62766,62771 ****
--- 62801,62807 ----
  4f9a7c7f22e75df6c54df1e67ad75557  gcc/testsuite/gcc.dg/torture/pr125234-1.c
  97b1645c0c31a99b15b63ae9e310caed  gcc/testsuite/gcc.dg/torture/pr125250.c
  9ef627b78ab64a9e96e5c32fca00b504  gcc/testsuite/gcc.dg/torture/pr125290-1.c
+ d769bd22a00fe25d5f4489238592c27f  gcc/testsuite/gcc.dg/torture/pr125419-1.c
  ded4330fd1cd52783bd9b1761db038ef  gcc/testsuite/gcc.dg/torture/pr16104-1.c
  fc265ee05da2f29f0e92804661cd1f28  gcc/testsuite/gcc.dg/torture/pr17526.c
  01c583edb41b632b835aa892b9c1cb14  gcc/testsuite/gcc.dg/torture/pr17933-1.c
*************** f3d50d6757f0db7ac4ee44425c687545  gcc/te
*** 63960,63965 ****
--- 63996,64002 ----
  1e3e76b5776790d0a8807f337635bcbe  gcc/testsuite/gcc.dg/tree-prof/loop-split-1.c
  87c3e8970d3d4eb3263f4bf93551e5d6  gcc/testsuite/gcc.dg/tree-prof/loop-split-2.c
  024848445b421f484722fad17deb1e8c  gcc/testsuite/gcc.dg/tree-prof/loop-split-3.c
+ e077f9d8bfd9600567254b4567d815ca  gcc/testsuite/gcc.dg/tree-prof/loop-split-4.c
  2b174a32f54b644b6e346838426c6612  gcc/testsuite/gcc.dg/tree-prof/merge_block.c
  f42eb1c078c3a1e9ca456dfd95d19635  gcc/testsuite/gcc.dg/tree-prof/peel-1.c
  03681fb31b899782af576da9dbd43dcb  gcc/testsuite/gcc.dg/tree-prof/peel-2.c
*************** de0442218beaea160d8107cc0928b0a0  gcc/te
*** 64915,64920 ****
--- 64952,64961 ----
  3f0b8ca2956c4eecb250bec846ea984b  gcc/testsuite/gcc.dg/tree-ssa/mult-abs-2.c
  de18b9aafeb5b7a70c2415d80406308c  gcc/testsuite/gcc.dg/tree-ssa/multcmp-1.c
  d247eecb7ac955c043ad5e586c7470e1  gcc/testsuite/gcc.dg/tree-ssa/multcmp-2.c
+ df4bd465820186c46b032bcea3dd41e4  gcc/testsuite/gcc.dg/tree-ssa/narrow-bool-eq.c
+ 7b4c0f86c9743cffb514a470b367504b  gcc/testsuite/gcc.dg/tree-ssa/narrow-float-eq.c
+ 114fa46eb9e2615e3c787f63c1372cd7  gcc/testsuite/gcc.dg/tree-ssa/narrow-integral-eq.c
+ 4ecda4e5692c6a693e2d50db7471ad92  gcc/testsuite/gcc.dg/tree-ssa/narrow-short-eq.c
  9fed80a4ae6cf5c73c12ca92c518b676  gcc/testsuite/gcc.dg/tree-ssa/neg-cast-2.c
  26693dceeecd0a142bbce3c8a3f5b0af  gcc/testsuite/gcc.dg/tree-ssa/neg-cast-3.c
  2d24280dac358b9f66c4931b4f05b337  gcc/testsuite/gcc.dg/tree-ssa/negate.c
*************** d8ade3018d1dbd5dd8934347cc42988d  gcc/te
*** 64981,64986 ****
--- 65022,65029 ----
  2012387a22e2697786633e36ff37268d  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-47.c
  c7161a8bb165008440ef79e3bc1c8e87  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c
  56955a10efc69b18ceb9374a2c5c5b90  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-5.c
+ 42f862b1ad5404cadc2b11b81aead4db  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-50.c
+ 7dc5730819e89f5d9e5574d184e9e45a  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-51.c
  033ff5a0b13956ee34bb2647a8515399  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-6.c
  804da31eb15fbfec665d7804d36ea041  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-7.c
  dec7e9a594d55bb6427abfb7ee0ae7b3  gcc/testsuite/gcc.dg/tree-ssa/phi-opt-8.c
*************** eed236f4c0a3dab3cadb4c5cbce403da  gcc/te
*** 65144,65150 ****
  44119a9898cb07aa07b7491d0a643353  gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c
  30191e7f04d08f0b42092e36965a3c63  gcc/testsuite/gcc.dg/tree-ssa/pr111967.c
  f5a620ca99a1fc9e267beab2ad387ade  gcc/testsuite/gcc.dg/tree-ssa/pr111972-1.c
! 5811601acaf252f2b50291bd70a20a05  gcc/testsuite/gcc.dg/tree-ssa/pr112095.c
  beccfabbbe0e25820c8a0bf1789cad24  gcc/testsuite/gcc.dg/tree-ssa/pr112706.c
  19ee66e2ab8d0fdea9f3e335e4a8fa86  gcc/testsuite/gcc.dg/tree-ssa/pr112721.c
  4eb8c3fc22eb21c2ea6d58e0ea78f8fc  gcc/testsuite/gcc.dg/tree-ssa/pr112767.c
--- 65187,65193 ----
  44119a9898cb07aa07b7491d0a643353  gcc/testsuite/gcc.dg/tree-ssa/pr111583-2.c
  30191e7f04d08f0b42092e36965a3c63  gcc/testsuite/gcc.dg/tree-ssa/pr111967.c
  f5a620ca99a1fc9e267beab2ad387ade  gcc/testsuite/gcc.dg/tree-ssa/pr111972-1.c
! c146f88113f10fde3201b81b2eeb30fb  gcc/testsuite/gcc.dg/tree-ssa/pr112095.c
  beccfabbbe0e25820c8a0bf1789cad24  gcc/testsuite/gcc.dg/tree-ssa/pr112706.c
  19ee66e2ab8d0fdea9f3e335e4a8fa86  gcc/testsuite/gcc.dg/tree-ssa/pr112721.c
  4eb8c3fc22eb21c2ea6d58e0ea78f8fc  gcc/testsuite/gcc.dg/tree-ssa/pr112767.c
*************** d87a1ad6187c06f07e6ee3b7c6352e9e  gcc/te
*** 65215,65220 ****
--- 65258,65264 ----
  5283f91d0eefda6d127eab3dcbb26458  gcc/testsuite/gcc.dg/tree-ssa/pr124560.c
  0054e44a9d7f98f16363e68bc8142e0f  gcc/testsuite/gcc.dg/tree-ssa/pr124746-1.c
  f5cfea6a1b6fc4b038b869d0d5b623f1  gcc/testsuite/gcc.dg/tree-ssa/pr124886.c
+ f129dd468dfe8a551c430253beea7ece  gcc/testsuite/gcc.dg/tree-ssa/pr125104.c
  20283de4958877c9f56821eb4c2d19cd  gcc/testsuite/gcc.dg/tree-ssa/pr125214.c
  fff67bd84df25cc9f3265a2fd89436d9  gcc/testsuite/gcc.dg/tree-ssa/pr125259.c
  78e6c5fe63f7305009c8a79840fe20dc  gcc/testsuite/gcc.dg/tree-ssa/pr13146.c
*************** d80bfc6c78f7b2de2fe9e7c1d6d6021b  gcc/te
*** 67374,67379 ****
--- 67418,67427 ----
  9853fcd370fbdb6957bbfc245a52880b  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr114264.c
  e271c0bb89de3852c7a63455d3a0ef4a  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr114506.c
  8b0c1cfaeac5f1f58c2e22db7abf2415  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr114516.c
+ df59d79925252dba0873d7641e368caa  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c
+ b72a4dcaf9e4de664a8e2ebc78f3d522  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c
+ f2805e46c1aa2ccf3ab99cc893dd9159  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c
+ 48d77e45dbfa769a6e00a9a7281659d5  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c
  979e78c5ed1d2ba91a46584480362b26  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/riscv_vector.h
  4f6bceb10ec93d41d797ffe2cbac3136  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/rvv-costmodel-vect.exp
  788c12f50f2859623dd4839a46f0806e  gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/vla_vs_vls-1.c
*************** cef7070b381518da6b1a5af1d304f9f6  gcc/te
*** 69418,69424 ****
  65032f980ed26d35986016868f58f5fb  gcc/testsuite/gcc.dg/visibility-b.c
  3914edf5bc61ae4a7f8bfe7daf7a917f  gcc/testsuite/gcc.dg/visibility-c.c
  86ff2e0220006b62079262b0a60c8325  gcc/testsuite/gcc.dg/visibility-d.c
! d6fb9bdd6cbcc9aead0f2cd253b0d182  gcc/testsuite/gcc.dg/vla-1.c
  3a3971b57d9b9c24f86e7ec58832e1cc  gcc/testsuite/gcc.dg/vla-10.c
  156d8c0cb6e36f02ea60ab74130dbbb3  gcc/testsuite/gcc.dg/vla-11.c
  6279bb892b45c144be8f0f592f512f57  gcc/testsuite/gcc.dg/vla-12.c
--- 69466,69472 ----
  65032f980ed26d35986016868f58f5fb  gcc/testsuite/gcc.dg/visibility-b.c
  3914edf5bc61ae4a7f8bfe7daf7a917f  gcc/testsuite/gcc.dg/visibility-c.c
  86ff2e0220006b62079262b0a60c8325  gcc/testsuite/gcc.dg/visibility-d.c
! 638ef227084d279899d96b2a58a191b5  gcc/testsuite/gcc.dg/vla-1.c
  3a3971b57d9b9c24f86e7ec58832e1cc  gcc/testsuite/gcc.dg/vla-10.c
  156d8c0cb6e36f02ea60ab74130dbbb3  gcc/testsuite/gcc.dg/vla-11.c
  6279bb892b45c144be8f0f592f512f57  gcc/testsuite/gcc.dg/vla-12.c
*************** c6cf8bf0cb1b39440a64d8f476f6edc2  gcc/te
*** 70757,70762 ****
--- 70805,70811 ----
  47ecf70940c2c8939e2d79a162064898  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-3.c
  a19c70499df83a0df6b609719e946240  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-4.c
  47a568763e86163c952b5b17243e396a  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-5.c
+ 7d031cd667cb44743e43f71332f66c73  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c
  702b2037dd57663f46b3925af934a1bf  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-be.c
  2e34b4d658642fa31028e6c77888d89c  gcc/testsuite/gcc.target/aarch64/bb-slp-pr113091.c
  b46f641f0dcc38f3e3de3f9a90702753  gcc/testsuite/gcc.target/aarch64/bfloat16_scalar_1.c
*************** b2b956bad084ba29822ce226a454dfc9  gcc/te
*** 70791,70796 ****
--- 70840,70846 ----
  cd00ceeea45683383cf6ab2205253ad0  gcc/testsuite/gcc.target/aarch64/bitint-alignments.c
  965ec77b8d3e85d1504d8274b1d5ec0c  gcc/testsuite/gcc.target/aarch64/bitint-args.c
  301277270ef16c20c5a857394b26d4e3  gcc/testsuite/gcc.target/aarch64/bitint-sizes.c
+ 16fe86282e05e0dbed0b31eaac68b35a  gcc/testsuite/gcc.target/aarch64/bitreverse.c
  11f6f9054981704db09136d921c586d4  gcc/testsuite/gcc.target/aarch64/branch-protection-attr-2.c
  f29221b3dc2d27ac71c726e119cac0ff  gcc/testsuite/gcc.target/aarch64/branch-protection-attr.c
  c45ad55864031fa75ffa4f831160438a  gcc/testsuite/gcc.target/aarch64/branch-protection-option-2.c
*************** f278ce8788e95ff6c4d2d30e0e50237e  gcc/te
*** 71714,71721 ****
  8c0ffc4245119027029238d923b96313  gcc/testsuite/gcc.target/aarch64/pr123286.c
  3525a5777032197cdd1e39b2aad94c29  gcc/testsuite/gcc.target/aarch64/pr123294-1.c
  085f7e2087fb0cf8d5d9a44259bb616c  gcc/testsuite/gcc.target/aarch64/pr123548.c
  def5c2749854b129e22c1e5c9a817159  gcc/testsuite/gcc.target/aarch64/pr123786.c
! 8e31ae8966d8da1bd50421b4d0a9cd01  gcc/testsuite/gcc.target/aarch64/pr123791.c
  0fb432038c1a084913bbbe8d8d8b8bd8  gcc/testsuite/gcc.target/aarch64/pr123792.c
  a588c84982135f60225d2a017f7b53df  gcc/testsuite/gcc.target/aarch64/pr124078-1.c
  3416e11e7fd77f36803f713303e6145a  gcc/testsuite/gcc.target/aarch64/pr124167.c
--- 71764,71772 ----
  8c0ffc4245119027029238d923b96313  gcc/testsuite/gcc.target/aarch64/pr123286.c
  3525a5777032197cdd1e39b2aad94c29  gcc/testsuite/gcc.target/aarch64/pr123294-1.c
  085f7e2087fb0cf8d5d9a44259bb616c  gcc/testsuite/gcc.target/aarch64/pr123548.c
+ 0234368499c1dadf9926fb014b16551a  gcc/testsuite/gcc.target/aarch64/pr123748.c
  def5c2749854b129e22c1e5c9a817159  gcc/testsuite/gcc.target/aarch64/pr123786.c
! b3ab989c7fd4a3722c72edff57ac7f9d  gcc/testsuite/gcc.target/aarch64/pr123791.c
  0fb432038c1a084913bbbe8d8d8b8bd8  gcc/testsuite/gcc.target/aarch64/pr123792.c
  a588c84982135f60225d2a017f7b53df  gcc/testsuite/gcc.target/aarch64/pr124078-1.c
  3416e11e7fd77f36803f713303e6145a  gcc/testsuite/gcc.target/aarch64/pr124167.c
*************** d8cfefc063686118062e9fc3b774907b  gcc/te
*** 71730,71736 ****
  617b125a3275c9ce440e1e542a8bbc79  gcc/testsuite/gcc.target/aarch64/pr62178.c
  da1fc7d53b5f8b6e99f57a2a7b7ac849  gcc/testsuite/gcc.target/aarch64/pr62262.c
  5b090e5d951a21826fd629be991b5411  gcc/testsuite/gcc.target/aarch64/pr62308.c
! 32cd403212b0827f42a447c050158e6a  gcc/testsuite/gcc.target/aarch64/pr63304_1.c
  5195785cc7216a9662357829a66aa2c7  gcc/testsuite/gcc.target/aarch64/pr63424.c
  baf71778326c44f90d27479f00af7a63  gcc/testsuite/gcc.target/aarch64/pr63874.c
  193743022291a9918f493ad3090965ec  gcc/testsuite/gcc.target/aarch64/pr64263_1.c
--- 71781,71787 ----
  617b125a3275c9ce440e1e542a8bbc79  gcc/testsuite/gcc.target/aarch64/pr62178.c
  da1fc7d53b5f8b6e99f57a2a7b7ac849  gcc/testsuite/gcc.target/aarch64/pr62262.c
  5b090e5d951a21826fd629be991b5411  gcc/testsuite/gcc.target/aarch64/pr62308.c
! 9b3dbcd2a3f562e3970f6393ee0c71d1  gcc/testsuite/gcc.target/aarch64/pr63304_1.c
  5195785cc7216a9662357829a66aa2c7  gcc/testsuite/gcc.target/aarch64/pr63424.c
  baf71778326c44f90d27479f00af7a63  gcc/testsuite/gcc.target/aarch64/pr63874.c
  193743022291a9918f493ad3090965ec  gcc/testsuite/gcc.target/aarch64/pr64263_1.c
*************** c8c052e3ffb361fbe4b0043b1414c58b  gcc/te
*** 71762,71769 ****
  ed6579d962ab6988afc3e526e6c51275  gcc/testsuite/gcc.target/aarch64/pr78255.c
  f9f37ccfc032535c8079deb6b916aca7  gcc/testsuite/gcc.target/aarch64/pr78382.c
  15de7f015106f4b337262f146247f86f  gcc/testsuite/gcc.target/aarch64/pr78561.c
! df3739a4c3af3a5b24b42b1f9811afda  gcc/testsuite/gcc.target/aarch64/pr78733.c
! df3739a4c3af3a5b24b42b1f9811afda  gcc/testsuite/gcc.target/aarch64/pr79041-2.c
  1074b04062fdbdecea7da7cc9a58423f  gcc/testsuite/gcc.target/aarch64/pr79794.c
  95c0e3d8e5a0ee0fab92ee4779a8d831  gcc/testsuite/gcc.target/aarch64/pr80295.c
  105bb65b036f134453135d5817cd946c  gcc/testsuite/gcc.target/aarch64/pr81356.c
--- 71813,71820 ----
  ed6579d962ab6988afc3e526e6c51275  gcc/testsuite/gcc.target/aarch64/pr78255.c
  f9f37ccfc032535c8079deb6b916aca7  gcc/testsuite/gcc.target/aarch64/pr78382.c
  15de7f015106f4b337262f146247f86f  gcc/testsuite/gcc.target/aarch64/pr78561.c
! 0e650c278656cb2d6496aa147dda2e3e  gcc/testsuite/gcc.target/aarch64/pr78733.c
! 0e650c278656cb2d6496aa147dda2e3e  gcc/testsuite/gcc.target/aarch64/pr79041-2.c
  1074b04062fdbdecea7da7cc9a58423f  gcc/testsuite/gcc.target/aarch64/pr79794.c
  95c0e3d8e5a0ee0fab92ee4779a8d831  gcc/testsuite/gcc.target/aarch64/pr80295.c
  105bb65b036f134453135d5817cd946c  gcc/testsuite/gcc.target/aarch64/pr81356.c
*************** dd1e6bbf22f1b03feb2bfdbae38cab23  gcc/te
*** 77145,77150 ****
--- 77196,77206 ----
  8e3bca719c354c3d01d4730b1a3ddc45  gcc/testsuite/gcc.target/aarch64/sve/vcond_9_run.c
  c0dc3b5582c5b7a3a6e420b9369201de  gcc/testsuite/gcc.target/aarch64/sve/vec_bool_cmp_1.c
  ad03609f7c5910d8e0ee4d989acbb564  gcc/testsuite/gcc.target/aarch64/sve/vec_bool_cmp_1_run.c
+ 7c6bdd35d49a882397ffe44d64984649  gcc/testsuite/gcc.target/aarch64/sve/vec_construct_1.c
+ 0cde3ecc991a08c5a8179a13857ff96a  gcc/testsuite/gcc.target/aarch64/sve/vec_construct_2.c
+ 9c626dd3dfb9c496150a7db74a49eb9c  gcc/testsuite/gcc.target/aarch64/sve/vec_construct_3.c
+ cde879250eaab85864cd4005cecab2ed  gcc/testsuite/gcc.target/aarch64/sve/vec_construct_4.c
+ 650d21a97baa0b9135dd26a4a6bb52ca  gcc/testsuite/gcc.target/aarch64/sve/vec_construct_5.c
  fede82c538ecebf82ae0f495a35f66db  gcc/testsuite/gcc.target/aarch64/sve/vec_init_1.c
  008cae7eaa9cd6f41b5955cdd2b3f709  gcc/testsuite/gcc.target/aarch64/sve/vec_init_1_run.c
  2502162497eb48d665e7c376dccae0df  gcc/testsuite/gcc.target/aarch64/sve/vec_init_2.c
*************** f6ab59a6fb51c2f31ff41e022a946244  gcc/te
*** 78711,78717 ****
  bc349135d022ac42fcd58ff325aac4bd  gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_2.c
  e53326644c82364d004e69f92a902b22  gcc/testsuite/gcc.target/aarch64/tbl_with_zero_1.c
  3bb1f516dc1688d1f1bc09e387708965  gcc/testsuite/gcc.target/aarch64/tbl_with_zero_2.c
! 038f11aa9e6f1a7714c44a57550a260e  gcc/testsuite/gcc.target/aarch64/tbz_1.c
  d3ad46c7cb1921d0930ac5bd6d6a9cf0  gcc/testsuite/gcc.target/aarch64/tbz_2.c
  189a1d84ddfafd309b413723971ee116  gcc/testsuite/gcc.target/aarch64/tbz_3.c
  8337f562dcf7ef4442f3fda5116f6516  gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c
--- 78767,78773 ----
  bc349135d022ac42fcd58ff325aac4bd  gcc/testsuite/gcc.target/aarch64/target_attr_crypto_ice_2.c
  e53326644c82364d004e69f92a902b22  gcc/testsuite/gcc.target/aarch64/tbl_with_zero_1.c
  3bb1f516dc1688d1f1bc09e387708965  gcc/testsuite/gcc.target/aarch64/tbl_with_zero_2.c
! 65241afc2a717091ee01e39b109031a8  gcc/testsuite/gcc.target/aarch64/tbz_1.c
  d3ad46c7cb1921d0930ac5bd6d6a9cf0  gcc/testsuite/gcc.target/aarch64/tbz_2.c
  189a1d84ddfafd309b413723971ee116  gcc/testsuite/gcc.target/aarch64/tbz_3.c
  8337f562dcf7ef4442f3fda5116f6516  gcc/testsuite/gcc.target/aarch64/test-framepointer-1.c
*************** bf8d75c7373fd9960d5991b8c49f6925  gcc/te
*** 78826,78831 ****
--- 78882,78899 ----
  de34757aca5748fc33ea15e8ee6a1eec  gcc/testsuite/gcc.target/aarch64/vdup_n_1.c
  1c93884e2e0d923d37c8896f3e314217  gcc/testsuite/gcc.target/aarch64/vdup_n_2.c
  a37827c58e9b235ef8fb68b9d0397a33  gcc/testsuite/gcc.target/aarch64/vdup_n_3.c
+ 68b1bbf415079a9d83d449fd93249e24  gcc/testsuite/gcc.target/aarch64/vec-construct-1.c
+ e1253136b3bf994bacc270b1b8f4c399  gcc/testsuite/gcc.target/aarch64/vec-construct-10.c
+ f248ece81c62e0b1fd04a3f8c921ee11  gcc/testsuite/gcc.target/aarch64/vec-construct-11.c
+ ed0a19c2e65831483cf8c29fa5b81b98  gcc/testsuite/gcc.target/aarch64/vec-construct-12.c
+ 3a501c1a94a61b63a3dbb5720005c753  gcc/testsuite/gcc.target/aarch64/vec-construct-2.c
+ 6def7f13ab21227775e880e9621409b3  gcc/testsuite/gcc.target/aarch64/vec-construct-3.c
+ 1ed65672221000a1a224ee744e32aef0  gcc/testsuite/gcc.target/aarch64/vec-construct-4.c
+ 2171304f67ad395e2d65b6ce01d2d008  gcc/testsuite/gcc.target/aarch64/vec-construct-5.c
+ c363d246e3e32b01f68ca3a06bfaedb6  gcc/testsuite/gcc.target/aarch64/vec-construct-6.c
+ d9732df5d96f583e6d6ad94f804e0373  gcc/testsuite/gcc.target/aarch64/vec-construct-7.c
+ 02177610940abb12d82b6ed4044d3049  gcc/testsuite/gcc.target/aarch64/vec-construct-8.c
+ 3673de6c30edcdec89e4149dfb64be25  gcc/testsuite/gcc.target/aarch64/vec-construct-9.c
  6373941c7a38d57c6e9f57889eeb10ed  gcc/testsuite/gcc.target/aarch64/vec-init-10.c
  8a1633a7f054df8919c5747b9e556c8f  gcc/testsuite/gcc.target/aarch64/vec-init-11.c
  ec1f4e31dbc32ad8c510ee0d47b63019  gcc/testsuite/gcc.target/aarch64/vec-init-12.c
*************** e963a81134c27ab0136fa91188158682  gcc/te
*** 79289,79294 ****
--- 79357,79363 ----
  871e12148b7f9b5713bdd08d343eb282  gcc/testsuite/gcc.target/arc/sdata-3.c
  d0d9ef681fbb444736d5e1a93af1b4d7  gcc/testsuite/gcc.target/arc/sdata-4.c
  3548ca5684b59d3df3f1b73f4af93e08  gcc/testsuite/gcc.target/arc/sdata-5.c
+ 59a33e8f90455803bd68125ebfe01c8f  gcc/testsuite/gcc.target/arc/sdata-6.c
  92fc3fd98e40a51c2d87628560cebd9d  gcc/testsuite/gcc.target/arc/shlsi-1.c
  067b0a5f89321de3f4f61c0aca42f7a4  gcc/testsuite/gcc.target/arc/shlsi-2.c
  e0d14bc4647cfc2d656dd758e505bd88  gcc/testsuite/gcc.target/arc/shlsi-3.c
*************** bf378714d79fc87ae8d2ba5ba38abac9  gcc/te
*** 80005,80010 ****
--- 80074,80080 ----
  c6565beafc869833d2a6dd9484818c2d  gcc/testsuite/gcc.target/arm/mve/intrinsics/pr118332.c
  1073bc89c952fc9eb9cdb6a1efd78a78  gcc/testsuite/gcc.target/arm/mve/intrinsics/pr122175.c
  b52bd79f0b568c75adaa75c022b0e2a0  gcc/testsuite/gcc.target/arm/mve/intrinsics/pr122223.c
+ d7c212778ee5c316128a821b206740c1  gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c
  b64a60d68e969b641b8652c2bd4eef0d  gcc/testsuite/gcc.target/arm/mve/intrinsics/pr97327.c
  f1860ef4320f7f2a6a4791bdb0c063ba  gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c
  5d7653e2d5007d0c5a0f2368f9b07c02  gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c
*************** d62f4eaf47b23414362fe83ba0b4dd8f  gcc/te
*** 84588,84593 ****
--- 84658,84665 ----
  46322bf9b32fe645dd973a6bc8e8b128  gcc/testsuite/gcc.target/i386/avx-os-support.h
  4282e5e62a637968b77c731037a2875b  gcc/testsuite/gcc.target/i386/avx-pr102224.c
  d7381eba5a3462b2fdda088ce0332455  gcc/testsuite/gcc.target/i386/avx-pr114190.c
+ 647c91c236fde5931c8fa207fe634973  gcc/testsuite/gcc.target/i386/avx-pr125357-2.c
+ 3e342813ef0549590b4652e1a4d438c1  gcc/testsuite/gcc.target/i386/avx-pr125357.c
  62aa13560c827f799be1941a2e6da500  gcc/testsuite/gcc.target/i386/avx-pr51581-1.c
  c437ae63e2540199d8c765547fc407d6  gcc/testsuite/gcc.target/i386/avx-pr51581-2.c
  b6e744a5c521873cc8be2dbb5f25790d  gcc/testsuite/gcc.target/i386/avx-pr57233.c
*************** b2a5408a9b77cab42d5d95146250a38f  gcc/te
*** 85412,85417 ****
--- 85484,85491 ----
  f6a4ee4d223cdf4463f296171468844c  gcc/testsuite/gcc.target/i386/avx2-pr114157.c
  1e455b321989ce8198e2a5cd0ab772ff  gcc/testsuite/gcc.target/i386/avx2-pr114783.c
  6fa4b94fa60e1eec4b7906f5939c053f  gcc/testsuite/gcc.target/i386/avx2-pr115517.c
+ 91b0404bb9414d32d9ec704f6f6e82fe  gcc/testsuite/gcc.target/i386/avx2-pr125357-2.c
+ 09237138d4aefde84fe073675701b7bd  gcc/testsuite/gcc.target/i386/avx2-pr125357.c
  a544282846ec57648b2f38abf14119f0  gcc/testsuite/gcc.target/i386/avx2-pr51581-1.c
  46ffedd4e5e66cd46ad561ee8562eb7b  gcc/testsuite/gcc.target/i386/avx2-pr51581-2.c
  adf63582badc02467af57f768108628f  gcc/testsuite/gcc.target/i386/avx2-pr57233.c
*************** a550f5d58c76f06756173ea568e8fb94  gcc/te
*** 89142,89147 ****
--- 89216,89222 ----
  f0aea57bccd3254b56180992963b7853  gcc/testsuite/gcc.target/i386/gfni-3.c
  96b35644483e6b2e113e5d5497d2f247  gcc/testsuite/gcc.target/i386/gfni-4.c
  8e79204a73349dff77f13ec378c539d2  gcc/testsuite/gcc.target/i386/gfni-5.c
+ 1275d31c224cf4d9be36bb7f4e9a6451  gcc/testsuite/gcc.target/i386/gfni-builtin-bitreverse-1.c
  716a7d554c4bcfa03d5ab7a3716133b3  gcc/testsuite/gcc.target/i386/harden-sls-1.c
  2174fb9d7e67ba522adfcb41c02f1438  gcc/testsuite/gcc.target/i386/harden-sls-2.c
  1f9937c491145b854eb2f33cb4416a73  gcc/testsuite/gcc.target/i386/harden-sls-3.c
*************** da692b8fe7fe8e3d33b45f3f919da356  gcc/te
*** 90509,90515 ****
  917d3074e579c1fad9a86cf1657c1ab6  gcc/testsuite/gcc.target/i386/pr117318.c
  d9c36e68265950d44ce781ce1be85bf6  gcc/testsuite/gcc.target/i386/pr117357.c
  806f0e4354836aef875182ce5a2a2a6c  gcc/testsuite/gcc.target/i386/pr117416-1.c
! a3fb9f039624d844dbdebb7d7a80e797  gcc/testsuite/gcc.target/i386/pr117416-2.c
  d354c62b8ff60efc0d5983bf81d1bfa4  gcc/testsuite/gcc.target/i386/pr117418-1.c
  60ce35a307c6c720d7d566058b4d7c52  gcc/testsuite/gcc.target/i386/pr117432.c
  7ddffdfcd8796e4829e7f8adf656a64b  gcc/testsuite/gcc.target/i386/pr117452.c
--- 90584,90590 ----
  917d3074e579c1fad9a86cf1657c1ab6  gcc/testsuite/gcc.target/i386/pr117318.c
  d9c36e68265950d44ce781ce1be85bf6  gcc/testsuite/gcc.target/i386/pr117357.c
  806f0e4354836aef875182ce5a2a2a6c  gcc/testsuite/gcc.target/i386/pr117416-1.c
! 1f7353c974f63880cb50d6304e782de6  gcc/testsuite/gcc.target/i386/pr117416-2.c
  d354c62b8ff60efc0d5983bf81d1bfa4  gcc/testsuite/gcc.target/i386/pr117418-1.c
  60ce35a307c6c720d7d566058b4d7c52  gcc/testsuite/gcc.target/i386/pr117432.c
  7ddffdfcd8796e4829e7f8adf656a64b  gcc/testsuite/gcc.target/i386/pr117452.c
*************** df76ec06f1f94b77cb1652a61b635dcd  gcc/te
*** 90766,90771 ****
--- 90841,90849 ----
  02bcd898871c488722d8481d6020b391  gcc/testsuite/gcc.target/i386/pr125239.c
  014fb32893a5812986a3d672ecf6682d  gcc/testsuite/gcc.target/i386/pr125245.c
  83da3f12f4b2e9f51434bf8ad312884d  gcc/testsuite/gcc.target/i386/pr125308.c
+ dc1ca8471081be67fdad4d340997d425  gcc/testsuite/gcc.target/i386/pr125351.c
+ b7294c9a200c00a9779bc70185f7be63  gcc/testsuite/gcc.target/i386/pr125355-2.c
+ 10dc742236e7e84bc62c2214e6691b2b  gcc/testsuite/gcc.target/i386/pr125355.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
  9a752a4b3b77930d91d3c8b0c8897b90  gcc/testsuite/gcc.target/i386/pr13685.c
  31ead0ee84b382ba03e3561931bc6e40  gcc/testsuite/gcc.target/i386/pr14289-1.c
*************** caaaf541c6f7eb87214c11b5dc2b35f0  gcc/te
*** 93457,93462 ****
--- 93535,93542 ----
  15ef11d1dac7ad31e1121e9c543bea70  gcc/testsuite/gcc.target/i386/sse4_1-ptest-4.c
  c7f19bd30ed931063fa75e82444dd743  gcc/testsuite/gcc.target/i386/sse4_1-ptest-5.c
  b2f9c9d9e447094c2e94c85cc66d9048  gcc/testsuite/gcc.target/i386/sse4_1-ptest-6.c
+ 979882f4a979ba3fa3db8e91247c5430  gcc/testsuite/gcc.target/i386/sse4_1-ptest-8.c
+ fcaa09f9da1b7cb7bf668016fbdeeb62  gcc/testsuite/gcc.target/i386/sse4_1-ptest-9.c
  6408e72a864871562196b6c57a9cad38  gcc/testsuite/gcc.target/i386/sse4_1-rint-inline.c
  75e4f72172a62d7cb9bc07f245c0c740  gcc/testsuite/gcc.target/i386/sse4_1-rint-sfix-vec.c
  d43f57b93ce30d26aca624ea0e35e1ed  gcc/testsuite/gcc.target/i386/sse4_1-rint-vec.c
*************** b0da33fc443024e77c7b605056bff4ae  gcc/te
*** 94082,94087 ****
--- 94162,94168 ----
  cd00ceeea45683383cf6ab2205253ad0  gcc/testsuite/gcc.target/loongarch/la64/bitint-alignments.c
  5c715c6d7b8151a147fb4a6fb41b3be0  gcc/testsuite/gcc.target/loongarch/la64/bitint-args.c
  301277270ef16c20c5a857394b26d4e3  gcc/testsuite/gcc.target/loongarch/la64/bitint-sizes.c
+ 6aedb4c046b57915d474acc0ce8512dd  gcc/testsuite/gcc.target/loongarch/la64/bitreverse.c
  e21ed5cafc7ccdbe2f139e72a1f702e1  gcc/testsuite/gcc.target/loongarch/la64/bitwise-shift-reassoc.c
  414d78d00363c1e5dd854d23224b39d7  gcc/testsuite/gcc.target/loongarch/la64/bitwise_extend.c
  3c95ec617ab685105bc31c59fb62dd42  gcc/testsuite/gcc.target/loongarch/la64/bstrins-1.c
*************** b26d289b049a7ec0f9c609e457ff9d92  gcc/te
*** 96032,96037 ****
--- 96113,96123 ----
  702fff490ab3a8d9a47f188cff688e7c  gcc/testsuite/gcc.target/powerpc/altivec_vld_vst_addr-2.c
  ed343c63973b66c0e986170ee496a1bd  gcc/testsuite/gcc.target/powerpc/amo1.c
  523510347699205aba59cb836c38573b  gcc/testsuite/gcc.target/powerpc/amo2.c
+ d03dd931aa8e5dbd17e37ae33d9e3a99  gcc/testsuite/gcc.target/powerpc/amo3.c
+ 2ac88062aeb8265673fe43586beb0ec2  gcc/testsuite/gcc.target/powerpc/amo4.c
+ 3451ae43cce0fb6c42cdb403ba6bd949  gcc/testsuite/gcc.target/powerpc/amo5.c
+ 190f865d5df3758c51189d9bbd731026  gcc/testsuite/gcc.target/powerpc/amo6.c
+ 6566dd501fb781aab01889cda5d1db4c  gcc/testsuite/gcc.target/powerpc/amo7.c
  f92704c5f7f462e7f0b0f7a56209b9c1  gcc/testsuite/gcc.target/powerpc/asm-es-1.c
  ab233b59d18c7aa71a26292124ceae27  gcc/testsuite/gcc.target/powerpc/asm-es-2.c
  6ab0c2c5c17e69db0ab917861a4fc5cc  gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c
*************** dada9b5540f865ba0c0df21dc2b72904  gcc/te
*** 96850,96855 ****
--- 96936,96942 ----
  e7f24c5bcf4677a0ae7a8fdcd1aeff80  gcc/testsuite/gcc.target/powerpc/mod-no_copy.c
  fed2453600d3a45ca2a5679c322ff194  gcc/testsuite/gcc.target/powerpc/mod-peephole.c
  b3bf87376bd60d32d00ef203e1cf7d6e  gcc/testsuite/gcc.target/powerpc/mod-vectorize.c
+ 41f56657bf9cb785fd18785e626fbd53  gcc/testsuite/gcc.target/powerpc/mpc860_no_lwsync.c
  ad1bf2ac6624bd6fd4ccb08fb87916e8  gcc/testsuite/gcc.target/powerpc/mul-vectorize-1.c
  0756792d071f22b4d0d92c56ab912d25  gcc/testsuite/gcc.target/powerpc/mul-vectorize-2.c
  64af73bfe790036cc6a9cae813ae5517  gcc/testsuite/gcc.target/powerpc/mul-vectorize-3.c
*************** dd2a69827b362a49d563fade314835c6  gcc/te
*** 98797,98810 ****
  2573f08aa90200501175230090155ec0  gcc/testsuite/gcc.target/riscv/addsine.c
  ede37792c75d3dd4e95f80cc7fbca305  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-fence.c
  6bfea5b991446b7c6a32cf5404a1d43b  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-acquire.c
! 828cf805c01f48fb509e0bff942d1b21  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c
  4920e86b6ffcf6883f4deb01e4a55d16  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-seq-cst.c
  159e8792b104783998934c9925a998c2  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-compat-seq-cst.c
  0b4382b44ea5d2234b4083a6c35ab6ab  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-relaxed.c
  633d070b4a1c42f478db39c4244135ac  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-release.c
  82b895436dff086fcb57612a470f3b65  gcc/testsuite/gcc.target/riscv/amo/a-ztso-fence.c
  e0a5ea71bf7350ae31bb77913dfa1ee0  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-acquire.c
! 2f55b49dee26cc30e18d6918ed16481a  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c
  c7831e9890b75b07100c51fa065b3eb9  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-seq-cst.c
  b60be37a3dc8947f21a32b72634f813e  gcc/testsuite/gcc.target/riscv/amo/a-ztso-store-compat-seq-cst.c
  6346f76444d149b2e942ac9ca803da29  gcc/testsuite/gcc.target/riscv/amo/a-ztso-store-relaxed.c
--- 98884,98897 ----
  2573f08aa90200501175230090155ec0  gcc/testsuite/gcc.target/riscv/addsine.c
  ede37792c75d3dd4e95f80cc7fbca305  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-fence.c
  6bfea5b991446b7c6a32cf5404a1d43b  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-acquire.c
! a46df14c0088c2d651208ca19eb01cb8  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c
  4920e86b6ffcf6883f4deb01e4a55d16  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-seq-cst.c
  159e8792b104783998934c9925a998c2  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-compat-seq-cst.c
  0b4382b44ea5d2234b4083a6c35ab6ab  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-relaxed.c
  633d070b4a1c42f478db39c4244135ac  gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-store-release.c
  82b895436dff086fcb57612a470f3b65  gcc/testsuite/gcc.target/riscv/amo/a-ztso-fence.c
  e0a5ea71bf7350ae31bb77913dfa1ee0  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-acquire.c
! 565fe336db6b556582a6d881d96ca86b  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c
  c7831e9890b75b07100c51fa065b3eb9  gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-seq-cst.c
  b60be37a3dc8947f21a32b72634f813e  gcc/testsuite/gcc.target/riscv/amo/a-ztso-store-compat-seq-cst.c
  6346f76444d149b2e942ac9ca803da29  gcc/testsuite/gcc.target/riscv/amo/a-ztso-store-relaxed.c
*************** a6b4e9e4c2036848e43208552c73f1a7  gcc/te
*** 98863,98875 ****
  b31f1966159013e4296db9a3e7e72bf9  gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-short-seq-cst.c
  ec086e301c7bbfed8a34fc05332d47cb  gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-short.c
  754399070c647b90de5a92836308d209  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-acquire.c
! 99acda0bb8cd2d2014761ee633be058d  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c
  4d7f29cd81c70a72a15d4db36c0123e1  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-seq-cst.c
  a037b78c87793aada59503957a58517a  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-compat-seq-cst.c
  ccefab651aff3606dc8519ba659367ca  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-relaxed.c
  32afc6587b69bf60b711f26274ba7063  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-release.c
  aeb87f725b5694b0db33d0fbc731ef5e  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-acquire.c
! c70c355ca301c40b4d9840d9aa18c2b6  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c
  e045d211a5d61e8344c17c7da02405be  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-seq-cst.c
  6acd155f4d182342a7a4881312665fbc  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-store-compat-seq-cst.c
  8523aad453296639eaa2ac0fc74964a2  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-store-relaxed.c
--- 98950,98962 ----
  b31f1966159013e4296db9a3e7e72bf9  gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-short-seq-cst.c
  ec086e301c7bbfed8a34fc05332d47cb  gcc/testsuite/gcc.target/riscv/amo/zacas-ztso-compare-exchange-short.c
  754399070c647b90de5a92836308d209  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-acquire.c
! 25cca71964acd2f075b6d6548e7a563b  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c
  4d7f29cd81c70a72a15d4db36c0123e1  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-seq-cst.c
  a037b78c87793aada59503957a58517a  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-compat-seq-cst.c
  ccefab651aff3606dc8519ba659367ca  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-relaxed.c
  32afc6587b69bf60b711f26274ba7063  gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-store-release.c
  aeb87f725b5694b0db33d0fbc731ef5e  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-acquire.c
! bbfeec4e0698f66a0dd4987944a4cbba  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c
  e045d211a5d61e8344c17c7da02405be  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-seq-cst.c
  6acd155f4d182342a7a4881312665fbc  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-store-compat-seq-cst.c
  8523aad453296639eaa2ac0fc74964a2  gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-store-relaxed.c
*************** b7d6405b5f5be04adfd70695074dee46  gcc/te
*** 98902,98907 ****
--- 98989,98995 ----
  65c0f232dbcfadf7a94cd7ceef3bce58  gcc/testsuite/gcc.target/riscv/amo/zalrsc-ztso-subword-amo-add-char-seq-cst.c
  f2824bba3f317208bc724728332991c3  gcc/testsuite/gcc.target/riscv/and-extend-1.c
  adc74d0f17f6765898acaf25e4b80da2  gcc/testsuite/gcc.target/riscv/and-extend-2.c
+ 435a7b88323e1b422fbc6dd56ff2a323  gcc/testsuite/gcc.target/riscv/and-shift-1.c
  b446251fd8ececadfe514cc0a7b811cf  gcc/testsuite/gcc.target/riscv/and-shift32.c
  616dd45309bca9019fe3b9af69599baf  gcc/testsuite/gcc.target/riscv/and-shift64.c
  d0db5e2267389a1185e58b9406371ee4  gcc/testsuite/gcc.target/riscv/arch-1.c
*************** a4c468f0dabef5849f00b0ea4f2d7f34  gcc/te
*** 99327,99332 ****
--- 99415,99421 ----
  32eaba242b02f0d41f419865f53ea9a3  gcc/testsuite/gcc.target/riscv/divmod-1.c
  563117792f9d6ea0cadd47fbafeed890  gcc/testsuite/gcc.target/riscv/divmod-2.c
  5436f7a25300f600f9163405e8836b6f  gcc/testsuite/gcc.target/riscv/ext-dce-1.c
+ 5a1d2cabe7e71d1c3b7c41816442ac0e  gcc/testsuite/gcc.target/riscv/ext-dce-2.c
  b289cfd1cdd529019c81c25ebf8aee0f  gcc/testsuite/gcc.target/riscv/ext-dce-promote-1.c
  a9e21b2d22d00c5d449271103515f86d  gcc/testsuite/gcc.target/riscv/ext-dce-promote-2.c
  7cf820151c7fd7e6165871cdb49c8cac  gcc/testsuite/gcc.target/riscv/extend-shift-helpers.h
*************** a0ec9e9b1278bec59b5f6fb4473ae0be  gcc/te
*** 99380,99385 ****
--- 99469,99478 ----
  1f185dea80449f2a4c268c953b9fbe22  gcc/testsuite/gcc.target/riscv/interrupt-no-lpad.c
  a1e26ab7f1c0fd4128be164780eb6afc  gcc/testsuite/gcc.target/riscv/interrupt-rnmi.c
  756572791a9293ef57d0855c156c1c04  gcc/testsuite/gcc.target/riscv/interrupt-smode.c
+ db88574d908c4a63425e865239f141c8  gcc/testsuite/gcc.target/riscv/intrinsic-detection-bitmanip.c
+ 56c8ceca1bca87e580c529ad3ee72a7a  gcc/testsuite/gcc.target/riscv/intrinsic-detection-crypto.c
+ eedc30a88e7c85fed9a92e93b5ef5553  gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar-reverse.c
+ 20a8bbfa3e5d05d3a11e9bc6e2353a96  gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar.c
  371709295f3134754428c912bd5e3ee4  gcc/testsuite/gcc.target/riscv/ior-synthesis-1.c
  016fae660b0d8d24c12a8ce81c7bc0c0  gcc/testsuite/gcc.target/riscv/ior-synthesis-2.c
  b656a9e0d73427727bb0cc6df44334ab  gcc/testsuite/gcc.target/riscv/jump-table-large-code-model.c
*************** dcced0272e68ebd6c311b4e558088af7  gcc/te
*** 99412,99417 ****
--- 99505,99511 ----
  ff231335f542050ad4fec2d9fb0a1456  gcc/testsuite/gcc.target/riscv/mcpu-xt-c910v2.c
  f4d15f0f76038ce87073049d4d456ff6  gcc/testsuite/gcc.target/riscv/mcpu-xt-c920.c
  8499a3cd439fb6c9b5053ff1651105af  gcc/testsuite/gcc.target/riscv/mcpu-xt-c920v2.c
+ 47a4c49696b231a88b31b94ebebd9874  gcc/testsuite/gcc.target/riscv/mcpu-xt-c9501fdvt.c
  3311f6659838594b5135f5297b263bd1  gcc/testsuite/gcc.target/riscv/mem-extend.c
  16126a8d4ef67d573cd4276fa7c8cb6f  gcc/testsuite/gcc.target/riscv/memcpy-nonoverlapping.c
  2dd2de1f802134107e9ed820836a3aa7  gcc/testsuite/gcc.target/riscv/memset-nonoverlapping.c
*************** a5d14f1769aeb1fc6792a954a0ae414c  gcc/te
*** 99721,99729 ****
  c2ea2036045469f1056fc7689ee62c7f  gcc/testsuite/gcc.target/riscv/pr102957.c
  c70df77dca2d9d059e9b22e279613d45  gcc/testsuite/gcc.target/riscv/pr103302.c
  78659ffafd452ac6a43859083b99d8ae  gcc/testsuite/gcc.target/riscv/pr104140.c
! ef0ff25c6903087992aa69002e1fe999  gcc/testsuite/gcc.target/riscv/pr105314-rtl.c
  2a8afe8c20a6dcb0f68bfd5c67b3c1f0  gcc/testsuite/gcc.target/riscv/pr105314-rtl32.c
! 837709e161c1d5eaa66ca76c13aa7469  gcc/testsuite/gcc.target/riscv/pr105314.c
  488d01f6a52c713a85a02ef3f9147fe8  gcc/testsuite/gcc.target/riscv/pr105666.c
  d7cf53ef302f30f2c25f866e2db8247c  gcc/testsuite/gcc.target/riscv/pr105733.c
  63dc226b106d6c80e12472b668bcbb5b  gcc/testsuite/gcc.target/riscv/pr106244.c
--- 99815,99823 ----
  c2ea2036045469f1056fc7689ee62c7f  gcc/testsuite/gcc.target/riscv/pr102957.c
  c70df77dca2d9d059e9b22e279613d45  gcc/testsuite/gcc.target/riscv/pr103302.c
  78659ffafd452ac6a43859083b99d8ae  gcc/testsuite/gcc.target/riscv/pr104140.c
! a3762e2d80e5c93e2af776c5264123f2  gcc/testsuite/gcc.target/riscv/pr105314-rtl.c
  2a8afe8c20a6dcb0f68bfd5c67b3c1f0  gcc/testsuite/gcc.target/riscv/pr105314-rtl32.c
! 6524e84c24f8d9066054ae4faead245a  gcc/testsuite/gcc.target/riscv/pr105314.c
  488d01f6a52c713a85a02ef3f9147fe8  gcc/testsuite/gcc.target/riscv/pr105666.c
  d7cf53ef302f30f2c25f866e2db8247c  gcc/testsuite/gcc.target/riscv/pr105733.c
  63dc226b106d6c80e12472b668bcbb5b  gcc/testsuite/gcc.target/riscv/pr106244.c
*************** dbe7e01002e5a8097f16f6e89450e72f  gcc/te
*** 99871,99876 ****
--- 99965,99971 ----
  2d8f78bed7d5d7c2f70dfa4d3902ac2b  gcc/testsuite/gcc.target/riscv/pr124955.c
  689058565a07dcb181ca0bd08374dcc0  gcc/testsuite/gcc.target/riscv/pr124984.c
  7f393994eaf6402baf4e43a673c3f1f5  gcc/testsuite/gcc.target/riscv/pr125152.c
+ de7f2cc01b369ea994e72e2ba0a8b39a  gcc/testsuite/gcc.target/riscv/pr125320.c
  37a08389ba95284cc27832767dfc1430  gcc/testsuite/gcc.target/riscv/pr43644.c
  8eba488c3d26a288644785954ea86af2  gcc/testsuite/gcc.target/riscv/pr52345.c
  f035fac0dc9b5f42ec0a469a8391163c  gcc/testsuite/gcc.target/riscv/pr56096.c
*************** a35ab89b4f1328862d2d5893af40272b  gcc/te
*** 100353,100359 ****
  8fc4fce49e4bc4f733c7b70ba7788d9c  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc-2.c
  6993e6d563f91e3de62f0af1ca47f6c6  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc_run-1.c
  8faf667c33a8e128d5c1a45fe033a51e  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc_run-2.c
! 7afaa6ea87c32da0c534799e46003c95  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c
  a80a327ad7994dcee7af0ba4ecf079ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c
  1a9f3306db4324b51d4e6cce402cc766  gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vec-narrow-int64-float16.c
  184b7484bbed8a4ab66b558698fe3aca  gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vec-widen-float16-int64.c
--- 100448,100454 ----
  8fc4fce49e4bc4f733c7b70ba7788d9c  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc-2.c
  6993e6d563f91e3de62f0af1ca47f6c6  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc_run-1.c
  8faf667c33a8e128d5c1a45fe033a51e  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/cond_widen_reduc_run-2.c
! 4c338f92eac5e608e0efaf0e6f03280f  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c
  a80a327ad7994dcee7af0ba4ecf079ab  gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111594.c
  1a9f3306db4324b51d4e6cce402cc766  gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vec-narrow-int64-float16.c
  184b7484bbed8a4ab66b558698fe3aca  gcc/testsuite/gcc.target/riscv/rvv/autovec/conversions/vec-widen-float16-int64.c
*************** ad335589099a94191b9aed7b0762be2e  gcc/te
*** 100415,100421 ****
  ff340d9c6dee8784837f8941d76ecb52  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-2.c
  5522a5c36ca95ef215635928ff0690c4  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-3.c
  98c9ad8647e73c3d00ffb9b02387030e  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-4.c
! 4eec1c208618208817133e20728e6cb7  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c
  5a12daa267ef1b36fd2b14c30b0c65fc  gcc/testsuite/gcc.target/riscv/rvv/autovec/fixed-vlmax-1.c
  dd2861db83bd4db623b682d60209ffd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/fold-min-poly.c
  b60c9f046ba24d1346603ea33fa46de1  gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/gather_load_32-1.c
--- 100510,100516 ----
  ff340d9c6dee8784837f8941d76ecb52  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-2.c
  5522a5c36ca95ef215635928ff0690c4  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-3.c
  98c9ad8647e73c3d00ffb9b02387030e  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-4.c
! 264041a74ff4f1e7140e0354facda513  gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c
  5a12daa267ef1b36fd2b14c30b0c65fc  gcc/testsuite/gcc.target/riscv/rvv/autovec/fixed-vlmax-1.c
  dd2861db83bd4db623b682d60209ffd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/fold-min-poly.c
  b60c9f046ba24d1346603ea33fa46de1  gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/gather_load_32-1.c
*************** d2222030c01217f8068ec4a563d5bc18  gcc/te
*** 102194,102203 ****
  402ce5fce97f2b0732d2941db33bdc14  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-16.c
  eb55f2c3ddbf10c180aac54990e9c2f1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-17.c
  26e1c04eaabf0b65d6bc6dfe6d2ac5b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-18.c
! b65aba01e8bf32e2bfd8e7ae11930fa0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c
  1481137426b14ee87b88bbc9678b9696  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-2.c
! 91b14db576a4f42aa14688938d1ea062  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c
! d845b6075f8e9b17ef225e13c126157e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c
  4081c79d5c2563ec6c1a44a623bae0ba  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-3.c
  6d456c6824280daea7666a2b39e6a9e7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-4.c
  9ab9cb5cb53a8215b614d8d8d298fdde  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-5.c
--- 102289,102298 ----
  402ce5fce97f2b0732d2941db33bdc14  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-16.c
  eb55f2c3ddbf10c180aac54990e9c2f1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-17.c
  26e1c04eaabf0b65d6bc6dfe6d2ac5b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-18.c
! acf80df085e65d5901158fef0d783c63  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c
  1481137426b14ee87b88bbc9678b9696  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-2.c
! eb57c6210ef4bc920e168aef65bf1493  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c
! 4a72645316609ff46774873fe5eb4f97  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c
  4081c79d5c2563ec6c1a44a623bae0ba  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-3.c
  6d456c6824280daea7666a2b39e6a9e7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-4.c
  9ab9cb5cb53a8215b614d8d8d298fdde  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-5.c
*************** cda7e9e862749dd8cf762cc1f49b7cda  gcc/te
*** 102281,102287 ****
  ca4b6d27bd895f74c1271c4e1f574e94  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wmul-3.c
  96a518f01c4f6d965a6d9cc6b6bf1840  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-1.c
  66cfafbf6ff4e26db2090f88e587a1a3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-2.c
! 2399a90713056a6eece929c0dee1a270  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c
  4b8d6002f3edfa64401923386b165903  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-1.c
  9026964ee15efb37908a3e512297a41b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-2.c
  2d43c1a385403a3909ef94fa3151830e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-3.c
--- 102376,102382 ----
  ca4b6d27bd895f74c1271c4e1f574e94  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wmul-3.c
  96a518f01c4f6d965a6d9cc6b6bf1840  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-1.c
  66cfafbf6ff4e26db2090f88e587a1a3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-2.c
! dc475c1c32de0c1ee9856b00a2f88fa4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c
  4b8d6002f3edfa64401923386b165903  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-1.c
  9026964ee15efb37908a3e512297a41b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-2.c
  2d43c1a385403a3909ef94fa3151830e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wsub-3.c
*************** ef4245fd73f1de259b051142efa963ad  gcc/te
*** 103176,103181 ****
--- 103271,103277 ----
  08054e5f470b078b510e4a3e83f162d6  gcc/testsuite/gcc.target/riscv/rvv/base/frm-1.c
  62b9c34ffc66f09c2f8e7f4e0f7963a6  gcc/testsuite/gcc.target/riscv/rvv/base/integer-cmp-eqne.c
  49f1b4782476ece5ef4b7d47553b9e13  gcc/testsuite/gcc.target/riscv/rvv/base/integer_compare_insn_shortcut.c
+ e1b6721569cd290fd5be5cbd06e06b04  gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic-detection.c
  ad3f94be809a85189ad1c49198c4c3ad  gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic_required_ext-1.c
  c6b052e57c2390fdf919c33521b5abdc  gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic_required_ext-10.c
  a1c36473cff92034ab6df5d98269988d  gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic_required_ext-2.c
*************** f6f88d093025e4e08279af1a0dc99807  gcc/te
*** 105386,105391 ****
--- 105482,105489 ----
  6742e9c429211c6f6e2ad530e2068baf  gcc/testsuite/gcc.target/riscv/shift-shift-3.c
  6ac6cb7156c6792c36eb8bf50d36e6c3  gcc/testsuite/gcc.target/riscv/shift-shift-4.c
  f75203940c40557e5e51741f83c5a2de  gcc/testsuite/gcc.target/riscv/shift-shift-5.c
+ 8211d8e4b9da78adea589cb1f201edb1  gcc/testsuite/gcc.target/riscv/shift-shift-6.c
+ 30d71df4284c3f12e347e20a6c5d7c17  gcc/testsuite/gcc.target/riscv/shift-shift-7.c
  d42b5158196a609204cd9c4e3de58825  gcc/testsuite/gcc.target/riscv/shorten-memrefs-1.c
  19d45e9f2c84257eb2d8540e8a98084b  gcc/testsuite/gcc.target/riscv/shorten-memrefs-2.c
  d16769ddf3b35ed27690cb27f697ede2  gcc/testsuite/gcc.target/riscv/shorten-memrefs-3.c
*************** b2d190bbc93bb8aca63abd0ddf20aefc  gcc/te
*** 105403,105409 ****
  3f47aa8acdf98bd432971c2997721537  gcc/testsuite/gcc.target/riscv/simplify_ior_optimization.c
  b46d13a1308787ce2b7a3bb9f83f6524  gcc/testsuite/gcc.target/riscv/sle.c
  7932cde858379cf62bae15befab52987  gcc/testsuite/gcc.target/riscv/sleu.c
! 2c30eb1ba2842808c504f1ae0a347271  gcc/testsuite/gcc.target/riscv/slt-1.c
  a2a3683590a6c12a010cfd0b3f03b095  gcc/testsuite/gcc.target/riscv/smax-ieee.c
  86c31544a16504a7d32260ca07621420  gcc/testsuite/gcc.target/riscv/smax.c
  0215096559d8744c32da1dc65d488b7c  gcc/testsuite/gcc.target/riscv/smaxf-ieee.c
--- 105501,105507 ----
  3f47aa8acdf98bd432971c2997721537  gcc/testsuite/gcc.target/riscv/simplify_ior_optimization.c
  b46d13a1308787ce2b7a3bb9f83f6524  gcc/testsuite/gcc.target/riscv/sle.c
  7932cde858379cf62bae15befab52987  gcc/testsuite/gcc.target/riscv/sleu.c
! 43818de9fb25aaf8a55fa39dcd3bca02  gcc/testsuite/gcc.target/riscv/slt-1.c
  a2a3683590a6c12a010cfd0b3f03b095  gcc/testsuite/gcc.target/riscv/smax-ieee.c
  86c31544a16504a7d32260ca07621420  gcc/testsuite/gcc.target/riscv/smax.c
  0215096559d8744c32da1dc65d488b7c  gcc/testsuite/gcc.target/riscv/smaxf-ieee.c
*************** c365e36104fa71b9d21ff3749043ed59  gcc/te
*** 105612,105618 ****
  8ebdc283aea5f958d8df81217669c6cc  gcc/testsuite/gcc.target/riscv/zba-shNadd-01.c
  bd5709f7ce727c9b20e5978f22237e84  gcc/testsuite/gcc.target/riscv/zba-shNadd-02.c
  80c06090d5b9372e4d3b24414a3ac481  gcc/testsuite/gcc.target/riscv/zba-shNadd-03.c
! cf1c8476f01377285a0b1c08de6df67b  gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c
  1456e0b644560b4d55a604c8032c331b  gcc/testsuite/gcc.target/riscv/zba-shNadd-05.c
  b783b3106f46216a8103473a59dd8ea9  gcc/testsuite/gcc.target/riscv/zba-shNadd-07.c
  ca9771ec96feacc32b224db5e3406eff  gcc/testsuite/gcc.target/riscv/zba-shNadd-08.c
--- 105710,105716 ----
  8ebdc283aea5f958d8df81217669c6cc  gcc/testsuite/gcc.target/riscv/zba-shNadd-01.c
  bd5709f7ce727c9b20e5978f22237e84  gcc/testsuite/gcc.target/riscv/zba-shNadd-02.c
  80c06090d5b9372e4d3b24414a3ac481  gcc/testsuite/gcc.target/riscv/zba-shNadd-03.c
! 454dd88a2cab54ead208e08ea10976a7  gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c
  1456e0b644560b4d55a604c8032c331b  gcc/testsuite/gcc.target/riscv/zba-shNadd-05.c
  b783b3106f46216a8103473a59dd8ea9  gcc/testsuite/gcc.target/riscv/zba-shNadd-07.c
  ca9771ec96feacc32b224db5e3406eff  gcc/testsuite/gcc.target/riscv/zba-shNadd-08.c
*************** ca8dcbe1d318561f3ba7df5abeff7677  gcc/te
*** 105620,105626 ****
  2e6bd091b9b1d2d6fcb7fdfa8aa1641f  gcc/testsuite/gcc.target/riscv/zba-shNadd-10.c
  85bbbaeaa23916a0c9e7e6745ed586de  gcc/testsuite/gcc.target/riscv/zba-shadd.c
  ee390913829a46a6ce5004198d82bb62  gcc/testsuite/gcc.target/riscv/zba-shadduw.c
! 1e372c3919a67ae0d4e075b9c20347e5  gcc/testsuite/gcc.target/riscv/zba-slliuw.c
  7897a2dc924c5d59e2471445e59414f7  gcc/testsuite/gcc.target/riscv/zba-zextw.c
  6c5397671f66bec010860dfbc4625631  gcc/testsuite/gcc.target/riscv/zba_zbs_and-1.c
  a051ed98697d928f921972ad228d616d  gcc/testsuite/gcc.target/riscv/zbb-andn-orn-01.c
--- 105718,105724 ----
  2e6bd091b9b1d2d6fcb7fdfa8aa1641f  gcc/testsuite/gcc.target/riscv/zba-shNadd-10.c
  85bbbaeaa23916a0c9e7e6745ed586de  gcc/testsuite/gcc.target/riscv/zba-shadd.c
  ee390913829a46a6ce5004198d82bb62  gcc/testsuite/gcc.target/riscv/zba-shadduw.c
! b5119fbd11d5e172fb6ab7e1bb33ac05  gcc/testsuite/gcc.target/riscv/zba-slliuw.c
  7897a2dc924c5d59e2471445e59414f7  gcc/testsuite/gcc.target/riscv/zba-zextw.c
  6c5397671f66bec010860dfbc4625631  gcc/testsuite/gcc.target/riscv/zba_zbs_and-1.c
  a051ed98697d928f921972ad228d616d  gcc/testsuite/gcc.target/riscv/zbb-andn-orn-01.c
*************** c3444472611116c90abffb38b29ae95d  gcc/te
*** 105679,105685 ****
  3f88423cd15511bd9a5e52bf7243c39c  gcc/testsuite/gcc.target/riscv/zbs-if_then_else-02.c
  50150b544e8395982aac17886c1b29db  gcc/testsuite/gcc.target/riscv/zbs-zext-2.c
  3a06315324f29c37623a9cee79bd753d  gcc/testsuite/gcc.target/riscv/zbs-zext-3.c
! 133ebde9ed99c7dd5e86cd0001da8b72  gcc/testsuite/gcc.target/riscv/zbs-zext.c
  8fb8cdfdbce79f56e1e73dab457a9db0  gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c
  c726e3a440795e179d06b6378a2243a1  gcc/testsuite/gcc.target/riscv/zcmp_push_gpr.c
  25806d4ad1e3f8088607b230b1652906  gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
--- 105777,105783 ----
  3f88423cd15511bd9a5e52bf7243c39c  gcc/testsuite/gcc.target/riscv/zbs-if_then_else-02.c
  50150b544e8395982aac17886c1b29db  gcc/testsuite/gcc.target/riscv/zbs-zext-2.c
  3a06315324f29c37623a9cee79bd753d  gcc/testsuite/gcc.target/riscv/zbs-zext-3.c
! 6f785d7a1a3dc522effd83da0ff50142  gcc/testsuite/gcc.target/riscv/zbs-zext.c
  8fb8cdfdbce79f56e1e73dab457a9db0  gcc/testsuite/gcc.target/riscv/zcmp_push_fpr.c
  c726e3a440795e179d06b6378a2243a1  gcc/testsuite/gcc.target/riscv/zcmp_push_gpr.c
  25806d4ad1e3f8088607b230b1652906  gcc/testsuite/gcc.target/riscv/zcmp_shrink_wrap_separate.c
*************** a009fbb003840ecc4d7a50c463fa72da  gcc/te
*** 105745,105750 ****
--- 105843,105859 ----
  bb2b3e0ab01f1ec16e989024621b390a  gcc/testsuite/gcc.target/riscv/zihintpause-1.c
  2b3fb44b9845e2008eee1f6ba7b44bc4  gcc/testsuite/gcc.target/riscv/zihintpause-2.c
  b93bb61a6adb25211cec61b639273181  gcc/testsuite/gcc.target/riscv/zihintpause-noarch.c
+ f5e81027739b18285a7080f889a67713  gcc/testsuite/gcc.target/riscv/zilsd-align-default-1.c
+ 383c4ba31512356e3c0a2bc438f85fd0  gcc/testsuite/gcc.target/riscv/zilsd-align-df-1.c
+ d7e927022071f3920497126117010e1c  gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-1.c
+ 5dc3c4c1458389c54fee927172fbd22a  gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-2.c
+ 5e2e3abc50fdda47d61901693cd5dc21  gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-3.c
+ bf2668eb9907726e33b9300f39a77bb7  gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-4.c
+ 58ac6a399d35f7d3051bca3a975bd712  gcc/testsuite/gcc.target/riscv/zilsd-align-word-1.c
+ e6d985b37513e4d48038cf0b5a6a5490  gcc/testsuite/gcc.target/riscv/zilsd-align-word-2.c
+ 395fba9a8b66da8af45e06fb289e5f4a  gcc/testsuite/gcc.target/riscv/zilsd-align-word-3.c
+ aec58c2550c673c191cd2212b3042987  gcc/testsuite/gcc.target/riscv/zilsd-align-word-4.c
+ 69cfa469becc057a86198ffaae182554  gcc/testsuite/gcc.target/riscv/zilsd-align-word-5.c
  70e2ba21009e1db30b88fe6569ef97c9  gcc/testsuite/gcc.target/riscv/zilsd-code-gen-split-subreg-1.c
  c4d11819daad481809a78407b7815f76  gcc/testsuite/gcc.target/riscv/zilsd-code-gen-split-subreg-2.c
  f7d12c5379fd73c039260ba85d51a8a7  gcc/testsuite/gcc.target/riscv/zilsd-code-gen.c
*************** ab84766be794b9e4852be1779055db33  gcc/te
*** 108351,108357 ****
  1446d4a981346257c105a413b762723f  gcc/testsuite/gdc.test/compilable/dtoh_CPPNamespaceDeclaration.d
  5988f398efbd47ee9a32e8f23cf2b942  gcc/testsuite/gdc.test/compilable/dtoh_ClassDeclaration.d
  c4bc92df8eaebe56b02521ae9eb5cba7  gcc/testsuite/gdc.test/compilable/dtoh_StructDeclaration.d
! e4216cc7c14062ff1f39f123b8a089da  gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d
  df0c7ce33fabf0c2e7618cab3a18e7ad  gcc/testsuite/gdc.test/compilable/dtoh_UnionDeclaration.d
  7d955c40525206951fce203f46fd30b4  gcc/testsuite/gdc.test/compilable/dtoh_VarDeclaration.d
  8bb39e8cee1ae6d61d691e78989b728b  gcc/testsuite/gdc.test/compilable/dtoh_cpp98_compat.d
--- 108460,108466 ----
  1446d4a981346257c105a413b762723f  gcc/testsuite/gdc.test/compilable/dtoh_CPPNamespaceDeclaration.d
  5988f398efbd47ee9a32e8f23cf2b942  gcc/testsuite/gdc.test/compilable/dtoh_ClassDeclaration.d
  c4bc92df8eaebe56b02521ae9eb5cba7  gcc/testsuite/gdc.test/compilable/dtoh_StructDeclaration.d
! 2603c827b5553b5ea3db17d985cbbd4c  gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d
  df0c7ce33fabf0c2e7618cab3a18e7ad  gcc/testsuite/gdc.test/compilable/dtoh_UnionDeclaration.d
  7d955c40525206951fce203f46fd30b4  gcc/testsuite/gdc.test/compilable/dtoh_VarDeclaration.d
  8bb39e8cee1ae6d61d691e78989b728b  gcc/testsuite/gdc.test/compilable/dtoh_cpp98_compat.d
*************** a8db2129ce64619adefe97016e2a537b  gcc/te
*** 112210,112215 ****
--- 112319,112326 ----
  38343e39577a1d093c40818070ea1d7b  gcc/testsuite/gfortran.dg/20181025-1.f
  4c764b41ba24a01014e53db159a15787  gcc/testsuite/gfortran.dg/20231103-1.f90
  69f7d2e39ae1d08b07a3d6e622ed82fb  gcc/testsuite/gfortran.dg/20231103-2.f90
+ 9b50c383f7b022f4fe7d97cf7f5fb283  gcc/testsuite/gfortran.dg/EXformat_1.F90
+ d80fbb8b308e7fcbcd0be2241cff3e64  gcc/testsuite/gfortran.dg/EXformat_2.f90
  747722c12afa6e089d9e33c3d05257f7  gcc/testsuite/gfortran.dg/ISO_Fortran_binding_1.c
  57077f084b8ec81f4f537428d13a6588  gcc/testsuite/gfortran.dg/ISO_Fortran_binding_1.f90
  a0882a6b88250e8258ab4511465c89da  gcc/testsuite/gfortran.dg/ISO_Fortran_binding_10.c
*************** d82ed154b6725c2bdc6ca8598e397162  gcc/te
*** 113161,113166 ****
--- 113272,113278 ----
  25e8c9238196849a558c35ff0fc853f7  gcc/testsuite/gfortran.dg/binding_label_tests_35.f90
  0305b1b284520ed3a5eea6c54b76d66c  gcc/testsuite/gfortran.dg/binding_label_tests_36.f90
  6217ed89f30703648de1cf1a0f54a5ed  gcc/testsuite/gfortran.dg/binding_label_tests_37.f90
+ a68135e272df85061728e10e152d1821  gcc/testsuite/gfortran.dg/binding_label_tests_38.f90
  30bf7172a6348994b72ba6a37d0e1844  gcc/testsuite/gfortran.dg/binding_label_tests_4.f03
  27695dee78547e7050f28a42fe933cf4  gcc/testsuite/gfortran.dg/binding_label_tests_5.f03
  07f203142fb7f0e2e9ab4fdd1b57c16f  gcc/testsuite/gfortran.dg/binding_label_tests_6.f03
*************** e747f35261c244bfefe1a3b6df142197  gcc/te
*** 116023,116028 ****
--- 116135,116142 ----
  fa862d5202e8a9940ce10e5de251b964  gcc/testsuite/gfortran.dg/gomp/crayptr3.f90
  1c6644a88dc4bee98beb52bb4342fee9  gcc/testsuite/gfortran.dg/gomp/crayptr4.f90
  4a434ccf995f8c325ad483ae77b66d9f  gcc/testsuite/gfortran.dg/gomp/crayptr5.f90
+ 2197612966927c70eb9ce973922322b3  gcc/testsuite/gfortran.dg/gomp/declare-mapper-1.f90
+ 2215d6710672f20b0b578edad96702ef  gcc/testsuite/gfortran.dg/gomp/declare-mapper-2.f90
  f771e918155eed02d90e026b9c163449  gcc/testsuite/gfortran.dg/gomp/declare-simd-1.f90
  57864e06c09c2a6cc2c1d34d921c8d24  gcc/testsuite/gfortran.dg/gomp/declare-simd-2.f90
  2a1d11803d89a25e412300a0b880260f  gcc/testsuite/gfortran.dg/gomp/declare-simd-3.f90
*************** b76492fcf2fb1505fe0530d8302d7581  gcc/te
*** 116175,116180 ****
--- 116289,116296 ----
  7d7d346af5f07416c14bd1e65e77ee39  gcc/testsuite/gfortran.dg/gomp/map-8.f90
  e4611087ccbe2da89ff845309c4f0a28  gcc/testsuite/gfortran.dg/gomp/map-9.f90
  76e8b638cea123405704916f0d8d15c5  gcc/testsuite/gfortran.dg/gomp/map-alloc-comp-1.f90
+ ae1d1638880f871f0edc64f288ea809c  gcc/testsuite/gfortran.dg/gomp/map-multi-1.f90
+ ecc6a107b4b8d99f10df6f63298016f0  gcc/testsuite/gfortran.dg/gomp/map-multi-2.f90
  45a30924a96af3f4dc17367d65b8aa30  gcc/testsuite/gfortran.dg/gomp/map-subarray-2.f90
  3342189171517704ceefc26729c9af1c  gcc/testsuite/gfortran.dg/gomp/map-subarray-3.f90
  50d9e88ef3e24f6a0f0bcc698af2f0bb  gcc/testsuite/gfortran.dg/gomp/map-subarray-4.f90
*************** aa1b85a34517ebec1f009bb653cba745  gcc/te
*** 116281,116287 ****
  edeec1fe2488c7117f56e10734af03dc  gcc/testsuite/gfortran.dg/gomp/pr107214-6.f90
  697c52a53eea166cade44a3f935b8caf  gcc/testsuite/gfortran.dg/gomp/pr107214-7.f90
  75a523b6ea1c03878cc3bdc6a6346971  gcc/testsuite/gfortran.dg/gomp/pr107214-8.f90
! 3beded12a494129bebcc732d85089896  gcc/testsuite/gfortran.dg/gomp/pr107214.f90
  999f28c36a4332b9862398973c6f4c18  gcc/testsuite/gfortran.dg/gomp/pr107421.f90
  9413acb66d424e7e859e5b387d479808  gcc/testsuite/gfortran.dg/gomp/pr107425.f90
  0c6f80bb0ae8c8d07f18df0d3258975b  gcc/testsuite/gfortran.dg/gomp/pr113436-1.f90
--- 116397,116403 ----
  edeec1fe2488c7117f56e10734af03dc  gcc/testsuite/gfortran.dg/gomp/pr107214-6.f90
  697c52a53eea166cade44a3f935b8caf  gcc/testsuite/gfortran.dg/gomp/pr107214-7.f90
  75a523b6ea1c03878cc3bdc6a6346971  gcc/testsuite/gfortran.dg/gomp/pr107214-8.f90
! 7442b2022fa185494e41c5ecf3d38e69  gcc/testsuite/gfortran.dg/gomp/pr107214.f90
  999f28c36a4332b9862398973c6f4c18  gcc/testsuite/gfortran.dg/gomp/pr107421.f90
  9413acb66d424e7e859e5b387d479808  gcc/testsuite/gfortran.dg/gomp/pr107425.f90
  0c6f80bb0ae8c8d07f18df0d3258975b  gcc/testsuite/gfortran.dg/gomp/pr113436-1.f90
*************** e5a418513e079e50ea576e021cf5ad8e  gcc/te
*** 117008,117013 ****
--- 117124,117130 ----
  89a35f94060b171becdc54771a02040b  gcc/testsuite/gfortran.dg/inline_matmul_24.f90
  d5dddad98efc37928795b446cb8d6501  gcc/testsuite/gfortran.dg/inline_matmul_25.f90
  4887d0ef96e236941f816ecf873abb25  gcc/testsuite/gfortran.dg/inline_matmul_26.f90
+ f500cc59ecbd3442513dea98e8f73719  gcc/testsuite/gfortran.dg/inline_matmul_27.f90
  ffdb4ca68f61f3bd618415335c9c7c21  gcc/testsuite/gfortran.dg/inline_matmul_3.f90
  f95e5fd479c839cfa9cb3ac127ee7584  gcc/testsuite/gfortran.dg/inline_matmul_4.f90
  6cb787ca0dac6ea814c8af4ac7cb8022  gcc/testsuite/gfortran.dg/inline_matmul_5.f90
*************** f62b2fa65f325ecd9897d1210ea1dd59  gcc/te
*** 118500,118505 ****
--- 118617,118623 ----
  c2c29ab4a03f3fce7c592346c758df55  gcc/testsuite/gfortran.dg/pr114874_2.f90
  4b273604e577c17fd50a80fc5e61fbc9  gcc/testsuite/gfortran.dg/pr114883.f90
  114f9ad97017aeb38f9ec22adfdc15e9  gcc/testsuite/gfortran.dg/pr114959.f90
+ dcc85737c1fe827eb6a63f372dd52f3e  gcc/testsuite/gfortran.dg/pr115260.f90
  2cdd9da41524094c8df35fef567a26c5  gcc/testsuite/gfortran.dg/pr115281.f90
  862aedc97da38fe9b3319406b768d9c0  gcc/testsuite/gfortran.dg/pr115348.f90
  d1ba07988d4687e1f81b063e8b20cefa  gcc/testsuite/gfortran.dg/pr117060.f90
*************** f5fb3cbcb5e6e13e6a56fcf9422a2863  gcc/te
*** 118561,118566 ****
--- 118679,118686 ----
  c82475796fec905fbcbddbebc480ad15  gcc/testsuite/gfortran.dg/pr124739.f90
  8d5b416e1b358553fdc69e965bc1db7e  gcc/testsuite/gfortran.dg/pr124780.f90
  5b0777068e1d7ec735043f942f680e93  gcc/testsuite/gfortran.dg/pr125117.f90
+ 355d56226f56678c5cd357d83a78ddff  gcc/testsuite/gfortran.dg/pr125263.f90
+ 21a6fcd9db938827306935bac8eec1c1  gcc/testsuite/gfortran.dg/pr125391.f90
  984f8307f36d56a0b48b5acce2dd5eb5  gcc/testsuite/gfortran.dg/pr12884.f
  64075248b9d1bffd6f380bb4e2a6eae0  gcc/testsuite/gfortran.dg/pr15129.f90
  2b5f18b773a5db29b0a2ee2d8cce767c  gcc/testsuite/gfortran.dg/pr15140.f90
*************** d84a04f02b348b9b24a659413d60a25b  gcc/te
*** 128507,128513 ****
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
  5a6cedce32c4c01005adb940226eae62  gcc/testsuite/lib/sarif.py
! 0eaf8d4c599d230033d941eb4d7b6e51  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
--- 128627,128633 ----
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
  5a6cedce32c4c01005adb940226eae62  gcc/testsuite/lib/sarif.py
! 7ceb6095fbcbf32d237a5fe52953b277  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
*************** cbe90a107fcd179a95684d58982b5779  gcc/te
*** 131291,131297 ****
  ee4165de3d74b0fde5ca55a403c7f37b  gcc/timevar.def
  160bb6626a9562507750456253c82eb4  gcc/timevar.h
  af430d420eee56a4d869b7421ddb08b9  gcc/topics/pass-events.h
! 9122f2cfd3c35635a4ff995c650d9f7b  gcc/toplev.cc
  4cc76bc48e83cd9bdd4f991959a6f230  gcc/toplev.h
  08a29208cd04c7f3a5f2b43bec77b277  gcc/tracer.cc
  461d12af5a299c303884d0d07511a6a9  gcc/tracer.h
--- 131411,131417 ----
  ee4165de3d74b0fde5ca55a403c7f37b  gcc/timevar.def
  160bb6626a9562507750456253c82eb4  gcc/timevar.h
  af430d420eee56a4d869b7421ddb08b9  gcc/topics/pass-events.h
! 480ac969ad3b5485ec5045df000fadab  gcc/toplev.cc
  4cc76bc48e83cd9bdd4f991959a6f230  gcc/toplev.h
  08a29208cd04c7f3a5f2b43bec77b277  gcc/tracer.cc
  461d12af5a299c303884d0d07511a6a9  gcc/tracer.h
*************** d7c0da59494a51ae966d29f4618b2f9a  gcc/tr
*** 131325,131331 ****
  0cb6286531ef1298c60bd670fe8a1f62  gcc/tree-emutls.cc
  278ef0d1cc8f017ae51affd9a1e110a5  gcc/tree-hash-traits.h
  f8be97e59befb22cc3869e742a095cca  gcc/tree-hasher.h
! 74a1d8bf597d9fcfa84e6ac9f2297cb5  gcc/tree-if-conv.cc
  87f110e202a07bb1d7e6402808531851  gcc/tree-if-conv.h
  36641aac4acff031aafd6e8316186bf0  gcc/tree-inline.cc
  8e4dac1ee5fbcab0629042db2f9ece45  gcc/tree-inline.h
--- 131445,131451 ----
  0cb6286531ef1298c60bd670fe8a1f62  gcc/tree-emutls.cc
  278ef0d1cc8f017ae51affd9a1e110a5  gcc/tree-hash-traits.h
  f8be97e59befb22cc3869e742a095cca  gcc/tree-hasher.h
! 2cbf7c07966448c7108b23f5ccc8374d  gcc/tree-if-conv.cc
  87f110e202a07bb1d7e6402808531851  gcc/tree-if-conv.h
  36641aac4acff031aafd6e8316186bf0  gcc/tree-inline.cc
  8e4dac1ee5fbcab0629042db2f9ece45  gcc/tree-inline.h
*************** b36c3bd52f9df56746196a0cf2b3ac14  gcc/tr
*** 131369,131408 ****
  121090f76aa83f677c00129216885e7e  gcc/tree-ssa-copy.cc
  397fa8587be3541feae34aee955f9229  gcc/tree-ssa-dce.cc
  34546de59e69d1a125c3fa7747d7f0e2  gcc/tree-ssa-dce.h
! 0f4c141491f78cda131cc59551623f12  gcc/tree-ssa-dom.cc
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
! b0752286b16612fce67b55c8b0bdbdbc  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
  82d1147e003412dabe820e815cdf2eed  gcc/tree-ssa-forwprop.cc
  bb90d30f7c6176fd9edf8b10cc7803b6  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
  dcaeaaad1469ccb53d09d0c3975284d7  gcc/tree-ssa-loop-ch.cc
! 2b00d0f0fd67365a2e05a25f3a784111  gcc/tree-ssa-loop-im.cc
  f8b96abb98adf78d9bf9645ec4529541  gcc/tree-ssa-loop-ivcanon.cc
  d24792a2959758d0e543ff78a3449773  gcc/tree-ssa-loop-ivopts.cc
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
! 3b019867aefd4f962c260256d5bed88e  gcc/tree-ssa-loop-manip.cc
  d6013c7f2ea70d40b0d82c53eacccd45  gcc/tree-ssa-loop-manip.h
! 698d95be97d13872c2d2ec327b692cbb  gcc/tree-ssa-loop-niter.cc
  722669ffcd66a5eddeeebe77512a22fa  gcc/tree-ssa-loop-niter.h
  a00381a12f6e0a0c69845030d621d615  gcc/tree-ssa-loop-prefetch.cc
! ebf22ffd803f5b75a6819a8b565bcea0  gcc/tree-ssa-loop-split.cc
! 7d41277dc2b070fc20de82de11dfe8bc  gcc/tree-ssa-loop-unswitch.cc
  faa18178392bba086edee765e464318c  gcc/tree-ssa-loop.cc
  c1590659dad2b41a69adb7654db65644  gcc/tree-ssa-loop.h
! 895ec87fac3252b3f3cf780e31ae7020  gcc/tree-ssa-math-opts.cc
  fa83f982a805985b3a3da2ca5e10e43a  gcc/tree-ssa-math-opts.h
  56d25f9d7a5f35aa3637460c00b7eb7e  gcc/tree-ssa-operands.cc
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
! 93fc2d8d4a975720fc373c7c277cba39  gcc/tree-ssa-phiopt.cc
! 92ad5cbf538d0838f11679a2c649a672  gcc/tree-ssa-phiprop.cc
! e356f4c7b22c3759a86c782d5e99d1a8  gcc/tree-ssa-pre.cc
! 5d6622629ccbf56551beb5cb3cc8684a  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
! 1f64e1425bb8bc82e544c5f49f89b084  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
! bbfdab9c432e365a5d11e0249f3f57f1  gcc/tree-ssa-sccvn.cc
  969557a6ff2537ae4a6d36fde566e436  gcc/tree-ssa-sccvn.h
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
--- 131489,131528 ----
  121090f76aa83f677c00129216885e7e  gcc/tree-ssa-copy.cc
  397fa8587be3541feae34aee955f9229  gcc/tree-ssa-dce.cc
  34546de59e69d1a125c3fa7747d7f0e2  gcc/tree-ssa-dce.h
! 49ea38a06cadbaa424304a42a436cba8  gcc/tree-ssa-dom.cc
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
! eb45207f0c6a42c26f3322d4ccd5cc21  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
  82d1147e003412dabe820e815cdf2eed  gcc/tree-ssa-forwprop.cc
  bb90d30f7c6176fd9edf8b10cc7803b6  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
  dcaeaaad1469ccb53d09d0c3975284d7  gcc/tree-ssa-loop-ch.cc
! 7e0fc21bd49ee6c5642e711dcaa8196a  gcc/tree-ssa-loop-im.cc
  f8b96abb98adf78d9bf9645ec4529541  gcc/tree-ssa-loop-ivcanon.cc
  d24792a2959758d0e543ff78a3449773  gcc/tree-ssa-loop-ivopts.cc
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
! 9c2771407c6cb32b3d230d8b3c87a2b8  gcc/tree-ssa-loop-manip.cc
  d6013c7f2ea70d40b0d82c53eacccd45  gcc/tree-ssa-loop-manip.h
! 0b89f1372a57411cf07dcb10d552755a  gcc/tree-ssa-loop-niter.cc
  722669ffcd66a5eddeeebe77512a22fa  gcc/tree-ssa-loop-niter.h
  a00381a12f6e0a0c69845030d621d615  gcc/tree-ssa-loop-prefetch.cc
! f90bb829a4d4ab0700f5e8b5c30e8d13  gcc/tree-ssa-loop-split.cc
! e095960ef0fe00db5db9f4a2e88515d1  gcc/tree-ssa-loop-unswitch.cc
  faa18178392bba086edee765e464318c  gcc/tree-ssa-loop.cc
  c1590659dad2b41a69adb7654db65644  gcc/tree-ssa-loop.h
! 406c7948bf51ea197264ff2b52a23a9c  gcc/tree-ssa-math-opts.cc
  fa83f982a805985b3a3da2ca5e10e43a  gcc/tree-ssa-math-opts.h
  56d25f9d7a5f35aa3637460c00b7eb7e  gcc/tree-ssa-operands.cc
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
! b50e386b38111783b2afaf5e0562b47d  gcc/tree-ssa-phiopt.cc
! e548b44ff2b868f552f8100aeea9ec7a  gcc/tree-ssa-phiprop.cc
! 2629a2f2f3697ec132db57ae1cbd88dd  gcc/tree-ssa-pre.cc
! 63af51f1dd8ae411ddff56d9abeb68a1  gcc/tree-ssa-propagate.cc
  d38017eb69a50f24b5e47ee97928afde  gcc/tree-ssa-propagate.h
! 5b77fd429ee7e541ce41a750ef1ba809  gcc/tree-ssa-reassoc.cc
  82a2c700ac2e32f106bcbd11fc5cf152  gcc/tree-ssa-reassoc.h
! fdcd4f12e83f639ac995861cd763232d  gcc/tree-ssa-sccvn.cc
  969557a6ff2537ae4a6d36fde566e436  gcc/tree-ssa-sccvn.h
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
*************** f0d1488584aa7165744ddc40b3d98e30  gcc/tr
*** 131448,131456 ****
  1c4ff57c2d14795783b43ada68bc9165  gcc/tree-vectorizer.h
  366e0ed463591e966ced4d1fd421282d  gcc/tree-vrp.cc
  d7273e63988959e17e61bc75f7f0cf29  gcc/tree-vrp.h
! 0ce4fc85b0fe37d68fb37a7e2d4c56a8  gcc/tree.cc
  f88475a43ca5e7c59112c941875a762c  gcc/tree.def
! b81aa0cdd29bf9ff413e5bc6890ee498  gcc/tree.h
  56652e612288132aa8395fdf720b0146  gcc/treestruct.def
  6c6350469a3dbb37f658f247d16ed872  gcc/tristate.cc
  704359710c2d40a58b6646b2da626443  gcc/tristate.h
--- 131568,131576 ----
  1c4ff57c2d14795783b43ada68bc9165  gcc/tree-vectorizer.h
  366e0ed463591e966ced4d1fd421282d  gcc/tree-vrp.cc
  d7273e63988959e17e61bc75f7f0cf29  gcc/tree-vrp.h
! dd57fd4c22c61522419ffb9ff325074b  gcc/tree.cc
  f88475a43ca5e7c59112c941875a762c  gcc/tree.def
! f2567fc812e31ecd85a4a0c19ea9a089  gcc/tree.h
  56652e612288132aa8395fdf720b0146  gcc/treestruct.def
  6c6350469a3dbb37f658f247d16ed872  gcc/tristate.cc
  704359710c2d40a58b6646b2da626443  gcc/tristate.h
*************** df6e60fd226c010029982dccb67d2e71  gcc/va
*** 131469,131475 ****
  87b8ea160aedd51d0b39987c651c19c5  gcc/value-pointer-equiv.h
  25abf8431e827e6fdd5d719820f13b81  gcc/value-prof.cc
  062dd0b6b7d499b7d7b9a11718fe3ecb  gcc/value-prof.h
! 415a35e15b00d5f7ef3a7bd5ee1b61b8  gcc/value-query.cc
  c559980f2936e62bb80a512b1682d0fd  gcc/value-query.h
  232e88bef5fe263fb56ac139fedbeff7  gcc/value-range-pretty-print.cc
  4235b252ca8759d55215ee9cd42e1e93  gcc/value-range-pretty-print.h
--- 131589,131595 ----
  87b8ea160aedd51d0b39987c651c19c5  gcc/value-pointer-equiv.h
  25abf8431e827e6fdd5d719820f13b81  gcc/value-prof.cc
  062dd0b6b7d499b7d7b9a11718fe3ecb  gcc/value-prof.h
! 1618d5795aa6fd02634fdfff4d2a0f39  gcc/value-query.cc
  c559980f2936e62bb80a512b1682d0fd  gcc/value-query.h
  232e88bef5fe263fb56ac139fedbeff7  gcc/value-range-pretty-print.cc
  4235b252ca8759d55215ee9cd42e1e93  gcc/value-range-pretty-print.h
*************** e65249df44ee10434babf84d1f108509  gcc/va
*** 131479,131485 ****
  dc6847f80ec5b2bfbfb505a18197c8a8  gcc/value-range.h
  89dd7a2e6c8aad8f04c37053eb24ec36  gcc/value-relation.cc
  ea7df3e5b6ab2e6e23e741431d583880  gcc/value-relation.h
! d6e6c12ad7955457218136e35f5a30d6  gcc/var-tracking.cc
  1657e0e5b170dd495911d1c2ceeb23da  gcc/varasm.cc
  183473e8cac5bad9279eb1937e4edda9  gcc/varasm.h
  136dfca78729a02f744f7929df4331c9  gcc/varpool.cc
--- 131599,131605 ----
  dc6847f80ec5b2bfbfb505a18197c8a8  gcc/value-range.h
  89dd7a2e6c8aad8f04c37053eb24ec36  gcc/value-relation.cc
  ea7df3e5b6ab2e6e23e741431d583880  gcc/value-relation.h
! 67243720463ddf0b7b00721a5680051a  gcc/var-tracking.cc
  1657e0e5b170dd495911d1c2ceeb23da  gcc/varasm.cc
  183473e8cac5bad9279eb1937e4edda9  gcc/varasm.h
  136dfca78729a02f744f7929df4331c9  gcc/varpool.cc
*************** a97c47969dfc92a7666dfe3c2e1e1448  libdec
*** 131911,131951 ****
  d4974701aea29eb07237c3fe5699033a  libdecnumber/dpd/decimal64.h
  0f6db29710e7075c2fd62bc4478b3b8d  libdecnumber/dpd/decimal64Symbols.h
  055606b47e85369c5d003f6e3a1b657e  libffi/.gitattributes
! 49a2de84abac86aa2477527b187d211c  libffi/ChangeLog
  0e38ead823643c45765e5fe55e7ab16b  libffi/ChangeLog.libffi
  fbbc216bc25d759a72ea3e6d734af56b  libffi/ChangeLog.libgcj
  d946d2b97454ad50a1dbfbf48923c5be  libffi/ChangeLog.v1
  cc4552d9286c17a905988bf55f96def7  libffi/HOWTO_MERGE
! 679b5c9bdc79a2b93ee574e193e7a7bc  libffi/LICENSE
  631bc8750a749106cf625001c1d6efb0  libffi/LICENSE-BUILDTOOLS
! aa69bb7958e068f86dbd0801c88113dd  libffi/LOCAL_PATCHES
! c55286ffa9013e1bc9fe188894b39e1d  libffi/MERGE
! 1685fa58ee6d09dbcf84f25f1ed2be42  libffi/Makefile.am
! 8072bae95b6d87464408fa1f8dbbef3f  libffi/Makefile.in
! 0196871242a2420712bad4e2c16d5274  libffi/README.md
! c67252e8ff3150683a184a729911b219  libffi/acinclude.m4
  54e1bb9dc8859b05ce3d3bb15c85704c  libffi/aclocal.m4
  aec59abbc470dda1bfe630dbb0bbd627  libffi/autogen.sh
! 63abd4903ab36ab93ef36a31e6bd124f  libffi/configure
! 0c9310ab4da9ff4d0d8aa37fa8fcb0be  libffi/configure.ac
! 54389f155bf929aa9429f225f0dbbaab  libffi/configure.host
  bad91ff01547ce79fe537211f4763ac0  libffi/doc/Makefile.am
! db28be3951c18d6db6e90f7e612bc67b  libffi/doc/libffi.texi
! 5919fb480c65fe4ba9e8d97536e528b2  libffi/doc/version.texi
! ea125d6ff0b3d20372a1556f82ca6a05  libffi/fficonfig.h.in
! 9a358eeaa41d3ceb5e732dbf61d3c931  libffi/generate-darwin-source-and-headers.py
  dd34002683e9900a6cd89c440f24a394  libffi/include/Makefile.am
! 545982dc8250d34ea0698384cce2648f  libffi/include/Makefile.in
! 60e00bb8059867f47ba6b93e4b4fac00  libffi/include/ffi.h.in
! a07e638debebcc001e7a73eb4a90ddba  libffi/include/ffi_cfi.h
! 3bafe1ab47d80c33e901b03a1e9c7732  libffi/include/ffi_common.h
  c19cb74ddd4e2244044a1da83a952afb  libffi/include/tramp.h
! 73375602600b485370ad4bd1ce1b6ab3  libffi/libffi.map.in
  ad82c93bb7f9710ee5d0f0e9af25e51d  libffi/libffi.pc.in
  1f271e0501ca22905ebfa732c49143db  libffi/libffi.xcodeproj/project.pbxproj
! 5b9a262eb2adfad2e0e5a67c9732b9c5  libffi/libtool-version
  ade48c43a4229988450151e8d3fd4ea2  libffi/man/Makefile.am
! c589e94738aa0a50780157c2a43ea3ac  libffi/man/Makefile.in
  375a858985ec2096671f484b1fe9b14b  libffi/man/ffi.3
  dd7b61f56e75a1d052dd10dc02ac4940  libffi/man/ffi_call.3
  634ea3ff80c805d513f31c111c5e6d36  libffi/man/ffi_prep_cif.3
--- 132031,132071 ----
  d4974701aea29eb07237c3fe5699033a  libdecnumber/dpd/decimal64.h
  0f6db29710e7075c2fd62bc4478b3b8d  libdecnumber/dpd/decimal64Symbols.h
  055606b47e85369c5d003f6e3a1b657e  libffi/.gitattributes
! e5ffd9885442b1f742a3bcf9b31c4865  libffi/ChangeLog
  0e38ead823643c45765e5fe55e7ab16b  libffi/ChangeLog.libffi
  fbbc216bc25d759a72ea3e6d734af56b  libffi/ChangeLog.libgcj
  d946d2b97454ad50a1dbfbf48923c5be  libffi/ChangeLog.v1
  cc4552d9286c17a905988bf55f96def7  libffi/HOWTO_MERGE
! ce4763670c5b7756000561f9af1ab178  libffi/LICENSE
  631bc8750a749106cf625001c1d6efb0  libffi/LICENSE-BUILDTOOLS
! 41a13f5ef35ac0b70f33310c368b895c  libffi/LOCAL_PATCHES
! e8fb2211eb1a54025c66700803f54894  libffi/MERGE
! c11244a7c5b07a31c0ad1d1918de98d0  libffi/Makefile.am
! 9f4314d027dec3754bdfdccdb2d0e546  libffi/Makefile.in
! 474f986ea89cf5916cc9b21d48cb5cb8  libffi/README.md
! d6274fea5d23a5f4d593df29caa1db13  libffi/acinclude.m4
  54e1bb9dc8859b05ce3d3bb15c85704c  libffi/aclocal.m4
  aec59abbc470dda1bfe630dbb0bbd627  libffi/autogen.sh
! 81c196f6911606dca78570a768d2e3e7  libffi/configure
! 9c1930d6bf47c062dc6a3b2a9fea58aa  libffi/configure.ac
! 607cd171f6a806488ca3fe2ac2e678e9  libffi/configure.host
  bad91ff01547ce79fe537211f4763ac0  libffi/doc/Makefile.am
! dfcb2c5dfd0ab331cbe7c87928e88b1b  libffi/doc/libffi.texi
! 274f129f6f64c89e9723e57c1d7f3fed  libffi/doc/version.texi
! 127bd6156ded6cf1483983652dde31ee  libffi/fficonfig.h.in
! 3f1ec03999faabce9c441c50f6904a1d  libffi/generate-darwin-source-and-headers.py
  dd34002683e9900a6cd89c440f24a394  libffi/include/Makefile.am
! 81b86ec752386cd1e54bb97724d8a967  libffi/include/Makefile.in
! cfedfd3d18595417723caa6e2b6149e4  libffi/include/ffi.h.in
! 2e5a02d879ba686b55d46eeb165a4ffa  libffi/include/ffi_cfi.h
! 95b4236d71fe221c71b2654cc65a6de6  libffi/include/ffi_common.h
  c19cb74ddd4e2244044a1da83a952afb  libffi/include/tramp.h
! 032ed0780e281a4a773c89517c91bef1  libffi/libffi.map.in
  ad82c93bb7f9710ee5d0f0e9af25e51d  libffi/libffi.pc.in
  1f271e0501ca22905ebfa732c49143db  libffi/libffi.xcodeproj/project.pbxproj
! d0c24b9e3f9993195afdc9c561b73f9b  libffi/libtool-version
  ade48c43a4229988450151e8d3fd4ea2  libffi/man/Makefile.am
! 9686d4da9702a97f2baa1fdb7e55ff33  libffi/man/Makefile.in
  375a858985ec2096671f484b1fe9b14b  libffi/man/ffi.3
  dd7b61f56e75a1d052dd10dc02ac4940  libffi/man/ffi_call.3
  634ea3ff80c805d513f31c111c5e6d36  libffi/man/ffi_prep_cif.3
*************** dd7b61f56e75a1d052dd10dc02ac4940  libffi
*** 131953,131974 ****
  00c15050127751bd8322e3a44f3a5e61  libffi/mdate-sh
  dce3aff6e79185f3a81f2eda4bd02ae1  libffi/merge.sh
  7487ea3d59873bb39dc4886eb3616d5c  libffi/msvcc.sh
! 9175551acbdd0ff98611d1daef987b47  libffi/src/aarch64/ffi.c
! b42af3dfe2dfed31394770bd1bb0baa4  libffi/src/aarch64/ffitarget.h
! d259a7b185a1e3b9f9058899270fbbb1  libffi/src/aarch64/internal.h
! 409570d506a6d52f51cdb50df9de56f6  libffi/src/aarch64/sysv.S
  dc58ba07aeb41fd359b53bcaca803126  libffi/src/aarch64/win64_armasm.S
  40e4bfc4ce20447e75683f85d1801954  libffi/src/alpha/ffi.c
  d602d6b1b71200f27c9c202731a55218  libffi/src/alpha/ffitarget.h
  a9a4ef52f3883876d62820519ba4f3ab  libffi/src/alpha/internal.h
  6908f921057714d5356a458f7a2deba2  libffi/src/alpha/osf.S
! 57aa2fdade3129c340916bc4bb26cfbb  libffi/src/arc/arcompact.S
! 059c03eb967ea6bcd70d11136688a98d  libffi/src/arc/ffi.c
! 2b86e1cded84eca7d5e99c892bd83b4a  libffi/src/arc/ffitarget.h
! 593e782d65fb85458911b3269277a731  libffi/src/arm/ffi.c
  fa10ab8dc9b3f606aed6ea3864e0c261  libffi/src/arm/ffitarget.h
  fc86defc055e16b8d111b4c103680bde  libffi/src/arm/internal.h
! 683e7de620fc2b2cbdec191d9ef46034  libffi/src/arm/sysv.S
  0351a92c508a57029bff881867529d57  libffi/src/arm/sysv_msvc_arm32.S
  1e7f2be6a7bb2c081a285a402215a364  libffi/src/avr32/ffi.c
  cecc1618a6dcea06d53ddfdd6d11dd39  libffi/src/avr32/ffitarget.h
--- 132073,132094 ----
  00c15050127751bd8322e3a44f3a5e61  libffi/mdate-sh
  dce3aff6e79185f3a81f2eda4bd02ae1  libffi/merge.sh
  7487ea3d59873bb39dc4886eb3616d5c  libffi/msvcc.sh
! 5d9bfa956941ba31ab3df7821bc130ba  libffi/src/aarch64/ffi.c
! f2fed788380f9e6a2b289189b9f53748  libffi/src/aarch64/ffitarget.h
! d52c1e8968d1912403160884d1d8a095  libffi/src/aarch64/internal.h
! 5478f38570afc203e8ca81c700b9c33a  libffi/src/aarch64/sysv.S
  dc58ba07aeb41fd359b53bcaca803126  libffi/src/aarch64/win64_armasm.S
  40e4bfc4ce20447e75683f85d1801954  libffi/src/alpha/ffi.c
  d602d6b1b71200f27c9c202731a55218  libffi/src/alpha/ffitarget.h
  a9a4ef52f3883876d62820519ba4f3ab  libffi/src/alpha/internal.h
  6908f921057714d5356a458f7a2deba2  libffi/src/alpha/osf.S
! 06326163b8e742ad7d2ffd2f2c5c19a7  libffi/src/arc/arcompact.S
! 615aeb0cd9cb5a2ab3d4a23130898927  libffi/src/arc/ffi.c
! 6d420d98dd259fb7039381f1066c8da2  libffi/src/arc/ffitarget.h
! 32c54ceb8da0561b11b80c407ac4fe0b  libffi/src/arm/ffi.c
  fa10ab8dc9b3f606aed6ea3864e0c261  libffi/src/arm/ffitarget.h
  fc86defc055e16b8d111b4c103680bde  libffi/src/arm/internal.h
! c30ff0183872fd34d7c085a765d5bbb7  libffi/src/arm/sysv.S
  0351a92c508a57029bff881867529d57  libffi/src/arm/sysv_msvc_arm32.S
  1e7f2be6a7bb2c081a285a402215a364  libffi/src/avr32/ffi.c
  cecc1618a6dcea06d53ddfdd6d11dd39  libffi/src/avr32/ffitarget.h
*************** cecc1618a6dcea06d53ddfdd6d11dd39  libffi
*** 131976,132006 ****
  1565efe598960193506628cafe73fbbb  libffi/src/bfin/ffi.c
  7513cc181bf36663d44182b9f1c95c51  libffi/src/bfin/ffitarget.h
  186967f96f819500e39f59a5251364e9  libffi/src/bfin/sysv.S
! 73895d422ff9f71f22ed5e3fc5ea7c65  libffi/src/closures.c
  89604a232af8071de35df602e5a6c8db  libffi/src/cris/ffi.c
  d56060242baa5dc429ba60ace6ebd724  libffi/src/cris/ffitarget.h
  b17e59bf6ba716c77cd9ca7a4e39e672  libffi/src/cris/sysv.S
  7ed06af0df087c85b9530785b2d2803d  libffi/src/csky/ffi.c
  334e5efe5554e9684814d43ad528f6c7  libffi/src/csky/ffitarget.h
  fd623ff1552771afe72e7d80971d9399  libffi/src/csky/sysv.S
! 960420667f1d82b9fdedcf2cb739390d  libffi/src/debug.c
! 1a1c46976e063513efdd1691d8991a71  libffi/src/dlmalloc.c
  b9ecce87980cf9448d35f168d0b12575  libffi/src/frv/eabi.S
  6d5f5603c261316978170edcae57685a  libffi/src/frv/ffi.c
  46d793348229f3fa5c098e65a913a2da  libffi/src/frv/ffitarget.h
! 42c9128059bd7e19c9952ccbcd2f2275  libffi/src/ia64/ffi.c
  7a21116d53a02f2ce8b47909dc050259  libffi/src/ia64/ffitarget.h
  6598837388b91973b3e6193968357fdb  libffi/src/ia64/ia64_flags.h
! 239c4f9ce72d72023f8fbd6b2a1516ad  libffi/src/ia64/unix.S
  5087a408b19fca412cf1b81262d0da0b  libffi/src/java_raw_api.c
  4594a1a5f46397d21c30f9e974ff8384  libffi/src/kvx/asm.h
  989104e297aeeae17122773939bd6830  libffi/src/kvx/ffi.c
  3cb04b5ba3412b866d5e7449ca24b6f0  libffi/src/kvx/ffitarget.h
  0c8c94d032ab11ae726e214dd6b91e7d  libffi/src/kvx/sysv.S
! bb5154e6fa46637b78be64775b3e9bb5  libffi/src/loongarch64/ffi.c
  e4452f19d2e2fe4da9ccd84182c6fb60  libffi/src/loongarch64/ffitarget.h
  4e9a878bb31f58e6265e1b49c13b8e79  libffi/src/loongarch64/sysv.S
! a06a5272996a57cf9c1338b05f6b19c8  libffi/src/m32r/ffi.c
  f231859daa12286973d5134b9afc8afe  libffi/src/m32r/ffitarget.h
  fde1f5cb81ab7ce114af861c94c368c0  libffi/src/m32r/sysv.S
  e4a8b1db2017ccf89ed2d5cb543f9e04  libffi/src/m68k/ffi.c
--- 132096,132126 ----
  1565efe598960193506628cafe73fbbb  libffi/src/bfin/ffi.c
  7513cc181bf36663d44182b9f1c95c51  libffi/src/bfin/ffitarget.h
  186967f96f819500e39f59a5251364e9  libffi/src/bfin/sysv.S
! 9b348ed95c901e67070015446ac4cb22  libffi/src/closures.c
  89604a232af8071de35df602e5a6c8db  libffi/src/cris/ffi.c
  d56060242baa5dc429ba60ace6ebd724  libffi/src/cris/ffitarget.h
  b17e59bf6ba716c77cd9ca7a4e39e672  libffi/src/cris/sysv.S
  7ed06af0df087c85b9530785b2d2803d  libffi/src/csky/ffi.c
  334e5efe5554e9684814d43ad528f6c7  libffi/src/csky/ffitarget.h
  fd623ff1552771afe72e7d80971d9399  libffi/src/csky/sysv.S
! ce59869df097ab772f4b206921d6ada5  libffi/src/debug.c
! 4907977388597c54d9190be2aa980532  libffi/src/dlmalloc.c
  b9ecce87980cf9448d35f168d0b12575  libffi/src/frv/eabi.S
  6d5f5603c261316978170edcae57685a  libffi/src/frv/ffi.c
  46d793348229f3fa5c098e65a913a2da  libffi/src/frv/ffitarget.h
! cbbb69c7dbce5d67ade9fbb1b429e1da  libffi/src/ia64/ffi.c
  7a21116d53a02f2ce8b47909dc050259  libffi/src/ia64/ffitarget.h
  6598837388b91973b3e6193968357fdb  libffi/src/ia64/ia64_flags.h
! f261fe28bdcc423046b1850f6ff327f4  libffi/src/ia64/unix.S
  5087a408b19fca412cf1b81262d0da0b  libffi/src/java_raw_api.c
  4594a1a5f46397d21c30f9e974ff8384  libffi/src/kvx/asm.h
  989104e297aeeae17122773939bd6830  libffi/src/kvx/ffi.c
  3cb04b5ba3412b866d5e7449ca24b6f0  libffi/src/kvx/ffitarget.h
  0c8c94d032ab11ae726e214dd6b91e7d  libffi/src/kvx/sysv.S
! 68a97e5d11b4a24c1ccb467a824bfa5d  libffi/src/loongarch64/ffi.c
  e4452f19d2e2fe4da9ccd84182c6fb60  libffi/src/loongarch64/ffitarget.h
  4e9a878bb31f58e6265e1b49c13b8e79  libffi/src/loongarch64/sysv.S
! 987ead1e68c70efd49d39681ed91927a  libffi/src/m32r/ffi.c
  f231859daa12286973d5134b9afc8afe  libffi/src/m32r/ffitarget.h
  fde1f5cb81ab7ce114af861c94c368c0  libffi/src/m32r/sysv.S
  e4a8b1db2017ccf89ed2d5cb543f9e04  libffi/src/m68k/ffi.c
*************** bd5c369d7cbe5b0672949e7b2140b722  libffi
*** 132015,132061 ****
  e304356d36eb4ed4971634212e726904  libffi/src/microblaze/ffi.c
  dea48c87bab2e6e9d92c69688cc49534  libffi/src/microblaze/ffitarget.h
  a3471fed3c5c66dede7037c2d82f1cd3  libffi/src/microblaze/sysv.S
! 9e7c419dc4eb3308a1d9784e3cbea54d  libffi/src/mips/ffi.c
! 0cc2fe4a50257992f4f9465ab0d2ab10  libffi/src/mips/ffitarget.h
! 88b6d496075bba1f2b1cb9088de36291  libffi/src/mips/n32.S
! 419b750e0c790e6caa7ca84bf4013272  libffi/src/mips/o32.S
  bd63095b928c820cffdc50dcacb5377c  libffi/src/moxie/eabi.S
! 1bc2d64e6a2badd9a3062686dbc14534  libffi/src/moxie/ffi.c
  1ce9696e486104a23914c589a1221309  libffi/src/moxie/ffitarget.h
  972354564207577d25b2de719d8a298b  libffi/src/nios2/ffi.c
  af1ef1c834944abb57b8572c2df0a282  libffi/src/nios2/ffitarget.h
  cba9f8730593aa0a016a6c2b0c791591  libffi/src/nios2/sysv.S
! 7c71ebd0062610b1037575137335fb1c  libffi/src/or1k/ffi.c
  cf11f05b0ece088d52d21699f3e7f6a4  libffi/src/or1k/ffitarget.h
  1d34d3abbc7d50e72537a84c14e06338  libffi/src/or1k/sysv.S
! eca4ed5cd288871999d01adab3057ee3  libffi/src/pa/ffi.c
! f4e42d7aea7c15c3a0c6f9a541dab715  libffi/src/pa/ffitarget.h
! 8d59e0e683fd8bf5ec88ef8467ae11dd  libffi/src/pa/hpux32.S
! e2d9ed32ab4b84d4e225d20d84204f6f  libffi/src/pa/linux.S
  184c7714b9cf25fbbbe0bcc89a26dcfa  libffi/src/powerpc/aix.S
  551ede9bd56160e1c6cd39409bfec751  libffi/src/powerpc/aix_closure.S
  acdd4f1a6a4093df0feb0e71744898b4  libffi/src/powerpc/asm.h
  fcf4949764155e3174447f2ee55b0db7  libffi/src/powerpc/darwin.S
  8c2fbc617e204f07672c5cae0e592102  libffi/src/powerpc/darwin_closure.S
! b18c5d79db8ec26f2a2a5f5720396e27  libffi/src/powerpc/ffi.c
! 84aacb1bbd19a1e9b325c0530554c2f4  libffi/src/powerpc/ffi_darwin.c
! affbaac10f157c4ac165c80edcad5396  libffi/src/powerpc/ffi_linux64.c
  88d699c59596d5fa950e20646df8c277  libffi/src/powerpc/ffi_powerpc.h
! b3dfde8013f5032762b6b7b21b089599  libffi/src/powerpc/ffi_sysv.c
  a355fd8f3b93f9f1cdabbcd382f689f1  libffi/src/powerpc/ffitarget.h
  a3bf5d91df6ac036576283afc9318660  libffi/src/powerpc/linux64.S
! 26da125425142997abbf7f385d0a568e  libffi/src/powerpc/linux64_closure.S
! deba483bab067974966ec684fe6af5e2  libffi/src/powerpc/ppc_closure.S
  1127b58ac46f8e4c17e199257f6c652c  libffi/src/powerpc/sysv.S
! 356c18ddf4c594f08dabdc43f8b9f5fb  libffi/src/prep_cif.c
  0f87fd960dd5ab7d9ad685435f358014  libffi/src/raw_api.c
! 8f14ca5a5d9994b06fa1e35ad62c9c98  libffi/src/riscv/ffi.c
  a455990e50ebe413228c8095b32780a6  libffi/src/riscv/ffitarget.h
  c2701659c3363f2f239b73c60fe7c498  libffi/src/riscv/sysv.S
! ab8266659fdf9d027f4fcdaefe6f2882  libffi/src/s390/ffi.c
  b3368476e8654a67a996fc3570993a59  libffi/src/s390/ffitarget.h
! 0cd10b848c2fefb644a3ea94d8b40895  libffi/src/s390/internal.h
! 2f187548e6d19acd4b026e3124fba409  libffi/src/s390/sysv.S
  7aef7f35e26674ec5bfd80ce6cfab20c  libffi/src/sh/ffi.c
  2bc28603ade2a1e9718180b01c9346ac  libffi/src/sh/ffitarget.h
  7e0990b03e6cff0ed4b1c69ca758a1fe  libffi/src/sh/sysv.S
--- 132135,132185 ----
  e304356d36eb4ed4971634212e726904  libffi/src/microblaze/ffi.c
  dea48c87bab2e6e9d92c69688cc49534  libffi/src/microblaze/ffitarget.h
  a3471fed3c5c66dede7037c2d82f1cd3  libffi/src/microblaze/sysv.S
! d43c3c98324e04fba202eaca1d2b500c  libffi/src/mips/ffi.c
! 4b86665cd5b106d33862bdfd3bf150f3  libffi/src/mips/ffitarget.h
! bc4b7554f5c92a0c8a273ad24cd2c862  libffi/src/mips/n32.S
! 14df5ddc10087c7dcba26476a2df22e3  libffi/src/mips/o32.S
  bd63095b928c820cffdc50dcacb5377c  libffi/src/moxie/eabi.S
! 2855eea998db28ad8c8a8e1a86d8efe4  libffi/src/moxie/ffi.c
  1ce9696e486104a23914c589a1221309  libffi/src/moxie/ffitarget.h
  972354564207577d25b2de719d8a298b  libffi/src/nios2/ffi.c
  af1ef1c834944abb57b8572c2df0a282  libffi/src/nios2/ffitarget.h
  cba9f8730593aa0a016a6c2b0c791591  libffi/src/nios2/sysv.S
! 75470d89eb0510153c85b01adea5d285  libffi/src/or1k/ffi.c
  cf11f05b0ece088d52d21699f3e7f6a4  libffi/src/or1k/ffitarget.h
  1d34d3abbc7d50e72537a84c14e06338  libffi/src/or1k/sysv.S
! 91cccdcaadd145cb41f07ea559da0603  libffi/src/pa/ffi.c
! 05ccd7163712c478d7c8f22379c42a47  libffi/src/pa/ffi64.c
! b77591a2e1b9bfe7008ebecc7f23529f  libffi/src/pa/ffitarget.h
! e9673382cb47d7ec71eba6368fe1afaa  libffi/src/pa/hpux32.S
! a58d5906560c760901b48b8fc2a81d1b  libffi/src/pa/hpux64.S
! ec71ece7137d55500ce99aeede8ac735  libffi/src/pa/linux.S
  184c7714b9cf25fbbbe0bcc89a26dcfa  libffi/src/powerpc/aix.S
  551ede9bd56160e1c6cd39409bfec751  libffi/src/powerpc/aix_closure.S
  acdd4f1a6a4093df0feb0e71744898b4  libffi/src/powerpc/asm.h
  fcf4949764155e3174447f2ee55b0db7  libffi/src/powerpc/darwin.S
  8c2fbc617e204f07672c5cae0e592102  libffi/src/powerpc/darwin_closure.S
! 40f49bf3aae2a6a597b8ff8162b55c32  libffi/src/powerpc/ffi.c
! 6c0a4e54a0f2e80fd06cd2486fa0a2a6  libffi/src/powerpc/ffi_darwin.c
! 229b61d4c8f3c6562f4cb562e641c07e  libffi/src/powerpc/ffi_linux64.c
  88d699c59596d5fa950e20646df8c277  libffi/src/powerpc/ffi_powerpc.h
! 3ecc0b58c2f9be3599d04322813a35b7  libffi/src/powerpc/ffi_sysv.c
  a355fd8f3b93f9f1cdabbcd382f689f1  libffi/src/powerpc/ffitarget.h
+ e4bf21787b4cc1f8a6ceb0eab34c9530  libffi/src/powerpc/internal.h
  a3bf5d91df6ac036576283afc9318660  libffi/src/powerpc/linux64.S
! 9292ef3abd6a7d1628a61c9a99c35971  libffi/src/powerpc/linux64_closure.S
! 104399a137b66d7f915157794fa0638f  libffi/src/powerpc/ppc_closure.S
  1127b58ac46f8e4c17e199257f6c652c  libffi/src/powerpc/sysv.S
! 0ba7f382ea7d2f0d5e4c884e3a02fa0e  libffi/src/powerpc/t-aix
! 5cb3927a12f037373552028c22954284  libffi/src/prep_cif.c
  0f87fd960dd5ab7d9ad685435f358014  libffi/src/raw_api.c
! dfaa8851cb38ce984317273086d81083  libffi/src/riscv/ffi.c
  a455990e50ebe413228c8095b32780a6  libffi/src/riscv/ffitarget.h
  c2701659c3363f2f239b73c60fe7c498  libffi/src/riscv/sysv.S
! 8e6da2b6b63e949c2bd4c38cb3004c57  libffi/src/s390/ffi.c
  b3368476e8654a67a996fc3570993a59  libffi/src/s390/ffitarget.h
! 004a1a57ded38f42338bc24f7cd2262f  libffi/src/s390/internal.h
! 357eaaa05056fd4dd8af71c231393b46  libffi/src/s390/sysv.S
  7aef7f35e26674ec5bfd80ce6cfab20c  libffi/src/sh/ffi.c
  2bc28603ade2a1e9718180b01c9346ac  libffi/src/sh/ffitarget.h
  7e0990b03e6cff0ed4b1c69ca758a1fe  libffi/src/sh/sysv.S
*************** b3368476e8654a67a996fc3570993a59  libffi
*** 132063,132069 ****
  bafcfb82eb59a68953d6ec8c4c56812b  libffi/src/sh64/ffitarget.h
  981772e8eedf7ba19049819909040d94  libffi/src/sh64/sysv.S
  c1ab7b5aaf8d70c05ad51a6ba1e2e60a  libffi/src/sparc/ffi.c
! d91f1ec3fbd46caf1508582b9d90530b  libffi/src/sparc/ffi64.c
  ac0f8f25f159c2358b99625e7ce6904e  libffi/src/sparc/ffitarget.h
  3ec745fb9adabb2cad31b87dc3a175c7  libffi/src/sparc/internal.h
  991fd1c4e25a52e37e32d4a900e0152a  libffi/src/sparc/v8.S
--- 132187,132193 ----
  bafcfb82eb59a68953d6ec8c4c56812b  libffi/src/sh64/ffitarget.h
  981772e8eedf7ba19049819909040d94  libffi/src/sh64/sysv.S
  c1ab7b5aaf8d70c05ad51a6ba1e2e60a  libffi/src/sparc/ffi.c
! 3ff7cc3294cd57007cc37d2d978679d4  libffi/src/sparc/ffi64.c
  ac0f8f25f159c2358b99625e7ce6904e  libffi/src/sparc/ffitarget.h
  3ec745fb9adabb2cad31b87dc3a175c7  libffi/src/sparc/internal.h
  991fd1c4e25a52e37e32d4a900e0152a  libffi/src/sparc/v8.S
*************** e8a7dc5891a2d4077a6736c3f99cfada  libffi
*** 132071,132130 ****
  74934128ac3facd5eb561545bdbc5532  libffi/src/tile/ffi.c
  cb2b6c2fe568c674b50f708613772da7  libffi/src/tile/ffitarget.h
  f56d8803c1d6045d76283e7fac454681  libffi/src/tile/tile.S
! ed71bb67304551b763a02f7ddc8a869d  libffi/src/tramp.c
! 264d52e2f2ca4db989785cc57dfdef10  libffi/src/types.c
  52e15866f080e8d9541f6b44a152ea51  libffi/src/vax/elfbsd.S
  83f1d9086dd20ba7da978b3421197af4  libffi/src/vax/ffi.c
  30aa04305b3eb941b4f1de70b251aca8  libffi/src/vax/ffitarget.h
  0be1efbbd2f96f4797d30eb5eca8a423  libffi/src/x86/asmnames.h
! 83d2e3ba124520295147a0255aafb0c2  libffi/src/x86/ffi.c
! 7d93ba7d545bae76950dc57b5e553374  libffi/src/x86/ffi64.c
! 3efa9d73e3800b9869806832fa2bf84d  libffi/src/x86/ffitarget.h
! db048864cd587d20c5396ddefbceda75  libffi/src/x86/ffiw64.c
  1037cfca8b55b81b29a72490869cb153  libffi/src/x86/internal.h
  e78cd40a51a894d54a7e2d2626613958  libffi/src/x86/internal64.h
  dae1263fa1771a70a616824f21464a05  libffi/src/x86/sysv.S
! 1b5e5e04568642438a80263e3e74d880  libffi/src/x86/sysv_intel.S
! e6a372c1ab34c8f1f71396d597076973  libffi/src/x86/unix64.S
  076f1dee01f3e0956ba88df96799b469  libffi/src/x86/win64.S
  832fc35a1ff3510af32ef59fd2117b1a  libffi/src/x86/win64_intel.S
! 549bfba791a5bb2268f5e2b35332c48a  libffi/src/xtensa/ffi.c
! 892c400315f5a127da4cd7a1eb7b65be  libffi/src/xtensa/ffitarget.h
! 30e1959beeb8d6392ff804e925efcc11  libffi/src/xtensa/sysv.S
  1ded054093de910d9786c62bc4fe8cc6  libffi/stamp-h.in
! 8e8befc990bd91505202466bad0815b2  libffi/testsuite/Makefile.am
! 411fd444178f93d4c680a7970cd12ed4  libffi/testsuite/Makefile.in
  dce80ba7e038ca18591aabc6d3d2582c  libffi/testsuite/config/default.exp
! aa258e4878fe20cf3490deabacccb583  libffi/testsuite/lib/libffi.exp
! 88f888c66cee8d916e1ac91000ecc87a  libffi/testsuite/lib/target-libpath.exp
  68db067550882b3b091a82df87310fff  libffi/testsuite/lib/wrapper.exp
  38c126f0fb1a075c0bd7591eca1e0385  libffi/testsuite/libffi.bhaible/Makefile
  b3f6762a9cda7df26859e715049f5053  libffi/testsuite/libffi.bhaible/README
  3b7ebd553f520825956e5610e90dbfcd  libffi/testsuite/libffi.bhaible/alignof.h
  d641d5187c4666dd31a3462c6ae71709  libffi/testsuite/libffi.bhaible/bhaible.exp
! 4e044f8e5f3bc10a55e031b60842d8f4  libffi/testsuite/libffi.bhaible/test-call.c
  877bb6f05effdf4d5d6a9cc132c49919  libffi/testsuite/libffi.bhaible/test-callback.c
! e9712a10f30a5e2e91a5095f44f047f2  libffi/testsuite/libffi.bhaible/testcases.c
  2c96425847acf8e7ff588c88273b45d4  libffi/testsuite/libffi.call/align_mixed.c
  ba5013eafd064227c2a9c9f498e6bdb6  libffi/testsuite/libffi.call/align_stdcall.c
  4a73223f3b7419f5474e26ae23b604b0  libffi/testsuite/libffi.call/call.exp
  2c95e2fe4d23faba409cf65589b1f338  libffi/testsuite/libffi.call/err_bad_typedef.c
! 3987abf215c9a160539b5d60d8da40df  libffi/testsuite/libffi.call/ffitest.h
  ace1fa30cb916c3d27b791dba947a912  libffi/testsuite/libffi.call/float.c
  f4a5e4425ea89816b7c98ac823009954  libffi/testsuite/libffi.call/float1.c
  ee8cd1ab6a0bbb9732c4fe9eed094e2f  libffi/testsuite/libffi.call/float2.c
  e5777875ff05674a898c2698863fcf92  libffi/testsuite/libffi.call/float3.c
  588214bfe0933dee146a7320c1e76301  libffi/testsuite/libffi.call/float4.c
! 1a76d7191022d46cb781036cf7a317de  libffi/testsuite/libffi.call/float_va.c
  139148efc8d1a90d3087ff74864b404b  libffi/testsuite/libffi.call/many.c
  3330439d04ab3e68626c1e7d942aba88  libffi/testsuite/libffi.call/many2.c
  d52283ebfc8b14e702571caa4b15faae  libffi/testsuite/libffi.call/many_double.c
  b1fc2a9b18683c39c78174fe71d41c9a  libffi/testsuite/libffi.call/many_mixed.c
  5436e9764590fcff1fb2843206b643d6  libffi/testsuite/libffi.call/negint.c
  8aa7375a792a71efd2376257847225e8  libffi/testsuite/libffi.call/offsets.c
  7b55db543073180951abb334862ac6b7  libffi/testsuite/libffi.call/pr1172638.c
  09a387482b7ce131ae73efe275816fdd  libffi/testsuite/libffi.call/promotion.c
  446779e31373e96f145df84b68b53d31  libffi/testsuite/libffi.call/pyobjc-tc.c
  f442e0fb84a1398a958e163728b6d96a  libffi/testsuite/libffi.call/return_dbl.c
  b7915d69fd4da55413d80c64fe1a7f57  libffi/testsuite/libffi.call/return_dbl1.c
  56a258923c7b9c1aa0ab24bbde1ade56  libffi/testsuite/libffi.call/return_dbl2.c
--- 132195,132270 ----
  74934128ac3facd5eb561545bdbc5532  libffi/src/tile/ffi.c
  cb2b6c2fe568c674b50f708613772da7  libffi/src/tile/ffitarget.h
  f56d8803c1d6045d76283e7fac454681  libffi/src/tile/tile.S
! 8a2446b8b8968d1a31c1d4c17bbc2463  libffi/src/tramp.c
! 2b05196f335e987e4834ec50210d373d  libffi/src/types.c
  52e15866f080e8d9541f6b44a152ea51  libffi/src/vax/elfbsd.S
  83f1d9086dd20ba7da978b3421197af4  libffi/src/vax/ffi.c
  30aa04305b3eb941b4f1de70b251aca8  libffi/src/vax/ffitarget.h
+ 043b47596446c2fef43baca9aae89981  libffi/src/wasm/ffi.c
+ 32f437d5b6b020aadc16f92740f16def  libffi/src/wasm/ffitarget.h
  0be1efbbd2f96f4797d30eb5eca8a423  libffi/src/x86/asmnames.h
! c2e5c9a7796de138e0f2b7f0b1a91fa0  libffi/src/x86/ffi.c
! 6fd68ac01a5f726a8dedbc94058eb44e  libffi/src/x86/ffi64.c
! 41f52f7663ba4cc6c7b0875cbef03f9b  libffi/src/x86/ffitarget.h
! 19048653a10c71f0c14a4f11f51ceb51  libffi/src/x86/ffiw64.c
  1037cfca8b55b81b29a72490869cb153  libffi/src/x86/internal.h
  e78cd40a51a894d54a7e2d2626613958  libffi/src/x86/internal64.h
  dae1263fa1771a70a616824f21464a05  libffi/src/x86/sysv.S
! 67c33476349edc73807fe74ed3ec8221  libffi/src/x86/sysv_intel.S
! 47fe7f1f99351d4d14177214ed3b54e1  libffi/src/x86/unix64.S
  076f1dee01f3e0956ba88df96799b469  libffi/src/x86/win64.S
  832fc35a1ff3510af32ef59fd2117b1a  libffi/src/x86/win64_intel.S
! 7c8337358eb15b7d7ccbe26b28d55f69  libffi/src/xtensa/ffi.c
! 220f95f0872c748259fbc6f82c8aa1b5  libffi/src/xtensa/ffitarget.h
! 9f478d01a7dd118681c50d222ff55147  libffi/src/xtensa/sysv.S
  1ded054093de910d9786c62bc4fe8cc6  libffi/stamp-h.in
! 7b9350c4bab47aaa12ecfc6b0b4c842b  libffi/testsuite/Makefile.am
! fccf7764303fcf527bfb81e88153cb05  libffi/testsuite/Makefile.in
  dce80ba7e038ca18591aabc6d3d2582c  libffi/testsuite/config/default.exp
! 41f69b5b8a7649d568933f5a8e438fe0  libffi/testsuite/emscripten/build-tests.sh
! 26bee400335418c9aa3b5480f1021358  libffi/testsuite/emscripten/build.sh
! 7a630992ce8a70ee8d8f6786064b77ed  libffi/testsuite/emscripten/conftest.py
! e45c1fda03f045bc2dc2e96a48664f5f  libffi/testsuite/emscripten/node-tests.sh
! 5bbe5076002911577cdf421ea8f595a5  libffi/testsuite/emscripten/test.html
! 00ebe746e96e11e16b20192e55800b94  libffi/testsuite/emscripten/test_libffi.py
! bbd8a1375a77ff51b8436d56af6d51c1  libffi/testsuite/lib/libffi.exp
! 554fbd4b8e0ec7aad17b2c2fad7f3b2e  libffi/testsuite/lib/target-libpath.exp
  68db067550882b3b091a82df87310fff  libffi/testsuite/lib/wrapper.exp
  38c126f0fb1a075c0bd7591eca1e0385  libffi/testsuite/libffi.bhaible/Makefile
  b3f6762a9cda7df26859e715049f5053  libffi/testsuite/libffi.bhaible/README
  3b7ebd553f520825956e5610e90dbfcd  libffi/testsuite/libffi.bhaible/alignof.h
  d641d5187c4666dd31a3462c6ae71709  libffi/testsuite/libffi.bhaible/bhaible.exp
! e646f1f38ebecc6c61d90f58fd6f87e6  libffi/testsuite/libffi.bhaible/test-call.c
  877bb6f05effdf4d5d6a9cc132c49919  libffi/testsuite/libffi.bhaible/test-callback.c
! 3e2af51a67b681c9707010030bff48c1  libffi/testsuite/libffi.bhaible/testcases.c
  2c96425847acf8e7ff588c88273b45d4  libffi/testsuite/libffi.call/align_mixed.c
  ba5013eafd064227c2a9c9f498e6bdb6  libffi/testsuite/libffi.call/align_stdcall.c
+ b8a253a8e295ae554e7342a42a4a04a7  libffi/testsuite/libffi.call/bpo_38748.c
  4a73223f3b7419f5474e26ae23b604b0  libffi/testsuite/libffi.call/call.exp
+ c3d90d71aa978f68c7bb52a9e308042c  libffi/testsuite/libffi.call/callback.c
+ cbde5bfd0f1ba219ff9e9f36b25bfbf1  libffi/testsuite/libffi.call/callback2.c
+ 8ea8eff449c01e8ca09466b3214d6065  libffi/testsuite/libffi.call/callback3.c
+ fa46e42723a61a0824e24e22fa852a35  libffi/testsuite/libffi.call/callback4.c
  2c95e2fe4d23faba409cf65589b1f338  libffi/testsuite/libffi.call/err_bad_typedef.c
! ba55347def9316c8931e53b6d0e0e6d3  libffi/testsuite/libffi.call/ffitest.h
  ace1fa30cb916c3d27b791dba947a912  libffi/testsuite/libffi.call/float.c
  f4a5e4425ea89816b7c98ac823009954  libffi/testsuite/libffi.call/float1.c
  ee8cd1ab6a0bbb9732c4fe9eed094e2f  libffi/testsuite/libffi.call/float2.c
  e5777875ff05674a898c2698863fcf92  libffi/testsuite/libffi.call/float3.c
  588214bfe0933dee146a7320c1e76301  libffi/testsuite/libffi.call/float4.c
! d89d915bd932ab64d59653598ea0bb16  libffi/testsuite/libffi.call/float_va.c
! 1fd5bf4ae722f55ae57ece3d393bd24b  libffi/testsuite/libffi.call/longjmp.c
  139148efc8d1a90d3087ff74864b404b  libffi/testsuite/libffi.call/many.c
  3330439d04ab3e68626c1e7d942aba88  libffi/testsuite/libffi.call/many2.c
  d52283ebfc8b14e702571caa4b15faae  libffi/testsuite/libffi.call/many_double.c
  b1fc2a9b18683c39c78174fe71d41c9a  libffi/testsuite/libffi.call/many_mixed.c
  5436e9764590fcff1fb2843206b643d6  libffi/testsuite/libffi.call/negint.c
  8aa7375a792a71efd2376257847225e8  libffi/testsuite/libffi.call/offsets.c
+ 430d5e2c41c2887cd7ea4b9c3b307028  libffi/testsuite/libffi.call/overread.c
  7b55db543073180951abb334862ac6b7  libffi/testsuite/libffi.call/pr1172638.c
  09a387482b7ce131ae73efe275816fdd  libffi/testsuite/libffi.call/promotion.c
  446779e31373e96f145df84b68b53d31  libffi/testsuite/libffi.call/pyobjc-tc.c
+ 446779e31373e96f145df84b68b53d31  libffi/testsuite/libffi.call/pyobjc_tc.c
  f442e0fb84a1398a958e163728b6d96a  libffi/testsuite/libffi.call/return_dbl.c
  b7915d69fd4da55413d80c64fe1a7f57  libffi/testsuite/libffi.call/return_dbl1.c
  56a258923c7b9c1aa0ab24bbde1ade56  libffi/testsuite/libffi.call/return_dbl2.c
*************** b7915d69fd4da55413d80c64fe1a7f57  libffi
*** 132134,132150 ****
  5e832fea7e1abc3e13210dd628c3ea6a  libffi/testsuite/libffi.call/return_fl3.c
  5deb81eb8e84ad6ef16614c1add50a51  libffi/testsuite/libffi.call/return_ldl.c
  63b5fe4e262d0dc8190cb9ba24e921ae  libffi/testsuite/libffi.call/return_ll.c
! 675d8bc6e828c9d48fcea15ef768bba6  libffi/testsuite/libffi.call/return_ll1.c
  76d81ab6bef1595898b8009494531069  libffi/testsuite/libffi.call/return_sc.c
! 866d838b632f6386651d20ce470fb97d  libffi/testsuite/libffi.call/return_sl.c
  29cfe9ac6e19ee1487ae861350762147  libffi/testsuite/libffi.call/return_uc.c
! 3a6009ea065561440e779c52ceb86a9c  libffi/testsuite/libffi.call/return_ul.c
! 2081d64816600ca4535343b980219cfe  libffi/testsuite/libffi.call/strlen.c
! 74d8371e40c246748fa03ce15125455f  libffi/testsuite/libffi.call/strlen2.c
! d6ea10c1773b643019f24db9e2e52eb2  libffi/testsuite/libffi.call/strlen3.c
! 04c83732b01d12a794e456448d2a2889  libffi/testsuite/libffi.call/strlen4.c
  29fbee97acbf46cc5a1447502298fdb2  libffi/testsuite/libffi.call/struct1.c
! 97a1394bfa466ad546cd43626f3ab115  libffi/testsuite/libffi.call/struct10.c
  72baefd1e61e8272dbb7c9e9c41c3fce  libffi/testsuite/libffi.call/struct2.c
  0e34f0ca12c3a9976525ee704ecb4b07  libffi/testsuite/libffi.call/struct3.c
  ef4a954bef98225aaf38adb49cd3fbe0  libffi/testsuite/libffi.call/struct4.c
--- 132274,132291 ----
  5e832fea7e1abc3e13210dd628c3ea6a  libffi/testsuite/libffi.call/return_fl3.c
  5deb81eb8e84ad6ef16614c1add50a51  libffi/testsuite/libffi.call/return_ldl.c
  63b5fe4e262d0dc8190cb9ba24e921ae  libffi/testsuite/libffi.call/return_ll.c
! 609b272581a67027a585878a23f7b870  libffi/testsuite/libffi.call/return_ll1.c
  76d81ab6bef1595898b8009494531069  libffi/testsuite/libffi.call/return_sc.c
! a91acdf0db1402576b618271516ae760  libffi/testsuite/libffi.call/return_sl.c
  29cfe9ac6e19ee1487ae861350762147  libffi/testsuite/libffi.call/return_uc.c
! abaf895c59ea62b029b37e057d44d15c  libffi/testsuite/libffi.call/return_ul.c
! 2c087ccbec7087672a2f45573f8175c1  libffi/testsuite/libffi.call/s55.c
! 4c635612fe86bbe75f5e7d93e78505d2  libffi/testsuite/libffi.call/strlen.c
! 8ca319f367ca303f47e64f28e6215001  libffi/testsuite/libffi.call/strlen2.c
! 9e3d841048a44dcd9f261ac1a864f2e8  libffi/testsuite/libffi.call/strlen3.c
! 7f42decd3d3619d0e78411decb621b4e  libffi/testsuite/libffi.call/strlen4.c
  29fbee97acbf46cc5a1447502298fdb2  libffi/testsuite/libffi.call/struct1.c
! d8cb599f481b6ca5d61503aa8dd044fe  libffi/testsuite/libffi.call/struct10.c
  72baefd1e61e8272dbb7c9e9c41c3fce  libffi/testsuite/libffi.call/struct2.c
  0e34f0ca12c3a9976525ee704ecb4b07  libffi/testsuite/libffi.call/struct3.c
  ef4a954bef98225aaf38adb49cd3fbe0  libffi/testsuite/libffi.call/struct4.c
*************** d2920b5f89901d939f43adf536e96e91  libffi
*** 132153,132254 ****
  811734d9479ea9497dce819e117eba3a  libffi/testsuite/libffi.call/struct7.c
  0d2479c06958a107a4f563a00d6ba7ea  libffi/testsuite/libffi.call/struct8.c
  5b5cf822c9d9cdd0aa08ba677b85f60a  libffi/testsuite/libffi.call/struct9.c
  27377455643e292197b2ed18e97dfd95  libffi/testsuite/libffi.call/uninitialized.c
  188d7481aa4319f47c47a0f25aa0637f  libffi/testsuite/libffi.call/va_1.c
! 553d1178b1b1222a99b3c8ca6716478f  libffi/testsuite/libffi.call/va_2.c
! 97d207a19b1e8e9c38d2efe1c57100ef  libffi/testsuite/libffi.call/va_struct1.c
! 056855051c9eff64c15f458d864360bd  libffi/testsuite/libffi.call/va_struct2.c
! 04d6c77802a49fada942f4e9e7a0bb4a  libffi/testsuite/libffi.call/va_struct3.c
  654fa11cc3957125bf1586780e4ea457  libffi/testsuite/libffi.closures/closure.exp
! 95a3d81256c777f68d1d74641cce6f15  libffi/testsuite/libffi.closures/closure_fn0.c
! af1c73f8927fd6ff7f3d0169d6a16bfa  libffi/testsuite/libffi.closures/closure_fn1.c
! 786c19f83b67c7b045c7603cc940dc6a  libffi/testsuite/libffi.closures/closure_fn2.c
! 80762a3d4a50c6d41904442445de79d0  libffi/testsuite/libffi.closures/closure_fn3.c
! 155711693ac5df848dc78899d92159db  libffi/testsuite/libffi.closures/closure_fn4.c
! 2d9a7ca775efbe9b842562715af63078  libffi/testsuite/libffi.closures/closure_fn5.c
! 2447e0637ff7f794fc4113878f8927bb  libffi/testsuite/libffi.closures/closure_fn6.c
! 65f570164afa446f2f157df5210b7083  libffi/testsuite/libffi.closures/closure_loc_fn0.c
! 0ece4fa9ced11b84ddbe5a5a8f96af07  libffi/testsuite/libffi.closures/closure_simple.c
! c97f1f851010776179eeccf84093f453  libffi/testsuite/libffi.closures/cls_12byte.c
! 9a889ecde9cac8d6cdcab4d46358566d  libffi/testsuite/libffi.closures/cls_16byte.c
! 74a4d0cd76ef4a68b57524e52eb6e026  libffi/testsuite/libffi.closures/cls_18byte.c
! 8745d4a18ea0c61bfc288bdcfe144733  libffi/testsuite/libffi.closures/cls_19byte.c
! e1adb7cce72ca554059e8afe052e0d01  libffi/testsuite/libffi.closures/cls_1_1byte.c
! b2eea781fefee43e222cc7cb4b838333  libffi/testsuite/libffi.closures/cls_20byte.c
! 5c03a3dcd7459c7c1fa1169197cde8c3  libffi/testsuite/libffi.closures/cls_20byte1.c
! 7751bc36701b81965e29e46c129e88ab  libffi/testsuite/libffi.closures/cls_24byte.c
! ca547730d5493630c5b4f813450f6dde  libffi/testsuite/libffi.closures/cls_2byte.c
! b3233fb76ba0a1266f8d9cb15edc5740  libffi/testsuite/libffi.closures/cls_3_1byte.c
! 981fa45d1742be35d08ebeca3a160fbb  libffi/testsuite/libffi.closures/cls_3byte1.c
! d7ec90166bceb0193b2c691db6ea7181  libffi/testsuite/libffi.closures/cls_3byte2.c
! 12f6c6cc6bebd79091f086827da29c06  libffi/testsuite/libffi.closures/cls_3float.c
! c1a9fb2d6c003c4192cc65dcc5729b52  libffi/testsuite/libffi.closures/cls_4_1byte.c
! fc9c27f090d515b83d42b3b99e620022  libffi/testsuite/libffi.closures/cls_4byte.c
! f745e72138a719631b458817a1295863  libffi/testsuite/libffi.closures/cls_5_1_byte.c
! cab5a789f1e845f2a50a935019565269  libffi/testsuite/libffi.closures/cls_5byte.c
! 22a1a0b8cdbd5807d180cbbc9fab0918  libffi/testsuite/libffi.closures/cls_64byte.c
! 484a8834ac2fd7881c3cec99b25831cd  libffi/testsuite/libffi.closures/cls_6_1_byte.c
! 9ffba46ce5a6380a571b53c7b5b55523  libffi/testsuite/libffi.closures/cls_6byte.c
! 2be3cf6f4966b2e1561516e8095ff02d  libffi/testsuite/libffi.closures/cls_7_1_byte.c
! 1d31be781ad2fd1bf34c1a03f9fb821b  libffi/testsuite/libffi.closures/cls_7byte.c
! 9598abf0c23b0db23b36c4e9f85a7906  libffi/testsuite/libffi.closures/cls_8byte.c
! 5e4ea1178f1db13547b77b5a71f57269  libffi/testsuite/libffi.closures/cls_9byte1.c
! 4c5fea9bfe32daae8306b28fce47c54a  libffi/testsuite/libffi.closures/cls_9byte2.c
! 155eb02ef8ba5cecc451ccee21d56d3c  libffi/testsuite/libffi.closures/cls_align_double.c
! e261dc460c842d0812e86c24b1d78bb4  libffi/testsuite/libffi.closures/cls_align_float.c
! 58d3a71d01f5ada00517cfbcdfaa05ac  libffi/testsuite/libffi.closures/cls_align_longdouble.c
! 8a425ff10bdac02045090e015171fe37  libffi/testsuite/libffi.closures/cls_align_longdouble_split.c
! fc103635d26dc98a4a52503077d3171e  libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c
! e0a0faf2923c59beb9308d2bbfd9a942  libffi/testsuite/libffi.closures/cls_align_pointer.c
! be71ba558190aab491610f60aac2dd1b  libffi/testsuite/libffi.closures/cls_align_sint16.c
! 9b698695672b30e7766da86dc2b65c07  libffi/testsuite/libffi.closures/cls_align_sint32.c
! 20bfefedfc2df29636910fc83fa3ff0b  libffi/testsuite/libffi.closures/cls_align_sint64.c
! f34901721d749fd570e05dc365bedfee  libffi/testsuite/libffi.closures/cls_align_uint16.c
! 8de4664d157fc0d543d0e24cb17efaa6  libffi/testsuite/libffi.closures/cls_align_uint32.c
! ab7742be2f3b25a65a442dbb2cd2b50c  libffi/testsuite/libffi.closures/cls_align_uint64.c
! 2a5583f3f9f0e75e7e2c4b80c30e1db0  libffi/testsuite/libffi.closures/cls_dbls_struct.c
  0bdb41c9d86c6676cf323baed9763580  libffi/testsuite/libffi.closures/cls_double.c
! 85af19de6f9aa3bc98869658b34fd21c  libffi/testsuite/libffi.closures/cls_double_va.c
! 6e1894c5c87c0ef2ea5672eedde623ae  libffi/testsuite/libffi.closures/cls_float.c
! d02c5ec1a9f0f4f4aa8d070c4943f547  libffi/testsuite/libffi.closures/cls_longdouble.c
! 5b0d8dfbd840efe0b844f40f2343f90c  libffi/testsuite/libffi.closures/cls_longdouble_va.c
  212585c54b08ba182add95682ff0ca38  libffi/testsuite/libffi.closures/cls_many_mixed_args.c
  57c679dce954358cd2289e3970e758df  libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c
! 3c03404c0190b953246e25c2cd0c52b3  libffi/testsuite/libffi.closures/cls_multi_schar.c
! b3813529e43d421501c4100edac83712  libffi/testsuite/libffi.closures/cls_multi_sshort.c
! 8b586fda4171625a7e6fe8fb0248e24f  libffi/testsuite/libffi.closures/cls_multi_sshortchar.c
! 954a34ea79afbbc3e81358689a8ada79  libffi/testsuite/libffi.closures/cls_multi_uchar.c
! 285759347d627be1f0c1a920e766508f  libffi/testsuite/libffi.closures/cls_multi_ushort.c
! a4aecda5d16b6b4ff15951a58205ed88  libffi/testsuite/libffi.closures/cls_multi_ushortchar.c
! 8a24bf22ffb66d78ffb9d07097ac525c  libffi/testsuite/libffi.closures/cls_pointer.c
! 1530e5ac044dec5f8d028d93f6387144  libffi/testsuite/libffi.closures/cls_pointer_stack.c
! dca5e991396283227d918a173bae9eeb  libffi/testsuite/libffi.closures/cls_schar.c
! 37b0cfcce376e70fa2bd116dfd672022  libffi/testsuite/libffi.closures/cls_sint.c
! fa0415723a96a5c2da90b627c2ea7651  libffi/testsuite/libffi.closures/cls_sshort.c
! a7e2b3d43c781dc2dd39f460eb169f4c  libffi/testsuite/libffi.closures/cls_struct_va1.c
! f9f33179dfc8d6845df8f4ca2dc67394  libffi/testsuite/libffi.closures/cls_uchar.c
! a8a303deb2e98e9fdd113f6b0ef0ef5f  libffi/testsuite/libffi.closures/cls_uint.c
! c2ce8a7e1f3ebeaca2735d077daade77  libffi/testsuite/libffi.closures/cls_uint_va.c
! 7b545991c51cd6c0fd3a62a1a4e85da3  libffi/testsuite/libffi.closures/cls_ulong_va.c
! 0b927b47ba0e31aabfdef019c60dbeb7  libffi/testsuite/libffi.closures/cls_ulonglong.c
! 00f799e8e128a3208bcdf82e1b3a0639  libffi/testsuite/libffi.closures/cls_ushort.c
  8d51134a9ef24d24a2984bdf13273405  libffi/testsuite/libffi.closures/err_bad_abi.c
! 3987abf215c9a160539b5d60d8da40df  libffi/testsuite/libffi.closures/ffitest.h
! b00df4bb73e255dbdbef16779d5dc6c7  libffi/testsuite/libffi.closures/huge_struct.c
! 1b4c8843984e3d6ae09032b02bfc64eb  libffi/testsuite/libffi.closures/nested_struct.c
  76549bc0e1457475625727c72131cfbc  libffi/testsuite/libffi.closures/nested_struct1.c
! c208ae0468ee6688a753297d3ad0003d  libffi/testsuite/libffi.closures/nested_struct10.c
! 5cdea341282c185038f3701005139f72  libffi/testsuite/libffi.closures/nested_struct11.c
! d2295b89560dc59868be757419c2e0d6  libffi/testsuite/libffi.closures/nested_struct12.c
! 371ae5b1747f876c6612b09ee0a3e66d  libffi/testsuite/libffi.closures/nested_struct13.c
! b1ee2868d967641385c091a7157b2f27  libffi/testsuite/libffi.closures/nested_struct2.c
! fd3296110ef2f80fed48705fdd9b1b9e  libffi/testsuite/libffi.closures/nested_struct3.c
! 8dfe86c771d317f4ab02797610cc15dd  libffi/testsuite/libffi.closures/nested_struct4.c
! c183d19b2e095ae415811b42c1fcfc28  libffi/testsuite/libffi.closures/nested_struct5.c
! 2577b750521812e281b999d52d597688  libffi/testsuite/libffi.closures/nested_struct6.c
! ae47bd537a9d97445b9489d0f5a9743d  libffi/testsuite/libffi.closures/nested_struct7.c
! 0945337cb3187ecb858ca7a3b0a57525  libffi/testsuite/libffi.closures/nested_struct8.c
! da000adc1649f379bf1430bb7a33ce8e  libffi/testsuite/libffi.closures/nested_struct9.c
  00c9e6412441f7bba3c5d8f863d11d2f  libffi/testsuite/libffi.closures/problem1.c
  f0d7ac0f4c46fedd9236941fee3734fe  libffi/testsuite/libffi.closures/single_entry_structs1.c
  b0f6b491966d196868db60ae77e8b802  libffi/testsuite/libffi.closures/single_entry_structs2.c
--- 132294,132407 ----
  811734d9479ea9497dce819e117eba3a  libffi/testsuite/libffi.call/struct7.c
  0d2479c06958a107a4f563a00d6ba7ea  libffi/testsuite/libffi.call/struct8.c
  5b5cf822c9d9cdd0aa08ba677b85f60a  libffi/testsuite/libffi.call/struct9.c
+ 1c704d340ad2f05bcd3e16b3925cafed  libffi/testsuite/libffi.call/struct_by_value_2.c
+ cc8dfe190b41474c2237077dd3b198f8  libffi/testsuite/libffi.call/struct_by_value_3.c
+ 9bb1424cab76dfad8bfa60dd52c4024a  libffi/testsuite/libffi.call/struct_by_value_3f.c
+ e95103fcf85f544fe7c268ec8c207bca  libffi/testsuite/libffi.call/struct_by_value_4.c
+ f9f84ad6132f527817f401236bdd5ed4  libffi/testsuite/libffi.call/struct_by_value_4f.c
+ ae628f42074b5fc97604d72c3265442e  libffi/testsuite/libffi.call/struct_by_value_big.c
+ aeaee8f42078cc1bf5b856bfe4e98e74  libffi/testsuite/libffi.call/struct_by_value_small.c
+ b56fee8f8094f87945a9257046285264  libffi/testsuite/libffi.call/struct_int_float.c
+ ea726d891a33bb6380691ac1e9b206d5  libffi/testsuite/libffi.call/struct_return_2H.c
+ b595817c845755f3f5ac5dfc30335e54  libffi/testsuite/libffi.call/struct_return_8H.c
  27377455643e292197b2ed18e97dfd95  libffi/testsuite/libffi.call/uninitialized.c
  188d7481aa4319f47c47a0f25aa0637f  libffi/testsuite/libffi.call/va_1.c
! 2179e0991c2ea96b38fa900a186cdcb1  libffi/testsuite/libffi.call/va_2.c
! 280d0c5b1a5e8c8f37a616dff86bf700  libffi/testsuite/libffi.call/va_3.c
! f7d35c3b0e112621e7c5dbb624468fec  libffi/testsuite/libffi.call/va_struct1.c
! ec15065a94c34d10280ff80ef6e33668  libffi/testsuite/libffi.call/va_struct2.c
! 2211ac32ccc7888b3f004d6a24de88e2  libffi/testsuite/libffi.call/va_struct3.c
! 15790af182ba2f09702c6fdef544f7b4  libffi/testsuite/libffi.call/x32.c
  654fa11cc3957125bf1586780e4ea457  libffi/testsuite/libffi.closures/closure.exp
! b8ea7054fe376eb488ecf0af4b28972a  libffi/testsuite/libffi.closures/closure_fn0.c
! c71ceaab0615635ce88dff8ed344249d  libffi/testsuite/libffi.closures/closure_fn1.c
! 1e91cef7280cc152bf7858f0dce55cbb  libffi/testsuite/libffi.closures/closure_fn2.c
! dce0d3bc603709c0f547376496dfcf06  libffi/testsuite/libffi.closures/closure_fn3.c
! 35102f20888e36072a2b6bc12732efc9  libffi/testsuite/libffi.closures/closure_fn4.c
! f3c9a3968a8928ebf95479123dfa8e21  libffi/testsuite/libffi.closures/closure_fn5.c
! b18c19b9cf147cb2b1ad5ff6170f7fea  libffi/testsuite/libffi.closures/closure_fn6.c
! 85c0e68cdb9216fe37cedc08243c3ea9  libffi/testsuite/libffi.closures/closure_loc_fn0.c
! 8bbc4ecd3b01b97dc9691e48ef67813b  libffi/testsuite/libffi.closures/closure_simple.c
! bc1648d8a50b5901dd249fd66fc1ea65  libffi/testsuite/libffi.closures/cls_12byte.c
! f4eb01aaa45faba1727178504a420271  libffi/testsuite/libffi.closures/cls_16byte.c
! 02bd0d096f6e20e133e7ff0e7881cc50  libffi/testsuite/libffi.closures/cls_18byte.c
! aa86490dd18b6a6af00137c192d4fe0f  libffi/testsuite/libffi.closures/cls_19byte.c
! 7a6c316ab3abb003f60f97ed94d1b254  libffi/testsuite/libffi.closures/cls_1_1byte.c
! a19c3cf5e9d942c42a7e7296da3375f3  libffi/testsuite/libffi.closures/cls_20byte.c
! 90aed6ee92d25442c2e2d61ff794668f  libffi/testsuite/libffi.closures/cls_20byte1.c
! 6c519fdb22b6435bef725a9253cfd443  libffi/testsuite/libffi.closures/cls_24byte.c
! 9a496a799f051b608f01250bc713437c  libffi/testsuite/libffi.closures/cls_2byte.c
! 8a03f10b68d87cb8e7d30e1ef77e8d1c  libffi/testsuite/libffi.closures/cls_3_1byte.c
! b85e70325ec4ab83a224e1d48d7c578c  libffi/testsuite/libffi.closures/cls_3byte1.c
! 573b2d450638be3ec1e06e823465b5ec  libffi/testsuite/libffi.closures/cls_3byte2.c
! 35131212ecadd5ce605fd6fa320d90df  libffi/testsuite/libffi.closures/cls_3float.c
! a62bdc40f64d238234fc75186bc06086  libffi/testsuite/libffi.closures/cls_4_1byte.c
! 275ed0d17a35829b109f0ef40c3b1e99  libffi/testsuite/libffi.closures/cls_4byte.c
! 85997675b2716673ca4b0762a43c75c9  libffi/testsuite/libffi.closures/cls_5_1_byte.c
! a65913cce53708494e50d995387ac6e3  libffi/testsuite/libffi.closures/cls_5byte.c
! c16f9383bf376f42f269de148c5db6a9  libffi/testsuite/libffi.closures/cls_64byte.c
! 09936a32382fd40634d69b8a5fe80f6c  libffi/testsuite/libffi.closures/cls_6_1_byte.c
! 1c3648d87f8f3790fcf77ae1c116f576  libffi/testsuite/libffi.closures/cls_6byte.c
! d58dc2564aec25e17cd8d813e7d18d74  libffi/testsuite/libffi.closures/cls_7_1_byte.c
! 6ba96b6df19e5403e4a9292357b6a0f0  libffi/testsuite/libffi.closures/cls_7byte.c
! fa22a60a9a2800d65cb3010b3c6db1ab  libffi/testsuite/libffi.closures/cls_8byte.c
! 26d5383ffd99bded2a87c9fa82439a7c  libffi/testsuite/libffi.closures/cls_9byte1.c
! 424c4a1141050544c5b6456365f50dc0  libffi/testsuite/libffi.closures/cls_9byte2.c
! 5eb2cbf543c42326c659da66818329f8  libffi/testsuite/libffi.closures/cls_align_double.c
! 35118995804714bb478b82120bf83775  libffi/testsuite/libffi.closures/cls_align_float.c
! 843dd830e8a5375b6820c8ebd3a52e91  libffi/testsuite/libffi.closures/cls_align_longdouble.c
! 727ed76469c796bafad4692913ffc79e  libffi/testsuite/libffi.closures/cls_align_longdouble_split.c
! 9be9f5412ff356ce0cb633fd6b42ddca  libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c
! 38cbbee82e2e7de801b4bfe8f05da373  libffi/testsuite/libffi.closures/cls_align_pointer.c
! f20c82a9476544efcbe27fb4669915eb  libffi/testsuite/libffi.closures/cls_align_sint16.c
! 167491eb42fb412a911fe48c1ecadf27  libffi/testsuite/libffi.closures/cls_align_sint32.c
! 1016e4f67cc477524e8cf724f9ef3c8f  libffi/testsuite/libffi.closures/cls_align_sint64.c
! 2ed45c4e2ae6a700aadd841ef59e05be  libffi/testsuite/libffi.closures/cls_align_uint16.c
! 326fcb99e629dd5d0643b597790b77df  libffi/testsuite/libffi.closures/cls_align_uint32.c
! 613fbfbeddafbe139c7ef60bd80d2e03  libffi/testsuite/libffi.closures/cls_align_uint64.c
! 23f5b01703200faf35aaca29261fe907  libffi/testsuite/libffi.closures/cls_dbls_struct.c
  0bdb41c9d86c6676cf323baed9763580  libffi/testsuite/libffi.closures/cls_double.c
! 79b945f26dcc3707c81794024c9aee53  libffi/testsuite/libffi.closures/cls_double_va.c
! 5f118459d5bbf9f459e3fe702f2de72e  libffi/testsuite/libffi.closures/cls_float.c
! 0798616e4cf3aacb69e9aa42a278fbe8  libffi/testsuite/libffi.closures/cls_longdouble.c
! c2e587c4c83aba7b366b8f0bf3b36b9a  libffi/testsuite/libffi.closures/cls_longdouble_va.c
  212585c54b08ba182add95682ff0ca38  libffi/testsuite/libffi.closures/cls_many_mixed_args.c
  57c679dce954358cd2289e3970e758df  libffi/testsuite/libffi.closures/cls_many_mixed_float_double.c
! 40a327df0ba0a6ddc1c9cffd232c08ca  libffi/testsuite/libffi.closures/cls_multi_schar.c
! 60f460ffe47f93b85a6efcc241297123  libffi/testsuite/libffi.closures/cls_multi_sshort.c
! bbbfe7713c104850e62381d753f2d584  libffi/testsuite/libffi.closures/cls_multi_sshortchar.c
! 77ab62de6cf175db94ee91c26c2b3130  libffi/testsuite/libffi.closures/cls_multi_uchar.c
! da91227b5215eca609e6a7db70fce29f  libffi/testsuite/libffi.closures/cls_multi_ushort.c
! 54959cef46371d6fee7d304396b0436e  libffi/testsuite/libffi.closures/cls_multi_ushortchar.c
! 7d2c09ef97d88032bfc0636023dc3b71  libffi/testsuite/libffi.closures/cls_pointer.c
! 4afae64869e8eb7955f144c4cc7f7ff4  libffi/testsuite/libffi.closures/cls_pointer_stack.c
! ac37df14ea73da7f03cb3b6022bfb6a4  libffi/testsuite/libffi.closures/cls_schar.c
! 4f450ae609371eb85aaaeb1c9b7eecb5  libffi/testsuite/libffi.closures/cls_sint.c
! 06e361be6c3071ca285b801f096470f3  libffi/testsuite/libffi.closures/cls_sshort.c
! ee29be3e026ef6ee1a0dcf7fb6fc574a  libffi/testsuite/libffi.closures/cls_struct_va1.c
! 2cd438e942616c72779e5d47b2931a62  libffi/testsuite/libffi.closures/cls_uchar.c
! 53b167cdc12735ea2699e2c9f750c3c1  libffi/testsuite/libffi.closures/cls_uint.c
! 520ddd5db09f9e4937c11c3b49a6c719  libffi/testsuite/libffi.closures/cls_uint_va.c
! 86d6e8afa41e121dafd67b2a77a1596f  libffi/testsuite/libffi.closures/cls_ulong_va.c
! f3b680e88d43df7f419ba667c23a5441  libffi/testsuite/libffi.closures/cls_ulonglong.c
! 3733f968cb6c70c1dcee6e4274f7fea7  libffi/testsuite/libffi.closures/cls_ushort.c
  8d51134a9ef24d24a2984bdf13273405  libffi/testsuite/libffi.closures/err_bad_abi.c
! 0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.closures/ffitest.h
! 4a96b53a3fdcd35f1705f47c8e6a3010  libffi/testsuite/libffi.closures/huge_struct.c
! 54f6c11fbe92b94b959c0a7860c28b0d  libffi/testsuite/libffi.closures/nested_struct.c
  76549bc0e1457475625727c72131cfbc  libffi/testsuite/libffi.closures/nested_struct1.c
! f74b6def9679c37e11adb502897ee2bb  libffi/testsuite/libffi.closures/nested_struct10.c
! e95f53c6a4d29fee4907a6fa8d098dae  libffi/testsuite/libffi.closures/nested_struct11.c
! 1d09792fa6bf96a7a04db88541fa7aa1  libffi/testsuite/libffi.closures/nested_struct12.c
! 4f1c88dca07d612b01f2128ccc57c109  libffi/testsuite/libffi.closures/nested_struct13.c
! a41a73fdd75e262ae189b17c5e20df13  libffi/testsuite/libffi.closures/nested_struct2.c
! 84cff65f74476b51e1e977793fcbb4d4  libffi/testsuite/libffi.closures/nested_struct3.c
! e822098c8d15cfb3885439eaef6c4a38  libffi/testsuite/libffi.closures/nested_struct4.c
! c363aa7fab5e6242e36a42eeb5efd02f  libffi/testsuite/libffi.closures/nested_struct5.c
! 52c078f823733ede0061241ae2233659  libffi/testsuite/libffi.closures/nested_struct6.c
! 6fc40914c38430e8bc9b6e1d543c3c10  libffi/testsuite/libffi.closures/nested_struct7.c
! a094da84f590246e30c5b96fa4832519  libffi/testsuite/libffi.closures/nested_struct8.c
! f744f2b8281f0b5f25c72fd6fc3b522a  libffi/testsuite/libffi.closures/nested_struct9.c
  00c9e6412441f7bba3c5d8f863d11d2f  libffi/testsuite/libffi.closures/problem1.c
  f0d7ac0f4c46fedd9236941fee3734fe  libffi/testsuite/libffi.closures/single_entry_structs1.c
  b0f6b491966d196868db60ae77e8b802  libffi/testsuite/libffi.closures/single_entry_structs2.c
*************** b0f6b491966d196868db60ae77e8b802  libffi
*** 132257,132265 ****
  b6b4e24f5afbaf7409816b6afa5fc677  libffi/testsuite/libffi.closures/stret_large2.c
  af8120c9522daaf3aeca3284ab521494  libffi/testsuite/libffi.closures/stret_medium.c
  5f172be0cdacafffaa3978bf2df9a4bd  libffi/testsuite/libffi.closures/stret_medium2.c
! 2ea2e2ba822811cd9fd336f41df6198b  libffi/testsuite/libffi.closures/testclosure.c
! 0e06b1c4de82582129c72b43b797efe6  libffi/testsuite/libffi.closures/unwindtest.cc
! 356db1b1b8ce3d7bc7c7373914bd21ad  libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc
  56663dcbfcf718fa8ed640fe9fe6bd79  libffi/testsuite/libffi.complex/cls_align_complex.inc
  b63238fc419bed697485033ac08faa86  libffi/testsuite/libffi.complex/cls_align_complex_double.c
  cfcc4cae5ff02aa7b0ca6687c3ca3b22  libffi/testsuite/libffi.complex/cls_align_complex_float.c
--- 132410,132418 ----
  b6b4e24f5afbaf7409816b6afa5fc677  libffi/testsuite/libffi.closures/stret_large2.c
  af8120c9522daaf3aeca3284ab521494  libffi/testsuite/libffi.closures/stret_medium.c
  5f172be0cdacafffaa3978bf2df9a4bd  libffi/testsuite/libffi.closures/stret_medium2.c
! 401e12ff707f577394dfc551c56f2eb8  libffi/testsuite/libffi.closures/testclosure.c
! 806ae032d5aa92c4270106419aebc42e  libffi/testsuite/libffi.closures/unwindtest.cc
! d66cf7198df1b94ab4182077f16c5bfe  libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc
  56663dcbfcf718fa8ed640fe9fe6bd79  libffi/testsuite/libffi.complex/cls_align_complex.inc
  b63238fc419bed697485033ac08faa86  libffi/testsuite/libffi.complex/cls_align_complex_double.c
  cfcc4cae5ff02aa7b0ca6687c3ca3b22  libffi/testsuite/libffi.complex/cls_align_complex_float.c
*************** dd8de8461b5028819597c0e8ac67fc86  libffi
*** 132283,132289 ****
  28cc17ed71d65109f905ad720d20f420  libffi/testsuite/libffi.complex/complex_defs_longdouble.inc
  7080e9c0f06568616ce6d1c8337b3142  libffi/testsuite/libffi.complex/complex_double.c
  ceb3fb0a63894dba3db02101851241b4  libffi/testsuite/libffi.complex/complex_float.c
! 5e32c604a0cdc8b13e8b49292cea0fa2  libffi/testsuite/libffi.complex/complex_int.c
  c63bb413e057c3b737a6feb9bd950ade  libffi/testsuite/libffi.complex/complex_longdouble.c
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.complex/ffitest.h
  1644b630e950122addb928ae8bcd814f  libffi/testsuite/libffi.complex/many_complex.inc
--- 132436,132442 ----
  28cc17ed71d65109f905ad720d20f420  libffi/testsuite/libffi.complex/complex_defs_longdouble.inc
  7080e9c0f06568616ce6d1c8337b3142  libffi/testsuite/libffi.complex/complex_double.c
  ceb3fb0a63894dba3db02101851241b4  libffi/testsuite/libffi.complex/complex_float.c
! 97c8d0eb9b3a64ef4baad77692cbb2e4  libffi/testsuite/libffi.complex/complex_int.c
  c63bb413e057c3b737a6feb9bd950ade  libffi/testsuite/libffi.complex/complex_longdouble.c
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.complex/ffitest.h
  1644b630e950122addb928ae8bcd814f  libffi/testsuite/libffi.complex/many_complex.inc
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 132307,132312 ****
--- 132460,132468 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
+ 0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.threads/ffitest.h
+ 47823fb622c1b9c674f97230b0a76e49  libffi/testsuite/libffi.threads/threads.exp
+ 654a797b8bac51161e578c052ad36145  libffi/testsuite/libffi.threads/tsan.c
  ef053e556d1ac5f1c356d944c23061d7  libga68/ChangeLog
  e53a0cec9bb8b49f90bb24ae600d40c2  libga68/Makefile.am
  c277867afd267be068d94edc9f7362f5  libga68/Makefile.in
*************** fc49680d0c6e77e437523ea496a6b8c4  libga6
*** 132332,132338 ****
  095aff369c31681c96b933fbedd8e05f  libga68/posix.a68
  b0d017b83148520411f1c1ebdbf28b58  libga68/sppp.awk
  4ad0dcaa2eb0b81efb58d47400b0933d  libga68/standard.a68.in
! 81f9ee22682d13697142774aa9d2fcaf  libgcc/ChangeLog
  9ce0b8c50fec68eb0555ae800e4e457e  libgcc/Makefile.in
  ba1ecf5f6e509462d341532b3bf23177  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
--- 132488,132494 ----
  095aff369c31681c96b933fbedd8e05f  libga68/posix.a68
  b0d017b83148520411f1c1ebdbf28b58  libga68/sppp.awk
  4ad0dcaa2eb0b81efb58d47400b0933d  libga68/standard.a68.in
! 5742146e1134572baed8f8af4973317c  libgcc/ChangeLog
  9ce0b8c50fec68eb0555ae800e4e457e  libgcc/Makefile.in
  ba1ecf5f6e509462d341532b3bf23177  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
*************** a2cbfeed5ac41bd10f73aa701e9ac26d  libgcc
*** 132476,132482 ****
  d1bc698652ed847a9a315e51f8dfecc1  libgcc/config/arm/unwind-arm.h
  16da8ddeeb0393a8a09e4b1d871d728a  libgcc/config/avr/avr-lib.h
  6b49ee82e3034a8630645152233c515a  libgcc/config/avr/lib1funcs-fixed.S
! 8d9d8e4f975f3fa3907a9a2ff9bc4f21  libgcc/config/avr/lib1funcs.S
  622f81485f02d0eac2caaafa7d3a2fd1  libgcc/config/avr/lib2-object.mk
  c7a08febc167bf9a84c28593ca627617  libgcc/config/avr/lib2funcs.c
  c01476abe456556d2a2e48eb9b52431d  libgcc/config/avr/libf7/ChangeLog
--- 132632,132638 ----
  d1bc698652ed847a9a315e51f8dfecc1  libgcc/config/arm/unwind-arm.h
  16da8ddeeb0393a8a09e4b1d871d728a  libgcc/config/avr/avr-lib.h
  6b49ee82e3034a8630645152233c515a  libgcc/config/avr/lib1funcs-fixed.S
! f55306289bae5967429b6d421c1be6dd  libgcc/config/avr/lib1funcs.S
  622f81485f02d0eac2caaafa7d3a2fd1  libgcc/config/avr/lib2-object.mk
  c7a08febc167bf9a84c28593ca627617  libgcc/config/avr/lib2funcs.c
  c01476abe456556d2a2e48eb9b52431d  libgcc/config/avr/libf7/ChangeLog
*************** e0d52767ffbd916d11a487e542c9da0a  libgcc
*** 132497,132503 ****
  2921a86fef727ada45668b8c0f091e33  libgcc/config/avr/libf7/t-libf7
  bf9360cfc14e0b0129af5560893f374e  libgcc/config/avr/libf7/t-libf7-math
  761826027ebb1cfbb089d23904494606  libgcc/config/avr/libf7/t-libf7-math-symbols
! 2203329f7323549e6c781eca3437d2e0  libgcc/config/avr/t-avr
  42e21fd8b00be58d09a62b8654a8ba20  libgcc/config/avr/t-avrlibc
  77d29be9a46b600293b32c93c09dacbf  libgcc/config/avr/t-copy-libgcc
  a2c28c9fd8e63f29ab5a369ef41e8b3b  libgcc/config/bfin/crti.S
--- 132653,132659 ----
  2921a86fef727ada45668b8c0f091e33  libgcc/config/avr/libf7/t-libf7
  bf9360cfc14e0b0129af5560893f374e  libgcc/config/avr/libf7/t-libf7-math
  761826027ebb1cfbb089d23904494606  libgcc/config/avr/libf7/t-libf7-math-symbols
! bafae17b5d2413fa5abeb0be76fd62ca  libgcc/config/avr/t-avr
  42e21fd8b00be58d09a62b8654a8ba20  libgcc/config/avr/t-avrlibc
  77d29be9a46b600293b32c93c09dacbf  libgcc/config/avr/t-copy-libgcc
  a2c28c9fd8e63f29ab5a369ef41e8b3b  libgcc/config/bfin/crti.S
*************** bbd10af0f21bbb60b8dcb578d21ea8fc  libgcc
*** 133384,133390 ****
  b542071feaa6f1914ec810a91b9f0e4c  libgcc/config/riscv/crti.S
  196894f3e59520659e3b0ba14bb0a903  libgcc/config/riscv/crtn.S
  3e8b5b53e342b916e5c14f9af338c109  libgcc/config/riscv/div.S
! 67914451f9c65710da65b5591b7258f9  libgcc/config/riscv/feature_bits.c
  3c665a373e2a4309fc79a25e5b436964  libgcc/config/riscv/libgcc-riscv.ver
  ee6e30cc4a2ad7734a1c0eacad56a515  libgcc/config/riscv/linux-unwind.h
  fc4c3defc96f140cf5aa4a7b4a7dfc66  libgcc/config/riscv/muldi3.S
--- 133540,133546 ----
  b542071feaa6f1914ec810a91b9f0e4c  libgcc/config/riscv/crti.S
  196894f3e59520659e3b0ba14bb0a903  libgcc/config/riscv/crtn.S
  3e8b5b53e342b916e5c14f9af338c109  libgcc/config/riscv/div.S
! 15bf4bccce1d3e67ee72c9509a21ebf0  libgcc/config/riscv/feature_bits.c
  3c665a373e2a4309fc79a25e5b436964  libgcc/config/riscv/libgcc-riscv.ver
  ee6e30cc4a2ad7734a1c0eacad56a515  libgcc/config/riscv/linux-unwind.h
  fc4c3defc96f140cf5aa4a7b4a7dfc66  libgcc/config/riscv/muldi3.S
*************** df0869fbdcd7a132ac266d2b365bf481  libgco
*** 133985,133991 ****
  9486776ee88dd841ac94aa73290a74bf  libgcobol/valconv.cc
  3466db9e6fc5748c08c947e71a566c07  libgcobol/valconv.h
  db95b8e503515d7615559adc1be6164a  libgcobol/xmlparse.cc
! c3355e3ca29502e5f1ba7d967db4e000  libgfortran/ChangeLog
  d99469a76bfe825683f8d94fe07b508c  libgfortran/ChangeLog-2002
  522fdb2df6cefe6bcaed3c7c7311eae1  libgfortran/ChangeLog-2003
  5a3a93e76d878d063aba66079340cfe0  libgfortran/ChangeLog-2004
--- 134141,134147 ----
  9486776ee88dd841ac94aa73290a74bf  libgcobol/valconv.cc
  3466db9e6fc5748c08c947e71a566c07  libgcobol/valconv.h
  db95b8e503515d7615559adc1be6164a  libgcobol/xmlparse.cc
! e7dfc760bc2e917a5d6d2996513a3d69  libgfortran/ChangeLog
  d99469a76bfe825683f8d94fe07b508c  libgfortran/ChangeLog-2002
  522fdb2df6cefe6bcaed3c7c7311eae1  libgfortran/ChangeLog-2003
  5a3a93e76d878d063aba66079340cfe0  libgfortran/ChangeLog-2004
*************** d12e2fed9a2c91588398e73955650416  libgfo
*** 134392,134415 ****
  a526c5c956f932998143c24d2364a9d4  libgfortran/generated/iparity_i2.c
  72f68f1cd109bee704adcc398d357ffd  libgfortran/generated/iparity_i4.c
  18c82a61930672cca3906ba90612d4d5  libgfortran/generated/iparity_i8.c
! 39144082b2d03fa63f65050a47111529  libgfortran/generated/matmul_c10.c
! 8a1467c1263d1151991c2aa027e1efa5  libgfortran/generated/matmul_c16.c
! a38287cf42d600653f882e70c3045c96  libgfortran/generated/matmul_c17.c
! fbcd37d3f8c3acd913c31a510add4e70  libgfortran/generated/matmul_c4.c
! 6764e17e379f8316a5c29f8703dc5b01  libgfortran/generated/matmul_c8.c
! 2cac0e461c307c9f0b25b1434a460e63  libgfortran/generated/matmul_i1.c
! 404bb133fd529d627abef7e9a0316e83  libgfortran/generated/matmul_i16.c
! 2c5c170c848304ebbb76a1b1d6c17193  libgfortran/generated/matmul_i2.c
! a6c6489dd3dc58687021003a8be9b8bc  libgfortran/generated/matmul_i4.c
! d1ba5b88e4085d7bae116ee691d6dc0a  libgfortran/generated/matmul_i8.c
  b38d3335d1d5235df00bff39a6a64f62  libgfortran/generated/matmul_l16.c
  dde3899103c765aabc5cac5ecb0d6519  libgfortran/generated/matmul_l4.c
  d87ec9fd9b45064bfc86d9100a42ae43  libgfortran/generated/matmul_l8.c
! 54695996c51e09c59632ff399687e24d  libgfortran/generated/matmul_r10.c
! e579d5406d25496d79cf59bb36ed23c3  libgfortran/generated/matmul_r16.c
! c4eb24671d8e188eb5412f750057b682  libgfortran/generated/matmul_r17.c
! 397410b99d69b77529a6d804bf110c1d  libgfortran/generated/matmul_r4.c
! fa66989d4e40d86e05080c47f5a71ac7  libgfortran/generated/matmul_r8.c
  201cfd58d7d61ee0c0c74c069ed59d08  libgfortran/generated/matmulavx128_c10.c
  e9a91a6056b5f29b3954f01e33f3a849  libgfortran/generated/matmulavx128_c16.c
  d3a5492b100d17686fa63ccbd9fd60bd  libgfortran/generated/matmulavx128_c17.c
--- 134548,134571 ----
  a526c5c956f932998143c24d2364a9d4  libgfortran/generated/iparity_i2.c
  72f68f1cd109bee704adcc398d357ffd  libgfortran/generated/iparity_i4.c
  18c82a61930672cca3906ba90612d4d5  libgfortran/generated/iparity_i8.c
! 3f46356a2a9e81cdf1a54ed1b5fd2fde  libgfortran/generated/matmul_c10.c
! 19c48d28ed6ff0e53c4237907ddae070  libgfortran/generated/matmul_c16.c
! a95eda087a38964c160e75b27607a4d1  libgfortran/generated/matmul_c17.c
! 056b8cf333b11a499d5b41ab56af1d2f  libgfortran/generated/matmul_c4.c
! fa9e6ee829ef262e36ad68cf0b928b6d  libgfortran/generated/matmul_c8.c
! bbd1236ab10d79139cffd86e00e8a87d  libgfortran/generated/matmul_i1.c
! e38c06a3c94d5efefdc74660945aeecd  libgfortran/generated/matmul_i16.c
! a0fce421a4afd2a2e182c11c3705a633  libgfortran/generated/matmul_i2.c
! faba1d49e0d574c53d462fa2b0febb43  libgfortran/generated/matmul_i4.c
! bbfcc88d2f345bbd7b17b57b869ee73e  libgfortran/generated/matmul_i8.c
  b38d3335d1d5235df00bff39a6a64f62  libgfortran/generated/matmul_l16.c
  dde3899103c765aabc5cac5ecb0d6519  libgfortran/generated/matmul_l4.c
  d87ec9fd9b45064bfc86d9100a42ae43  libgfortran/generated/matmul_l8.c
! 615c5d911c304635c9b84e5112505e01  libgfortran/generated/matmul_r10.c
! 58c9868631942c96ef6a8db985c247bc  libgfortran/generated/matmul_r16.c
! 3cd6cfaecbf47ab42baf9182d969aa07  libgfortran/generated/matmul_r17.c
! dbb99790a15db4e004154591c5e0870c  libgfortran/generated/matmul_r4.c
! d10606dc2e322de8f29f4b24964a7693  libgfortran/generated/matmul_r8.c
  201cfd58d7d61ee0c0c74c069ed59d08  libgfortran/generated/matmulavx128_c10.c
  e9a91a6056b5f29b3954f01e33f3a849  libgfortran/generated/matmulavx128_c16.c
  d3a5492b100d17686fa63ccbd9fd60bd  libgfortran/generated/matmulavx128_c17.c
*************** c62b817e6f400a567db7dccd71d76f33  libgfo
*** 134922,134944 ****
  0686754907b94e015f02e5417b8ecb03  libgfortran/io/fbuf.c
  2a512bb8d96b461dcb82470c5dd52121  libgfortran/io/fbuf.h
  12c0228bb34d93f8553a3810004881eb  libgfortran/io/file_pos.c
! 2ba356952fcdb5359b615e9ec90bdd77  libgfortran/io/format.c
  73d01474fc7e12ff7cd21c2c920a6638  libgfortran/io/format.h
  3d6bdfad19038c8e5794b4f1d39dc010  libgfortran/io/inquire.c
  86f78d0a8d7fd3418de9e9f9a1cb384f  libgfortran/io/intrinsics.c
! fe24afda0444aab88f5a40caf1738169  libgfortran/io/io.h
  ea635852033817b89d7cc5fa4cee5183  libgfortran/io/list_read.c
  908721400434528de210b0cbef37f603  libgfortran/io/lock.c
  a5048d41737161954ead03f98865a018  libgfortran/io/open.c
  15fa25bbc2ea09df80ad7037e0c28b75  libgfortran/io/read.c
  4d71c600a702cb37b041c18304734191  libgfortran/io/size_from_kind.c
! dd8535291b48bf3df4849d1591b0aec0  libgfortran/io/transfer.c
  61d9fcffebe964f0be67a134abea6d15  libgfortran/io/transfer128.c
  6cf3fdea6474d249cc6fe641cb6a7629  libgfortran/io/unit.c
  054d43551f43e42d19a3ca81456c9a34  libgfortran/io/unix.c
  f460ce66bb06770e24fc348ce57dcea7  libgfortran/io/unix.h
! 9ad46a1d2f409dd8aa39fff0cf9281c8  libgfortran/io/write.c
! e2d3368a47699888087765be0b92fb75  libgfortran/io/write_float.def
  4d4402eb782c9c4ba1fafd5b3ca5b80b  libgfortran/kinds-override.h
  782dd75d67502253d6f5915fe7acf119  libgfortran/libgfortran.h
  387b6182fc5961d2910eba8861402578  libgfortran/libgfortran.spec.in
--- 135078,135100 ----
  0686754907b94e015f02e5417b8ecb03  libgfortran/io/fbuf.c
  2a512bb8d96b461dcb82470c5dd52121  libgfortran/io/fbuf.h
  12c0228bb34d93f8553a3810004881eb  libgfortran/io/file_pos.c
! 1db12b19e84068763a3dfa1249568b52  libgfortran/io/format.c
  73d01474fc7e12ff7cd21c2c920a6638  libgfortran/io/format.h
  3d6bdfad19038c8e5794b4f1d39dc010  libgfortran/io/inquire.c
  86f78d0a8d7fd3418de9e9f9a1cb384f  libgfortran/io/intrinsics.c
! 44d847baa8fb2279e10d8b6c68984a54  libgfortran/io/io.h
  ea635852033817b89d7cc5fa4cee5183  libgfortran/io/list_read.c
  908721400434528de210b0cbef37f603  libgfortran/io/lock.c
  a5048d41737161954ead03f98865a018  libgfortran/io/open.c
  15fa25bbc2ea09df80ad7037e0c28b75  libgfortran/io/read.c
  4d71c600a702cb37b041c18304734191  libgfortran/io/size_from_kind.c
! b94de02fd60dc6a23f23fdbb73351b86  libgfortran/io/transfer.c
  61d9fcffebe964f0be67a134abea6d15  libgfortran/io/transfer128.c
  6cf3fdea6474d249cc6fe641cb6a7629  libgfortran/io/unit.c
  054d43551f43e42d19a3ca81456c9a34  libgfortran/io/unix.c
  f460ce66bb06770e24fc348ce57dcea7  libgfortran/io/unix.h
! 9e44115b64997d8b564db596373c239d  libgfortran/io/write.c
! 63dc1e7847872ead7c41b96130ad6023  libgfortran/io/write_float.def
  4d4402eb782c9c4ba1fafd5b3ca5b80b  libgfortran/kinds-override.h
  782dd75d67502253d6f5915fe7acf119  libgfortran/libgfortran.h
  387b6182fc5961d2910eba8861402578  libgfortran/libgfortran.spec.in
*************** e6278096d8f198c25934d35533c13a10  libgfo
*** 134975,134981 ****
  c8ce93c91f9370754e09838c26964133  libgfortran/m4/in_unpack.m4
  8006e8d3ecb5517dc5afc9650c232096  libgfortran/m4/iparity.m4
  a0c59c07599c968a763da08daacff7fd  libgfortran/m4/iparm.m4
! d04d311e4bb26a45a430721808ed2372  libgfortran/m4/matmul.m4
  404f92b6c287e61378cd84f231b65850  libgfortran/m4/matmul_internal.m4
  b6b51349d9e37dd02dba8c15dfb760e5  libgfortran/m4/matmulavx128.m4
  6c1bb8d76973ec4c408b761377ce0fdf  libgfortran/m4/matmull.m4
--- 135131,135137 ----
  c8ce93c91f9370754e09838c26964133  libgfortran/m4/in_unpack.m4
  8006e8d3ecb5517dc5afc9650c232096  libgfortran/m4/iparity.m4
  a0c59c07599c968a763da08daacff7fd  libgfortran/m4/iparm.m4
! b154c96ab21ed1d04d7ca5eb1d253625  libgfortran/m4/matmul.m4
  404f92b6c287e61378cd84f231b65850  libgfortran/m4/matmul_internal.m4
  b6b51349d9e37dd02dba8c15dfb760e5  libgfortran/m4/matmulavx128.m4
  6c1bb8d76973ec4c408b761377ce0fdf  libgfortran/m4/matmull.m4
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 140573,140579 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! ecc927cf2b0bde04923d4e1599db0e85  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  3d8bbdea66244a10e715c52717f8a88a  libgomp/Makefile.in
--- 140729,140735 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! a4901b0f145b5a3fb31e44b0b8ecfbb5  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  3d8bbdea66244a10e715c52717f8a88a  libgomp/Makefile.in
*************** b22a767f11646ecb4998ef385c41337f  libgom
*** 141109,141114 ****
--- 141265,141271 ----
  4372bdd89f0ce0490fa57005228167d3  libgomp/testsuite/libgomp.c++/target-lambda-4.C
  cfa4149542c401b73310497159a6cb92  libgomp/testsuite/libgomp.c++/target-map-class-1.C
  8f7ce45b75a797c6700eae6c6c482459  libgomp/testsuite/libgomp.c++/target-map-class-2.C
+ 8bee2b429ff0f1aa99091f03e9cfb459  libgomp/testsuite/libgomp.c++/target-map-multi-1.C
  d01f6cd5771f7784c8ce461cf8b60255  libgomp/testsuite/libgomp.c++/target-same-name-2-a.C
  b0372bd118a07b6674371887148186be  libgomp/testsuite/libgomp.c++/target-same-name-2-b.C
  e20a8ae264dd60aac921ec743e8b6ef6  libgomp/testsuite/libgomp.c++/target-same-name-2.C
*************** dea6e4773d5d9bcf4b5177f8c2dfb4de  libgom
*** 141512,141517 ****
--- 141669,141679 ----
  6dac483ba3b23504793becd705f3947d  libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-1.c
  0cf20228dfeb5394791055d76019d46e  libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-2.c
  09bc6cf4e088b0fd6625e525cfe99662  libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-3.c
+ 03a1c359b34e074319295ac0fddcdb7a  libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-6.c
+ 40c007f2ead4fdd429085b37ee81db43  libgomp/testsuite/libgomp.c-c++-common/target-map-multi-1.c
+ 7e075f3bbeba54544939646c91dbd112  libgomp/testsuite/libgomp.c-c++-common/target-map-multi-2.c
+ db9ea708fd687f039a48791e93b28bd0  libgomp/testsuite/libgomp.c-c++-common/target-map-multi-3.c
+ c35f38f460f64965baec1b0ae130e8ab  libgomp/testsuite/libgomp.c-c++-common/target-map-multi-4.c
  7803e5fd9e16ac9bf8d10f1018a092c0  libgomp/testsuite/libgomp.c-c++-common/target-map-zlas-1.c
  d989443106e2a262436792d18fb2f23b  libgomp/testsuite/libgomp.c-c++-common/target-memcpy-async-1.c
  3737e3b4823c33573762510eb88c0f0f  libgomp/testsuite/libgomp.c-c++-common/target-memcpy-async-2.c
*************** ee1bca91c6e853556cd65170329412cb  libgom
*** 141805,141811 ****
  ee6acb3089ae16656715ede5acd4a769  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-hip-header.c
  73994b391db11a9fa8269d17021fc731  libgomp/testsuite/libgomp.c/interop-hipblas.h
  a312f0c1d775afad3261daee64966b25  libgomp/testsuite/libgomp.c/interop-hsa.c
! a6c33c02bb48400578351a95922a2f1c  libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c
  01e92bf2afe709ab5d5aabf0410fa484  libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c
  95f6c8613aa251d5def12c5b8ac78a94  libgomp/testsuite/libgomp.c/ipcp-cb1.c
  05a55b01beb419917b31560d862a3cad  libgomp/testsuite/libgomp.c/lib-1.c
--- 141967,141973 ----
  ee6acb3089ae16656715ede5acd4a769  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-hip-header.c
  73994b391db11a9fa8269d17021fc731  libgomp/testsuite/libgomp.c/interop-hipblas.h
  a312f0c1d775afad3261daee64966b25  libgomp/testsuite/libgomp.c/interop-hsa.c
! d2f54779778d4b9c23b17d235214afc6  libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c
  01e92bf2afe709ab5d5aabf0410fa484  libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c
  95f6c8613aa251d5def12c5b8ac78a94  libgomp/testsuite/libgomp.c/ipcp-cb1.c
  05a55b01beb419917b31560d862a3cad  libgomp/testsuite/libgomp.c/lib-1.c
*************** b205f9e12d1bd4e2fa5b8ecd4f50db58  libgom
*** 142615,142620 ****
--- 142777,142787 ----
  6859dad56b2334740e8ca2b4290949fe  libgomp/testsuite/libgomp.fortran/target-is-initial-host.f
  27af88403c16b3dceba23e48c356e1be  libgomp/testsuite/libgomp.fortran/target-is-initial-host.f90
  c8674726b7e6d033a64557c340289db9  libgomp/testsuite/libgomp.fortran/target-map-1.f90
+ 3aa0e23d9a616e459cd9b249870a9aac  libgomp/testsuite/libgomp.fortran/target-map-multi-1.f90
+ b4624f6aeb10bd6bb3bfe811e141f7f0  libgomp/testsuite/libgomp.fortran/target-map-multi-2.f90
+ 47737bf33818ec9206276ba22eee1c14  libgomp/testsuite/libgomp.fortran/target-map-multi-3.f90
+ 2576714857351be5930748f097d00107  libgomp/testsuite/libgomp.fortran/target-map-multi-4.f90
+ 1b210cbf6f257813d297d30a5aef526f  libgomp/testsuite/libgomp.fortran/target-map-multi-5.f90
  01e2ad7b20b3a43df8961f12a00e15c3  libgomp/testsuite/libgomp.fortran/target-memcpy-async-1.f90
  df2f6664e447efa046e484854a127809  libgomp/testsuite/libgomp.fortran/target-memcpy-async-2.f90
  fa67086ca331f5c3937170a587173c10  libgomp/testsuite/libgomp.fortran/target-memcpy-rect-1.f90
*************** a73d560a3ba317c5ad0a7919d87b4b6d  libssp
*** 146211,146217 ****
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 90185a25ca40be9ae9c4195304d86c57  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 146378,146384 ----
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 7f184126d5fb85e3a9d1ecb0e3f9938b  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** f7e6afd3479309813624b96ba52e9f11  libstd
*** 146278,146284 ****
  64c7ddb3ee44b0d3bc4a83995c1f0d96  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  d8fba4e72b3bac4b2fa939d9ec589c51  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! a52799d35af179aa140198d41ab81659  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  a2a19bba90a6663d180d5d9f7b28b623  libstdc++-v3/config/allocator/malloc_allocator_base.h
  92afc718fea5d5748cbf18f969414917  libstdc++-v3/config/allocator/new_allocator_base.h
--- 146445,146451 ----
  64c7ddb3ee44b0d3bc4a83995c1f0d96  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  d8fba4e72b3bac4b2fa939d9ec589c51  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 25fae1b670f3a8f2a42f4311bc475590  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  a2a19bba90a6663d180d5d9f7b28b623  libstdc++-v3/config/allocator/malloc_allocator_base.h
  92afc718fea5d5748cbf18f969414917  libstdc++-v3/config/allocator/new_allocator_base.h
*************** d7249eb4d31bd107d0b09ea3c80cb723  libstd
*** 146533,146548 ****
  1d86b338a316806c80b250eb132ac6dd  libstdc++-v3/doc/html/images/pbds_tree_text_lor_find.png
  33bc39e8f2d47f3d490d7ca7d4832b43  libstdc++-v3/doc/html/images/pbds_trie_node_updator_policy_cd.png
  df705f3839120dcb896e9839cf3404d0  libstdc++-v3/doc/html/images/pbds_update_seq_diagram.png
! 1ee0763cec1ed7370868bbd953b92b71  libstdc++-v3/doc/html/index.html
  da8ef3dbcb662f961907eacee627f1e5  libstdc++-v3/doc/html/manual/abi.html
  4ce10e27356ac31a5b7962aecbeb3638  libstdc++-v3/doc/html/manual/algorithms.html
! e8962e30cf090d22cd4186a86105e4f3  libstdc++-v3/doc/html/manual/api.html
! e5a690ded485bd276ae2fa367fc1fd13  libstdc++-v3/doc/html/manual/appendix.html
  09331471a432d70e6ad2e090ee1ba091  libstdc++-v3/doc/html/manual/appendix_contributing.html
  23038a3eb57967596dd7dc4f944e55e6  libstdc++-v3/doc/html/manual/appendix_free.html
  7bedd2c8f6a4683546db552dc3e8261f  libstdc++-v3/doc/html/manual/appendix_gfdl.html
  502f9b7267830b21cb88745d060faacf  libstdc++-v3/doc/html/manual/appendix_gpl.html
! d3607480851bb0ef04730339ec5f4471  libstdc++-v3/doc/html/manual/appendix_porting.html
  28d18f62862955c03fd5de7a9e104581  libstdc++-v3/doc/html/manual/associative.html
  b8ac9fc2f2cfcaed0450c79e2fb01569  libstdc++-v3/doc/html/manual/atomics.html
  1985180c416d737bee7686d60f4e70ef  libstdc++-v3/doc/html/manual/backwards.html
--- 146700,146715 ----
  1d86b338a316806c80b250eb132ac6dd  libstdc++-v3/doc/html/images/pbds_tree_text_lor_find.png
  33bc39e8f2d47f3d490d7ca7d4832b43  libstdc++-v3/doc/html/images/pbds_trie_node_updator_policy_cd.png
  df705f3839120dcb896e9839cf3404d0  libstdc++-v3/doc/html/images/pbds_update_seq_diagram.png
! 1d021ecbe8d19331bb3ea7b6228f8918  libstdc++-v3/doc/html/index.html
  da8ef3dbcb662f961907eacee627f1e5  libstdc++-v3/doc/html/manual/abi.html
  4ce10e27356ac31a5b7962aecbeb3638  libstdc++-v3/doc/html/manual/algorithms.html
! 231ab808250c15c801ef2c73327e9d43  libstdc++-v3/doc/html/manual/api.html
! 429324d165eade3038a28de2ea41bd2f  libstdc++-v3/doc/html/manual/appendix.html
  09331471a432d70e6ad2e090ee1ba091  libstdc++-v3/doc/html/manual/appendix_contributing.html
  23038a3eb57967596dd7dc4f944e55e6  libstdc++-v3/doc/html/manual/appendix_free.html
  7bedd2c8f6a4683546db552dc3e8261f  libstdc++-v3/doc/html/manual/appendix_gfdl.html
  502f9b7267830b21cb88745d060faacf  libstdc++-v3/doc/html/manual/appendix_gpl.html
! d43dba936560e100776bfd4dc6c6c607  libstdc++-v3/doc/html/manual/appendix_porting.html
  28d18f62862955c03fd5de7a9e104581  libstdc++-v3/doc/html/manual/associative.html
  b8ac9fc2f2cfcaed0450c79e2fb01569  libstdc++-v3/doc/html/manual/atomics.html
  1985180c416d737bee7686d60f4e70ef  libstdc++-v3/doc/html/manual/backwards.html
*************** ffd5e74a40bbf6623b8ccf687eb584d8  libstd
*** 146580,146586 ****
  76cac108e21e304b7607196fb5245e00  libstdc++-v3/doc/html/manual/facets.html
  9b06f8b16b4ba69e1269f98bb22377f2  libstdc++-v3/doc/html/manual/fstreams.html
  fbe501e55689450dce7bb04b0f9a28b1  libstdc++-v3/doc/html/manual/generalized_numeric_operations.html
! bfdb80842e9876f39424e27dd1e6f8a0  libstdc++-v3/doc/html/manual/index.html
  b1c5b19b09af9d16def15e1a73ea851a  libstdc++-v3/doc/html/manual/internals.html
  89f96b13d0525d86ec6cd96b462130cf  libstdc++-v3/doc/html/manual/intro.html
  ad9c4c3d4e5712738facc14da8c89ae7  libstdc++-v3/doc/html/manual/io.html
--- 146747,146753 ----
  76cac108e21e304b7607196fb5245e00  libstdc++-v3/doc/html/manual/facets.html
  9b06f8b16b4ba69e1269f98bb22377f2  libstdc++-v3/doc/html/manual/fstreams.html
  fbe501e55689450dce7bb04b0f9a28b1  libstdc++-v3/doc/html/manual/generalized_numeric_operations.html
! 59e5213b7c7f4f46b14ee33558fe6191  libstdc++-v3/doc/html/manual/index.html
  b1c5b19b09af9d16def15e1a73ea851a  libstdc++-v3/doc/html/manual/internals.html
  89f96b13d0525d86ec6cd96b462130cf  libstdc++-v3/doc/html/manual/intro.html
  ad9c4c3d4e5712738facc14da8c89ae7  libstdc++-v3/doc/html/manual/io.html
*************** d08c687d9520b2f9d8dd6d973cca9e6a  libstd
*** 146837,146843 ****
  a972c915c47573572139ea9161dec244  libstdc++-v3/doc/xml/manual/debug_mode.xml
  90361f264f5edc899c47c155c4106f24  libstdc++-v3/doc/xml/manual/diagnostics.xml
  3680906036c20b1ccc54e2d06b5a3a24  libstdc++-v3/doc/xml/manual/documentation_hacking.xml
! a428ca9e1e1a450b765156e74924d806  libstdc++-v3/doc/xml/manual/evolution.xml
  35161972a439c38c57ac30525b12bd9f  libstdc++-v3/doc/xml/manual/extensions.xml
  cf6e1934851f1294436c0a13931cc42b  libstdc++-v3/doc/xml/manual/internals.xml
  b9a71f2513a821d689faf68e4bb3c87f  libstdc++-v3/doc/xml/manual/intro.xml
--- 147004,147010 ----
  a972c915c47573572139ea9161dec244  libstdc++-v3/doc/xml/manual/debug_mode.xml
  90361f264f5edc899c47c155c4106f24  libstdc++-v3/doc/xml/manual/diagnostics.xml
  3680906036c20b1ccc54e2d06b5a3a24  libstdc++-v3/doc/xml/manual/documentation_hacking.xml
! 0f2b78b7b0ac8c29796c1f480b6880dd  libstdc++-v3/doc/xml/manual/evolution.xml
  35161972a439c38c57ac30525b12bd9f  libstdc++-v3/doc/xml/manual/extensions.xml
  cf6e1934851f1294436c0a13931cc42b  libstdc++-v3/doc/xml/manual/internals.xml
  b9a71f2513a821d689faf68e4bb3c87f  libstdc++-v3/doc/xml/manual/intro.xml
*************** bb9a7ef31b4a9de3a402d0493d5862e9  libstd
*** 146885,146901 ****
  2f4121a38a68c1efce93c7dafa3b408a  libstdc++-v3/include/backward/strstream
  a7d1ee943a62851fe350ec2bafff68be  libstdc++-v3/include/bits/algorithmfwd.h
  19a62011e468a574086c2dd3f6c8d0f2  libstdc++-v3/include/bits/align.h
! b3ad585e8dea128f22460b1137490781  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
! 80189b147081bd6b28f814f7b9622c5d  libstdc++-v3/include/bits/allocator.h
  90474cfdc599d84d37f90551a24dfb7c  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
  f67bb8f4c8c8e2352479c2540b62543f  libstdc++-v3/include/bits/atomic_wait.h
  65e262c95ca2a5021497a947a07b5d48  libstdc++-v3/include/bits/basic_ios.h
  e0d25c8ddeac5ee95a7b60861849f304  libstdc++-v3/include/bits/basic_ios.tcc
! 0b099193950908f00410d2b1bdb20de3  libstdc++-v3/include/bits/basic_string.h
! 397c9d91ebf40f0a7ccea33f0bde178f  libstdc++-v3/include/bits/basic_string.tcc
  abf1c74de0fb52f696034bd48432d075  libstdc++-v3/include/bits/binders.h
  3bc144622d471efab1aef4ec705459d0  libstdc++-v3/include/bits/boost_concept_check.h
  8af4c7d9e9f6b31055b2f57c798201d6  libstdc++-v3/include/bits/c++0x_warning.h
--- 147052,147068 ----
  2f4121a38a68c1efce93c7dafa3b408a  libstdc++-v3/include/backward/strstream
  a7d1ee943a62851fe350ec2bafff68be  libstdc++-v3/include/bits/algorithmfwd.h
  19a62011e468a574086c2dd3f6c8d0f2  libstdc++-v3/include/bits/align.h
! 8b861e997049da913d847c1c3386de8b  libstdc++-v3/include/bits/alloc_traits.h
  54d70975b96f74e9dab06dcfdeb88658  libstdc++-v3/include/bits/allocated_ptr.h
! 057f2ba9795770f94d269ec61c0c9cf7  libstdc++-v3/include/bits/allocator.h
  90474cfdc599d84d37f90551a24dfb7c  libstdc++-v3/include/bits/atomic_base.h
  504ddf67fe31254fb67815770ee690ba  libstdc++-v3/include/bits/atomic_futex.h
  e901edfc8eef441d1adabd54be25b807  libstdc++-v3/include/bits/atomic_timed_wait.h
  f67bb8f4c8c8e2352479c2540b62543f  libstdc++-v3/include/bits/atomic_wait.h
  65e262c95ca2a5021497a947a07b5d48  libstdc++-v3/include/bits/basic_ios.h
  e0d25c8ddeac5ee95a7b60861849f304  libstdc++-v3/include/bits/basic_ios.tcc
! 3703f6fc16e78a5989dfe0921b1e2197  libstdc++-v3/include/bits/basic_string.h
! 2f7562208df92df6d82751520c3e1881  libstdc++-v3/include/bits/basic_string.tcc
  abf1c74de0fb52f696034bd48432d075  libstdc++-v3/include/bits/binders.h
  3bc144622d471efab1aef4ec705459d0  libstdc++-v3/include/bits/boost_concept_check.h
  8af4c7d9e9f6b31055b2f57c798201d6  libstdc++-v3/include/bits/c++0x_warning.h
*************** abf1c74de0fb52f696034bd48432d075  libstd
*** 146903,146909 ****
  5cbbd0fafb904f86c9ddce3fc54380f1  libstdc++-v3/include/bits/char_traits.h
  9a3227d14b324832ae22b4c7ec6979e2  libstdc++-v3/include/bits/charconv.h
  6fe2f7b46dbc6b4127ad2e546061bfaf  libstdc++-v3/include/bits/chrono.h
! 4ac369b53166ce061e37bf465dc13909  libstdc++-v3/include/bits/chrono_io.h
  1f26067336c4957237db887ab1ce6b55  libstdc++-v3/include/bits/codecvt.h
  53f7e45e350f1bb99b3d67e27f914b61  libstdc++-v3/include/bits/concept_check.h
  3000c6dba4f53a32aed26e5c5cbccffc  libstdc++-v3/include/bits/cow_string.h
--- 147070,147076 ----
  5cbbd0fafb904f86c9ddce3fc54380f1  libstdc++-v3/include/bits/char_traits.h
  9a3227d14b324832ae22b4c7ec6979e2  libstdc++-v3/include/bits/charconv.h
  6fe2f7b46dbc6b4127ad2e546061bfaf  libstdc++-v3/include/bits/chrono.h
! 9c32c72531ca78037c316602cefb201b  libstdc++-v3/include/bits/chrono_io.h
  1f26067336c4957237db887ab1ce6b55  libstdc++-v3/include/bits/codecvt.h
  53f7e45e350f1bb99b3d67e27f914b61  libstdc++-v3/include/bits/concept_check.h
  3000c6dba4f53a32aed26e5c5cbccffc  libstdc++-v3/include/bits/cow_string.h
*************** f69aa477afbbb88f2ee81c3b9aa8d777  libstd
*** 146946,146958 ****
  5e10fa4819349005d341e0d826c26645  libstdc++-v3/include/bits/locale_facets_nonio.tcc
  ba88833f52a0518e73f3f865cd474fcd  libstdc++-v3/include/bits/localefwd.h
  7d421045a2c29aed04d8138049f30a0f  libstdc++-v3/include/bits/mask_array.h
! 3acac12c52dd020e88e494e9005a4e9f  libstdc++-v3/include/bits/max_size_type.h
! 132af6fa95001b1f22942660000c3734  libstdc++-v3/include/bits/memory_resource.h
  d8251691b710967c63f24ecf3e8cad75  libstdc++-v3/include/bits/memoryfwd.h
  2708f802c8da11c10d875a4645e4940f  libstdc++-v3/include/bits/mofunc_impl.h
  4169d644c2ef24f0668b2a257a0a5e54  libstdc++-v3/include/bits/monostate.h
  3cfa2a35a7a2c4659303ecaa81de7f29  libstdc++-v3/include/bits/move.h
! 9433cdde0133c30f26005432cb0b7214  libstdc++-v3/include/bits/new_allocator.h
  1b9f1c577b18d8325e7de09b66b12c27  libstdc++-v3/include/bits/new_except.h
  30068e814005895587eb706ab7c5c00c  libstdc++-v3/include/bits/new_throw.h
  ab1a2667b1fb6a0843b439656cb56a71  libstdc++-v3/include/bits/node_handle.h
--- 147113,147125 ----
  5e10fa4819349005d341e0d826c26645  libstdc++-v3/include/bits/locale_facets_nonio.tcc
  ba88833f52a0518e73f3f865cd474fcd  libstdc++-v3/include/bits/localefwd.h
  7d421045a2c29aed04d8138049f30a0f  libstdc++-v3/include/bits/mask_array.h
! 3b8fde32379284f35ba1b16a4a8e5b75  libstdc++-v3/include/bits/max_size_type.h
! c2a37a4d261aa6aa543de47ce2a11603  libstdc++-v3/include/bits/memory_resource.h
  d8251691b710967c63f24ecf3e8cad75  libstdc++-v3/include/bits/memoryfwd.h
  2708f802c8da11c10d875a4645e4940f  libstdc++-v3/include/bits/mofunc_impl.h
  4169d644c2ef24f0668b2a257a0a5e54  libstdc++-v3/include/bits/monostate.h
  3cfa2a35a7a2c4659303ecaa81de7f29  libstdc++-v3/include/bits/move.h
! 969ff45921e9018219c351e49f98e77d  libstdc++-v3/include/bits/new_allocator.h
  1b9f1c577b18d8325e7de09b66b12c27  libstdc++-v3/include/bits/new_except.h
  30068e814005895587eb706ab7c5c00c  libstdc++-v3/include/bits/new_throw.h
  ab1a2667b1fb6a0843b439656cb56a71  libstdc++-v3/include/bits/node_handle.h
*************** c70bbf877307a51d2c70e9955edf27f6  libstd
*** 147039,147046 ****
  2e947ba181d169443bd32dfa77c0e138  libstdc++-v3/include/bits/stl_stack.h
  1c29bd2c226486c0b4016828fd21d761  libstdc++-v3/include/bits/stl_tempbuf.h
  5a7ae738df1c65c40473cbd89974f3fd  libstdc++-v3/include/bits/stl_tree.h
! 7d34318fb81417ec27b53785cc389660  libstdc++-v3/include/bits/stl_uninitialized.h
! fa6a2197d9927c61c24b530816008594  libstdc++-v3/include/bits/stl_vector.h
  96570e9668a903cd69d5febdf0595994  libstdc++-v3/include/bits/stream_iterator.h
  5d9b3cc499e4ec992ba0bb9a3de1d791  libstdc++-v3/include/bits/streambuf.tcc
  6343ef1e67538a9623d0775ee71895cb  libstdc++-v3/include/bits/streambuf_iterator.h
--- 147206,147213 ----
  2e947ba181d169443bd32dfa77c0e138  libstdc++-v3/include/bits/stl_stack.h
  1c29bd2c226486c0b4016828fd21d761  libstdc++-v3/include/bits/stl_tempbuf.h
  5a7ae738df1c65c40473cbd89974f3fd  libstdc++-v3/include/bits/stl_tree.h
! 6b5ebf261762096423606222edf5246e  libstdc++-v3/include/bits/stl_uninitialized.h
! 7d9ed7479273bdd2f66b5f3b4065f829  libstdc++-v3/include/bits/stl_vector.h
  96570e9668a903cd69d5febdf0595994  libstdc++-v3/include/bits/stream_iterator.h
  5d9b3cc499e4ec992ba0bb9a3de1d791  libstdc++-v3/include/bits/streambuf.tcc
  6343ef1e67538a9623d0775ee71895cb  libstdc++-v3/include/bits/streambuf_iterator.h
*************** d1cf5a35c4ad3820cb023d8f84762cc7  libstd
*** 147063,147069 ****
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  682dec8d9b388681bc1f171ba0c5590e  libstdc++-v3/include/bits/vec_ops.h
! 5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
  ae1e85f3adbba68624784dcdc24add83  libstdc++-v3/include/bits/version.def
  6531f407cc29e442f9192eef7f513307  libstdc++-v3/include/bits/version.h
  f92789aa59d1ed5207e13c936667059d  libstdc++-v3/include/bits/version.tpl
--- 147230,147236 ----
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  682dec8d9b388681bc1f171ba0c5590e  libstdc++-v3/include/bits/vec_ops.h
! fe1be23d00db0d87529a75faf3afb98a  libstdc++-v3/include/bits/vector.tcc
  ae1e85f3adbba68624784dcdc24add83  libstdc++-v3/include/bits/version.def
  6531f407cc29e442f9192eef7f513307  libstdc++-v3/include/bits/version.h
  f92789aa59d1ed5207e13c936667059d  libstdc++-v3/include/bits/version.tpl
*************** f945d16289e71c13744e7d9177de9ccc  libstd
*** 147631,147645 ****
  649d9183a0fa35d50371bb1bce3f70c2  libstdc++-v3/include/std/execution
  a8e79cb6c591611cd6113eed355c3de6  libstdc++-v3/include/std/expected
  d1dc8325fc8c069a07bab71a935bced3  libstdc++-v3/include/std/filesystem
! f004e380db68bad2f1a8548323345a5c  libstdc++-v3/include/std/flat_map
  b384f6e8eb77f0d5747534b3ed9a89cb  libstdc++-v3/include/std/flat_set
  a5851608f400f6bf608e45d480108434  libstdc++-v3/include/std/format
  7e1c7765d1205d0a0571065e7e1f111d  libstdc++-v3/include/std/forward_list
  c85826e5073be733076e4825a96a991c  libstdc++-v3/include/std/fstream
  5907213253b81e40fd9101e5d092fc82  libstdc++-v3/include/std/functional
! 94a42cdbbdcf611d6ed85997de7e69ec  libstdc++-v3/include/std/future
  f07a74eecab3055929d3af3c5ea38bed  libstdc++-v3/include/std/generator
! 009ac20865acb37f9c89d1506afaebe5  libstdc++-v3/include/std/inplace_vector
  9faf9f4caa2dcbfe374113d6cf2380ad  libstdc++-v3/include/std/iomanip
  48bf9080e650b3c09a288f25a49455d5  libstdc++-v3/include/std/ios
  df4362bdba64b8e857e22cfffc178349  libstdc++-v3/include/std/iosfwd
--- 147798,147812 ----
  649d9183a0fa35d50371bb1bce3f70c2  libstdc++-v3/include/std/execution
  a8e79cb6c591611cd6113eed355c3de6  libstdc++-v3/include/std/expected
  d1dc8325fc8c069a07bab71a935bced3  libstdc++-v3/include/std/filesystem
! 2e6e28dfb5edb1fef43bb61a7cfa4f6d  libstdc++-v3/include/std/flat_map
  b384f6e8eb77f0d5747534b3ed9a89cb  libstdc++-v3/include/std/flat_set
  a5851608f400f6bf608e45d480108434  libstdc++-v3/include/std/format
  7e1c7765d1205d0a0571065e7e1f111d  libstdc++-v3/include/std/forward_list
  c85826e5073be733076e4825a96a991c  libstdc++-v3/include/std/fstream
  5907213253b81e40fd9101e5d092fc82  libstdc++-v3/include/std/functional
! 6fc93cafeb2ebce1111afdc9b6cf84c5  libstdc++-v3/include/std/future
  f07a74eecab3055929d3af3c5ea38bed  libstdc++-v3/include/std/generator
! 09e388caae4d74909f62208d8c04e541  libstdc++-v3/include/std/inplace_vector
  9faf9f4caa2dcbfe374113d6cf2380ad  libstdc++-v3/include/std/iomanip
  48bf9080e650b3c09a288f25a49455d5  libstdc++-v3/include/std/ios
  df4362bdba64b8e857e22cfffc178349  libstdc++-v3/include/std/iosfwd
*************** f16c882692ac65bc0c0b5dd8549e9ee0  libstd
*** 147647,147657 ****
  8a6f8748d19565f2448fe4e00285ffb9  libstdc++-v3/include/std/istream
  b33d9f7d5e6dae4596b350ebc5fd6b8f  libstdc++-v3/include/std/iterator
  44697b5c0f957dae546124db0f196f5f  libstdc++-v3/include/std/latch
! 17e11e13544c770792b94b85997a624f  libstdc++-v3/include/std/limits
  2f3eb4865a149d33afc45095dfd51d15  libstdc++-v3/include/std/list
  979d756bd9149a01a697b92c921e75a0  libstdc++-v3/include/std/locale
  b9368104d884bddd988db2b9e69ab485  libstdc++-v3/include/std/map
! 255a13f24a7b5e508bdf5bfa1d1762b5  libstdc++-v3/include/std/mdspan
  5439ce157f7c11ab4eddd8c04799fea4  libstdc++-v3/include/std/memory
  ea0d67f29f1a73f1ccdade0115646a1c  libstdc++-v3/include/std/memory_resource
  567571e5d45a92d724eb13976d8d825d  libstdc++-v3/include/std/meta
--- 147814,147824 ----
  8a6f8748d19565f2448fe4e00285ffb9  libstdc++-v3/include/std/istream
  b33d9f7d5e6dae4596b350ebc5fd6b8f  libstdc++-v3/include/std/iterator
  44697b5c0f957dae546124db0f196f5f  libstdc++-v3/include/std/latch
! 57d926bff59fb37eabbd9524d6a53c6d  libstdc++-v3/include/std/limits
  2f3eb4865a149d33afc45095dfd51d15  libstdc++-v3/include/std/list
  979d756bd9149a01a697b92c921e75a0  libstdc++-v3/include/std/locale
  b9368104d884bddd988db2b9e69ab485  libstdc++-v3/include/std/map
! 14c31197c9d818ad9850b16d875d6fba  libstdc++-v3/include/std/mdspan
  5439ce157f7c11ab4eddd8c04799fea4  libstdc++-v3/include/std/memory
  ea0d67f29f1a73f1ccdade0115646a1c  libstdc++-v3/include/std/memory_resource
  567571e5d45a92d724eb13976d8d825d  libstdc++-v3/include/std/meta
*************** b99e4c8ad37dc8e679d2d265354d549b  libstd
*** 147693,147699 ****
  994522acd96f1b6084469da322d17c19  libstdc++-v3/include/std/unordered_map
  5393bc9d8b494917b25afd3714e8014a  libstdc++-v3/include/std/unordered_set
  3dafc052e829f49f947b61291c35680f  libstdc++-v3/include/std/utility
! bd07fa105994eb5d05ee66c7c9f10b7d  libstdc++-v3/include/std/valarray
  f4935a7b92bee0179976443347292535  libstdc++-v3/include/std/variant
  df7e0b14ef429fc02b9968616de62de0  libstdc++-v3/include/std/vector
  ecd0f316fc872dc19b88a6c834438315  libstdc++-v3/include/std/version
--- 147860,147866 ----
  994522acd96f1b6084469da322d17c19  libstdc++-v3/include/std/unordered_map
  5393bc9d8b494917b25afd3714e8014a  libstdc++-v3/include/std/unordered_set
  3dafc052e829f49f947b61291c35680f  libstdc++-v3/include/std/utility
! 5cb829e90da37cd599d0c543e420a83f  libstdc++-v3/include/std/valarray
  f4935a7b92bee0179976443347292535  libstdc++-v3/include/std/variant
  df7e0b14ef429fc02b9968616de62de0  libstdc++-v3/include/std/vector
  ecd0f316fc872dc19b88a6c834438315  libstdc++-v3/include/std/version
*************** fbb127f006c65ae37d591c627cc6235c  libstd
*** 147985,147992 ****
  85b9d2e407dc7113a97234b2c23e96dc  libstdc++-v3/src/c++17/ryu/ryu_generic_128.h
  2773ff0feb499fbb952b5beae8ae5833  libstdc++-v3/src/c++17/string-inst.cc
  04669634e7d7f19fae4baadedc6d0908  libstdc++-v3/src/c++17/uint128_t.h
! 3b693644866857e3152dd11055b1cbd5  libstdc++-v3/src/c++20/Makefile.am
! e5a726de140540a59e2007eceae3acd1  libstdc++-v3/src/c++20/Makefile.in
  5ef17b396924faca2ae22d3b9424b38d  libstdc++-v3/src/c++20/atomic.cc
  e017d47cedd4e843177ec9ff2c936541  libstdc++-v3/src/c++20/clock.cc
  beadb627afafbd9d018802046c0b4403  libstdc++-v3/src/c++20/cow-string-inst.cc
--- 148152,148159 ----
  85b9d2e407dc7113a97234b2c23e96dc  libstdc++-v3/src/c++17/ryu/ryu_generic_128.h
  2773ff0feb499fbb952b5beae8ae5833  libstdc++-v3/src/c++17/string-inst.cc
  04669634e7d7f19fae4baadedc6d0908  libstdc++-v3/src/c++17/uint128_t.h
! b4fa33c3234234ee50ec148cb246a424  libstdc++-v3/src/c++20/Makefile.am
! 350c996187175978ddbbd4e0635cd6a5  libstdc++-v3/src/c++20/Makefile.in
  5ef17b396924faca2ae22d3b9424b38d  libstdc++-v3/src/c++20/atomic.cc
  e017d47cedd4e843177ec9ff2c936541  libstdc++-v3/src/c++20/clock.cc
  beadb627afafbd9d018802046c0b4403  libstdc++-v3/src/c++20/cow-string-inst.cc
*************** beadb627afafbd9d018802046c0b4403  libstd
*** 147995,148002 ****
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
  23187a5ee053acd65f32c0dc2ac4bdf7  libstdc++-v3/src/c++20/string-inst.cc
  50ac2e00d5794df965e47509f3c16cb5  libstdc++-v3/src/c++20/syncbuf.cc
! e868493d039d86bca105c23a24b87383  libstdc++-v3/src/c++20/tzdata.zi
! 4526d5b5727f712b2023dd9249fd0974  libstdc++-v3/src/c++20/tzdb.cc
  ac7b7a080d5f7aa8fe6a26188631fc18  libstdc++-v3/src/c++20/windows_zones-map.h
  7c8cb4e8c454557197d2d63ced1992bb  libstdc++-v3/src/c++23/Makefile.am
  b00f9570f9f027f375c731351ae64403  libstdc++-v3/src/c++23/Makefile.in
--- 148162,148169 ----
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
  23187a5ee053acd65f32c0dc2ac4bdf7  libstdc++-v3/src/c++20/string-inst.cc
  50ac2e00d5794df965e47509f3c16cb5  libstdc++-v3/src/c++20/syncbuf.cc
! 0dfa4a770289b4e926b8281770732d5a  libstdc++-v3/src/c++20/tzdata.zi
! c8e15a23e0318d4217cc91b00e606cee  libstdc++-v3/src/c++20/tzdb.cc
  ac7b7a080d5f7aa8fe6a26188631fc18  libstdc++-v3/src/c++20/windows_zones-map.h
  7c8cb4e8c454557197d2d63ced1992bb  libstdc++-v3/src/c++23/Makefile.am
  b00f9570f9f027f375c731351ae64403  libstdc++-v3/src/c++23/Makefile.in
*************** b8e90d29766a86575e9a4fe20033177e  libstd
*** 148236,148248 ****
  457817958c82b8b3f75ec9e7b60e2627  libstdc++-v3/testsuite/18_support/numeric_limits/128bit.cc
  bc2c6d755b92df29cdbd0b115984b11c  libstdc++-v3/testsuite/18_support/numeric_limits/29989.cc
  ea9c657217aef9dc23aae3a59cf7a0d4  libstdc++-v3/testsuite/18_support/numeric_limits/40856.cc
! 3d45f31ddffdecdbd607fecd78e039a0  libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
! 33f4a4aabb0ec6660273ff290eba812a  libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
  6e62a47190821d00d69adeb41b2d7d57  libstdc++-v3/testsuite/18_support/numeric_limits/cons/default.cc
  c04541c587ba0b67540115f791586d8d  libstdc++-v3/testsuite/18_support/numeric_limits/cons/default_c++0x.cc
! 1c3da0ae35e8558afd4d849a41437f6c  libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
  766ccddf594def4d83643e41218a992c  libstdc++-v3/testsuite/18_support/numeric_limits/digits10.cc
! 5c9888de954cf7ef5e2f08d7577a492d  libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
  f1cf287be722c98523d670274b929495  libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc
  3273d59697aa2071fc38cdb9cad8175b  libstdc++-v3/testsuite/18_support/numeric_limits/infinity.cc
  25bb14e163df866e7d3dd57f33a60f31  libstdc++-v3/testsuite/18_support/numeric_limits/is_iec559.cc
--- 148403,148415 ----
  457817958c82b8b3f75ec9e7b60e2627  libstdc++-v3/testsuite/18_support/numeric_limits/128bit.cc
  bc2c6d755b92df29cdbd0b115984b11c  libstdc++-v3/testsuite/18_support/numeric_limits/29989.cc
  ea9c657217aef9dc23aae3a59cf7a0d4  libstdc++-v3/testsuite/18_support/numeric_limits/40856.cc
! 10024801a68a5ca984ace494993bb0a5  libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
! bcd3ce6a18955cdc57cd32209375dab8  libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
  6e62a47190821d00d69adeb41b2d7d57  libstdc++-v3/testsuite/18_support/numeric_limits/cons/default.cc
  c04541c587ba0b67540115f791586d8d  libstdc++-v3/testsuite/18_support/numeric_limits/cons/default_c++0x.cc
! 54aa9ea0da27520d4550c975b007236c  libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
  766ccddf594def4d83643e41218a992c  libstdc++-v3/testsuite/18_support/numeric_limits/digits10.cc
! 7993109c10e917a16c77357ca28f32df  libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
  f1cf287be722c98523d670274b929495  libstdc++-v3/testsuite/18_support/numeric_limits/epsilon.cc
  3273d59697aa2071fc38cdb9cad8175b  libstdc++-v3/testsuite/18_support/numeric_limits/infinity.cc
  25bb14e163df866e7d3dd57f33a60f31  libstdc++-v3/testsuite/18_support/numeric_limits/is_iec559.cc
*************** f1cf287be722c98523d670274b929495  libstd
*** 148252,148261 ****
  c16b7f14fa9375bf71bf8e5cef7d59e1  libstdc++-v3/testsuite/18_support/numeric_limits/min_max.cc
  bc5844dac5494e11aa1e9a5b88eed390  libstdc++-v3/testsuite/18_support/numeric_limits/primary.cc
  8b421d736b596c1697bf0c17e0ba030f  libstdc++-v3/testsuite/18_support/numeric_limits/quiet_NaN.cc
! d51ab9e22b3cafeb28628134872e9f63  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
  cab8fb83ca805e6cb5df8059919d7a1a  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc
  51976326fab835ea7322ddab2c29b04d  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/explicit_instantiation/1.cc
! 4c6b8bd1018df9cdeb6e324a1994410b  libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
  8e8764ab32aae5f1a2b2448aaad95aab  libstdc++-v3/testsuite/18_support/numeric_limits/traps.cc
  29110fde64f45fdf2bc32d69f6e94bf6  libstdc++-v3/testsuite/18_support/pthread_guard.cc
  966cd0384e2ba52943bcd3aaa72fcbb1  libstdc++-v3/testsuite/18_support/quick_exit/quick_exit.cc
--- 148419,148428 ----
  c16b7f14fa9375bf71bf8e5cef7d59e1  libstdc++-v3/testsuite/18_support/numeric_limits/min_max.cc
  bc5844dac5494e11aa1e9a5b88eed390  libstdc++-v3/testsuite/18_support/numeric_limits/primary.cc
  8b421d736b596c1697bf0c17e0ba030f  libstdc++-v3/testsuite/18_support/numeric_limits/quiet_NaN.cc
! 214ea7c1441c8fa92e40e6559389c517  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
  cab8fb83ca805e6cb5df8059919d7a1a  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_functions.cc
  51976326fab835ea7322ddab2c29b04d  libstdc++-v3/testsuite/18_support/numeric_limits/requirements/explicit_instantiation/1.cc
! 56812858dc8f5e8196c222a421710c13  libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
  8e8764ab32aae5f1a2b2448aaad95aab  libstdc++-v3/testsuite/18_support/numeric_limits/traps.cc
  29110fde64f45fdf2bc32d69f6e94bf6  libstdc++-v3/testsuite/18_support/pthread_guard.cc
  966cd0384e2ba52943bcd3aaa72fcbb1  libstdc++-v3/testsuite/18_support/quick_exit/quick_exit.cc
*************** c3633be19cc26ebd3041d6f7a8120295  libstd
*** 148393,148399 ****
  ae49058091ac2f31814de6246e958d6a  libstdc++-v3/testsuite/20_util/allocator/64135.cc
  3d6fd2416cfe20b40727679190a1acd5  libstdc++-v3/testsuite/20_util/allocator/8230.cc
  304feeda4411dd976033b709ad4dc9ed  libstdc++-v3/testsuite/20_util/allocator/89510.cc
! 3dfa4bfcfdfadebf8e902ee535a79064  libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
  efd50eb210f11e05083d51d5f197edce  libstdc++-v3/testsuite/20_util/allocator/allocate_at_least_neg.cc
  aee95679e97e16985af49532fadbba5c  libstdc++-v3/testsuite/20_util/allocator/lwg3190.cc
  af5ed7a07c56e8d2e5f768f47c861ba1  libstdc++-v3/testsuite/20_util/allocator/overaligned.cc
--- 148560,148566 ----
  ae49058091ac2f31814de6246e958d6a  libstdc++-v3/testsuite/20_util/allocator/64135.cc
  3d6fd2416cfe20b40727679190a1acd5  libstdc++-v3/testsuite/20_util/allocator/8230.cc
  304feeda4411dd976033b709ad4dc9ed  libstdc++-v3/testsuite/20_util/allocator/89510.cc
! c00426efc55c8078b60f6b9281f6fb69  libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
  efd50eb210f11e05083d51d5f197edce  libstdc++-v3/testsuite/20_util/allocator/allocate_at_least_neg.cc
  aee95679e97e16985af49532fadbba5c  libstdc++-v3/testsuite/20_util/allocator/lwg3190.cc
  af5ed7a07c56e8d2e5f768f47c861ba1  libstdc++-v3/testsuite/20_util/allocator/overaligned.cc
*************** b9820acb1e2d2f495bdf8c4808286a8d  libstd
*** 148526,148531 ****
--- 148693,148699 ----
  2b0c500eeaf17501147b2c23910ff146  libstdc++-v3/testsuite/20_util/bitset/cons/dr1325-1.cc
  9f4913ec42894fc417a56a67d3191d09  libstdc++-v3/testsuite/20_util/bitset/cons/dr1325-2.cc
  fc9736e59ce3aecb63a4d55da41ca8ab  libstdc++-v3/testsuite/20_util/bitset/cons/dr396.cc
+ 28085e09cf944c3dc2bedc55e64eb03c  libstdc++-v3/testsuite/20_util/bitset/cons/lwg4294.cc
  23558c3c7723e93f470cbb736e5d9af5  libstdc++-v3/testsuite/20_util/bitset/cons/string_view.cc
  7b64a4ce05ecd6b19e8079b0c59ca3d9  libstdc++-v3/testsuite/20_util/bitset/cons/string_view_wide.cc
  4739712fd7e238ea3f424a1b9a749ded  libstdc++-v3/testsuite/20_util/bitset/count/constexpr.cc
*************** e5721ee6e8ab192ecf69b9626112131f  libstd
*** 149655,149660 ****
--- 149823,149829 ----
  011867a03f274bbbef840ac5f0b94f96  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_fill_n/94017.cc
  280bf5f09f78c75aaab47a90dafd75aa  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_fill_n/dr1339.cc
  be99204a835ab9703e43f2fe95b06ed4  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_fill_n/sizes.cc
+ 5dba156b95e030006a637a6c85557dd0  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc
  6cf4cb93cbec42025a516fa8bc8fc11d  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/constexpr.cc
  eef20dbce7a3305c045aad2ee490c458  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/constrained.cc
  728ff6bdc4a20d86864e3a02404ab3f8  libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_value_construct/120397.cc
*************** a07619e43e955b741e18ada8dc1368f4  libstd
*** 150003,150017 ****
  58df4974054cfdb048d47953caf0b439  libstdc++-v3/testsuite/21_strings/basic_string/allocator/wchar_t/swap.cc
  835fb321fb414a531349e170e6ba9151  libstdc++-v3/testsuite/21_strings/basic_string/capacity/1.cc
  9613fe9aaee178a7254193e5c01deb98  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc
! 61b5d22c68d4931145498d2ccc110e47  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
  e50974ee2fad62b92508c9e786d602f9  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/2.cc
  e5836542231b7ec7b12a157aefb23656  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc
  92fd664564ddcbc3da3f7299d2f4b92f  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite_ext.cc
! b5159a07107f67bd9e31d22e34af5371  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc
  7ddc6c5a0f6e99704b218592bcf819ea  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc
! 46d2ae6d982f8f293d1348894f8b90b4  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
! f02bdb9761c46e917fafd770562c07c1  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc
! 4a50136ca15fea83d45bb885bb2159e0  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc
  137f7c6d797769f46d64da2125223e09  libstdc++-v3/testsuite/21_strings/basic_string/cons/113841.cc
  55dd03a6a0ceb0d6c93c83c1d6dbe04e  libstdc++-v3/testsuite/21_strings/basic_string/cons/char/1.cc
  122070b73ab61f4cd7f3bf7dca05ad4c  libstdc++-v3/testsuite/21_strings/basic_string/cons/char/103919.cc
--- 150172,150186 ----
  58df4974054cfdb048d47953caf0b439  libstdc++-v3/testsuite/21_strings/basic_string/allocator/wchar_t/swap.cc
  835fb321fb414a531349e170e6ba9151  libstdc++-v3/testsuite/21_strings/basic_string/capacity/1.cc
  9613fe9aaee178a7254193e5c01deb98  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/1.cc
! 0490c068d7ae91c2250bb083d96a9dbf  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
  e50974ee2fad62b92508c9e786d602f9  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/2.cc
  e5836542231b7ec7b12a157aefb23656  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc
  92fd664564ddcbc3da3f7299d2f4b92f  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite_ext.cc
! dde495e6c63e9c9b423dec5aa54b79d4  libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc
  7ddc6c5a0f6e99704b218592bcf819ea  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/1.cc
! 4111a8f4058ca250bcc8da2395f13713  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
! 62211e308f7f11c6083d056ae7dfebf6  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc
! 93055849b74fdabb1fb3153be7917211  libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc
  137f7c6d797769f46d64da2125223e09  libstdc++-v3/testsuite/21_strings/basic_string/cons/113841.cc
  55dd03a6a0ceb0d6c93c83c1d6dbe04e  libstdc++-v3/testsuite/21_strings/basic_string/cons/char/1.cc
  122070b73ab61f4cd7f3bf7dca05ad4c  libstdc++-v3/testsuite/21_strings/basic_string/cons/char/103919.cc
*************** aab23a059d97e93b80bf23883af2e3ad  libstd
*** 151161,151167 ****
  779dd84805e0fb5db0a5788b58041607  libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_cpp14.cc
  4aba86ec7c82d37280332a28a304eb5b  libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc
  c42d304c2e32a04cff6f581ba80eebb9  libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_size.cc
- 28085e09cf944c3dc2bedc55e64eb03c  libstdc++-v3/testsuite/23_containers/bitset/lwg4294.cc
  2f8e551de300bee33bdef57bbf631b4d  libstdc++-v3/testsuite/23_containers/default_template_value.cc
  ddf767067d4b89b063a9cdaf9a38233c  libstdc++-v3/testsuite/23_containers/deque/100516.cc
  456826cc41b2fc20b46ba9ce42b00641  libstdc++-v3/testsuite/23_containers/deque/14340.cc
--- 151330,151335 ----
*************** f0b8e57260744dc4dd54e9310150e92b  libstd
*** 151276,151282 ****
  f5b48dae8a0117e334adb810656e5c1e  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs.cc
  f18a580ead7e972f0c090a4027e9a983  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs_debug.cc
  ca98b78997105b8f93c1c653568b6095  libstdc++-v3/testsuite/23_containers/deque/version.cc
! b19cd21cd3ddf5fc9e40f72427b1c2bb  libstdc++-v3/testsuite/23_containers/flat_map/1.cc
  999168abb39b43b26234e06cd590acc2  libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
  086ebf6be41c0011120859c1081060d2  libstdc++-v3/testsuite/23_containers/flat_multiset/1.cc
  10bd36e295161b7839fff585fcf825af  libstdc++-v3/testsuite/23_containers/flat_set/1.cc
--- 151444,151450 ----
  f5b48dae8a0117e334adb810656e5c1e  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs.cc
  f18a580ead7e972f0c090a4027e9a983  libstdc++-v3/testsuite/23_containers/deque/types/pmr_typedefs_debug.cc
  ca98b78997105b8f93c1c653568b6095  libstdc++-v3/testsuite/23_containers/deque/version.cc
! e310ae393b8fe01de804bcfc323ce95f  libstdc++-v3/testsuite/23_containers/flat_map/1.cc
  999168abb39b43b26234e06cd590acc2  libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
  086ebf6be41c0011120859c1081060d2  libstdc++-v3/testsuite/23_containers/flat_multiset/1.cc
  10bd36e295161b7839fff585fcf825af  libstdc++-v3/testsuite/23_containers/flat_set/1.cc
*************** d403a77f650ef09907df123254dd36ab  libstd
*** 151423,151429 ****
  ba30ee3573256e9c79323edeab55f45e  libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem.cc
  30ab64df2eb33c78da29eab2cf8935d7  libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem_neg.cc
  bc234ad58ff4608f222dc9066aef5bcc  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/1.cc
! c586c68ebedcd0552b5c6cec393e6f11  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc
  38e5f39346a05e51ec2a0e4cdf2586e4  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/throws.cc
  c3a1a3526de292cb363617372f081457  libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc
  c87eb94f57dafc64e6cdeeab93e4ea86  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc
--- 151591,151597 ----
  ba30ee3573256e9c79323edeab55f45e  libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem.cc
  30ab64df2eb33c78da29eab2cf8935d7  libstdc++-v3/testsuite/23_containers/inplace_vector/access/elem_neg.cc
  bc234ad58ff4608f222dc9066aef5bcc  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/1.cc
! 51d721241c463de8068e928fa7fdecee  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc
  38e5f39346a05e51ec2a0e4cdf2586e4  libstdc++-v3/testsuite/23_containers/inplace_vector/cons/throws.cc
  c3a1a3526de292cb363617372f081457  libstdc++-v3/testsuite/23_containers/inplace_vector/copy.cc
  c87eb94f57dafc64e6cdeeab93e4ea86  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/assign1_neg.cc
*************** adf70c3108bb57e460f5e7f13e417f6c  libstd
*** 151456,151465 ****
  1188aa6c20f869b0ff8369439d7994fb  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/invalidation/try_push_back.cc
  597dca6295388c7b43dbf6bd1b92363a  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/invalidation/unchecked_emplace_back.cc
  60ff94b514351d8def7157b4923d9f10  libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc
! 551687653f879c8cc6f6102dd99358dd  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc
  5aec8512568ce2f7543d9c77e6605c2c  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/erase.cc
  32171ec785b1b967d1076d5da1536940  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/erase_neg.cc
! ed67e9da3d1e71d5fb2cffe267b85db0  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc
  3c4148c567e8b15b2726a4d6154ede27  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert.cc
  63a7d605a0bc39f3acfb0fa4bb289dda  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert_neg.cc
  1b7fbaff011dd632225a4efffa9cd1a1  libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc
--- 151624,151633 ----
  1188aa6c20f869b0ff8369439d7994fb  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/invalidation/try_push_back.cc
  597dca6295388c7b43dbf6bd1b92363a  libstdc++-v3/testsuite/23_containers/inplace_vector/debug/invalidation/unchecked_emplace_back.cc
  60ff94b514351d8def7157b4923d9f10  libstdc++-v3/testsuite/23_containers/inplace_vector/erasure.cc
! 4ebd6a238b279bb188514f414a83ab9a  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc
  5aec8512568ce2f7543d9c77e6605c2c  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/erase.cc
  32171ec785b1b967d1076d5da1536940  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/erase_neg.cc
! c0610d745a0d882d53a58958367972f1  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc
  3c4148c567e8b15b2726a4d6154ede27  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert.cc
  63a7d605a0bc39f3acfb0fa4bb289dda  libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/single_insert_neg.cc
  1b7fbaff011dd632225a4efffa9cd1a1  libstdc++-v3/testsuite/23_containers/inplace_vector/move.cc
*************** ab07a82ad1f2a1ee5e8b19e0b60f44ea  libstd
*** 151745,151755 ****
  17c0f6c2479b2697a0e1f1e5dbbeb6af  libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
  ea1a2f61fac46b6b55b9ff2c52289540  libstdc++-v3/testsuite/23_containers/mdspan/layouts/debug/out_of_bounds_neg.cc
  afe443cccc07fbd59aff2af0edd955ce  libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
! f100ecfcef3f79639fc5c07828bee8f2  libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
! 2226303150eee3ae46373765f6a6d08f  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc
  490297a4a90a084a51d7dfe6eb3a0f72  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded_neg.cc
! 3f96813b92ac712ab8210f7eb24e7158  libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc
! 13c4652458676185e5ef28eed77c0527  libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
  4b1a50b4d361b155b60027f1bdc566e7  libstdc++-v3/testsuite/23_containers/mdspan/out_of_bounds_neg.cc
  d0948adb8d08e1ed90f5223c0e45676b  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices.cc
  c27c291ecb32ad3eccc01987f563a8b4  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices_neg.cc
--- 151913,151923 ----
  17c0f6c2479b2697a0e1f1e5dbbeb6af  libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
  ea1a2f61fac46b6b55b9ff2c52289540  libstdc++-v3/testsuite/23_containers/mdspan/layouts/debug/out_of_bounds_neg.cc
  afe443cccc07fbd59aff2af0edd955ce  libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
! 09daa3c75fb04a81cfa9ee45e1e6c9f7  libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
! c70a46b7a870b0d7ac9e94fd9d9077b6  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc
  490297a4a90a084a51d7dfe6eb3a0f72  libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded_neg.cc
! 54d31e86115d0b93699f33eca2e16852  libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc
! 083b2e8397805cfb105e7a8f99e725ca  libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
  4b1a50b4d361b155b60027f1bdc566e7  libstdc++-v3/testsuite/23_containers/mdspan/out_of_bounds_neg.cc
  d0948adb8d08e1ed90f5223c0e45676b  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices.cc
  c27c291ecb32ad3eccc01987f563a8b4  libstdc++-v3/testsuite/23_containers/mdspan/submdspan/canonical_slices_neg.cc
*************** bb6d676e2b7cd25bd2d820fd6a27a246  libstd
*** 152696,152703 ****
  6dc52e78edff9742ea8231538e8f8d04  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/moveable2.cc
  7e2699ee0905372b6bdb3470e7ab7173  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/resize_size.cc
  da8af5653b15a6423e1b4fae4f80bfbd  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/strong_guarantee.cc
! 8c692f46d3cb588a2f0b0404da50556c  libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc
! 7fa635e13e3d124917075a0f9b0c406f  libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc
  3ca19c1b35d86b725fd5c1882dc24767  libstdc++-v3/testsuite/23_containers/vector/check_construct_destroy.cc
  ccb4168be50b6750ea807fd62fb4dbdd  libstdc++-v3/testsuite/23_containers/vector/cmp_c++20.cc
  f14aeb095fa1a8e199a59998e2ebbb92  libstdc++-v3/testsuite/23_containers/vector/cons/1.cc
--- 152864,152871 ----
  6dc52e78edff9742ea8231538e8f8d04  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/moveable2.cc
  7e2699ee0905372b6bdb3470e7ab7173  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/resize_size.cc
  da8af5653b15a6423e1b4fae4f80bfbd  libstdc++-v3/testsuite/23_containers/vector/capacity/resize/strong_guarantee.cc
! eefc3a7a38761b3d2788ed4158785c22  libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc
! af7153626d10247a52c3b198c1706169  libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc
  3ca19c1b35d86b725fd5c1882dc24767  libstdc++-v3/testsuite/23_containers/vector/check_construct_destroy.cc
  ccb4168be50b6750ea807fd62fb4dbdd  libstdc++-v3/testsuite/23_containers/vector/cmp_c++20.cc
  f14aeb095fa1a8e199a59998e2ebbb92  libstdc++-v3/testsuite/23_containers/vector/cons/1.cc
*************** a325122e6a6afa548900873f460f4121  libstd
*** 152793,152799 ****
  00bc8fb19959079360f78f326f302b5b  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/1.cc
  1940c1c87df1e1e57902888e2452fd20  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/92878_92947.cc
  45cc3b6af51fd9fdee706437b637be63  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/cxx17_return.cc
! d6fb60a2b30f7419f343777a17e9c352  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc
  ddae0b3c999c660db9512cf5dc099e6f  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/1.cc
  b467e9e98e76f06b2504910c34d3b00c  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/50529.cc
  be8d5addb7fb3b738c2f5569127d74ca  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc
--- 152961,152967 ----
  00bc8fb19959079360f78f326f302b5b  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/1.cc
  1940c1c87df1e1e57902888e2452fd20  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/92878_92947.cc
  45cc3b6af51fd9fdee706437b637be63  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/cxx17_return.cc
! 7c7c55c349eb2ff96708885fe730d001  libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc
  ddae0b3c999c660db9512cf5dc099e6f  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/1.cc
  b467e9e98e76f06b2504910c34d3b00c  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/50529.cc
  be8d5addb7fb3b738c2f5569127d74ca  libstdc++-v3/testsuite/23_containers/vector/modifiers/erase/54577.cc
*************** be8d5addb7fb3b738c2f5569127d74ca  libstd
*** 152804,152810 ****
  cb0b7921070e1b4abd7e04b68eccfe49  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/aliasing.cc
  8644f187a6704f67509958ffc731be05  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/const_iterator.cc
  d62da1f1e000cf57a3797b218a6faf6f  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc
! 1098a4a1b232c2c78ce28ea927ed19cb  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc
  8fb5c601f412e71f5977219b7d89f18d  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc
  6918a31bae7d38579496520f65562419  libstdc++-v3/testsuite/23_containers/vector/modifiers/moveable.cc
  8ed736847052dbdd8573c5f109871264  libstdc++-v3/testsuite/23_containers/vector/modifiers/moveable2.cc
--- 152972,152978 ----
  cb0b7921070e1b4abd7e04b68eccfe49  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/aliasing.cc
  8644f187a6704f67509958ffc731be05  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/const_iterator.cc
  d62da1f1e000cf57a3797b218a6faf6f  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc
! 67ef62bd451b5084210a72e9dc9e3a30  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc
  8fb5c601f412e71f5977219b7d89f18d  libstdc++-v3/testsuite/23_containers/vector/modifiers/insert_vs_emplace.cc
  6918a31bae7d38579496520f65562419  libstdc++-v3/testsuite/23_containers/vector/modifiers/moveable.cc
  8ed736847052dbdd8573c5f109871264  libstdc++-v3/testsuite/23_containers/vector/modifiers/moveable2.cc
*************** eaaf09138f9c89061c5cd2835ee22dd9  libstd
*** 153599,153605 ****
  4baa175d84575e9b8eb6c56ded27ea43  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/is_heap.cc
  3976ac394882d12b8b5646eefdd364ba  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/is_sorted.cc
  038c90cb46c6b428483cf2c2fbd9e9ff  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/lexicographical_compare.cc
! b37d9cc6348d80b3465b1577d74b6d7a  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc
  51fd3c4098c1861566cbf9b6c277b0ac  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/partial_sort.cc
  d5e4ba72f1a9b9d6478a6a92b71b518b  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/partial_sort_copy.cc
  ac8890df44a550f4ce2ae489e8713185  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/set_difference.cc
--- 153767,153773 ----
  4baa175d84575e9b8eb6c56ded27ea43  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/is_heap.cc
  3976ac394882d12b8b5646eefdd364ba  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/is_sorted.cc
  038c90cb46c6b428483cf2c2fbd9e9ff  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/lexicographical_compare.cc
! 80fd49c32fb41deda0115a76196d29ec  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc
  51fd3c4098c1861566cbf9b6c277b0ac  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/partial_sort.cc
  d5e4ba72f1a9b9d6478a6a92b71b518b  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/partial_sort_copy.cc
  ac8890df44a550f4ce2ae489e8713185  libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/set_difference.cc
*************** f8a3ece135ffb34c9bb3ed4881b65fb9  libstd
*** 154403,154409 ****
  a52596c2f4c5076c6574d0ddc1397033  libstdc++-v3/testsuite/26_numerics/valarray/noexcept_move_construct.cc
  4bbebed52a6ae9fc40eaf3b0b0281c34  libstdc++-v3/testsuite/26_numerics/valarray/operators.cc
  26f7156df4c3c246167419138ee3a831  libstdc++-v3/testsuite/26_numerics/valarray/range_access.cc
! d530db67147a690d5d38b7e4644c2189  libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc
  c8108dd3ed10641a6c1f6c44722f8109  libstdc++-v3/testsuite/26_numerics/valarray/requirements/explicit_instantiation.cc
  e3f9b4adcdc87e58f6c367d48ecdcb93  libstdc++-v3/testsuite/26_numerics/valarray/requirements/typedefs.cc
  3953b777693e352f27d1c03cbd2f6e26  libstdc++-v3/testsuite/26_numerics/valarray/subset_assignment.cc
--- 154571,154577 ----
  a52596c2f4c5076c6574d0ddc1397033  libstdc++-v3/testsuite/26_numerics/valarray/noexcept_move_construct.cc
  4bbebed52a6ae9fc40eaf3b0b0281c34  libstdc++-v3/testsuite/26_numerics/valarray/operators.cc
  26f7156df4c3c246167419138ee3a831  libstdc++-v3/testsuite/26_numerics/valarray/range_access.cc
! c68b9dcccd1e3ba0008c0e69f5ecb300  libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc
  c8108dd3ed10641a6c1f6c44722f8109  libstdc++-v3/testsuite/26_numerics/valarray/requirements/explicit_instantiation.cc
  e3f9b4adcdc87e58f6c367d48ecdcb93  libstdc++-v3/testsuite/26_numerics/valarray/requirements/typedefs.cc
  3953b777693e352f27d1c03cbd2f6e26  libstdc++-v3/testsuite/26_numerics/valarray/subset_assignment.cc
*************** de5a5e022da3a4c2ae1ea6e048a7e6f4  libstd
*** 155869,155879 ****
  5df3828564e4fcf271b2e2fe95522c1a  libstdc++-v3/testsuite/29_atomics/headers/atomic/functions_std_c++0x.cc
  fa6faa9b9a68e22b822390b629091efd  libstdc++-v3/testsuite/29_atomics/headers/atomic/macros.cc
  75be78195d58beee455dae2731b56a52  libstdc++-v3/testsuite/29_atomics/headers/atomic/std_c++0x_neg.cc
! 0b0dbfb7dcffdb0f368cd4a2252a23b8  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
! 82f9f33f5c493108ba6d098a5be251e3  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc
! ef44538cef82c833a5b07867b9a57cf8  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20.cc
! 837af74a24dbfb72f301bf58f3ca83a7  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc
! 62e01d6e62aac68c5cb5e28d5f47afa2  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a.cc
  80495a66dfe62bdd7951e4876d6adfe1  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a_neg.cc
  a1f6f6e1e31959c1455d2b3f17e75885  libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/115807.cc
  a99cb8b3fa386993e78051b226f5f4eb  libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
--- 156037,156044 ----
  5df3828564e4fcf271b2e2fe95522c1a  libstdc++-v3/testsuite/29_atomics/headers/atomic/functions_std_c++0x.cc
  fa6faa9b9a68e22b822390b629091efd  libstdc++-v3/testsuite/29_atomics/headers/atomic/macros.cc
  75be78195d58beee455dae2731b56a52  libstdc++-v3/testsuite/29_atomics/headers/atomic/std_c++0x_neg.cc
! af2a8e3ab4569190270413230c0a945f  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
! 248b5df56169f6a56a3d130cf1516f6e  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc
  80495a66dfe62bdd7951e4876d6adfe1  libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a_neg.cc
  a1f6f6e1e31959c1455d2b3f17e75885  libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/115807.cc
  a99cb8b3fa386993e78051b226f5f4eb  libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
*************** c7c73b9ca28a7b95541a86cc195b7593  libstd
*** 156028,156034 ****
  3b37c5c35f6149d4f5476f117a53a2f3  libstdc++-v3/testsuite/30_threads/packaged_task/members/swap.cc
  298e8f8f222adbc2f05c01d7e8f3f097  libstdc++-v3/testsuite/30_threads/packaged_task/members/valid.cc
  1ad9888a8ad14e70e362043831d1d836  libstdc++-v3/testsuite/30_threads/packaged_task/requirements/explicit_instantiation.cc
! c632241f7e063a6f3b82b6e33a548945  libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
  620578f2ab3490958a46ebec23ed2df6  libstdc++-v3/testsuite/30_threads/promise/60966.cc
  9ff23d845b809b76435d54e80c773434  libstdc++-v3/testsuite/30_threads/promise/69106.cc
  0cddcfa708e31cf75f3a302e5d567ede  libstdc++-v3/testsuite/30_threads/promise/cons/1.cc
--- 156193,156199 ----
  3b37c5c35f6149d4f5476f117a53a2f3  libstdc++-v3/testsuite/30_threads/packaged_task/members/swap.cc
  298e8f8f222adbc2f05c01d7e8f3f097  libstdc++-v3/testsuite/30_threads/packaged_task/members/valid.cc
  1ad9888a8ad14e70e362043831d1d836  libstdc++-v3/testsuite/30_threads/packaged_task/requirements/explicit_instantiation.cc
! 923fe2ffd277530a87b150421fd4b003  libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
  620578f2ab3490958a46ebec23ed2df6  libstdc++-v3/testsuite/30_threads/promise/60966.cc
  9ff23d845b809b76435d54e80c773434  libstdc++-v3/testsuite/30_threads/promise/69106.cc
  0cddcfa708e31cf75f3a302e5d567ede  libstdc++-v3/testsuite/30_threads/promise/cons/1.cc
*************** bd6ab4732bfd0bef570ada81baa85d67  libstd
*** 156052,156058 ****
  420c0b5a2e02293b95c6428669bf04a6  libstdc++-v3/testsuite/30_threads/promise/members/swap.cc
  0ca82e7fd95e01dc210682737d8eff64  libstdc++-v3/testsuite/30_threads/promise/requirements/explicit_instantiation.cc
  a2d7051bd9557f0f2fd1cf2489d82314  libstdc++-v3/testsuite/30_threads/promise/requirements/lwg3466.cc
! b1baa8e43ab2922d6d6828e482d86313  libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc
  700e420f652d538caec8e705f810e04c  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/1.cc
  f3d45f0f418c2e8f1055daa5e89a36d6  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/assign_neg.cc
  e500a2962c689996445c5f667bf68de6  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/copy_neg.cc
--- 156217,156223 ----
  420c0b5a2e02293b95c6428669bf04a6  libstdc++-v3/testsuite/30_threads/promise/members/swap.cc
  0ca82e7fd95e01dc210682737d8eff64  libstdc++-v3/testsuite/30_threads/promise/requirements/explicit_instantiation.cc
  a2d7051bd9557f0f2fd1cf2489d82314  libstdc++-v3/testsuite/30_threads/promise/requirements/lwg3466.cc
! 985f63eae2e6927e4f3b73f3b48f3845  libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc
  700e420f652d538caec8e705f810e04c  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/1.cc
  f3d45f0f418c2e8f1055daa5e89a36d6  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/assign_neg.cc
  e500a2962c689996445c5f667bf68de6  libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/copy_neg.cc
*************** b85c5d11ff66a953580622b0e392f6ac  libstd
*** 157616,157622 ****
  5fcfa7f88da5f502513a40bf690508a6  libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc
  fef674ee1549f36062a5c182c11e0ae1  libstdc++-v3/testsuite/std/ranges/iota/iterator.cc
  30a217f3288580f6c12c477540fff36d  libstdc++-v3/testsuite/std/ranges/iota/lwg3292_neg.cc
! 0cf5cf337ec774cc41330bb75bcf41db  libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc
  5489aac8301f963534dcc43e4f8fc80f  libstdc++-v3/testsuite/std/ranges/iota/size.cc
  b286db728ea3757103c0fe0aca5b1f52  libstdc++-v3/testsuite/std/ranges/istream_view.cc
  a80c0109913fe1cac9adba1df2c554fb  libstdc++-v3/testsuite/std/ranges/p2259.cc
--- 157781,157787 ----
  5fcfa7f88da5f502513a40bf690508a6  libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc
  fef674ee1549f36062a5c182c11e0ae1  libstdc++-v3/testsuite/std/ranges/iota/iterator.cc
  30a217f3288580f6c12c477540fff36d  libstdc++-v3/testsuite/std/ranges/iota/lwg3292_neg.cc
! 8fb28b88fe75f64cc7d616d9be1750ba  libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc
  5489aac8301f963534dcc43e4f8fc80f  libstdc++-v3/testsuite/std/ranges/iota/size.cc
  b286db728ea3757103c0fe0aca5b1f52  libstdc++-v3/testsuite/std/ranges/istream_view.cc
  a80c0109913fe1cac9adba1df2c554fb  libstdc++-v3/testsuite/std/ranges/p2259.cc
*************** dd57c14e38e93b2a78361d6e4c7350b1  libstd
*** 157726,157731 ****
--- 157891,157897 ----
  075601020e49a49a2f5131b011ff3b25  libstdc++-v3/testsuite/std/time/month_weekday_last/io.cc
  60231b6bb71cc9175500ebf6d9f92ceb  libstdc++-v3/testsuite/std/time/parse/114240.cc
  a0be85b8053be995a48a4cfec6a5b675  libstdc++-v3/testsuite/std/time/parse/114279.cc
+ 4547b0badce5668333f08490264f6870  libstdc++-v3/testsuite/std/time/parse/125369.cc
  5762399d57d6d0d2d2d8cd51ff3f423d  libstdc++-v3/testsuite/std/time/parse/parse.cc
  f16dd4eb7915f1558b6ae75425ab2987  libstdc++-v3/testsuite/std/time/syn_c++20.cc
  942f5bb5a199e3f7b0821958da8b265a  libstdc++-v3/testsuite/std/time/time_zone/116110.cc
*************** d46265f9ed949404e1c5119354b95ac4  libstd
*** 158474,158480 ****
  54f2a8dfb9fbcdb569726ffbe6370f23  libstdc++-v3/testsuite/util/testsuite_abi.h
  db5d5717075b7e1c4eb267257b1ee418  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  aac284c59df58716bba32e67d322c2a8  libstdc++-v3/testsuite/util/testsuite_allocator.cc
! 73d6b9561a6ee5627267f6f043902f4c  libstdc++-v3/testsuite/util/testsuite_allocator.h
  b249d2a4baf04ea5ab1e5432b395b85f  libstdc++-v3/testsuite/util/testsuite_api.h
  ac38738c6b7dd4541f086659557cfcc8  libstdc++-v3/testsuite/util/testsuite_character.cc
  9cbcfd8517660335b43ca0586ca3b309  libstdc++-v3/testsuite/util/testsuite_character.h
--- 158640,158646 ----
  54f2a8dfb9fbcdb569726ffbe6370f23  libstdc++-v3/testsuite/util/testsuite_abi.h
  db5d5717075b7e1c4eb267257b1ee418  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  aac284c59df58716bba32e67d322c2a8  libstdc++-v3/testsuite/util/testsuite_allocator.cc
! 02981415ca52138ed575018759411526  libstdc++-v3/testsuite/util/testsuite_allocator.h
  b249d2a4baf04ea5ab1e5432b395b85f  libstdc++-v3/testsuite/util/testsuite_api.h
  ac38738c6b7dd4541f086659557cfcc8  libstdc++-v3/testsuite/util/testsuite_character.cc
  9cbcfd8517660335b43ca0586ca3b309  libstdc++-v3/testsuite/util/testsuite_character.h
*************** d0e4c75a4430f932eef2e477748b50af  libstd
*** 158485,158491 ****
  68f190d026ec8d9681c1ce7518e6a58e  libstdc++-v3/testsuite/util/testsuite_counter_type.h
  842c7fdf6ded6fed0d44ed60cb219589  libstdc++-v3/testsuite/util/testsuite_error.h
  e0f7d13a790b40f07a58ba70a8d2e554  libstdc++-v3/testsuite/util/testsuite_fs.h
! 660cb38de43fa8bdd1adaeeb9136a5fb  libstdc++-v3/testsuite/util/testsuite_greedy_ops.h
  a61da9cbd87ad94712cf12bae7e1c98f  libstdc++-v3/testsuite/util/testsuite_hooks.cc
  37dbdb4efaa4756802e9d59a40b5f911  libstdc++-v3/testsuite/util/testsuite_hooks.h
  e63fd0c6465f79a8ba5e9ca578ce9b07  libstdc++-v3/testsuite/util/testsuite_io.h
--- 158651,158657 ----
  68f190d026ec8d9681c1ce7518e6a58e  libstdc++-v3/testsuite/util/testsuite_counter_type.h
  842c7fdf6ded6fed0d44ed60cb219589  libstdc++-v3/testsuite/util/testsuite_error.h
  e0f7d13a790b40f07a58ba70a8d2e554  libstdc++-v3/testsuite/util/testsuite_fs.h
! dd88c1603de1bfe3c556df86650af13a  libstdc++-v3/testsuite/util/testsuite_greedy_ops.h
  a61da9cbd87ad94712cf12bae7e1c98f  libstdc++-v3/testsuite/util/testsuite_hooks.cc
  37dbdb4efaa4756802e9d59a40b5f911  libstdc++-v3/testsuite/util/testsuite_hooks.h
  e63fd0c6465f79a8ba5e9ca578ce9b07  libstdc++-v3/testsuite/util/testsuite_io.h
diff -Nrcpad gcc-17-20260517/gcc/ChangeLog gcc-17-20260524/gcc/ChangeLog
*** gcc-17-20260517/gcc/ChangeLog	Sun May 17 22:32:04 2026
--- gcc-17-20260524/gcc/ChangeLog	Sun May 24 22:32:04 2026
***************
*** 1,3 ****
--- 1,784 ----
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (fold_overflow_warning): Removed.
+ 	(pointer_may_wrap_p): Removed.
+ 	(fold_comparison): Removed fold_overflow_warning and
+ 	pointer_may_wrap_up calls.
+ 	(fold_binary_loc): Likewise.
+ 	* fold-const.h (fold_overflow_warning): Removed.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (fold_binary_loc): Likewise.
+ 	(tree_expr_nonnegative_warnv_p): Renamed to
+ 	tree_expr_nonnegative_p. Argument strict_overflow_p removed.
+ 	(tree_expr_nonnegative_p): Removed.
+ 	(RECURSE): Removed strict_overflow_p argument.
+ 	(tree_unary_nonnegative_p): Local strict_overflow_p variable
+ 	added to support the RECURSE() macro was removed.
+ 	(tree_binary_nonnegative_p): Likewise.
+ 	(tree_single_nonnegative_p): Likewise.
+ 	(tree_call_nonnegative_p): Likewise.
+ 	(tree_invalid_nonnegative_p): Likewise.
+ 	(tree_binary_nonzero_p): Removed sub_strict_overflow_p variable
+ 	from tree_expr_nonnegative_p call.
+ 	* fold-const.h (tree_expr_nonnegative_p): Removed.
+ 	(tree_expr_nonnegative_warnv_p): Renamed to
+ 	tree_expr_nonnegative_p, removed strict_overflow_p argument.
+ 	* tree-ssa-loop-manip.cc (create_iv): Removed ovf variable from
+ 	tree_expr_nonnegative_p call.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_call_nonnegative_warnv_p): Renamed to
+ 	tree_call_nonnegative_warnv_p.
+ 	(tree_call_nonnegative_p): Removed strict_overflow_p flag.
+ 	(tree_invalid_nonnegative_warnv_p): Renamed to
+ 	tree_invalid_nonnegative_p.
+ 	(tree_invalid_nonnegative_p): Removed strict_overflow_p flag.
+ 	(tree_expr_nonnegative_warnv_p): Added ATTRIBUTE_UNUSED tag in
+ 	the now unused strict_overflow_p argument. Removed
+ 	strict_overflow_p call from tree_invalid_nonnegative_p.
+ 	* fold-const.h (tree_call_nonnegative_warnv_p): Renamed to
+ 	tree_call_nonnegative_p.
+ 	(tree_call_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-fold.cc (gimple_call_nonnegative_warnv_p): Renamed to
+ 	gimple_call_nonnegative_p.
+ 	(gimple_call_nonnegative_p): Removed strict_overflow_p flag.
+ 	(gimple_stmt_nonnegative_warnv_p): Renamed to
+ 	gimple_stmt_nonnegative_p.
+ 	(gimple_stmt_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-fold.h (gimple_stmt_nonnegative_warnv_p): Renamed to
+ 	gimple_stmt_nonnegative_p.
+ 	(gimple_stmt_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-range-fold.cc (fold_using_range::fold_stmt): Removed
+ 	strict_overflow_p flag from gimple_stmt_nonnegative_p.
+ 	(fold_using_range::range_of_call): Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_single_nonnegative_warnv_p): Renamed to
+ 	tree_single_nonnegative_p.
+ 	(tree_single_nonnegative_p): Removed strict_overflow_p flag.
+ 	(tree_expr_nonnegative_warnv_p): Removed strict_overflow_p flag
+ 	from tree_single_nonnegative_p call.
+ 	* fold-const.h (tree_single_nonnegative_warnv_p): Renamed to
+ 	tree_single_nonnegative_p.
+ 	(tree_single_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-fold.cc (gimple_assign_nonnegative_warnv_p): Renamed to
+ 	gimple_assign_nonnegative_p.
+ 	(gimple_assign_nonnegative_p): Removed strict_overflow_p flag.
+ 	(gimple_phi_nonnegative_warnv_p): Renamed to
+ 	gimple_phi_nonnegative_p.
+ 	(gimple_phi_nonnegative_p): Removed strict_overflow_p flag.
+ 	(gimple_stmt_nonnegative_warnv_p): Removed strict_overflow_p
+ 	flag from gimple_phi_nonnegative_p and gimple_assign_nonnegative_p
+ 	calls.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_unary_nonnegative_warnv_p): Renamed to
+ 	tree_unary_nonnegative_p.
+ 	(tree_unary_nonnegative_p): Removed strict_overflow_p flag.
+ 	(tree_expr_nonnegative_warnv_p): Removed strict_overflow_flag
+ 	from tree_unary_nonnegative_p calls.
+ 	* fold-const.h (tree_unary_nonnegative_warnv_p): Renamed to
+ 	tree_unary_nonnegative_p.
+ 	(tree_unary_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-fold.cc (gimple_assign_nonnegative_warnv_p): Removed
+ 	strict_overflow_flag from tree_unary_nonnegative_p calls.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_binary_nonnegative_warnv_p): Renamed to
+ 	tree_binary_nonnegative_p.
+ 	(tree_binary_nonnegative_p): Removed strict_overflow_p flag. Add
+ 	a local variable with the same name for RECURSE() that we'll
+ 	remove later.
+ 	(tree_expr_nonnegative_warnv_p): Removed strict_overflow_p flag
+ 	from tree_binary_nonnegative_p call.
+ 	* fold-const.h (tree_binary_nonnegative_warnv_p): Renamed to
+ 	tree_binary_nonnegative_p.
+ 	(tree_binary_nonnegative_p): Removed strict_overflow_p flag.
+ 	* gimple-fold.cc (gimple_assign_nonnegative_warnv_p): Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (maybe_canonicalize_comparison_1): Removed
+ 	strict_overflow_p flag.
+ 	(maybe_canonicalize_comparison): Removed strict_overflow_p
+ 	flag and all fold_overflow_warning calls.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_expr_nonzero_warnv_p): Renamed to
+ 	tree_expr_nonzero_p and removed the strict_overflow_p flag.
+ 	(tree_expr_nonzero_p): Removed it since it's now redundant with
+ 	tree_expr_nonzero_warnv_p.
+ 	(tree_unary_nonzero_p): Removed the local sub_strict_overflow_p
+ 	flag from the tree_expr_nonzero_p call.
+ 	(tree_binary_nonzero_p): Likewise.
+ 	(tree_single_nonzero_p): Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_expr_nonzero_warnv_p): Removed
+ 	strict_overflow_p flag.
+ 	(tree_single_nonzero_warnv_p): Renamed to tree_single_nonzero_p.
+ 	(tree_single_nonzero_p): Removed strict_overflow_p flag.
+ 	* fold-const.h (tree_single_nonzero_warnv_p): Renamed to
+ 	tree_single_nonzero_p.
+ 	(tree_single_nonzero_p): Removed strict_overflow_p flag.
+ 	* gimple-range-fold.cc (fold_using_range::range_of_address):
+ 	Removed strict_overflow_p flag.
+ 	(range_from_readonly_load): Likewise.
+ 	* ipa-prop.cc (ipa_compute_jump_functions_for_edge): Likewise.
+ 	* tree-ssa-phiopt.cc (absorbing_element_p): Likewise.
+ 	* value-query.cc (range_query::get_tree_range): Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (tree_expr_nonzero_warnv_p): Removed
+ 	strict_overflow_p flag from tree_binary_nonzero_p call.
+ 	(tree_binary_nonzero_warnv_p): Renamed to tree_binary_nonzero_p.
+ 	(tree_binary_nonzero_p): Removed strict_overflow_p flag.
+ 	* fold-const.h (tree_binary_nonzero_warnv_p): Renamed to
+ 	tree_binary_nonzero_p.
+ 	(tree_binary_nonzero_p): Removed strict_overflow_p flag.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (mask_with_tz): Changed comment that describes
+ 	tree_expr_nonzero_warnv_p warn on overflow behavior.
+ 	(tree_expr_nonzero_warnv_p): Removed strict_overflow_p flag.
+ 	(tree_unary_nonzero_warnv_p): Renamed to tree_unary_nonzero_p.
+ 	(tree_unary_nonzero_p): Removed strict_overflow_p flag.
+ 	* fold-const.h (tree_unary_nonzero_warnv_p): Renamed to
+ 	tree_unary_nonzero_p.
+ 	(tree_unary_nonzero_p): Removed strict_overflow_p flag.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (extract_muldiv): Removed strict_overflow_p
+ 	references, including temporary variables and comments.
+ 	(extract_muldiv_1): Likewise.
+ 	(fold_binary_loc): Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* fold-const.cc (make_range_step): Likewise.
+ 	(make_range): Likewise.
+ 	(fold_range_test): Likewise.
+ 	* fold-const.h (make_range): Likewise.
+ 	(make_range_step): Likewise.
+ 	* tree-ssa-reassoc.cc (init_range_entry): Likewise.
+ 
+ 2026-05-23  Philipp Tomsich  <philipp.tomsich@vrull.eu>
+ 
+ 	* config/riscv/bitmanip.md (slli_slli_uw): New pattern.
+ 	(plus+and+ashift splitter): Turn into define_insn_and_split.
+ 	(riscv_slli_uw): Renamed from *slliuw.
+ 
+ 2026-05-23  Dimitar Dimitrov  <dimitar@dinux.eu>
+ 
+ 	* config/pru/constraints.md (MULDST_REGS): Remove constraint.
+ 	(MULSRC0_REGS): Ditto.
+ 	(MULSRC1_REGS): Ditto.
+ 	* config/pru/predicates.md (pru_muldst_operand): Compare
+ 	register number directly.
+ 	(pru_mulsrc0_operand): Ditto.
+ 	(pru_mulsrc1_operand): Ditto.
+ 	* config/pru/pru.h (enum reg_class): Remove single-reg classes.
+ 	(REG_CLASS_NAMES): Ditto.
+ 	(REGNO_REG_CLASS): Ditto.
+ 	* config/pru/pru.md (mulsi3): Switch to hard register constraints.
+ 	(umulsidi3): Ditto.
+ 
+ 2026-05-23  Dimitar Dimitrov  <dimitar@dinux.eu>
+ 
+ 	* config/pru/constraints.md: Prevent allocating r27 as
+ 	SImode destination for mulsi3 pattern.
+ 	* config/pru/pru.h (enum reg_class): Expand MULDST_REGS
+ 	to allow fitting DImode.
+ 	* config/pru/pru.md (umulsidi3): New pattern.
+ 	(muldi3): Ditto.
+ 
+ 2026-05-22  Disservin  <disservin.social@gmail.com>
+ 
+ 	PR target/50481
+ 	* config/aarch64/aarch64.md (bitreverse<mode>2, bitreverseqi2,
+ 	bitreversehi2): New expanders.
+ 	* config/aarch64/aarch64-simd.md (bitreverse<mode>2): New expander.
+ 
+ 2026-05-22  Wang Yaduo  <wangyaduo@linux.alibaba.com>
+ 
+ 	* config/riscv/riscv-protos.h (common_vector_cost): Add
+ 	reduc_i8_cost through reduc_f64_cost and
+ 	reduc_f{16,32,64}_ordered_cost.
+ 	* config/riscv/riscv.cc: Set costs in rvv_vls_vector_cost and
+ 	rvv_vla_vector_cost.
+ 	* config/riscv/riscv-vector-costs.cc (is_reduction): New helper.
+ 	(get_reduction_cost): New helper.
+ 	(costs::adjust_stmt_cost): Use them for vec_to_scalar kind.
+ 
+ 2026-05-22  Richard Sandiford  <rdsandiford@googlemail.com>
+ 
+ 	PR rtl-optimization/125375
+ 	* cfgrtl.cc (flow_active_insn_p): Return true for clobbers.
+ 
+ 2026-05-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/125399
+ 	* match.pd (BITREVERSE): Add BUILT_IN_BITREVERSE8.
+ 
+ 2026-05-22  Steve Markgraf  <steve@steve-m.de>
+ 
+ 	* config/rs6000/rs6000.h (TARGET_NO_LWSYNC): Add PROCESSOR_MPCCORE.
+ 
+ 2026-05-22  Avinal Kumar  <avinal.xlvii@gmail.com>
+ 
+ 	PR tree-optimization/125050
+ 	* match.pd: (X != C1 ? -X : C2): Handle C1 being INT_MIN
+ 	by emitting (signed)(-(unsigned)X) instead of bailing out.
+ 
+ 2026-05-21  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* avoid-store-forwarding.cc
+ 	(store_forwarding_analyzer::avoid_store_forwarding): Replace
+ 	return with flush-and-continue for complex memory operations.
+ 
+ 2026-05-21  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* avoid-store-forwarding.cc: Include regs.h.
+ 	(record_hard_reg_clobbers): New callback.
+ 	(store_forwarding_analyzer::m_bb_live_after): New cache.
+ 	(store_forwarding_analyzer::compute_bb_live_after): New helper.
+ 	(store_forwarding_analyzer::process_store_forwarding): Add
+ 	liveness check for hard registers clobbered by bit-insert
+ 	sequences, using the cached per-BB live-out information, and
+ 	evict the load_insn entry from the cache before delete_insn
+ 	in the load-elim path.
+ 	(store_forwarding_analyzer::avoid_store_forwarding): Clear the
+ 	per-BB liveness cache on entry.
+ 
+ 2026-05-21  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* avoid-store-forwarding.cc
+ 	(store_forwarding_analyzer::avoid_store_forwarding): Remove
+ 	store_exprs_del vector and all associated tracking.  Remove the
+ 	same_range_as_removed check from the forwarding loop.  Update
+ 	block comment.
+ 
+ 2026-05-21  Gerald Pfeifer  <gerald@pfeifer.com>
+ 
+ 	* doc/install.texi (Prerequisites): The C++ front end also does
+ 	not use extensions.
+ 
+ 2026-05-21  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123791
+ 	* config/aarch64/aarch64.cc (aarch64_cannot_force_const_mem): Remove
+ 	forcing symbol references to const mem.
+ 	(aarch64_can_use_per_function_literal_pools_p): Return false for
+ 	large model.
+ 	(aarch64_use_blocks_for_constant_p): Update comment.
+ 	(initialize_aarch64_code_model): Allow PIC/PIE.
+ 	(aarch64_classify_symbol): Use SYMBOL_SMALL_ABSOLUTE for constant
+ 	references and SYMBOL_SMALL_GOT_4G for writeable data.
+ 
+ 2026-05-21  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/125320
+ 	* config/riscv/riscv.md (stack_protect_test_<mode>): Call
+ 	riscv_output_move() instead of hard coding <load>.
+ 	(stack_protect_set_<mode>): Call riscv_output_move() instead of
+ 	hard coding <load> and <store>.
+ 
+ 2026-05-21  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* ipa-cp.cc (get_max_overall_size): Remove parameter CUR_SWEEP and
+ 	its use.
+ 	(decide_about_value): Adjust the call to get_max_overall_size.
+ 	(decide_whether_version_node): Likewise.
+ 	* params.opt (param_ipa_cp_eval_threshold): Initialize to 1100.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/riscv.opt.urls: Regenerate.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* common/config/riscv/riscv-common.cc (riscv_handle_option):
+ 	Handle Zilsd alignment options and clear the Zilsd-specific
+ 	explicit marker for -mstrict-align.
+ 	* config/riscv/riscv-opts.h (riscv_zilsd_align_type): New enum.
+ 	* config/riscv/riscv-protos.h
+ 	(riscv_expand_zilsd_misaligned_move): Declare as void.
+ 	(riscv_zilsd_valid_mem_p): Declare.
+ 	* config/riscv/riscv.cc (riscv_zilsd_required_align): New
+ 	functions.
+ 	(riscv_zilsd_valid_mem_p): New function.
+ 	(riscv_rtx_costs): Honor Zilsd alignment policy.
+ 	(riscv_split_64bit_move_p): Split invalid Zilsd GPR accesses.
+ 	(riscv_expand_zilsd_misaligned_move): New function.
+ 	(riscv_can_inline_p): Check effective Zilsd alignment policy.
+ 	(riscv_override_options_internal): Reject explicit Zilsd
+ 	alignment options for RV64.
+ 	* config/riscv/riscv.md (movmisaligndi): New expander.
+ 	(movmisaligndf): New expander.
+ 	* config/riscv/riscv.opt: Add -mzilsd-word-align and
+ 	-mzilsd-strict-align.
+ 	* config/riscv/riscv.opt.urls: Regenerate.
+ 	* doc/invoke.texi: Document the new options.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/andes_vector.h: Define intrinsic detection macros.
+ 	* config/riscv/riscv_bitmanip.h: Likewise.
+ 	* config/riscv/riscv_crypto.h: Likewise.
+ 	* config/riscv/riscv_vector.h: Likewise.
+ 	* config/riscv/sifive_vector.h: Likewise.
+ 	* doc/extend.texi: Document RISC-V intrinsic detection macros.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* common/config/riscv/riscv-ext-bitmask.def: Add zicfiss.
+ 	* config/riscv/riscv-ext.def: Add C API bit position for
+ 	zicfiss.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* common/config/riscv/riscv-ext-bitmask.def: Add supm,
+ 	zicntr, zihpm, zfbfmin, zvfbfmin, zvfbfwma, zicbom,
+ 	zaamo, zalrsc, zabha, zalasr, zicbop, and zicfilp.
+ 	* config/riscv/riscv-ext.def: Add C API bit positions for
+ 	supm, zicntr, zihpm, zfbfmin, zvfbfmin, zvfbfwma,
+ 	zicbom, zaamo, zalrsc, zabha, zalasr, zicbop, and
+ 	zicfilp.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* common/config/riscv/riscv-ext-bitmask.def: Add b, e, h,
+ 	zilsd, zclsd, zcmp, zifencei, and zmmul.
+ 
+ 2026-05-21  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/121343
+ 	* config/avr/avr.md (ctz_ffs, cxz_ffs): New code iterators.
+ 	(clzhi2, ctzhi2, ffshi2, clzsi2, ctzsi2, ffssi2, bswapsi2): New
+ 	insn-and-split's from former expanders.
+ 
+ 2026-05-21  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/50481
+ 	* config/loongarch/loongarch.md (@rbit<GPR:mode>2): Rename to
+ 	...
+ 	(@bitreverse<mode>2): ... this.
+ 	(rbithi2): Rename to ...
+ 	(bitreversehi2): ... this.
+ 	(rbitqi2): Rename to ...
+ 	(bitreverseqi2): ... this.
+ 	(rbitsi_extended): Rename to ...
+ 	(bitreversesi2_extended): ... this.
+ 
+ 2026-05-20  Shivam Gupta  <shivam98.tkg@gmail.com>
+ 
+ 	PR tree-optimization/112533
+ 	* match.pd: Add integral narrowing eq/ne to XOR-against-zero
+ 	rule for (T)(x) == (T)(y) where precision(T) < precision(x).
+ 
+ 2026-05-20  Richard Sandiford  <rdsandiford@googlemail.com>
+ 
+ 	* cselib.h (references_value_p): Remove only_useless parameter.
+ 	* cselib.cc (references_value_p): Likewise.  Use rtx iterators.
+ 	(invariant_or_equiv_p): Update accordingly.
+ 	* postreload.cc (reload_cse_simplify_set): Likewise.
+ 	* var-tracking.cc (reverse_op): Likewise.
+ 
+ 2026-05-20  Richard Sandiford  <rdsandiford@googlemail.com>
+ 
+ 	* cselib.h (cselib_val::HASH_MASK): New static constant.
+ 	(cselib_val::hash): Turn into a 30-bit bitfield.
+ 	(cselib_val::in_preserved_table_p): New bitfield.
+ 	(cselib_val::all_locs_preserved_p): Likewise.
+ 	* cselib.cc: Include rtl-iter.h.
+ 	(cselib_preserved_prune_list): New variable.
+ 	(cselib_clear_all_locs_preserved): New function.
+ 	(new_elt_loc_list): Call it when modifying a value's location list.
+ 	(preserve_constants_and_equivs): Set in_preserved_table_p when
+ 	moving a value to the preserved hash table.  Also push such values
+ 	onto cselib_preserved_prune_list.
+ 	(cselib_find_slot): Mask out the upper 2 bits of the hash.
+ 	(discard_useless_locs): New overload, split out from original
+ 	hash table traverse callback.  Use an inline rtl iteration
+ 	instead of calling references_value_p.  Record whether the
+ 	retained location only reference preserved value.
+ 	(remove_useless_values): Iterate over cselib_preserved_prune_list
+ 	instead of the hash table itself.  Remove a value from the list
+ 	if all remaining locations only reference preserved value.
+ 	(new_cselib_val): Initialize the new bitfields.
+ 	(cselib_finish): Free cselib_preserved_prune_list.
+ 
+ 2026-05-20  Richard Sandiford  <rdsandiford@googlemail.com>
+ 
+ 	* cselib.cc (new_elt_loc_list): Cache CSELIB_VAL_PTR.
+ 
+ 2026-05-20  Nathan Sidwell  <nathan@acm.org>
+ 
+ 	* config/riscv/riscv-builtins.cc (enum riscv_builtin_type): Delete.
+ 	(struct riscv_builtin_description): Replace builtin_type by bool.
+ 	Reorder fields for better packing.
+ 	(RISCV_BUILTIN_NO_PREFIX): Remove BUILTIN_TYPE arg.
+ 	(RISCV_BUILTIN): Likewise, call RISCV_BUILTIN_NO_PREFIX.
+ 	(DIRECT_BUILTIN): Adjust RISCV_BUILTIN invocation.
+ 	(DIRECT_NO_TARGET_BUILTIN): Delete.
+ 	(riscv_builtins): Make non-constant. Adjust initializers.
+ 	(riscv_init_builtins): Compute no_target from function type.
+ 	(riscv_expand_builtin): Simplify.
+ 	* config/riscv/andes.def: Adjust.
+ 	* config/riscv/corev.def: Adjust.
+ 	* config/riscv/riscv-cmo.def: Adjust.
+ 	* config/riscv/riscv-scalar-crypto.def: Adjust.
+ 
+ 2026-05-20  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	* config/i386/x86-tune.def (X86_TUNE_SHIFT1): Remove.
+ 	* config/i386/i386.h (TARGET_SHIFT1): Remove.
+ 	* config/i386/i386.md (*ashl<mode>3_1<nf_name>): Remove
+ 	TARGET_SHIFT1-gated implicit-1 encoding and simplify
+ 	length_immediate attribute.
+ 	(*ashlsi3_1_zext): Likewise.
+ 	(*ashlhi3_1<nf_name>): Likewise.
+ 	(*ashlqi3_1<nf_name>): Likewise.
+ 	(*ashl<mode>3_1_slp): Likewise.
+ 	(*ashl<mode>3_cmp): Likewise.
+ 	(*ashlsi3_cmp): Likewise.
+ 	(*<any_shiftrt:insn><mode>3_1<nf_name>): Likewise.
+ 	(*<any_shiftrt:insn>si3_1_zext): Likewise.
+ 	(*<any_shiftrt:insn><mode>3_1_slp): Likewise.
+ 	(*<any_shiftrt:insn><mode>3_cconly): Likewise.
+ 	(*<any_shiftrt:insn>qi_ext<mode>_1): Likewise.
+ 	(<any_shiftrt:insn><mode>3_carry): Likewise.
+ 
+ 2026-05-20  Michiel Derhaeg  <michiel@synopsys.com>
+ 
+ 	PR target/115650
+ 	* config/arc/arc.cc (legitimate_small_data_address_p): Check
+ 	offset size.
+ 
+ 2026-05-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125373
+ 	* config/i386/i386.md
+ 	(Convert imul by three, five and nine into lea define_peephole2s): Use
+ 	index_reg_operand instead of register_operand.
+ 
+ 2026-05-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125357
+ 	* config/i386/i386-expand.cc (ix86_expand_vec_perm): For TARGET_AVX
+ 	one_operand_shuffle handle also V2DImode and V2DFmode using
+ 	vpaddq and vpermilpd.
+ 
+ 2026-05-20  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* tree-ssa-loop-unswitch.cc (estimate_loop_insns): New function.
+ 	(init_loop_unswitch_info): Do not select an outer loop for
+ 	unswitching when the duplicated outer-body size exceeds
+ 	param_max_unswitch_insns.
+ 
+ 2026-05-20  Zhou Qiankang  <wszqkzqk@qq.com>
+ 
+ 	PR target/125362
+ 	* config/loongarch/t-loongarch (TM_H): Add
+ 	common/config/loongarch/cpu-features.h.
+ 
+ 2026-05-19  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	PR target/123748
+ 	* config/aarch64/aarch64-simd.md (vec_packs_float_v2di): New pattern.
+ 
+ 2026-05-19  Christopher Bazley  <chris.bazley@arm.com>
+ 
+ 	* config/aarch64/aarch64.cc (aarch64_call_scalar_result_in_simd_reg_p):
+ 	New function to determine probabilistically whether a gcall
+ 	produces a scalar result in a SIMD/FP register.
+ 	(aarch64_scalar_op_to_vec_p): New function to determine
+ 	whether or not to add scalar_to_vec_cost per scalar operand
+ 	from which a vector is to be constructed.
+ 	(aarch64_external_adjust_stmt_cost): New function to adjust the
+ 	cost of an SLP tree node for a vec_construct that is fed by
+ 	values defined outside the vectorized region.
+ 	(aarch64_vector_costs::add_stmt_cost): Call the new
+ 	aarch64_external_adjust_stmt_cost function if we have an SLP
+ 	node and a vector type.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* fold-const.cc (operand_compare::operand_equal_p): Handle
+ 	OMP_ARRAY_SECTION.
+ 	* gimplify.cc (gimplify_scan_omp_clauses): Call
+ 	omp_remove_duplicate_maps after partial clause expansion.
+ 	* omp-general.cc (omp_remove_duplicate_maps): New function.
+ 	* omp-general.h (omp_remove_duplicate_maps): Declare.
+ 	* omp-low.cc (install_var_field): Add new 'tree key_expr = NULL_TREE'
+ 	default parameter. Set splay-tree lookup key to key_expr instead of
+ 	var if key_expr is non-NULL. Adjust call to install_parm_decl.
+ 	Update comments.
+ 	(scan_sharing_clauses): Use clause tree expression as splay-tree key
+ 	for map/to/from and OpenACC firstprivate cases when installing the
+ 	variable field into the send/receive record type.
+ 	(lower_oacc_reductions): Adjust to find map-clause of reduction
+ 	variable, then create receiver-ref.
+ 	(lower_omp_target): Adjust to lookup var field using clause expression.
+ 
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR other/125348
+ 	* config/i386/i386-expand.cc (ix86_expand_builtin): Fix diagnostic
+ 	typo, forth -> fourth.
+ 
+ 2026-05-19  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/50481
+ 	* config/avr/avr.md (bitreverseqi2): New insn-and-split.
+ 	(*bitreverseqi2): New insn.
+ 
+ 2026-05-19  Roger Sayle  <roger@nextmovesoftware.com>
+ 
+ 	PR target/90483
+ 	PR libstdc++/118416
+ 	* config/i386/i386-expand.cc (ix86_expand_sse_ptest):  Refactor
+ 	with optimizations for PTESTZ*, PTESTC* and PTESTNZC*, including
+ 	transforming ptestz(x,-1) into ptestz(x,x).
+ 
+ 2026-05-19  Christophe Lyon  <christophe.lyon@arm.com>
+ 
+ 	PR target/124870
+ 	* config/arm/arm-mve-builtins-base.cc (vstrq_scatter_base_impl)
+ 	(vldrq_gather_base_impl): Fix call_properties.
+ 
+ 2026-05-19  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* cfgrtl.cc: Don't include gimplify.h or gimplify-me.h.
+ 	* cgraphbuild.cc: Likewise.
+ 	* emit-rtl.cc: Likewie.
+ 	* tree-ssa-dom.cc: Likewise.
+ 	* tree-ssa-dse.cc: Likewise.
+ 	* tree-ssa-loop-im.cc: Likewise.
+ 	* tree-ssa-loop-niter.cc: Likewise.
+ 	* tree-ssa-loop-unswitch.cc: Likewise.
+ 	* tree-ssa-math-opts.cc: Likewise.
+ 	* tree-ssa-phiopt.cc: Likewise.
+ 	* tree-ssa-phiprop.cc: Likewise.
+ 	* tree-ssa-pre.cc: Likewise.
+ 	* tree-ssa-propagate.cc: Likewise.
+ 	* tree-ssa-sccvn.cc: Likewise.
+ 	* gimplify.h (unshare_expr): Remove.
+ 	(unshare_expr_without_location): Remove.
+ 	(copy_if_shared): Remove.
+ 	* tree.h (unshare_expr): New decl.
+ 	(unshare_expr_without_location): Likewise.
+ 	(copy_if_shared): Likewise.
+ 	* gimplify.cc (mostly_copy_tree_r): Moved to tree.cc.
+ 	(copy_if_shared_r): Likewise.
+ 	(copy_if_shared): Likewise.
+ 	(unshare_expr): Likewise.
+ 	(prune_expr_location): Likewise.
+ 	(unshare_expr_without_location): Likewise.
+ 	* tree.cc (mostly_copy_tree_r): Moved from gimplify.cc
+ 	(copy_if_shared_r): Likewise.
+ 	(copy_if_shared): Likewise.
+ 	(unshare_expr): Likewise.
+ 	(prune_expr_location): Likewise.
+ 	(unshare_expr_without_location): Likewise.
+ 
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125357
+ 	* config/i386/i386-expand.cc (ix86_expand_vec_perm): For
+ 	one_operand_shuffle if TARGET_AVX and not TARGET_AVX512F use
+ 	vpermilps for V4SImode/V4SFmode.  Formatting fix.
+ 
+ 2026-05-19  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	* config/avr/avr.md (bitreversehi2, bitreversesi2): New insn_and_split.
+ 	(*bitreversehi2.libgcc, *bitreversesi2.libgcc): New insns.
+ 
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/50481
+ 	* optabs.cc (widen_bswap): Add UNOPTAB argument and use it instead
+ 	of hardcoded bswap_optab.  Rename to ...
+ 	(widen_bswap_or_bitreverse): ... this.
+ 	(expand_doubleword_bswap): Add UNOPTAB argument and use it instead
+ 	of hardcoded bswap_optab.  Rename to ...
+ 	(expand_doubleword_bswap_or_bitreverse): ... this.
+ 	(expand_bitreverse): Use widen_bswap_or_bitreverse and
+ 	expand_doubleword_bswap_or_bitreverse.
+ 	(expand_unop): Adjust widen_bswap and expand_doubleword_bswap callers
+ 	to use new names and add an extra bswap_optab argument.
+ 
+ 2026-05-19  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/125355
+ 	* config/i386/i386-expand.cc (ix86_expand_movmem): Replace
+ 	optimize_function_for_size_p with optimize_insn_for_size_p.
+ 
+ 2026-05-19  Robin Dapp  <robin.dapp@oss.qualcomm.com>
+ 
+ 	PR target/125097
+ 	* config/riscv/riscv.cc (riscv_legitimize_move): Emit 32-bit
+ 	vec_extracts right away.
+ 
+ 2026-05-19  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	* config/riscv/autovec.md (<cbranch_optab><mode>): Remove.
+ 	* config/riscv/riscv-protos.h (expand_vec_cmp_float): Add mask
+ 	and else arguments.
+ 	* config/riscv/riscv-v.cc (expand_vec_cmp): Add mask and else
+ 	arguments.
+ 	(expand_vec_cmp_float): Ditto.
+ 	* config/riscv/vector-iterators.md: Remove iterators.
+ 
+ 2026-05-19  Peter Bergner  <bergner@linux.ibm.com>
+ 	    Jeevitha Palanisamy  <jeevitha@linux.ibm.com>
+ 
+ 	* config/rs6000/amo.h: Add missing atomic memory operations.
+ 	* doc/extend.texi (PowerPC Atomic Memory Operation Functions): Document
+ 	new functions.
+ 
+ 2026-05-19  Andi Kleen  <ak@gcc.gnu.org>
+ 
+ 	PR target/125351
+ 	* config/i386/i386.md: Use alternative to handle masm ptwrite
+ 	syntax.
+ 
+ 2026-05-18  Xin Wang  <yw987194828@gmail.com>
+ 
+ 	* tree-ssa-loop-split.cc (fix_loop_bb_probability): Rename
+ 	parameters from true_edge/false_edge to loop1_edge/loop2_edge
+ 	and scale both loops directly from their semantic edge
+ 	probabilities.
+ 	(split_loop): Derive loop1_edge and loop2_edge from initial_true.
+ 	Use them for loop1_prob, fix_loop_bb_probability, and iteration
+ 	estimate scaling.
+ 
+ 2026-05-18  Wang Yaduo  <wangyaduo@linux.alibaba.com>
+ 
+ 	* config/riscv/riscv-cores.def: Add xt-c9501fdvt tune and core.
+ 	* doc/riscv-mcpu.texi: Regenerated.
+ 	* doc/riscv-mtune.texi: Regenerated.
+ 
+ 2026-05-18  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* config/riscv/riscv.cc (riscv_rtx_costs): Properly cost pack insns
+ 	for Zbkb.
+ 	* config/riscv/riscv.md (zero_extendsidi2): Expand into shift pairs
+ 	when the appropriate instructions are not available.
+ 	(zero_extendhi<GPR:mode>2): Simlarly.
+ 	(*zero_extendsidi2_internal): Make a simple define_insn.  Only handle
+ 	MEM sources.
+ 	(*zero_extendhi<GPR2:mode>2): Similarly.
+ 	(zero_extendsidi2_shifted): Turn into a define_split and generalize
+ 	to handle more constants.
+ 	* config/riscv/predicates.md (dimode_shift_operand): New predicate.
+ 
+ 2026-05-18  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* ext-dce.cc (carry_backpropagate): Handle AND and IOR with a constant argument.
+ 
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* doc/analyzer.texi: Update for change in param name.
+ 	* doc/params.texi: Likewise.  Clarify wording.
+ 
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* dump-context.h (dump_context::emit_optinfo): "info" is non-null,
+ 	so pass it by reference.
+ 	* dumpfile.cc (dump_context::end_any_optinfo): Update for above
+ 	change.
+ 	(dump_context::emit_optinfo): Likewise.
+ 	* optinfo-emit-json.cc: Update throughout to eliminate naked "new"
+ 	and "delete" in favor of std::make_unique and unique_ptr.  Drop
+ 	redundant dtor.  Use nullptr rather than NULL.  Pass by
+ 	const-reference rather than by const-pointer in the places that
+ 	require non-null.
+ 	* optinfo-emit-json.h: Likewise.
+ 	* optinfo.cc (optinfo::emit_for_opt_problem): Update for above
+ 	changes.
+ 
+ 2026-05-18  Yoshinori Sato  <yoshinori.sato@nifty.com>
+ 
+ 	* config/rx/rx.cc (rx_gen_move_template): Select the mode with the smallest size
+ 	for the mov instruction.
+ 
+ 2026-05-18  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* expr.cc (calculate_reversed_crc): New function.
+ 	(assemble_reversed_crc_table): New function.
+ 	(generate_reversed_crc_table): New function.
+ 	(calculate_table_based_reversed_CRC): New function.
+ 	(expand_reversed_crc_table_based): Remove gen_reflecting_code
+ 	parameter.  Use calculate_table_based_reversed_CRC.
+ 	* expr.h (expand_reversed_crc_table_based): Update prototype.
+ 	* builtins.cc (expand_builtin_crc_table_based): Update call.
+ 	* internal-fn.cc (expand_crc_optab_fn): Update call.
+ 	* config/aarch64/aarch64.md (crc_rev<ALLI:mode><ALLX:mode>4):
+ 	Update call.
+ 	* config/i386/i386.md (crc_rev<SWI124:mode>si4): Update call.
+ 	* config/loongarch/loongarch.md (crc_rev<mode>si4): Update call.
+ 	Remove local rbit lambda.
+ 	* config/riscv/bitmanip.md (crc_rev<ANYI1:mode><ANYI:mode>4):
+ 	Update call.  Remove TARGET_ZBKB case.
+ 	* config/riscv/riscv.cc (generate_reflecting_code_using_brev):
+ 	Remove.
+ 	* config/riscv/riscv-protos.h (generate_reflecting_code_using_brev):
+ 	Remove declaration.
+ 
+ 2026-05-18  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	* config/riscv/riscv.cc (riscv_hard_regno_mode_ok): Remove else.
+ 
+ 2026-05-18  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	* config/riscv/riscv.cc (riscv_check_target_clone_version): Fix
+ 	format specifier.
+ 
+ 2026-05-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/50481
+ 	* config/i386/i386-protos.h (ix86_expand_gfni_bitreverse): Declare.
+ 	* config/i386/i386-expand.cc (ix86_expand_gfni_bitreverse): New
+ 	function.
+ 	* config/i386/i386.md (bitreverse<mode>2): New expander.
+ 
+ 2026-05-18  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/125355
+ 	* config/i386/i386-expand.cc (ix86_expand_movmem): Return false
+ 	for -Os.
+ 
+ 2026-05-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-uncprop.cc (associate_equivalences_with_edges): For switches
+ 	info only store the case low value to be recorded as
+ 	the only value. Add comments.
+ 
+ 2026-05-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* ipa-icf-gimple.cc (func_checker::compare_gimple_switch): Remove
+ 	the check on CASE_LABEL_EXPR since it is redundant.
+ 
+ 2026-05-17  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* tree-ssa-dom.cc (record_edge_info): For switches
+ 	info only store the case low value to be recorded as
+ 	the only value. Add comments.
+ 
  2026-05-16  Jakub Jelinek  <jakub@redhat.com>
  
  	PR target/50481
diff -Nrcpad gcc-17-20260517/gcc/DATESTAMP gcc-17-20260524/gcc/DATESTAMP
*** gcc-17-20260517/gcc/DATESTAMP	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/DATESTAMP	Sun May 24 22:32:04 2026
***************
*** 1 ****
! 20260517
--- 1 ----
! 20260524
diff -Nrcpad gcc-17-20260517/gcc/ada/ChangeLog gcc-17-20260524/gcc/ada/ChangeLog
*** gcc-17-20260517/gcc/ada/ChangeLog	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/ada/ChangeLog	Sun May 24 22:32:04 2026
***************
*** 1,3 ****
--- 1,8 ----
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR other/125348
+ 	* libgnat/s-regpat.ads: Fix comment spelling, paramter -> parameter.
+ 
  2026-05-10  Eric Botcazou  <ebotcazou@adacore.com>
  
  	PR ada/125240
diff -Nrcpad gcc-17-20260517/gcc/ada/libgnat/s-regpat.ads gcc-17-20260524/gcc/ada/libgnat/s-regpat.ads
*** gcc-17-20260517/gcc/ada/libgnat/s-regpat.ads	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/ada/libgnat/s-regpat.ads	Sun May 24 22:32:05 2026
*************** package System.Regpat is
*** 428,434 ****
     --
     --  This function raises Storage_Error if Matcher is too small to hold
     --  the resulting code (i.e. Matcher.Size has too small a value) only when
!    --  the paramter Error_When_Too_Small is set to True. Otherwise, no error
     --  will be raised and the required size will be placed in the
     --  Final_Code_Size parameter.
     --
--- 428,434 ----
     --
     --  This function raises Storage_Error if Matcher is too small to hold
     --  the resulting code (i.e. Matcher.Size has too small a value) only when
!    --  the parameter Error_When_Too_Small is set to True. Otherwise, no error
     --  will be raised and the required size will be placed in the
     --  Final_Code_Size parameter.
     --
diff -Nrcpad gcc-17-20260517/gcc/algol68/ChangeLog gcc-17-20260524/gcc/algol68/ChangeLog
*** gcc-17-20260517/gcc/algol68/ChangeLog	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/algol68/ChangeLog	Sun May 24 22:32:05 2026
***************
*** 1,3 ****
--- 1,10 ----
+ 2026-05-20  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* a68-parser-prelude.cc (gnu_prelude): Map FLOOR(L real):L int
+ 	to ENTIER(L real):L int.
+ 	* ga68.texi: Add a section for real operators in the Extended
+ 	prelude chapter and document FLOOR.
+ 
  2026-05-10  Jose E. Marchesi  <jemarch@gnu.org>
  
  	* a68-parser-taxes.cc (is_mappable_routine): Remove handling of
diff -Nrcpad gcc-17-20260517/gcc/algol68/a68-lang.cc gcc-17-20260524/gcc/algol68/a68-lang.cc
*** gcc-17-20260517/gcc/algol68/a68-lang.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/algol68/a68-lang.cc	Sun May 24 22:32:05 2026
*************** a68_handle_option (size_t scode,
*** 538,544 ****
      case OPT_fmodules_map_file:
      case OPT_fmodules_map_file_:
        {
! 	FILE *file = fopen (arg, "r");
  	if (file == NULL)
  	  fatal_error (UNKNOWN_LOCATION,
  		       "cannot open modules map file %<%s%>", arg);
--- 538,544 ----
      case OPT_fmodules_map_file:
      case OPT_fmodules_map_file_:
        {
! 	FILE *file = fopen (arg, "rb");
  	if (file == NULL)
  	  fatal_error (UNKNOWN_LOCATION,
  		       "cannot open modules map file %<%s%>", arg);
diff -Nrcpad gcc-17-20260517/gcc/algol68/a68-parser-prelude.cc gcc-17-20260524/gcc/algol68/a68-parser-prelude.cc
*** gcc-17-20260517/gcc/algol68/a68-parser-prelude.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/algol68/a68-parser-prelude.cc	Sun May 24 22:32:05 2026
*************** gnu_prelude (void)
*** 1378,1383 ****
--- 1378,1392 ----
    a68_op (A68_EXT, "CLEAR", m, a68_lower_clear3);
    m = a68_proc (M_BOOL, M_LONG_LONG_BITS, M_INT, NO_MOID);
    a68_op (A68_EXT, "TEST", m, a68_lower_test3);
+   /* REAL operators.  */
+   m = a68_proc (M_INT, M_REAL, NO_MOID);
+   a68_op (A68_EXT, "FLOOR", m, a68_lower_entier2);
+   /* LONG REAL operators.  */
+   m = a68_proc (M_LONG_INT, M_LONG_REAL, NO_MOID);
+   a68_op (A68_EXT, "FLOOR", m, a68_lower_entier2);
+   /* LONG REAL operators.  */
+   m = a68_proc (M_LONG_LONG_INT, M_LONG_LONG_REAL, NO_MOID);
+   a68_op (A68_EXT, "FLOOR", m, a68_lower_entier2);
  }
  
  /* POSIX prelude.  */
diff -Nrcpad gcc-17-20260517/gcc/algol68/a68-parser-scanner.cc gcc-17-20260524/gcc/algol68/a68-parser-scanner.cc
*** gcc-17-20260517/gcc/algol68/a68-parser-scanner.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/algol68/a68-parser-scanner.cc	Sun May 24 22:32:05 2026
*************** read_source_file (const char *filename)
*** 334,340 ****
    bool ret = true;
  
    /* First open the given file.  */
!   if (!(FILE_SOURCE_FD (&A68_JOB) = fopen (filename, "r")))
      fatal_error (UNKNOWN_LOCATION, "could not open source file %s",
  		 filename);
    FILE_SOURCE_NAME (&A68_JOB) = ggc_strdup (filename);
--- 334,340 ----
    bool ret = true;
  
    /* First open the given file.  */
!   if (!(FILE_SOURCE_FD (&A68_JOB) = fopen (filename, "rb")))
      fatal_error (UNKNOWN_LOCATION, "could not open source file %s",
  		 filename);
    FILE_SOURCE_NAME (&A68_JOB) = ggc_strdup (filename);
*************** include_files (LINE_T *top)
*** 1076,1082 ****
  	      t = NO_LINE;
  
  	      /* Access the file.  */
! 	      fp = fopen (fn, "r");
  	      SCAN_ERROR (fp == NULL, start_l, start_c,
  			  "error opening included file");
  	      ssize = a68_file_size (fileno (fp));
--- 1076,1082 ----
  	      t = NO_LINE;
  
  	      /* Access the file.  */
! 	      fp = fopen (fn, "rb");
  	      SCAN_ERROR (fp == NULL, start_l, start_c,
  			  "error opening included file");
  	      ssize = a68_file_size (fileno (fp));
diff -Nrcpad gcc-17-20260517/gcc/algol68/ga68.texi gcc-17-20260524/gcc/algol68/ga68.texi
*** gcc-17-20260517/gcc/algol68/ga68.texi	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/algol68/ga68.texi	Sun May 24 22:32:05 2026
*************** to @code{b}.
*** 2631,2639 ****
  Monadic operator that yields the nearest integer to its operand.
  @end deftypefn
  
! @deftypefn Operator {} {@B{entier}} {= (@B{l} @B{real} a) @B{int}}
  Monadic operator that yields the integer equal to @code{a}, or the
  next integer below (more negative than) @code{a}.
  @end deftypefn
  
  @deftypefn Operator {} {@B{shorten}} {= (@B{long} @B{real} a) @B{real}}
--- 2631,2642 ----
  Monadic operator that yields the nearest integer to its operand.
  @end deftypefn
  
! @deftypefn Operator {} {@B{entier}} {= (@B{l} @B{real} a) @B{l} @B{int}}
  Monadic operator that yields the integer equal to @code{a}, or the
  next integer below (more negative than) @code{a}.
+ 
+ Selecting the @option{gnu68} dialect provides the @B{floor}
+ operator as a synonym for @B{entier}.  @xref{Extended real operators}.
  @end deftypefn
  
  @deftypefn Operator {} {@B{shorten}} {= (@B{long} @B{real} a) @B{real}}
*************** which is the default.
*** 2970,2975 ****
--- 2973,2979 ----
  * Extended rows operators::            Rows and associated operations.
  * Extended boolean operators::         Operations on boolean operands.
  * Extended bits operators::            Bits and associated operations.
+ * Extended real operators::            Operations on real operands.
  * Extended math procedures::           Mathematical constants and functions.
  @end menu
  
*************** is not in the range @code{0,L_bits_width
*** 3073,3078 ****
--- 3077,3092 ----
  @B{false}.
  @end deftypefn
  
+ @node Extended real operators
+ @section Extended real operators
+ 
+ @deftypefn Operator {} {@B{floor}} {= (@B{l} @B{real} a) @B{l} @B{int}}
+ Monadic operator that yields the integer equal to @code{a} rounded
+ towards negative infinity.
+ 
+ An alias for operator @B{entier}.  @xref{Real operators}.
+ @end deftypefn
+ 
  @node Extended math procedures
  @section Extended math procedures
  
diff -Nrcpad gcc-17-20260517/gcc/analyzer/ChangeLog gcc-17-20260524/gcc/analyzer/ChangeLog
*** gcc-17-20260517/gcc/analyzer/ChangeLog	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/ChangeLog	Sun May 24 22:32:05 2026
***************
*** 1,3 ****
--- 1,65 ----
+ 2026-05-20  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* region-model-manager.cc
+ 	(region_model_manager::maybe_fold_binop): Fold
+ 	"(X POINTER_PLUS Y) POINTER_DIFF_EXPR X" to Y.
+ 
+ 2026-05-19  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/125304
+ 	* common.h (compare_bit_offsets_p): New decl.
+ 	(eval_region_offset_comparison): New decl.
+ 	* region-model.cc (region_model::on_assignment): Pass *this to
+ 	store::set_value to help determination of aliasing.
+ 	(region_model::set_value): Likewise.
+ 	(region_model::eval_condition): Likewise for
+ 	region_svalue::eval_condition.
+ 	* region.cc (compare_bit_offsets_p): New.
+ 	(region_offset::dump_to_pp): Dump the base region, wrapping the
+ 	whole thing in braces.
+ 	(eval_byte_offset_comparison): New.
+ 	(eval_region_offset_comparison): New.
+ 	* store.cc (store::set_value): Add "model" param and pass it to
+ 	eval_alias.
+ 	(store::eval_alias): Add "model" param and pass to eval_alias_1.
+ 	Add early return of true when checking a base region against
+ 	itself.  Replace final return of "unknown" with logic that
+ 	compares the kinds of the two base regions, and may be able
+ 	to return "false" rather than "unknown".
+ 	(store::eval_alias_1): Add "model" param and pass to eval_alias.
+ 	Assert that we have two different base_regions.
+ 	(store::replay_call_summary_cluster): Pass model to set_value.
+ 	* store.h (store::set_value): Add "model" param.
+ 	(store::eval_alias): Likewise.
+ 	(store::eval_alias_1): Likewise.
+ 	* svalue.cc (region_svalue::eval_condition): Likewise.
+ 	Reimplement in terms of eval_region_offset_comparison.
+ 	* svalue.h (region_svalue::eval_condition): Add "model" param.
+ 
+ 2026-05-19  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/124104
+ 	* svalue.cc (binop_svalue::maybe_get_value_range_1): Bail out for
+ 	incompatible types.
+ 
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* analyzer.opt (-param=analyzer-bb-explosion-factor=): Rename to...
+ 	(-param=analyzer-supernode-explosion-factor=): ...this.
+ 	* engine.cc (exploded_graph::process_worklist): Update for change
+ 	to param name.  Clarify the -Wanalyzer-too-complex message when
+ 	hitting the overall limit on enodes by also showing the number
+ 	of snodes.
+ 
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* engine.cc (exploded_node::status_to_str): Drop unused field
+ 	m_num_processed_stmts.
+ 	(exploded_node::dump): Likewise.
+ 	(exploded_node::to_json): Likewise.
+ 	* exploded-graph.h (exploded_node::m_num_processed_stmts):
+ 	Likewise.
+ 
  2026-05-06  David Malcolm  <dmalcolm@redhat.com>
  
  	* svalue.cc (svalue::make_dump_widget): Show value ranges in
diff -Nrcpad gcc-17-20260517/gcc/analyzer/analyzer.opt gcc-17-20260524/gcc/analyzer/analyzer.opt
*** gcc-17-20260517/gcc/analyzer/analyzer.opt	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/analyzer.opt	Sun May 24 22:32:05 2026
***************
*** 22,31 ****
  
  ; Please try to keep this file in ASCII collating order.
  
- -param=analyzer-bb-explosion-factor=
- Common Joined UInteger Var(param_analyzer_bb_explosion_factor) Init(5) Param
- The maximum number of 'after supernode' exploded nodes within the analyzer per supernode, before terminating analysis.
- 
  -param=analyzer-max-enodes-per-program-point=
  Common Joined UInteger Var(param_analyzer_max_enodes_per_program_point) Init(8) Param
  The maximum number of exploded nodes per program point within the analyzer, before terminating analysis of that point.
--- 22,27 ----
*************** The minimum number of supernodes within
*** 54,59 ****
--- 50,59 ----
  Common Joined UInteger Var(param_analyzer_max_enodes_for_full_dump) Init(200) Param
  The maximum depth of exploded nodes that should appear in a dot dump before switching to a less verbose format.
  
+ -param=analyzer-supernode-explosion-factor=
+ Common Joined UInteger Var(param_analyzer_supernode_explosion_factor) Init(5) Param
+ The maximum number of exploded nodes within the analyzer per supernode, before terminating analysis.
+ 
  -param=analyzer-text-art-string-ellipsis-threshold=
  Common Joined UInteger Var(param_analyzer_text_art_string_ellipsis_threshold) Init(15) Param
  The number of bytes at which to ellipsize string literals in analyzer text art diagrams.
diff -Nrcpad gcc-17-20260517/gcc/analyzer/common.h gcc-17-20260524/gcc/analyzer/common.h
*** gcc-17-20260517/gcc/analyzer/common.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/common.h	Sun May 24 22:32:05 2026
*************** extern bool int_size_in_bits (const_tree
*** 210,215 ****
--- 210,220 ----
  
  extern tree get_field_at_bit_offset (tree record_type, bit_offset_t bit_offset);
  
+ extern bool
+ compare_bit_offsets_p (bit_offset_t a,
+ 		       enum tree_code op,
+ 		       bit_offset_t b);
+ 
  /* The location of a region expressesd as an offset relative to a
     base region.  */
  
*************** extern bool operator<= (const region_off
*** 291,296 ****
--- 296,307 ----
  extern bool operator> (const region_offset &, const region_offset &);
  extern bool operator>= (const region_offset &, const region_offset &);
  
+ extern tristate
+ eval_region_offset_comparison (region_offset lhs_offset,
+ 			       enum tree_code op,
+ 			       region_offset rhs_offset,
+ 			       const region_model &model);
+ 
  extern location_t get_stmt_location (const gimple *stmt, function *fun);
  
  extern bool compat_types_p (tree src_type, tree dst_type);
diff -Nrcpad gcc-17-20260517/gcc/analyzer/engine.cc gcc-17-20260524/gcc/analyzer/engine.cc
*** gcc-17-20260517/gcc/analyzer/engine.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/engine.cc	Sun May 24 22:32:05 2026
*************** exploded_node::status_to_str (enum statu
*** 1028,1035 ****
  
  exploded_node::exploded_node (const point_and_state &ps,
  			      int index)
! : m_ps (ps), m_status (status::worklist), m_index (index),
!   m_num_processed_stmts (0)
  {
    gcc_checking_assert (ps.get_state ().m_region_model->canonicalized_p ());
  }
--- 1028,1034 ----
  
  exploded_node::exploded_node (const point_and_state &ps,
  			      int index)
! : m_ps (ps), m_status (status::worklist), m_index (index)
  {
    gcc_checking_assert (ps.get_state ().m_region_model->canonicalized_p ());
  }
*************** exploded_node::dump (const extrinsic_sta
*** 1211,1218 ****
     {"point"  : object for program_point,
      "state"  : object for program_state,
      "status" : str,
!     "idx"    : int,
!     "processed_stmts" : int}.  */
  
  std::unique_ptr<json::object>
  exploded_node::to_json (const extrinsic_state &ext_state) const
--- 1210,1216 ----
     {"point"  : object for program_point,
      "state"  : object for program_state,
      "status" : str,
!     "idx"    : int}.  */
  
  std::unique_ptr<json::object>
  exploded_node::to_json (const extrinsic_state &ext_state) const
*************** exploded_node::to_json (const extrinsic_
*** 1223,1229 ****
    enode_obj->set ("state", get_state ().to_json (ext_state));
    enode_obj->set_string ("status", status_to_str (m_status));
    enode_obj->set_integer ("idx", m_index);
-   enode_obj->set_integer ("processed_stmts", m_num_processed_stmts);
  
    return enode_obj;
  }
--- 1221,1226 ----
*************** exploded_graph::process_worklist ()
*** 3155,3161 ****
  	 explosion (or bugs).  */
        const int limit
  	= (// Per-supernode limit:
! 	   (m_sg.num_nodes () * param_analyzer_bb_explosion_factor)
  	   // Allow one for the "origin" enode:
  	   + 1);
        if (m_global_stats.m_num_nodes > limit)
--- 3152,3158 ----
  	 explosion (or bugs).  */
        const int limit
  	= (// Per-supernode limit:
! 	   (m_sg.num_nodes () * param_analyzer_supernode_explosion_factor)
  	   // Allow one for the "origin" enode:
  	   + 1);
        if (m_global_stats.m_num_nodes > limit)
*************** exploded_graph::process_worklist ()
*** 3165,3172 ****
  	  warning_at (node->get_point ().get_location (),
  		      OPT_Wanalyzer_too_complex,
  		      "analysis bailed out early"
! 		      " (%i enodes)",
! 		      m_nodes.length ());
  	  return;
  	}
      }
--- 3162,3170 ----
  	  warning_at (node->get_point ().get_location (),
  		      OPT_Wanalyzer_too_complex,
  		      "analysis bailed out early"
! 		      " (%i enodes for %i snodes)",
! 		      m_nodes.length (),
! 		      m_sg.num_nodes ());
  	  return;
  	}
      }
diff -Nrcpad gcc-17-20260517/gcc/analyzer/exploded-graph.h gcc-17-20260524/gcc/analyzer/exploded-graph.h
*** gcc-17-20260517/gcc/analyzer/exploded-graph.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/exploded-graph.h	Sun May 24 22:32:05 2026
*************** private:
*** 322,331 ****
  public:
    /* The index of this exploded_node.  */
    const int m_index;
- 
-   /* The number of stmts that were processed when process_node was
-      called on this enode.  */
-   unsigned m_num_processed_stmts;
  };
  
  /* An edge within the exploded graph.
--- 322,327 ----
diff -Nrcpad gcc-17-20260517/gcc/analyzer/region-model-manager.cc gcc-17-20260524/gcc/analyzer/region-model-manager.cc
*** gcc-17-20260517/gcc/analyzer/region-model-manager.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/region-model-manager.cc	Sun May 24 22:32:05 2026
*************** region_model_manager::maybe_fold_binop (
*** 738,743 ****
--- 738,750 ----
  	  if (binop->get_arg0 () == arg1)
  	    return get_or_create_cast (type, binop->get_arg1 ());
        break;
+     case POINTER_DIFF_EXPR:
+       /* (X POINTER_PLUS Y) POINTER_DIFF_EXPR X -> Y.  */
+       if (const binop_svalue *binop = arg0->dyn_cast_binop_svalue ())
+ 	if (binop->get_op () == POINTER_PLUS_EXPR)
+ 	  if (binop->get_arg0 () == arg1)
+ 	    return get_or_create_cast (type, binop->get_arg1 ());
+       break;
      case MULT_EXPR:
        /* (VAL * 0).  */
        if (cst1
diff -Nrcpad gcc-17-20260517/gcc/analyzer/region-model.cc gcc-17-20260524/gcc/analyzer/region-model.cc
*** gcc-17-20260517/gcc/analyzer/region-model.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/region-model.cc	Sun May 24 22:32:05 2026
*************** region_model::on_assignment (const gassi
*** 1680,1686 ****
  	/* e.g. "struct s2 x = {{'A', 'B', 'C', 'D'}};".  */
  	const svalue *rhs_sval = get_rvalue (rhs1, ctxt);
  	m_store.set_value (m_mgr->get_store_manager(), lhs_reg, rhs_sval,
! 			   ctxt ? ctxt->get_uncertainty () : nullptr);
        }
        break;
      }
--- 1680,1687 ----
  	/* e.g. "struct s2 x = {{'A', 'B', 'C', 'D'}};".  */
  	const svalue *rhs_sval = get_rvalue (rhs1, ctxt);
  	m_store.set_value (m_mgr->get_store_manager(), lhs_reg, rhs_sval,
! 			   ctxt ? ctxt->get_uncertainty () : nullptr,
! 			   *this);
        }
        break;
      }
*************** region_model::set_value (const region *l
*** 4012,4018 ****
    check_region_for_write (lhs_reg, rhs_sval, ctxt);
  
    m_store.set_value (m_mgr->get_store_manager(), lhs_reg, rhs_sval,
! 		     ctxt ? ctxt->get_uncertainty () : nullptr);
  }
  
  /* Set the value of the region given by LHS to the value given by RHS.  */
--- 4013,4020 ----
    check_region_for_write (lhs_reg, rhs_sval, ctxt);
  
    m_store.set_value (m_mgr->get_store_manager(), lhs_reg, rhs_sval,
! 		     ctxt ? ctxt->get_uncertainty () : nullptr,
! 		     *this);
  }
  
  /* Set the value of the region given by LHS to the value given by RHS.  */
*************** region_model::eval_condition (const sval
*** 4985,4991 ****
    if (const region_svalue *lhs_ptr = lhs->dyn_cast_region_svalue ())
      if (const region_svalue *rhs_ptr = rhs->dyn_cast_region_svalue ())
        {
! 	tristate res = region_svalue::eval_condition (lhs_ptr, op, rhs_ptr);
  	if (res.is_known ())
  	  return res;
  	/* Otherwise, only known through constraints.  */
--- 4987,4994 ----
    if (const region_svalue *lhs_ptr = lhs->dyn_cast_region_svalue ())
      if (const region_svalue *rhs_ptr = rhs->dyn_cast_region_svalue ())
        {
! 	tristate res = region_svalue::eval_condition (lhs_ptr, op, rhs_ptr,
! 						      *this);
  	if (res.is_known ())
  	  return res;
  	/* Otherwise, only known through constraints.  */
diff -Nrcpad gcc-17-20260517/gcc/analyzer/region.cc gcc-17-20260524/gcc/analyzer/region.cc
*** gcc-17-20260517/gcc/analyzer/region.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/region.cc	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 44,49 ****
--- 44,67 ----
  
  namespace ana {
  
+ bool
+ compare_bit_offsets_p (bit_offset_t a,
+ 		       enum tree_code op,
+ 		       bit_offset_t b)
+ {
+   switch (op)
+     {
+     default:
+       gcc_unreachable ();
+     case EQ_EXPR: return a == b;
+     case NE_EXPR: return a != b;
+     case GE_EXPR: return a >= b;
+     case LE_EXPR: return a <= b;
+     case GT_EXPR: return a > b;
+     case LT_EXPR: return a < b;
+     }
+ }
+ 
  region_offset
  region_offset::make_byte_offset (const region *base_region,
  				 const svalue *num_bytes_sval)
*************** region_offset::calc_symbolic_byte_offset
*** 94,118 ****
  void
  region_offset::dump_to_pp (pretty_printer *pp, bool simple) const
  {
    if (symbolic_p ())
      {
!       /* We don't bother showing the base region.  */
!       pp_string (pp, "byte ");
        m_sym_offset->dump_to_pp (pp, simple);
      }
    else
      {
        if (m_offset % BITS_PER_UNIT == 0)
  	{
! 	  pp_string (pp, "byte ");
  	  pp_wide_int (pp, m_offset / BITS_PER_UNIT, SIGNED);
  	}
        else
  	{
! 	  pp_string (pp, "bit ");
  	  pp_wide_int (pp, m_offset, SIGNED);
  	}
      }
  }
  
  DEBUG_FUNCTION void
--- 112,138 ----
  void
  region_offset::dump_to_pp (pretty_printer *pp, bool simple) const
  {
+   pp_string (pp, "{");
+   m_base_region->dump_to_pp (pp, simple);
    if (symbolic_p ())
      {
!       pp_string (pp, " byte ");
        m_sym_offset->dump_to_pp (pp, simple);
      }
    else
      {
        if (m_offset % BITS_PER_UNIT == 0)
  	{
! 	  pp_string (pp, " byte ");
  	  pp_wide_int (pp, m_offset / BITS_PER_UNIT, SIGNED);
  	}
        else
  	{
! 	  pp_string (pp, " bit ");
  	  pp_wide_int (pp, m_offset, SIGNED);
  	}
      }
+   pp_string (pp, "}");
  }
  
  DEBUG_FUNCTION void
*************** strip_types (const region_offset &offset
*** 373,378 ****
--- 393,501 ----
      return offset;
  }
  
+ /* Ignoring base regions, compare the byte offset of OFFSET_A and OFFSET_B
+    within their respective base regions.  */
+ 
+ static tristate
+ eval_byte_offset_comparison (region_offset offset_a,
+ 			     enum tree_code op,
+ 			     region_offset offset_b,
+ 			     const region_model &model)
+ {
+   if (offset_a.concrete_p ())
+     {
+       if (offset_b.concrete_p ())
+ 	{
+ 	  // Concrete vs concrete: we know the result:
+ 	  return compare_bit_offsets_p (offset_a.get_bit_offset (),
+ 					op,
+ 					offset_b.get_bit_offset ());
+ 	}
+       else
+ 	{
+ 	  // Concrete vs symbolic
+ 	  // TODO: There may be room for improved precision here
+ 	  return tristate::unknown ();
+ 	}
+     }
+   else
+     {
+       if (offset_b.concrete_p ())
+ 	{
+ 	  // Symbolic vs concrete
+ 	  // TODO: There may be room for improved precision here
+ 	  return tristate::unknown ();
+ 	}
+       else
+ 	{
+ 	  // Symbolic vs symbolic
+ 	  const svalue *offset_sval_a = offset_a.get_symbolic_byte_offset ();
+ 	  const svalue *offset_sval_b = offset_b.get_symbolic_byte_offset ();
+ 	  return model.eval_condition (offset_sval_a, op, offset_sval_b);
+ 	}
+     }
+ }
+ 
+ /* Evaluate the condition LHS_OFFSET OP RHS_OFFSET for comparing
+    pointers.
+ 
+    See if they point to the same base region, and if we know about
+    the offsets within their regions.
+ 
+    Use MODEL for aliasing information and any knowledge from
+    constraint_manager about ordering of pointers.  */
+ 
+ tristate
+ eval_region_offset_comparison (region_offset lhs_offset,
+ 			       enum tree_code op,
+ 			       region_offset rhs_offset,
+ 			       const region_model &model)
+ {
+   /* Try to determine if they're the same base region.  */
+   const tristate same_base_region
+     = model.get_store ()->eval_alias (lhs_offset.get_base_region (),
+ 				      rhs_offset.get_base_region (),
+ 				      model);
+ 
+   /* Try to determine if they're the same offset relative to their
+      base region.  */
+   const tristate same_byte_offset
+     = eval_byte_offset_comparison (lhs_offset, EQ_EXPR, rhs_offset, model);
+ 
+   /* With that, we might know if they're equal/non-equal.  */
+   const tristate equality = same_base_region.and_(same_byte_offset);
+ 
+   switch (op)
+     {
+     default:
+       gcc_unreachable ();
+ 
+     case EQ_EXPR:
+       return equality;
+ 
+     case NE_EXPR:
+       return equality.not_ ();
+ 
+     case GE_EXPR:
+     case LE_EXPR:
+       if (equality.is_true ())
+ 	return tristate (true);
+       else if (same_base_region.is_true ())
+ 	return eval_byte_offset_comparison (lhs_offset, op, rhs_offset, model);
+       else
+ 	return tristate::unknown ();
+ 
+     case GT_EXPR:
+     case LT_EXPR:
+       if (equality.is_true ())
+ 	return tristate (false);
+       else if (same_base_region.is_true ())
+ 	return eval_byte_offset_comparison (lhs_offset, op, rhs_offset, model);
+       else
+ 	return tristate::unknown ();
+     }
+ }
+ 
  /* class region and its various subclasses.  */
  
  /* class region.  */
diff -Nrcpad gcc-17-20260517/gcc/analyzer/store.cc gcc-17-20260524/gcc/analyzer/store.cc
*** gcc-17-20260517/gcc/analyzer/store.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/store.cc	Sun May 24 22:32:05 2026
*************** store::get_any_binding (store_manager *m
*** 3133,3144 ****
    return (*cluster_slot)->get_any_binding (mgr, reg);
  }
  
! /* Set the value of LHS_REG to RHS_SVAL.  */
  
  void
  store::set_value (store_manager *mgr, const region *lhs_reg,
  		  const svalue *rhs_sval,
! 		  uncertainty_t *uncertainty)
  {
    logger *logger = mgr->get_logger ();
    LOG_SCOPE (logger);
--- 3133,3146 ----
    return (*cluster_slot)->get_any_binding (mgr, reg);
  }
  
! /* Set the value of LHS_REG to RHS_SVAL.
!    Use MODEL when determining if regions alias each other.  */
  
  void
  store::set_value (store_manager *mgr, const region *lhs_reg,
  		  const svalue *rhs_sval,
! 		  uncertainty_t *uncertainty,
! 		  const region_model &model)
  {
    logger *logger = mgr->get_logger ();
    LOG_SCOPE (logger);
*************** store::set_value (store_manager *mgr, co
*** 3201,3207 ****
  	      || lhs_cluster->symbolic_p ()
  	      || iter_cluster->symbolic_p ()))
  	{
! 	  tristate t_alias = eval_alias (lhs_base_reg, iter_base_reg);
  	  switch (t_alias.get_value ())
  	    {
  	    default:
--- 3203,3210 ----
  	      || lhs_cluster->symbolic_p ()
  	      || iter_cluster->symbolic_p ()))
  	{
! 	  tristate t_alias = eval_alias (lhs_base_reg, iter_base_reg,
! 					 model);
  	  switch (t_alias.get_value ())
  	    {
  	    default:
*************** store::set_value (store_manager *mgr, co
*** 3249,3260 ****
    on_maybe_live_values (*mgr, maybe_live_values);
  }
  
! /* Determine if BASE_REG_A could be an alias of BASE_REG_B.  */
  
  tristate
  store::eval_alias (const region *base_reg_a,
! 		   const region *base_reg_b) const
  {
    /* SSA names can't alias.  */
    tree decl_a = base_reg_a->maybe_get_decl ();
    if (decl_a && TREE_CODE (decl_a) == SSA_NAME)
--- 3252,3268 ----
    on_maybe_live_values (*mgr, maybe_live_values);
  }
  
! /* Determine if BASE_REG_A could be an alias of BASE_REG_B.
!    Use information from MODEL when comparing pointers. */
  
  tristate
  store::eval_alias (const region *base_reg_a,
! 		   const region *base_reg_b,
! 		   const region_model &model) const
  {
+   if (base_reg_a == base_reg_b)
+     return tristate (true);
+ 
    /* SSA names can't alias.  */
    tree decl_a = base_reg_a->maybe_get_decl ();
    if (decl_a && TREE_CODE (decl_a) == SSA_NAME)
*************** store::eval_alias (const region *base_re
*** 3268,3288 ****
      return tristate::TS_FALSE;
  
    /* Try both ways, for symmetry.  */
!   tristate ts_ab = eval_alias_1 (base_reg_a, base_reg_b);
    if (ts_ab.is_false ())
      return tristate::TS_FALSE;
!   tristate ts_ba = eval_alias_1 (base_reg_b, base_reg_a);
    if (ts_ba.is_false ())
      return tristate::TS_FALSE;
!   return tristate::TS_UNKNOWN;
  }
  
  /* Half of store::eval_alias; called twice for symmetry.  */
  
  tristate
  store::eval_alias_1 (const region *base_reg_a,
! 		     const region *base_reg_b) const
  {
    /* If they're in different memory spaces, they can't alias.  */
    {
      enum memory_space memspace_a = base_reg_a->get_memory_space ();
--- 3276,3468 ----
      return tristate::TS_FALSE;
  
    /* Try both ways, for symmetry.  */
!   tristate ts_ab = eval_alias_1 (base_reg_a, base_reg_b, model);
    if (ts_ab.is_false ())
      return tristate::TS_FALSE;
!   tristate ts_ba = eval_alias_1 (base_reg_b, base_reg_a, model);
    if (ts_ba.is_false ())
      return tristate::TS_FALSE;
! 
!   gcc_assert (base_reg_a != base_reg_b);
!   enum region_kind kind_a = base_reg_a->get_kind ();
!   enum region_kind kind_b = base_reg_b->get_kind ();
!   if (kind_a == kind_b)
!     {
!       /* We have two different base region instances of the same kind.
! 	 For many kinds of region this implies they must have different
! 	 addresses.  */
!       switch (kind_a)
! 	{
! 	/* Invalid cases.  */
! 
! 	default:
! 	  gcc_unreachable ();
! 
! 	case RK_CODE:
! 	case RK_ERRNO:
! 	case RK_GLOBALS:
! 	case RK_HEAP:
! 	case RK_ROOT:
! 	case RK_STACK:
! 	case RK_THREAD_LOCAL:
! 	  /* We expect these to be singletons.  */
! 	  gcc_unreachable ();
! 
! 	case RK_BIT_RANGE:
! 	case RK_CAST:
! 	case RK_ELEMENT:
! 	case RK_FIELD:
! 	case RK_OFFSET:
! 	case RK_SIZED:
! 	  /* These aren't base regions.  */
! 	  gcc_unreachable ();
! 
! 	/* Valid cases.  */
! 
! 	case RK_ALLOCA:
! 	case RK_DECL:
! 	case RK_FRAME:
! 	case RK_FUNCTION:
! 	case RK_LABEL:
! 	case RK_PRIVATE:
! 	case RK_VAR_ARG:
! 	  /* We expect different regions of these kinds to have
! 	     different addresses.  */
! 	  return tristate (false);
! 
! 	case RK_HEAP_ALLOCATED:
! 	  /* We have results of two different heap allocations.
! 	     If they were non-zero-sized allocations they are different from
! 	     each other, but zero-sized allocations might alias.
! 	     Note that this doesn't handle the case where of a freed pointer
! 	     possibly being reused, but we don't have a way to distinguish
! 	     this case from the "two different allocations case", and it seems
! 	     much more important to keep the latter from aliasing each
! 	     other (for precision when tracking writes).   */
! 	  {
! 	    tristate size_a_gt_zero (tristate::unknown ());
! 	    tristate size_b_gt_zero (tristate::unknown ());
! 	    const svalue *zero_size
! 	      = model.get_manager ()->get_or_create_int_cst (size_type_node, 0);
! 
! 	    if (auto sval_size_a = model.get_dynamic_extents (base_reg_a))
! 	      {
! 		size_a_gt_zero = model.eval_condition (sval_size_a,
! 						       GT_EXPR,
! 						       zero_size);
! 	      }
! 	    if (auto sval_size_b = model.get_dynamic_extents (base_reg_b))
! 	      {
! 		size_b_gt_zero = model.eval_condition (sval_size_b,
! 						       GT_EXPR,
! 						       zero_size);
! 	      }
! 	    if (size_a_gt_zero.is_known () && size_b_gt_zero.is_known ())
! 	      {
! 		/* We have results of two different heap allocations, and for
! 		   each we know if the size was non-zero.  */
! 		if (size_a_gt_zero.is_false () && size_b_gt_zero.is_false ())
! 		  {
! 		    /* Different allocations, both zero-sized.  We don't
! 		       know if they have the same address.  */
! 		    return tristate::unknown ();
! 		  }
! 		else
! 		  {
! 		    /* We either have different allocations of non-zero size,
! 		       or different allocations where one has non-zero size, the
! 		       other is zero-sized.  We know these have different
! 		       addresses.  */
! 		    return tristate (false);
! 		  }
! 	      }
! 	    if (size_a_gt_zero.is_true () || size_b_gt_zero.is_true ())
! 	      {
! 		/* Different allocations, of which at least one > 0 in size.
! 		   They must have different addresses.  */
! 		return tristate (false);
! 	      }
! 	    /* At least one size might be zero.  */
! 	    return tristate::unknown ();
! 	  }
! 
! 	case RK_SYMBOLIC:
! 	case RK_UNKNOWN:
! 	  /* We don't know that such regions are different from each other.  */
! 	  return tristate::unknown ();
! 
! 	case RK_STRING:
! 	  /* For now, don't attempt to decide if string literals alias
! 	     each other.  */
! 	  return tristate::unknown ();
! 	}
!     }
!   else
!     {
!       /* We have two base region instances of different kinds.
! 	 For many kinds of region this implies they must have different
! 	 addresses.  */
!       if (kind_b == RK_SYMBOLIC || kind_b == RK_UNKNOWN)
! 	return tristate::unknown ();
! 
!       switch (kind_a)
! 	{
! 	/* Invalid cases.  */
! 
! 	default:
! 	  gcc_unreachable ();
! 
! 	case RK_CODE:
! 	case RK_ERRNO:
! 	case RK_GLOBALS:
! 	case RK_HEAP:
! 	case RK_ROOT:
! 	case RK_STACK:
! 	case RK_THREAD_LOCAL:
! 	  /* We expect these to be singletons.  */
! 	  gcc_unreachable ();
! 
! 	case RK_BIT_RANGE:
! 	case RK_CAST:
! 	case RK_ELEMENT:
! 	case RK_FIELD:
! 	case RK_OFFSET:
! 	case RK_SIZED:
! 	  /* These aren't base regions.  */
! 	  gcc_unreachable ();
! 
! 	/* Valid cases.  */
! 
! 	case RK_ALLOCA:
! 	case RK_DECL:
! 	case RK_FRAME:
! 	case RK_FUNCTION:
! 	case RK_HEAP_ALLOCATED:
! 	case RK_LABEL:
! 	case RK_PRIVATE:
! 	case RK_STRING:
! 	case RK_VAR_ARG:
! 	  /* We expect regions of these kinds to have different addresses
! 	     from regions of other kinds (apart from symbolic/unknown).  */
! 	  return tristate (false);
! 
! 	case RK_SYMBOLIC:
! 	case RK_UNKNOWN:
! 	  /* We don't know anything about such regions.  */
! 	  return tristate::unknown ();
! 	}
!     }
  }
  
  /* Half of store::eval_alias; called twice for symmetry.  */
  
  tristate
  store::eval_alias_1 (const region *base_reg_a,
! 		     const region *base_reg_b,
! 		     const region_model &model) const
  {
+   gcc_assert (base_reg_a != base_reg_b);
+ 
    /* If they're in different memory spaces, they can't alias.  */
    {
      enum memory_space memspace_a = base_reg_a->get_memory_space ();
*************** store::eval_alias_1 (const region *base_
*** 3334,3345 ****
  		 We want to ensure that "*ptr" can only clobber things
  		 within REGION's base region.  */
  	      tristate ts = eval_alias (pointee->get_base_region (),
! 					base_reg_b);
  	      if (ts.is_false ())
  		return tristate::TS_FALSE;
  	    }
  	}
      }
    return tristate::TS_UNKNOWN;
  }
  
--- 3514,3527 ----
  		 We want to ensure that "*ptr" can only clobber things
  		 within REGION's base region.  */
  	      tristate ts = eval_alias (pointee->get_base_region (),
! 					base_reg_b,
! 					model);
  	      if (ts.is_false ())
  		return tristate::TS_FALSE;
  	    }
  	}
      }
+ 
    return tristate::TS_UNKNOWN;
  }
  
*************** store::replay_call_summary_cluster (call
*** 3952,3958 ****
  	  caller_sval =
  	    reg_mgr->get_or_create_unknown_svalue (summary_sval->get_type ());
  	set_value (mgr, caller_dest_reg,
! 		   caller_sval, nullptr /* uncertainty_t * */);
        }
        break;
  
--- 4134,4141 ----
  	  caller_sval =
  	    reg_mgr->get_or_create_unknown_svalue (summary_sval->get_type ());
  	set_value (mgr, caller_dest_reg,
! 		   caller_sval, nullptr /* uncertainty_t * */,
! 		   *cd.get_model ());
        }
        break;
  
*************** store::replay_call_summary_cluster (call
*** 3977,3983 ****
  	  caller_sval =
  	    reg_mgr->get_or_create_unknown_svalue (summary_sval->get_type ());
  	set_value (mgr, caller_dest_reg,
! 		   caller_sval, nullptr /* uncertainty_t * */);
        }
        break;
  
--- 4160,4167 ----
  	  caller_sval =
  	    reg_mgr->get_or_create_unknown_svalue (summary_sval->get_type ());
  	set_value (mgr, caller_dest_reg,
! 		   caller_sval, nullptr /* uncertainty_t * */,
! 		   *cd.get_model ());
        }
        break;
  
diff -Nrcpad gcc-17-20260517/gcc/analyzer/store.h gcc-17-20260524/gcc/analyzer/store.h
*** gcc-17-20260517/gcc/analyzer/store.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/store.h	Sun May 24 22:32:05 2026
*************** public:
*** 957,963 ****
  
    void set_value (store_manager *mgr, const region *lhs_reg,
  		  const svalue *rhs_sval,
! 		  uncertainty_t *uncertainty);
    void clobber_region (store_manager *mgr, const region *reg);
    void purge_region (store_manager *mgr, const region *reg);
    void fill_region (store_manager *mgr, const region *reg, const svalue *sval);
--- 957,964 ----
  
    void set_value (store_manager *mgr, const region *lhs_reg,
  		  const svalue *rhs_sval,
! 		  uncertainty_t *uncertainty,
! 		  const region_model &model);
    void clobber_region (store_manager *mgr, const region *reg);
    void purge_region (store_manager *mgr, const region *reg);
    void fill_region (store_manager *mgr, const region *reg, const svalue *sval);
*************** public:
*** 1002,1008 ****
    cluster_map_t::iterator end () const { return m_cluster_map.end (); }
  
    tristate eval_alias (const region *base_reg_a,
! 		       const region *base_reg_b) const;
  
    void canonicalize (store_manager *mgr);
    void loop_replay_fixup (const store *other_store,
--- 1003,1010 ----
    cluster_map_t::iterator end () const { return m_cluster_map.end (); }
  
    tristate eval_alias (const region *base_reg_a,
! 		       const region *base_reg_b,
! 		       const region_model &model) const;
  
    void canonicalize (store_manager *mgr);
    void loop_replay_fixup (const store *other_store,
*************** private:
*** 1020,1026 ****
    void remove_overlapping_bindings (store_manager *mgr, const region *reg,
  				    uncertainty_t *uncertainty);
    tristate eval_alias_1 (const region *base_reg_a,
! 			 const region *base_reg_b) const;
  
    cluster_map_t m_cluster_map;
  
--- 1022,1029 ----
    void remove_overlapping_bindings (store_manager *mgr, const region *reg,
  				    uncertainty_t *uncertainty);
    tristate eval_alias_1 (const region *base_reg_a,
! 			 const region *base_reg_b,
! 			 const region_model &model) const;
  
    cluster_map_t m_cluster_map;
  
diff -Nrcpad gcc-17-20260517/gcc/analyzer/svalue.cc gcc-17-20260524/gcc/analyzer/svalue.cc
*** gcc-17-20260517/gcc/analyzer/svalue.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/svalue.cc	Sun May 24 22:32:05 2026
*************** region_svalue::implicitly_live_p (const
*** 998,1042 ****
  tristate
  region_svalue::eval_condition (const region_svalue *lhs,
  			       enum tree_code op,
! 			       const region_svalue *rhs)
  {
!   /* See if they point to the same region.  */
    const region *lhs_reg = lhs->get_pointee ();
    const region *rhs_reg = rhs->get_pointee ();
-   bool ptr_equality = lhs_reg == rhs_reg;
-   switch (op)
-     {
-     default:
-       gcc_unreachable ();
- 
-     case EQ_EXPR:
-       if (ptr_equality)
- 	return tristate::TS_TRUE;
-       else
- 	return tristate::TS_FALSE;
-       break;
- 
-     case NE_EXPR:
-       if (ptr_equality)
- 	return tristate::TS_FALSE;
-       else
- 	return tristate::TS_TRUE;
-       break;
  
!     case GE_EXPR:
!     case LE_EXPR:
!       if (ptr_equality)
! 	return tristate::TS_TRUE;
!       break;
! 
!     case GT_EXPR:
!     case LT_EXPR:
!       if (ptr_equality)
! 	return tristate::TS_FALSE;
!       break;
!     }
  
!   return tristate::TS_UNKNOWN;
  }
  
  /* class constant_svalue : public svalue.  */
--- 998,1015 ----
  tristate
  region_svalue::eval_condition (const region_svalue *lhs,
  			       enum tree_code op,
! 			       const region_svalue *rhs,
! 			       const region_model &model)
  {
!   /* Convert to region_offset representation, and work with that.  */
    const region *lhs_reg = lhs->get_pointee ();
    const region *rhs_reg = rhs->get_pointee ();
  
!   region_model_manager *mgr = model.get_manager ();
!   region_offset lhs_offset = lhs_reg->get_offset (mgr);
!   region_offset rhs_offset = rhs_reg->get_offset (mgr);
  
!   return eval_region_offset_comparison (lhs_offset, op, rhs_offset, model);
  }
  
  /* class constant_svalue : public svalue.  */
*************** binop_svalue::maybe_get_value_range_1 (v
*** 1748,1754 ****
      if (m_arg1->maybe_get_value_range (rhs))
        {
  	range_op_handler handler (m_op);
! 	if (handler)
  	  {
  	    out.set_range_class (type);
  	    if (handler.fold_range (out, get_type (), lhs, rhs))
--- 1721,1728 ----
      if (m_arg1->maybe_get_value_range (rhs))
        {
  	range_op_handler handler (m_op);
! 	if (handler
! 	    && handler.operand_check_p (type, lhs.type (), rhs.type ()))
  	  {
  	    out.set_range_class (type);
  	    if (handler.fold_range (out, get_type (), lhs, rhs))
diff -Nrcpad gcc-17-20260517/gcc/analyzer/svalue.h gcc-17-20260524/gcc/analyzer/svalue.h
*** gcc-17-20260517/gcc/analyzer/svalue.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/analyzer/svalue.h	Sun May 24 22:32:05 2026
*************** public:
*** 284,290 ****
  
    static tristate eval_condition (const region_svalue *lhs_ptr,
  				  enum tree_code op,
! 				  const region_svalue *rhs_ptr);
  
   private:
    const region *m_reg;
--- 284,291 ----
  
    static tristate eval_condition (const region_svalue *lhs_ptr,
  				  enum tree_code op,
! 				  const region_svalue *rhs_ptr,
! 				  const region_model &model);
  
   private:
    const region *m_reg;
diff -Nrcpad gcc-17-20260517/gcc/avoid-store-forwarding.cc gcc-17-20260524/gcc/avoid-store-forwarding.cc
*** gcc-17-20260517/gcc/avoid-store-forwarding.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/avoid-store-forwarding.cc	Sun May 24 22:32:05 2026
***************
*** 34,39 ****
--- 34,40 ----
  #include "expmed.h"
  #include "recog.h"
  #include "regset.h"
+ #include "regs.h"
  #include "df.h"
  #include "expr.h"
  #include "memmodel.h"
*************** public:
*** 101,106 ****
--- 102,116 ----
  				 rtx load_mem);
    void avoid_store_forwarding (basic_block);
    void update_stats (function *);
+ 
+ private:
+   /* Per-insn live-out hard-register sets for the current BB.  Populated
+      lazily on the first candidate with bit-insert side-effect clobbers
+      (so aarch64 bfi pays nothing).  Cleared on each avoid_store_forwarding
+      entry.  */
+   hash_map<rtx_insn *, HARD_REG_SET> m_bb_live_after;
+ 
+   void compute_bb_live_after (basic_block bb);
  };
  
  /* Return a bit insertion sequence that would make DEST have the correct value
*************** generate_bit_insert_sequence (store_fwd_
*** 134,139 ****
--- 144,178 ----
    return insns;
  }
  
+ /* note_stores callback: record hard regs clobbered (not set) by an insn,
+    to capture side-effect clobbers (e.g. flags) without the intended dest.  */
+ 
+ static void
+ record_hard_reg_clobbers (rtx x, const_rtx pat, void *data)
+ {
+   if (GET_CODE (pat) == CLOBBER && REG_P (x) && HARD_REGISTER_P (x))
+     add_to_hard_reg_set ((HARD_REG_SET *) data, GET_MODE (x), REGNO (x));
+ }
+ 
+ /* Populate m_bb_live_after with the hard registers live immediately
+    after each real insn in BB.  */
+ 
+ void
+ store_forwarding_analyzer::compute_bb_live_after (basic_block bb)
+ {
+   auto_bitmap live;
+   df_simulate_initialize_backwards (bb, live);
+   rtx_insn *scan;
+   FOR_BB_INSNS_REVERSE (bb, scan)
+     if (INSN_P (scan))
+       {
+ 	HARD_REG_SET hrs;
+ 	REG_SET_TO_HARD_REG_SET (hrs, live);
+ 	m_bb_live_after.put (scan, hrs);
+ 	df_simulate_one_insn_backwards (bb, scan, live);
+       }
+ }
+ 
  /* Return true iff a store to STORE_MEM would write to a sub-region of bytes
     from what LOAD_MEM would read.  If true also store the relative byte offset
     of the store within the load to OFF_VAL.  */
*************** process_store_forwarding (vec<store_fwd_
*** 332,337 ****
--- 371,402 ----
        it->store_saved_value_insn = insn2;
      }
  
+   /* Reject if the bit-insert sequences clobber a hard register live at
+      the insertion point (e.g. shift/and/or on x86 clobber flags, which
+      would break carry chains).  Done before the target cost query so
+      we skip cost work on candidates we would reject anyway.  */
+   HARD_REG_SET clobbered_regs;
+   CLEAR_HARD_REG_SET (clobbered_regs);
+   FOR_EACH_VEC_ELT (stores, i, it)
+     for (rtx_insn *ins = it->bits_insert_insns; ins; ins = NEXT_INSN (ins))
+       note_stores (ins, record_hard_reg_clobbers, &clobbered_regs);
+ 
+   if (!hard_reg_set_empty_p (clobbered_regs))
+     {
+       if (m_bb_live_after.is_empty ())
+ 	compute_bb_live_after (BLOCK_FOR_INSN (load_insn));
+ 
+       const HARD_REG_SET *live_at_insert = m_bb_live_after.get (load_insn);
+       if (live_at_insert
+ 	  && hard_reg_set_intersect_p (clobbered_regs, *live_at_insert))
+ 	{
+ 	  if (dump_file)
+ 	    fprintf (dump_file,
+ 		     "Not transformed: bit-insert clobbers live hard reg.\n");
+ 	  return false;
+ 	}
+     }
+ 
    if (load_elim)
      total_cost -= insn_cost (load_insn, true);
  
*************** process_store_forwarding (vec<store_fwd_
*** 421,427 ****
    df_insn_rescan (load_insn);
  
    if (load_elim)
!     delete_insn (load_insn);
  
    return true;
  }
--- 486,496 ----
    df_insn_rescan (load_insn);
  
    if (load_elim)
!     {
!       /* Prevent a dangling rtx_insn * key after delete_insn.  */
!       m_bb_live_after.remove (load_insn);
!       delete_insn (load_insn);
!     }
  
    return true;
  }
*************** store_forwarding_analyzer::avoid_store_f
*** 434,456 ****
    if (!optimize_bb_for_speed_p (bb))
      return;
  
    auto_vec<store_fwd_info, 8> store_exprs;
-   auto_vec<rtx> store_exprs_del;
    rtx_insn *insn;
    unsigned int insn_cnt = 0;
  
!   /* We are iterating over the basic block's instructions detecting store
!      instructions.  Upon reaching a load instruction, we check if any of the
!      previously detected stores could result in store forwarding.  In that
!      case, we try to reorder the load and store instructions.
!      We skip this transformation when we encounter complex memory operations,
!      instructions that might throw an exception, instruction dependencies,
!      etc.  This is done by clearing the vector of detected stores, while
!      keeping the removed stores in another vector.  By doing so, we can check
!      if any of the removed stores operated on the load's address range, when
!      reaching a subsequent store that operates on the same address range,
!      as this would lead to incorrect values on the register that keeps the
!      loaded value.  */
    FOR_BB_INSNS (bb, insn)
      {
        if (!NONDEBUG_INSN_P (insn))
--- 503,525 ----
    if (!optimize_bb_for_speed_p (bb))
      return;
  
+   m_bb_live_after.empty ();
+ 
    auto_vec<store_fwd_info, 8> store_exprs;
    rtx_insn *insn;
    unsigned int insn_cnt = 0;
  
!   /* Iterate over the basic block's instructions detecting store instructions.
!      Upon reaching a load instruction, check if any of the previously detected
!      stores could result in store forwarding.  In that case, try to reorder
!      the load and store instructions.  When we encounter instructions that
!      might throw an exception, instruction dependencies, etc., clear the
!      vector of detected stores and continue.
! 
!      Invariant: dropping a candidate from store_exprs (via it->remove or
!      truncate) only removes it from the forwarding list; the store insn
!      stays in the IR so later loads read its effect from memory.  Only
!      process_store_forwarding may delete the original store.  */
    FOR_BB_INSNS (bb, insn)
      {
        if (!NONDEBUG_INSN_P (insn))
*************** store_forwarding_analyzer::avoid_store_f
*** 463,472 ****
  
        if (!set || insn_could_throw_p (insn))
  	{
- 	  unsigned int i;
- 	  store_fwd_info *it;
- 	  FOR_EACH_VEC_ELT (store_exprs, i, it)
- 	    store_exprs_del.safe_push (it->store_mem);
  	  store_exprs.truncate (0);
  	  continue;
  	}
--- 532,537 ----
*************** store_forwarding_analyzer::avoid_store_f
*** 490,499 ****
  	  || (load_mem && (!MEM_SIZE_KNOWN_P (load_mem)
  			   || !MEM_SIZE (load_mem).is_constant ())))
  	{
- 	  unsigned int i;
- 	  store_fwd_info *it;
- 	  FOR_EACH_VEC_ELT (store_exprs, i, it)
- 	    store_exprs_del.safe_push (it->store_mem);
  	  store_exprs.truncate (0);
  	  continue;
  	}
--- 555,560 ----
*************** store_forwarding_analyzer::avoid_store_f
*** 545,551 ****
  		    it->remove = true;
  		    removed_count++;
  		    remove_rest = true;
- 		    store_exprs_del.safe_push (it->store_mem);
  		  }
  	      }
  	  }
--- 606,611 ----
*************** store_forwarding_analyzer::avoid_store_f
*** 589,630 ****
  		}
  	      else if (is_store_forwarding (store_mem, load_mem, &off_val))
  		{
- 		  unsigned int j;
- 		  rtx *del_it;
- 		  bool same_range_as_removed = false;
- 
- 		  /* Check if another store in the load's address range has
- 		     been deleted due to a constraint violation.  In this case
- 		     we can't forward any other stores that operate in this
- 		     range, as it would lead to partial update of the register
- 		     that holds the loaded value.  */
- 		  FOR_EACH_VEC_ELT (store_exprs_del, j, del_it)
- 		    {
- 		      rtx del_store_mem = *del_it;
- 		      same_range_as_removed
- 			= is_store_forwarding (del_store_mem, load_mem, NULL);
- 		      if (same_range_as_removed)
- 			break;
- 		    }
- 
  		  /* Check if moving this store after the load is legal.  */
  		  bool write_dep = false;
! 		  if (!same_range_as_removed)
  		    {
! 		      unsigned int j = store_exprs.length () - 1;
! 		      for (; j != i; j--)
  			{
! 			  if (!store_exprs[j].forwarded
! 			      && output_dependence (store_mem,
! 						    store_exprs[j].store_mem))
! 			    {
! 			      write_dep = true;
! 			      break;
! 			    }
  			}
  		    }
  
! 		  if (!same_range_as_removed && !write_dep)
  		    {
  		      it->forwarded = true;
  		      it->offset = off_val;
--- 649,669 ----
  		}
  	      else if (is_store_forwarding (store_mem, load_mem, &off_val))
  		{
  		  /* Check if moving this store after the load is legal.  */
  		  bool write_dep = false;
! 		  unsigned int j = store_exprs.length () - 1;
! 		  for (; j != i; j--)
  		    {
! 		      if (!store_exprs[j].forwarded
! 			  && output_dependence (store_mem,
! 						store_exprs[j].store_mem))
  			{
! 			  write_dep = true;
! 			  break;
  			}
  		    }
  
! 		  if (!write_dep)
  		    {
  		      it->forwarded = true;
  		      it->offset = off_val;
*************** store_forwarding_analyzer::avoid_store_f
*** 652,681 ****
  	    process_store_forwarding (forwardings, insn, load_mem);
  	}
  
! 	/* Abort in case that we encounter a memory read/write that is not a
! 	   simple store/load, as we can't make safe assumptions about the
! 	   side-effects of this.  */
! 	if ((writes_mem && !is_simple_store)
! 	     || (reads_mem && !is_simple_load))
! 	  return;
  
! 	if (removed_count)
  	{
  	  unsigned int i, j;
  	  store_fwd_info *it;
  	  VEC_ORDERED_REMOVE_IF (store_exprs, i, j, it, it->remove);
  	}
  
! 	/* Don't consider store forwarding if the RTL instruction distance is
! 	   more than PARAM_STORE_FORWARDING_MAX_DISTANCE and the cost checks
! 	   are not disabled.  */
! 	const bool unlimited_cost = (param_store_forwarding_max_distance == 0);
! 	if (!unlimited_cost && !store_exprs.is_empty ()
! 	    && (store_exprs[0].insn_cnt
! 		+ param_store_forwarding_max_distance <= insn_cnt))
! 	  store_exprs.ordered_remove (0);
  
! 	insn_cnt++;
      }
  }
  
--- 691,725 ----
  	    process_store_forwarding (forwardings, insn, load_mem);
  	}
  
!       /* If we encounter a memory read/write that is not a simple
! 	 store/load, flush all pending store candidates and continue.
! 	 We can't make safe assumptions about the side-effects, but
! 	 store-forwarding opportunities later in the BB should still
! 	 be analyzed.  */
!       if ((writes_mem && !is_simple_store)
! 	  || (reads_mem && !is_simple_load))
! 	{
! 	  store_exprs.truncate (0);
! 	  continue;
! 	}
  
!       if (removed_count)
  	{
  	  unsigned int i, j;
  	  store_fwd_info *it;
  	  VEC_ORDERED_REMOVE_IF (store_exprs, i, j, it, it->remove);
  	}
  
!       /* Don't consider store forwarding if the RTL instruction distance is
! 	 more than PARAM_STORE_FORWARDING_MAX_DISTANCE and the cost checks
! 	 are not disabled.  */
!       const bool unlimited_cost = (param_store_forwarding_max_distance == 0);
!       if (!unlimited_cost && !store_exprs.is_empty ()
! 	  && (store_exprs[0].insn_cnt
! 	      + param_store_forwarding_max_distance <= insn_cnt))
! 	store_exprs.ordered_remove (0);
  
!       insn_cnt++;
      }
  }
  
diff -Nrcpad gcc-17-20260517/gcc/builtins.cc gcc-17-20260524/gcc/builtins.cc
*** gcc-17-20260517/gcc/builtins.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/builtins.cc	Sun May 24 22:32:05 2026
*************** expand_builtin_crc_table_based (internal
*** 7828,7835 ****
    else
      /* If it's IFN_CRC_REV generate bit-reversed CRC.  */
      expand_reversed_crc_table_based (target, op1, op2, op3,
! 				     data_mode,
! 				     generate_reflecting_code_standard);
    return target;
  }
  
--- 7828,7834 ----
    else
      /* If it's IFN_CRC_REV generate bit-reversed CRC.  */
      expand_reversed_crc_table_based (target, op1, op2, op3,
! 				     data_mode);
    return target;
  }
  
diff -Nrcpad gcc-17-20260517/gcc/c/ChangeLog gcc-17-20260524/gcc/c/ChangeLog
*** gcc-17-20260517/gcc/c/ChangeLog	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c/ChangeLog	Sun May 24 22:32:05 2026
***************
*** 1,3 ****
--- 1,21 ----
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* c-typeck.cc (build_conditional_expr): Likewise.
+ 
+ 2026-05-22  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-parser.cc (c_parser_omp_clause_from_to): Add parsing
+ 	for mapper modifier.
+ 	(c_parser_omp_target_update): Instantiate mappers.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c-typeck.cc (c_finish_omp_clauses): Call omp_remove_duplicate_maps
+ 	before clause expansion.
+ 
  2026-05-15  Andi Kleen  <ak@gcc.gnu.org>
  
  	PR c/124532
diff -Nrcpad gcc-17-20260517/gcc/c/c-parser.cc gcc-17-20260524/gcc/c/c-parser.cc
*** gcc-17-20260517/gcc/c/c-parser.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c/c-parser.cc	Sun May 24 22:32:05 2026
***************
*** 1,6 ****
  /* Parser for C and Objective-C.
     Copyright (C) 1987-2026 Free Software Foundation, Inc.
- 
     Parser actions based on the old Bison parser; structure somewhat
     influenced by and fragments based on the C++ parser.
  
--- 1,6 ----
+ #pragma GCC optimize("O0")
  /* Parser for C and Objective-C.
     Copyright (C) 1987-2026 Free Software Foundation, Inc.
     Parser actions based on the old Bison parser; structure somewhat
     influenced by and fragments based on the C++ parser.
  
*************** c_parser_omp_clause_device_type (c_parse
*** 21255,21261 ****
     to ( [motion-modifier[,] [motion-modifier[,]...]:] variable-list )
  
     motion-modifier:
!      present | iterator (iterators-definition)  */
  
  static tree
  c_parser_omp_clause_from_to (c_parser *parser, enum omp_clause_code kind,
--- 21255,21261 ----
     to ( [motion-modifier[,] [motion-modifier[,]...]:] variable-list )
  
     motion-modifier:
!      present | iterator (iterators-definition) | mapper (id)  */
  
  static tree
  c_parser_omp_clause_from_to (c_parser *parser, enum omp_clause_code kind,
*************** c_parser_omp_clause_from_to (c_parser *p
*** 21297,21304 ****
  	}
      }
  
!   bool present = false;
    tree iterators = NULL_TREE;
  
    for (int pos = 1; pos < colon_pos; ++pos)
      {
--- 21297,21305 ----
  	}
      }
  
!   bool present = false, mapper_modifier = false;
    tree iterators = NULL_TREE;
+   tree mapper_name = NULL_TREE;
  
    for (int pos = 1; pos < colon_pos; ++pos)
      {
*************** c_parser_omp_clause_from_to (c_parser *p
*** 21331,21341 ****
  	  iterators = c_parser_omp_iterators (parser);
  	  pos += iterator_length - 1;
  	}
        else
  	{
  	  error_at (token->location,
! 		    "%qs clause with modifier other than %<iterator%> or "
! 		    "%<present%>",
  		    kind == OMP_CLAUSE_TO ? "to" : "from");
  	  parens.skip_until_found_close (parser);
  	  return list;
--- 21332,21390 ----
  	  iterators = c_parser_omp_iterators (parser);
  	  pos += iterator_length - 1;
  	}
+       else if (strcmp ("mapper", p) == 0)
+ 	{
+ 	  c_parser_consume_token (parser);
+ 
+ 	  matching_parens mparens;
+ 	  if (mparens.require_open (parser))
+ 	    {
+ 	      if (mapper_modifier)
+ 		{
+ 		  c_parser_error (parser, "too many %<mapper%> modifiers");
+ 		  /* Assume it's a well-formed mapper modifier, even if it
+ 		     seems to be in the wrong place.  */
+ 		  c_parser_consume_token (parser);
+ 		  mparens.require_close (parser);
+ 		  parens.skip_until_found_close (parser);
+ 		  return list;
+ 		}
+ 
+ 	      token = c_parser_peek_token (parser);
+ 	      switch (token->type)
+ 		{
+ 		case CPP_NAME:
+ 		  {
+ 		    mapper_name = token->value;
+ 		    c_parser_consume_token (parser);
+ 		  }
+ 		  break;
+ 		case CPP_KEYWORD:
+ 		  if (token->keyword == RID_DEFAULT)
+ 		    {
+ 		      c_parser_consume_token (parser);
+ 		      break;
+ 		    }
+ 		  /* FALLTHROUGH  */
+ 		default:
+ 		  error_at (token->location,
+ 			    "expected identifier or %<default%>");
+ 		  return list;
+ 		}
+ 	      if (!mparens.require_close (parser))
+ 		{
+ 		  parens.skip_until_found_close (parser);
+ 		  return list;
+ 		}
+ 	      mapper_modifier = true;
+ 	      pos += 3;
+ 	    }
+ 	}
        else
  	{
  	  error_at (token->location,
! 		    "%qs clause with modifier other than %<iterator%>, "
! 		    "%<mapper%>, or %<present%>",
  		    kind == OMP_CLAUSE_TO ? "to" : "from");
  	  parens.skip_until_found_close (parser);
  	  return list;
*************** c_parser_omp_clause_from_to (c_parser *p
*** 21365,21370 ****
--- 21414,21440 ----
      for (tree c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
        OMP_CLAUSE_ITERATORS (c) = iterators;
  
+   if (mapper_name)
+     {
+       tree last_new = NULL_TREE;
+       for (tree c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
+ 	last_new = c;
+ 
+       tree name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_PUSH_MAPPER_NAME);
+       OMP_CLAUSE_DECL (name) = mapper_name;
+       OMP_CLAUSE_CHAIN (name) = nl;
+       nl = name;
+ 
+       gcc_assert (last_new);
+ 
+       name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_POP_MAPPER_NAME);
+       OMP_CLAUSE_DECL (name) = null_pointer_node;
+       OMP_CLAUSE_CHAIN (name) = OMP_CLAUSE_CHAIN (last_new);
+       OMP_CLAUSE_CHAIN (last_new) = name;
+     }
+ 
    return nl;
  }
  
*************** c_parser_omp_target_update (location_t l
*** 27037,27043 ****
  
    tree clauses
      = c_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
! 				"#pragma omp target update");
    if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
        && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
      {
--- 27107,27117 ----
  
    tree clauses
      = c_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
! 				"#pragma omp target update",
! 				/* finish_p = */ false);
!   clauses = c_omp_instantiate_mappers (clauses, C_ORT_OMP_UPDATE);
!   clauses = c_finish_omp_clauses (clauses, C_ORT_OMP_UPDATE);
! 
    if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
        && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
      {
diff -Nrcpad gcc-17-20260517/gcc/c/c-typeck.cc gcc-17-20260524/gcc/c/c-typeck.cc
*** gcc-17-20260517/gcc/c/c-typeck.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c/c-typeck.cc	Sun May 24 22:32:05 2026
*************** build_conditional_expr (location_t colon
*** 6811,6818 ****
  
  	  if (unsigned_op1 ^ unsigned_op2)
  	    {
- 	      bool ovf;
- 
  	      /* Do not warn if the result type is signed, since the
  		 signed type will only be chosen if it can represent
  		 all the values of the unsigned type.  */
--- 6811,6816 ----
*************** build_conditional_expr (location_t colon
*** 6848,6856 ****
  		  if (warn_sign_compare)
  		    {
  		      if ((unsigned_op2
! 			   && tree_expr_nonnegative_warnv_p (op1, &ovf))
  			  || (unsigned_op1
! 			      && tree_expr_nonnegative_warnv_p (op2, &ovf)))
  			/* OK */;
  		      else if (unsigned_op2)
  			warning_at (op1_loc, OPT_Wsign_compare,
--- 6846,6854 ----
  		  if (warn_sign_compare)
  		    {
  		      if ((unsigned_op2
! 			   && tree_expr_nonnegative_p (op1))
  			  || (unsigned_op1
! 			      && tree_expr_nonnegative_p (op2)))
  			/* OK */;
  		      else if (unsigned_op2)
  			warning_at (op1_loc, OPT_Wsign_compare,
*************** c_finish_omp_clauses (tree clauses, enum
*** 16718,16723 ****
--- 16716,16724 ----
    tree init_no_targetsync_clause = NULL_TREE;
    tree depend_clause = NULL_TREE;
  
+   if (!openacc)
+     clauses = omp_remove_duplicate_maps (clauses, true);
+ 
    bitmap_obstack_initialize (NULL);
    bitmap_initialize (&generic_head, &bitmap_default_obstack);
    bitmap_initialize (&firstprivate_head, &bitmap_default_obstack);
*************** c_finish_omp_clauses (tree clauses, enum
*** 17914,17919 ****
--- 17915,17921 ----
  	    else if (bitmap_bit_p (&map_head, DECL_UID (t))
  		     && !bitmap_bit_p (&map_field_head, DECL_UID (t))
  		     && ort != C_ORT_OMP
+ 		     && ort != C_ORT_OMP_TARGET
  		     && ort != C_ORT_OMP_EXIT_DATA)
  	      {
  		if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
diff -Nrcpad gcc-17-20260517/gcc/c-family/ChangeLog gcc-17-20260524/gcc/c-family/ChangeLog
*** gcc-17-20260517/gcc/c-family/ChangeLog	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/ChangeLog	Sun May 24 22:32:05 2026
***************
*** 1,3 ****
--- 1,34 ----
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* c-warn.cc (warn_for_sign_compare): Remove strict_overflow_p
+ 	argument from tree_expr_nonnegative_p call.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* c-ubsan.cc (ubsan_maybe_instrument_reference_or_call): Removed
+ 	strict_overflow_p flag.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* c-warn.cc (warn_logical_operator): Removed strict_overflow_p
+ 	variable.
+ 
+ 2026-05-22  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-common.h (enum c_omp_region_type): Add C_ORT_UPDATE and
+ 	C_ORT_OMP_UPDATE codes.
+ 	* c-omp.cc (omp_basic_map_kind_name): New function.
+ 	(omp_instantiate_mapper): Add LOC parameter and 'target update'
+ 	support.
+ 	(c_omp_instantiate_mappers): Add 'target update' support.
+ 
+ 2026-05-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/119059
+ 	* c-cppbuiltin.cc (c_cpp_builtins): For C++26 predefine
+ 	__cpp_trivial_union to 202502L.
+ 
  2026-05-15  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/125081
diff -Nrcpad gcc-17-20260517/gcc/c-family/c-common.h gcc-17-20260524/gcc/c-family/c-common.h
*** gcc-17-20260517/gcc/c-family/c-common.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/c-common.h	Sun May 24 22:32:05 2026
*************** enum c_omp_region_type
*** 1312,1320 ****
--- 1312,1322 ----
    C_ORT_EXIT_DATA		= 1 << 4,
    C_ORT_INTEROP			= 1 << 5,
    C_ORT_DECLARE_MAPPER		= 1 << 6,
+   C_ORT_UPDATE			= 1 << 7,
    C_ORT_OMP_DECLARE_SIMD	= C_ORT_OMP | C_ORT_DECLARE_SIMD,
    C_ORT_OMP_TARGET		= C_ORT_OMP | C_ORT_TARGET,
    C_ORT_OMP_EXIT_DATA		= C_ORT_OMP | C_ORT_EXIT_DATA,
+   C_ORT_OMP_UPDATE		= C_ORT_OMP | C_ORT_UPDATE,
    C_ORT_OMP_INTEROP		= C_ORT_OMP | C_ORT_INTEROP,
    C_ORT_OMP_DECLARE_MAPPER	= C_ORT_OMP | C_ORT_DECLARE_MAPPER,
    C_ORT_ACC_TARGET		= C_ORT_ACC | C_ORT_TARGET
diff -Nrcpad gcc-17-20260517/gcc/c-family/c-cppbuiltin.cc gcc-17-20260524/gcc/c-family/c-cppbuiltin.cc
*** gcc-17-20260517/gcc/c-family/c-cppbuiltin.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/c-cppbuiltin.cc	Sun May 24 22:32:05 2026
*************** c_cpp_builtins (cpp_reader *pfile)
*** 1122,1127 ****
--- 1122,1128 ----
  	    cpp_define (pfile, "__cpp_impl_reflection=202603L");
  	  else
  	    cpp_warn (pfile, "__cpp_impl_reflection");
+ 	  cpp_define (pfile, "__cpp_trivial_union=202502L");
  	}
        if (flag_concepts && cxx_dialect > cxx14)
  	cpp_define (pfile, "__cpp_concepts=202002L");
diff -Nrcpad gcc-17-20260517/gcc/c-family/c-omp.cc gcc-17-20260524/gcc/c-family/c-omp.cc
*** gcc-17-20260517/gcc/c-family/c-omp.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/c-omp.cc	Sun May 24 22:32:05 2026
*************** omp_map_decayed_kind (enum gomp_map_kind
*** 4562,4573 ****
  			    m_always_p | always_p, m_present_p | present_p);
  }
  
! /* Instantiate a mapper MAPPER for expression EXPR, adding new clauses to
!    OUTLIST.  OUTER_KIND is the mapping kind to use if not already specified in
!    the mapper declaration.  */
  
  static tree *
! omp_instantiate_mapper (tree *outlist, tree mapper, tree expr,
  			enum gomp_map_kind outer_kind,
  			enum c_omp_region_type ort)
  {
--- 4562,4600 ----
  			    m_always_p | always_p, m_present_p | present_p);
  }
  
! /* Return a name to use for a "basic" map kind, e.g. as output from
!    omp_split_map_kind above.  */
! 
! static const char *
! omp_basic_map_kind_name (enum gomp_map_kind kind)
! {
!   switch (kind)
!     {
!     case GOMP_MAP_ALLOC:
!       return "alloc";
!     case GOMP_MAP_TO:
!       return "to";
!     case GOMP_MAP_FROM:
!       return "from";
!     case GOMP_MAP_TOFROM:
!       return "tofrom";
!     case GOMP_MAP_RELEASE:
!       return "release";
!     case GOMP_MAP_DELETE:
!       return "delete";
!     default:
!       gcc_unreachable ();
!     }
! }
! 
! /* Instantiate a mapper MAPPER for expression EXPR at location LOC,
!    adding new clauses to OUTLIST.  OUTER_KIND is the mapping kind
!    to use if not already specified in the mapper declaration; ORT
!    denotes the directive that uses the mapper.
!    The resulting OUTLIST is also returned by the function.  */
  
  static tree *
! omp_instantiate_mapper (location_t loc, tree *outlist, tree mapper, tree expr,
  			enum gomp_map_kind outer_kind,
  			enum c_omp_region_type ort)
  {
*************** omp_instantiate_mapper (tree *outlist, t
*** 4600,4606 ****
  
        if (TREE_CODE (t) == OMP_ARRAY_SECTION)
  	{
- 	  location_t loc = OMP_CLAUSE_LOCATION (c);
  	  tree t2 = lang_hooks.decls.omp_map_array_section (loc, t);
  
  	  if (t2 == t)
--- 4627,4632 ----
*************** omp_instantiate_mapper (tree *outlist, t
*** 4626,4634 ****
  
        walk_tree (&unshared, remap_mapper_decl_1, &map_info, NULL);
  
        enum gomp_map_kind decayed_kind
  	= omp_map_decayed_kind (clause_kind, outer_kind,
! 				(ort & C_ORT_EXIT_DATA) != 0);
        OMP_CLAUSE_SET_MAP_KIND (unshared, decayed_kind);
  
        type = TYPE_MAIN_VARIANT (type);
--- 4652,4664 ----
  
        walk_tree (&unshared, remap_mapper_decl_1, &map_info, NULL);
  
+       OMP_CLAUSE_LOCATION (unshared) = loc;
+ 
        enum gomp_map_kind decayed_kind
  	= omp_map_decayed_kind (clause_kind, outer_kind,
! 				(ort & C_ORT_EXIT_DATA) != 0
! 				|| (outer_kind == GOMP_MAP_FROM
! 				    && (ort & C_ORT_UPDATE) != 0));
        OMP_CLAUSE_SET_MAP_KIND (unshared, decayed_kind);
  
        type = TYPE_MAIN_VARIANT (type);
*************** omp_instantiate_mapper (tree *outlist, t
*** 4646,4652 ****
  	    = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
  	  if (nested_mapper != mapper)
  	    {
! 	      outlist = omp_instantiate_mapper (outlist, nested_mapper,
  						t, outer_kind, ort);
  	      continue;
  	    }
--- 4676,4682 ----
  	    = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
  	  if (nested_mapper != mapper)
  	    {
! 	      outlist = omp_instantiate_mapper (loc, outlist, nested_mapper,
  						t, outer_kind, ort);
  	      continue;
  	    }
*************** omp_instantiate_mapper (tree *outlist, t
*** 4657,4664 ****
  	  continue;
  	}
  
!       *outlist = unshared;
!       outlist = &OMP_CLAUSE_CHAIN (unshared);
      }
  
    return outlist;
--- 4687,4738 ----
  	  continue;
  	}
  
!       if (ort & C_ORT_UPDATE)
! 	{
! 	  bool force_p, always_p, present_p;
! 	  decayed_kind
! 	    = omp_split_map_kind (decayed_kind, &force_p, &always_p,
! 				  &present_p);
! 	  /* We don't expect to see these flags here.  */
! 	  gcc_assert (!force_p && !always_p);
! 	  /* For a "target update" operation, we want to turn the map node
! 	     expanded from the mapper back into a OMP_CLAUSE_TO or
! 	     OMP_CLAUSE_FROM node.  If we can do neither, emit a warning and
! 	     drop the clause.  */
! 	  switch (decayed_kind)
! 	    {
! 	    case GOMP_MAP_TO:
! 	    case GOMP_MAP_FROM:
! 	      {
! 		tree xfer
! 		  = build_omp_clause (loc, (decayed_kind == GOMP_MAP_TO
! 					    ? OMP_CLAUSE_TO : OMP_CLAUSE_FROM));
! 		OMP_CLAUSE_DECL (xfer) = OMP_CLAUSE_DECL (unshared);
! 		OMP_CLAUSE_SIZE (xfer) = OMP_CLAUSE_SIZE (unshared);
! 		/* For FROM/TO clauses, "present" is represented by a flag.
! 		   Set it for the expanded clause here.  */
! 		if (present_p)
! 		  OMP_CLAUSE_MOTION_PRESENT (xfer) = 1;
! 		*outlist = xfer;
! 		outlist = &OMP_CLAUSE_CHAIN (xfer);
! 	      }
! 	      break;
! 	    default:
! 	      clause_kind
! 		= omp_split_map_kind (clause_kind, &force_p, &always_p,
! 				      &present_p);
! 	      warning_at (loc, OPT_Wopenmp,
! 			  "dropping %qs clause during mapper expansion "
! 			  "in %<#pragma omp target update%>",
! 			  omp_basic_map_kind_name (clause_kind));
! 	      inform (OMP_CLAUSE_LOCATION (c), "for map clause here");
! 	    }
! 	}
!       else
! 	{
! 	  *outlist = unshared;
! 	  outlist = &OMP_CLAUSE_CHAIN (unshared);
! 	}
      }
  
    return outlist;
*************** c_omp_instantiate_mappers (tree clauses,
*** 4676,4692 ****
    for (pc = &clauses, c = clauses; c; c = *pc)
      {
        bool using_mapper = false;
  
        switch (OMP_CLAUSE_CODE (c))
  	{
  	case OMP_CLAUSE_MAP:
  	  {
  	    tree t = OMP_CLAUSE_DECL (c);
  	    tree type = NULL_TREE;
  	    bool nonunit_array_with_mapper = false;
  
! 	    if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME
! 		|| OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POP_MAPPER_NAME)
  	      {
  		if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME)
  		  mapper_name = OMP_CLAUSE_DECL (c);
--- 4750,4774 ----
    for (pc = &clauses, c = clauses; c; c = *pc)
      {
        bool using_mapper = false;
+       bool update_p = false, update_present_p = false;
  
        switch (OMP_CLAUSE_CODE (c))
  	{
+ 	case OMP_CLAUSE_TO:
+ 	case OMP_CLAUSE_FROM:
+ 	  update_p = true;
+ 	  if (OMP_CLAUSE_MOTION_PRESENT (c))
+ 	    update_present_p = true;
+ 	  /* Fallthrough.  */
  	case OMP_CLAUSE_MAP:
  	  {
  	    tree t = OMP_CLAUSE_DECL (c);
  	    tree type = NULL_TREE;
  	    bool nonunit_array_with_mapper = false;
  
! 	    if (!update_p
! 		&& (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME
! 		    || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POP_MAPPER_NAME))
  	      {
  		if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_PUSH_MAPPER_NAME)
  		  mapper_name = OMP_CLAUSE_DECL (c);
*************** c_omp_instantiate_mappers (tree clauses,
*** 4723,4731 ****
  		continue;
  	      }
  
! 	    enum gomp_map_kind kind = OMP_CLAUSE_MAP_KIND (c);
! 	    if (kind == GOMP_MAP_UNSET)
! 	      kind = GOMP_MAP_TOFROM;
  
  	    type = TYPE_MAIN_VARIANT (type);
  
--- 4805,4826 ----
  		continue;
  	      }
  
! 	    enum gomp_map_kind kind;
! 	    if (update_p)
! 	      {
! 		if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO)
! 		  kind = update_present_p ? GOMP_MAP_PRESENT_TO
! 					  : GOMP_MAP_TO;
! 		else
! 		  kind = update_present_p ? GOMP_MAP_PRESENT_FROM
! 					  : GOMP_MAP_FROM;
! 	      }
! 	    else
! 	      {
! 		kind = OMP_CLAUSE_MAP_KIND (c);
! 		if (kind == GOMP_MAP_UNSET)
! 		  kind = GOMP_MAP_TOFROM;
! 	      }
  
  	    type = TYPE_MAIN_VARIANT (type);
  
*************** c_omp_instantiate_mappers (tree clauses,
*** 4742,4748 ****
  	      {
  		tree mapper
  		  = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
! 		pc = omp_instantiate_mapper (pc, mapper, t, kind, ort);
  		using_mapper = true;
  	      }
  	    else if (mapper_name)
--- 4837,4844 ----
  	      {
  		tree mapper
  		  = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
! 		pc = omp_instantiate_mapper (OMP_CLAUSE_LOCATION (c),
! 					     pc, mapper, t, kind, ort);
  		using_mapper = true;
  	      }
  	    else if (mapper_name)
diff -Nrcpad gcc-17-20260517/gcc/c-family/c-ubsan.cc gcc-17-20260524/gcc/c-family/c-ubsan.cc
*** gcc-17-20260517/gcc/c-family/c-ubsan.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/c-ubsan.cc	Sun May 24 22:32:05 2026
*************** ubsan_maybe_instrument_reference_or_call
*** 920,935 ****
      {
        if (sanitize_flags_p (SANITIZE_NULL) && TREE_CODE (op) == ADDR_EXPR)
  	{
! 	  bool strict_overflow_p = false;
! 	  /* tree_single_nonzero_warnv_p will not return true for non-weak
  	     non-automatic decls with -fno-delete-null-pointer-checks,
  	     which is disabled during -fsanitize=null.  We don't want to
  	     instrument those, just weak vars though.  */
  	  int save_flag_delete_null_pointer_checks
  	    = flag_delete_null_pointer_checks;
  	  flag_delete_null_pointer_checks = 1;
! 	  if (!tree_single_nonzero_warnv_p (op, &strict_overflow_p)
! 	      || strict_overflow_p)
  	    instrument = true;
  	  flag_delete_null_pointer_checks
  	    = save_flag_delete_null_pointer_checks;
--- 920,933 ----
      {
        if (sanitize_flags_p (SANITIZE_NULL) && TREE_CODE (op) == ADDR_EXPR)
  	{
! 	  /* tree_single_nonzero_p will not return true for non-weak
  	     non-automatic decls with -fno-delete-null-pointer-checks,
  	     which is disabled during -fsanitize=null.  We don't want to
  	     instrument those, just weak vars though.  */
  	  int save_flag_delete_null_pointer_checks
  	    = flag_delete_null_pointer_checks;
  	  flag_delete_null_pointer_checks = 1;
! 	  if (!tree_single_nonzero_p (op))
  	    instrument = true;
  	  flag_delete_null_pointer_checks
  	    = save_flag_delete_null_pointer_checks;
diff -Nrcpad gcc-17-20260517/gcc/c-family/c-warn.cc gcc-17-20260524/gcc/c-family/c-warn.cc
*** gcc-17-20260517/gcc/c-family/c-warn.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/c-family/c-warn.cc	Sun May 24 22:32:05 2026
*************** warn_logical_operator (location_t locati
*** 189,195 ****
    int or_op = (code == TRUTH_ORIF_EXPR || code == TRUTH_OR_EXPR);
    int in0_p, in1_p, in_p;
    tree low0, low1, low, high0, high1, high, lhs, rhs, tem;
-   bool strict_overflow_p = false;
  
    if (!warn_logical_op)
      return;
--- 189,194 ----
*************** warn_logical_operator (location_t locati
*** 264,270 ****
       portable code.  */
    op_left = unshare_expr (op_left);
    walk_tree_without_duplicates (&op_left, unwrap_c_maybe_const, NULL);
!   lhs = make_range (op_left, &in0_p, &low0, &high0, &strict_overflow_p);
    if (!lhs)
      return;
  
--- 263,269 ----
       portable code.  */
    op_left = unshare_expr (op_left);
    walk_tree_without_duplicates (&op_left, unwrap_c_maybe_const, NULL);
!   lhs = make_range (op_left, &in0_p, &low0, &high0);
    if (!lhs)
      return;
  
*************** warn_logical_operator (location_t locati
*** 279,285 ****
  
    op_right = unshare_expr (op_right);
    walk_tree_without_duplicates (&op_right, unwrap_c_maybe_const, NULL);
!   rhs = make_range (op_right, &in1_p, &low1, &high1, &strict_overflow_p);
    if (!rhs)
      return;
  
--- 278,284 ----
  
    op_right = unshare_expr (op_right);
    walk_tree_without_duplicates (&op_right, unwrap_c_maybe_const, NULL);
!   rhs = make_range (op_right, &in1_p, &low1, &high1);
    if (!rhs)
      return;
  
*************** warn_for_sign_compare (location_t locati
*** 2378,2384 ****
    else
      {
        tree sop, uop, base_type;
-       bool ovf;
  
        if (op0_signed)
  	sop = orig_op0, uop = orig_op1;
--- 2377,2382 ----
*************** warn_for_sign_compare (location_t locati
*** 2397,2403 ****
  	 literal (or some static constant expression involving such
  	 literals or a conditional expression involving such literals)
  	 and it is non-negative.  */
!       if (tree_expr_nonnegative_warnv_p (sop, &ovf))
  	/* OK */;
        /* Do not warn if the comparison is an equality operation, the
  	 unsigned quantity is an integral constant, and it would fit
--- 2395,2401 ----
  	 literal (or some static constant expression involving such
  	 literals or a conditional expression involving such literals)
  	 and it is non-negative.  */
!       if (tree_expr_nonnegative_p (sop))
  	/* OK */;
        /* Do not warn if the comparison is an equality operation, the
  	 unsigned quantity is an integral constant, and it would fit
diff -Nrcpad gcc-17-20260517/gcc/cfgrtl.cc gcc-17-20260524/gcc/cfgrtl.cc
*** gcc-17-20260517/gcc/cfgrtl.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/cfgrtl.cc	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 62,68 ****
  #include "tree-pass.h"
  #include "print-rtl.h"
  #include "rtl-iter.h"
- #include "gimplify.h"
  #include "profile.h"
  #include "sreal.h"
  
--- 62,67 ----
*************** update_bb_for_insn (basic_block bb)
*** 559,566 ****
  }
  
  
! /* Like active_insn_p, except keep the return value use or clobber around
!    even after reload.  */
  
  static bool
  flow_active_insn_p (const rtx_insn *insn)
--- 558,565 ----
  }
  
  
! /* Return true if adding or removing instances of INSN might affect the
!    semantics of the RTL.  */
  
  static bool
  flow_active_insn_p (const rtx_insn *insn)
*************** flow_active_insn_p (const rtx_insn *insn
*** 568,583 ****
    if (active_insn_p (insn))
      return true;
  
!   /* A clobber of the function return value exists for buggy
!      programs that fail to return a value.  Its effect is to
!      keep the return value from being live across the entire
!      function.  If we allow it to be skipped, we introduce the
!      possibility for register lifetime confusion.
!      Similarly, keep a USE of the function return value, otherwise
!      the USE is dropped and we could fail to thread jump if USE
!      appears on some paths and not on others, see PR90257.  */
!   if ((GET_CODE (PATTERN (insn)) == CLOBBER
!        || GET_CODE (PATTERN (insn)) == USE)
        && REG_P (XEXP (PATTERN (insn), 0))
        && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
      return true;
--- 567,595 ----
    if (active_insn_p (insn))
      return true;
  
!   /* We cannot add new clobbers to a path without first proving that
!      the clobbered thing is dead.
! 
!      For example:
! 
! 	(code_label L1)
! 	(clobber X)
! 	(set (pc) (label_ref L2))
! 
!      is a forwarder block in the sense that a jump to L1 can be replaced
!      with a jump to L2, although perhaps with some loss of dataflow precision.
!      However, any attempt to merge a jump to L1 with a jump to L2 would be an
!      asymmetric operation, in that the merged code must jump to L2 rather than
!      to L1.  Our current definition of "forwarder block" does not allow for
!      this distinction and so we need to take a conservatively correct
!      approach.  */
!   if (GET_CODE (PATTERN (insn)) == CLOBBER)
!     return true;
! 
!   /* Keep a USE of the function return value, otherwise the USE is dropped and
!      we could fail to thread a jump if USE appears on some paths and not on
!      others, see PR90257.  */
!   if (GET_CODE (PATTERN (insn)) == USE
        && REG_P (XEXP (PATTERN (insn), 0))
        && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))
      return true;
diff -Nrcpad gcc-17-20260517/gcc/cgraphbuild.cc gcc-17-20260524/gcc/cgraphbuild.cc
*** gcc-17-20260517/gcc/cgraphbuild.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/cgraphbuild.cc	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 31,37 ****
  #include "gimple-walk.h"
  #include "ipa-utils.h"
  #include "except.h"
- #include "gimplify.h"
  
  /* Context of record_reference.  */
  struct record_reference_ctx
--- 31,36 ----
diff -Nrcpad gcc-17-20260517/gcc/common/config/riscv/riscv-common.cc gcc-17-20260524/gcc/common/config/riscv/riscv-common.cc
*** gcc-17-20260517/gcc/common/config/riscv/riscv-common.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/common/config/riscv/riscv-common.cc	Sun May 24 22:32:05 2026
*************** riscv_find_cpu (const char *cpu)
*** 1705,1716 ****
  
  static bool
  riscv_handle_option (struct gcc_options *opts,
! 		     struct gcc_options *opts_set ATTRIBUTE_UNUSED,
  		     const struct cl_decoded_option *decoded,
  		     location_t loc)
  {
    switch (decoded->opt_index)
      {
      case OPT_march_:
        if (riscv_find_cpu (decoded->arg) == NULL)
  	riscv_parse_arch_string (decoded->arg, opts, loc);
--- 1705,1747 ----
  
  static bool
  riscv_handle_option (struct gcc_options *opts,
! 		     struct gcc_options *opts_set,
  		     const struct cl_decoded_option *decoded,
  		     location_t loc)
  {
    switch (decoded->opt_index)
      {
+     case OPT_mstrict_align:
+       opts->x_riscv_zilsd_align
+ 	= decoded->value ? RISCV_ZILSD_ALIGN_STRICT : RISCV_ZILSD_ALIGN_BYTE;
+       opts->x_riscv_zilsd_align_explicit = 0;
+       if (opts_set)
+ 	{
+ 	  opts_set->x_riscv_zilsd_align = opts->x_riscv_zilsd_align;
+ 	  opts_set->x_riscv_zilsd_align_explicit = 0;
+ 	}
+       return true;
+ 
+     case OPT_mzilsd_word_align:
+       opts->x_riscv_zilsd_align = RISCV_ZILSD_ALIGN_WORD;
+       opts->x_riscv_zilsd_align_explicit = 1;
+       if (opts_set)
+ 	{
+ 	  opts_set->x_riscv_zilsd_align = opts->x_riscv_zilsd_align;
+ 	  opts_set->x_riscv_zilsd_align_explicit = 1;
+ 	}
+       return true;
+ 
+     case OPT_mzilsd_strict_align:
+       opts->x_riscv_zilsd_align = RISCV_ZILSD_ALIGN_STRICT;
+       opts->x_riscv_zilsd_align_explicit = 1;
+       if (opts_set)
+ 	{
+ 	  opts_set->x_riscv_zilsd_align = opts->x_riscv_zilsd_align;
+ 	  opts_set->x_riscv_zilsd_align_explicit = 1;
+ 	}
+       return true;
+ 
      case OPT_march_:
        if (riscv_find_cpu (decoded->arg) == NULL)
  	riscv_parse_arch_string (decoded->arg, opts, loc);
diff -Nrcpad gcc-17-20260517/gcc/common/config/riscv/riscv-ext-bitmask.def gcc-17-20260524/gcc/common/config/riscv/riscv-ext-bitmask.def
*** gcc-17-20260517/gcc/common/config/riscv/riscv-ext-bitmask.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/common/config/riscv/riscv-ext-bitmask.def	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 27,38 ****
--- 27,42 ----
     minimal feature bits.  */
  
  RISCV_EXT_BITMASK ("i",			0,  8)
+ RISCV_EXT_BITMASK ("e",			0,  4)
  RISCV_EXT_BITMASK ("m",			0, 12)
+ RISCV_EXT_BITMASK ("zmmul",		1, 12)
  RISCV_EXT_BITMASK ("a",			0,  0)
  RISCV_EXT_BITMASK ("f",			0,  5)
  RISCV_EXT_BITMASK ("d",			0,  3)
  RISCV_EXT_BITMASK ("c",			0,  2)
+ RISCV_EXT_BITMASK ("h",			0,  7)
  RISCV_EXT_BITMASK ("v",			0, 21)
+ RISCV_EXT_BITMASK ("b",			0,  1)
  RISCV_EXT_BITMASK ("zba",		0, 27)
  RISCV_EXT_BITMASK ("zbb",		0, 28)
  RISCV_EXT_BITMASK ("zbs",		0, 33)
*************** RISCV_EXT_BITMASK ("zcd",		1,  4)
*** 79,83 ****
--- 83,105 ----
  RISCV_EXT_BITMASK ("zcf",		1,  5)
  RISCV_EXT_BITMASK ("zcmop",		1,  6)
  RISCV_EXT_BITMASK ("zawrs",		1,  7)
+ RISCV_EXT_BITMASK ("supm",		1, 14)
+ RISCV_EXT_BITMASK ("zicntr",		1, 15)
+ RISCV_EXT_BITMASK ("zihpm",		1, 16)
+ RISCV_EXT_BITMASK ("zfbfmin",		1, 17)
+ RISCV_EXT_BITMASK ("zvfbfmin",		1, 18)
+ RISCV_EXT_BITMASK ("zvfbfwma",		1, 19)
+ RISCV_EXT_BITMASK ("zicbom",		1, 20)
+ RISCV_EXT_BITMASK ("zaamo",		1, 21)
+ RISCV_EXT_BITMASK ("zalrsc",		1, 22)
+ RISCV_EXT_BITMASK ("zabha",		1, 23)
+ RISCV_EXT_BITMASK ("zalasr",		1, 24)
+ RISCV_EXT_BITMASK ("zicbop",		1, 25)
+ RISCV_EXT_BITMASK ("zilsd",		1,  8)
+ RISCV_EXT_BITMASK ("zclsd",		1,  9)
+ RISCV_EXT_BITMASK ("zicfilp",		1, 26)
+ RISCV_EXT_BITMASK ("zicfiss",		1, 27)
+ RISCV_EXT_BITMASK ("zcmp",		1, 10)
+ RISCV_EXT_BITMASK ("zifencei",		1, 11)
  
  #undef RISCV_EXT_BITMASK
diff -Nrcpad gcc-17-20260517/gcc/config/aarch64/aarch64-simd.md gcc-17-20260524/gcc/config/aarch64/aarch64-simd.md
*** gcc-17-20260517/gcc/config/aarch64/aarch64-simd.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/aarch64/aarch64-simd.md	Sun May 24 22:32:05 2026
***************
*** 400,405 ****
--- 400,411 ----
    [(set_attr "type" "neon_rev<q>")]
  )
  
+ (define_expand "bitreverse<mode>2"
+   [(set (match_operand:VB 0 "register_operand")
+ 	(bitreverse:VB (match_operand:VB 1 "register_operand")))]
+   "TARGET_SIMD"
+   "")
+ 
  (define_insn "aarch64_rbit<mode><vczle><vczbe>"
    [(set (match_operand:VB 0 "register_operand" "=w")
  	(bitreverse:VB (match_operand:VB 1 "register_operand" "w")))]
***************
*** 3206,3211 ****
--- 3212,3248 ----
    [(set_attr "type" "neon_int_to_fp_<VDQ_HSDI:stype><q>")]
  )
  
+ ;; V4DI -> V4SF is done as 2*V2DI->2*V2DF->2*V2SF and then combined together to
+ ;; form V4SF.
+ ;; Since there is an extra rounding step, unsafe math optimization needs to be
+ ;; on.
+ 
+ (define_expand "vec_packs_float_v2di"
+   [(set (match_operand:V4SF 0 "register_operand" "=w")
+ 	(vec_concat:V4SF
+ 	  (float:V2SF (match_operand:V2DI 1 "register_operand" "w"))
+ 	  (float:V2SF (match_operand:V2DI 2 "register_operand" "w"))))]
+   "TARGET_SIMD && flag_unsafe_math_optimizations"
+   {
+     rtx tmp = gen_reg_rtx (V2DFmode);
+     rtx tmp1 = gen_reg_rtx (V2DFmode);
+     rtx tmp2 = gen_reg_rtx (V2SFmode);
+     rtx tmp3 = gen_reg_rtx (V2SFmode);
+     emit_insn (gen_floatv2div2df2 (tmp, operands[1]));
+     emit_insn (gen_floatv2div2df2 (tmp1, operands[2]));
+     emit_insn (gen_truncv2dfv2sf2 (tmp2, tmp));
+     emit_insn (gen_truncv2dfv2sf2 (tmp3, tmp1));
+     if (BYTES_BIG_ENDIAN)
+       std::swap (tmp2, tmp3);
+ 
+     rtx tmp4 = gen_reg_rtx (V2DImode);
+     emit_insn (gen_aarch64_zip1v2di_low (tmp4, gen_lowpart (DImode, tmp2),
+ 					 gen_lowpart (DImode, tmp3)));
+     emit_move_insn (operands[0], gen_lowpart (V4SFmode, tmp4));
+     DONE;
+   }
+ )
+ 
  ;; ??? Note that the vectorizer usage of the vec_unpacks_[lo/hi] patterns
  ;; is inconsistent with vector ordering elsewhere in the compiler, in that
  ;; the meaning of HI and LO changes depending on the target endianness.
diff -Nrcpad gcc-17-20260517/gcc/config/aarch64/aarch64.cc gcc-17-20260524/gcc/config/aarch64/aarch64.cc
*** gcc-17-20260517/gcc/config/aarch64/aarch64.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/aarch64/aarch64.cc	Sun May 24 22:32:05 2026
*************** aarch64_cannot_force_const_mem (machine_
*** 11184,11194 ****
  	|| aarch64_sme_vq_unspec_p (x, &factor))
        return true;
  
!   /* Only allow symbols in literal pools with the large model (non-PIC).  */
    poly_int64 offset;
    rtx base = strip_offset_and_salt (x, &offset);
!   if ((SYMBOL_REF_P (base) || LABEL_REF_P (base))
!       && aarch64_cmodel != AARCH64_CMODEL_LARGE)
      return true;
  
    return aarch64_tls_referenced_p (x);
--- 11184,11193 ----
  	|| aarch64_sme_vq_unspec_p (x, &factor))
        return true;
  
!   /* Don't allow symbols in literal pools.  */
    poly_int64 offset;
    rtx base = strip_offset_and_salt (x, &offset);
!   if (SYMBOL_REF_P (base) || LABEL_REF_P (base))
      return true;
  
    return aarch64_tls_referenced_p (x);
*************** aarch64_uxt_size (int shift, HOST_WIDE_I
*** 14319,14332 ****
  }
  
  /* Constant pools are per function only when PC relative
!    literal loads are true or we are in the large memory
!    model.  */
  
  static inline bool
  aarch64_can_use_per_function_literal_pools_p (void)
  {
!   return (aarch64_pcrelative_literal_loads
! 	  || aarch64_cmodel == AARCH64_CMODEL_LARGE);
  }
  
  static bool
--- 14318,14329 ----
  }
  
  /* Constant pools are per function only when PC relative
!    literal loads are true.  */
  
  static inline bool
  aarch64_can_use_per_function_literal_pools_p (void)
  {
!   return aarch64_pcrelative_literal_loads;
  }
  
  static bool
*************** aarch64_select_rtx_section (machine_mode
*** 14345,14352 ****
  			    rtx x,
  			    unsigned HOST_WIDE_INT align)
  {
-   /* Forcing special symbols into the .text section is not correct (PR123791).
-      This is only an issue with the large code model.  */
    if (aarch64_can_use_per_function_literal_pools_p ())
      return function_section (current_function_decl);
  
--- 14342,14347 ----
*************** aarch64_possible_by_lane_insn_p (vec_inf
*** 18609,18614 ****
--- 18604,18752 ----
    return false;
  }
  
+ /* Determine probabilistically whether CALL is one that produces a scalar
+    result in a SIMD register.  */
+ static bool
+ aarch64_call_scalar_result_in_simd_reg_p (const gcall *call)
+ {
+   /* Don't assume that non-built-in functions return results in SIMD registers
+      because the ABI says that a scalar integer result is returned in a GPR.  */
+   if (!gimple_call_internal_p (call)
+       && !gimple_call_builtin_p (call, BUILT_IN_MD))
+     return false;
+ 
+   /* Assume that built-in functions which have at least one floating point or
+      SIMD parameter return scalar results in a SIMD register.  This heuristic
+      covers both reductions (whose result is always in a SIMD register) and
+      vector element extractions such as lastb (where the result can be in a GPR
+      or SIMD register, but instruction selection is assumed to make the choice
+      that is most efficient for the usage).  */
+   for (unsigned i = 0; i < gimple_call_num_args (call); ++i)
+     if (VECTOR_TYPE_P (TREE_TYPE (gimple_call_arg (call, i)))
+ 	|| SCALAR_FLOAT_TYPE_P (TREE_TYPE (gimple_call_arg (call, i))))
+       return true;
+ 
+   /* Assume that other built-in functions return scalar results in a GPR.  */
+   return false;
+ }
+ 
+ /* Determine probabilistically whether the scalar operand OP is one that could
+    incur additional costs for a GPR to SIMD register transfer.  We can't be
+    sure, but certain operations have a higher chance.  */
+ static bool
+ aarch64_scalar_op_to_vec_p (tree op)
+ {
+   gcc_checking_assert (TREE_CODE (op) == SSA_NAME);
+ 
+   tree optype = TREE_TYPE (op);
+   if (SCALAR_FLOAT_TYPE_P (optype))
+     return false;
+ 
+   gcc_checking_assert (!AGGREGATE_TYPE_P (optype));
+   gcc_checking_assert (!VECTOR_TYPE_P (optype));
+ 
+   gimple *def = SSA_NAME_DEF_STMT (op);
+   if (is_gimple_assign (def)
+       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
+     {
+       tree lhs = gimple_assign_lhs (def);
+       tree rhs = gimple_assign_rhs1 (def);
+       if (TREE_CODE (rhs) == SSA_NAME
+ 	  /* A sign-change expands to nothing.  */
+ 	  && tree_nop_conversion_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
+ 	def = SSA_NAME_DEF_STMT (rhs);
+     }
+ 
+   /* When the defining statement reads from memory, we can sometimes load its
+      value directly into a vector register lane, for example using
+        LD1 {v31.b}[1], [x0]
+      In reality, such operations usually seem to be lowered to a load-insert
+      pair instead, for example to allow pre-indexed addressing:
+        LDR b30, [x0, 4]
+        INS v31.b[1], v30.b[0]
+      Regardless, we do not charge extra scalar-to-vector costs for loads
+      from memory that feed a vec_construct because:
+        1.  builtin_vectorization_cost should already have charged any
+      insertion costs.
+        2.  Charging scalar-to-vector costs for loads would change how more
+      code is compiled. (Costs of scalar loads feeding a vec_construct are
+      charged separately; assume they subsume the cost of any SIMD load
+      instructions used in place of GPR load instructions as a consequence of
+      vectorization.)
+   */
+   if (gimple_vuse (def))
+     return false;
+ 
+   /* Likewise, we can hope to avoid using an intermediate GPR when
+      constructing a vector from a BIT_FIELD_REF that extracts from a
+      vector register.  */
+   if (is_gimple_assign (def) && gimple_assign_rhs_code (def) == BIT_FIELD_REF
+       && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (gimple_assign_rhs1 (def), 0))))
+     return false;
+ 
+   /* Likewise, we can hope to avoid using an intermediate GPR when
+      constructing a vector from the result of a vector reduction.  */
+   if (const gcall *call = dyn_cast<const gcall *> (def))
+     if (aarch64_call_scalar_result_in_simd_reg_p (call))
+       return false;
+ 
+   /* Likewise, we can hope to avoid using an intermediate GPR when
+      constructing a vector from the integer result of a vector reduction
+      that is immediately narrowed.  */
+   if (is_gimple_assign (def)
+       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
+     {
+       tree lhs = gimple_assign_lhs (def);
+       tree rhs = gimple_assign_rhs1 (def);
+ 
+       if (TREE_CODE (rhs) == SSA_NAME && INTEGRAL_TYPE_P (TREE_TYPE (lhs))
+ 	  && INTEGRAL_TYPE_P (TREE_TYPE (rhs))
+ 	  && (TYPE_PRECISION (TREE_TYPE (lhs))
+ 	      < TYPE_PRECISION (TREE_TYPE (rhs))))
+ 	{
+ 	  gimple *rhs_def = SSA_NAME_DEF_STMT (rhs);
+ 	  if (const gcall *call = dyn_cast<const gcall *> (rhs_def))
+ 	    if (aarch64_call_scalar_result_in_simd_reg_p (call))
+ 	      return false;
+ 	}
+     }
+ 
+   /* Otherwise, treat every component as requiring a GPR to SIMD
+      register transfer.  Notably, this prevents reverse-bytes ops
+      from being erroneously vectorized before reaching the store
+      merging pass that is supposed to ultimately produce REV.  */
+   return true;
+ }
+ 
+ /* STMT_COST is the cost calculated by aarch64_builtin_vectorization_cost
+    for NODE, which has cost kind KIND and which when vectorized would
+    operate on vector type VECTYPE.  Adjust the cost as necessary for a value
+    that is not defined within the vectorized region.  */
+ static fractional_cost
+ aarch64_external_adjust_stmt_cost (vect_cost_for_stmt kind, slp_tree node,
+ 				   tree vectype, fractional_cost stmt_cost)
+ {
+   if (SLP_TREE_DEF_TYPE (node) != vect_external_def)
+     return stmt_cost;
+ 
+   if (kind != vec_construct)
+     return stmt_cost;
+ 
+   const simd_vec_cost *simd_costs = aarch64_simd_vec_costs (vectype);
+   hash_set<tree> visited;
+ 
+   for (auto op : SLP_TREE_SCALAR_OPS (node))
+     {
+       if (TREE_CODE (op) != SSA_NAME || visited.add (op))
+ 	continue;
+ 
+       if (aarch64_scalar_op_to_vec_p (op))
+ 	stmt_cost += simd_costs->scalar_to_vec_cost;
+     }
+ 
+   return stmt_cost;
+ }
+ 
  unsigned
  aarch64_vector_costs::add_stmt_cost (int count, vect_cost_for_stmt kind,
  				     stmt_vec_info stmt_info, slp_tree node,
*************** aarch64_vector_costs::add_stmt_cost (int
*** 18799,18804 ****
--- 18937,18946 ----
        m_stores_to_vector_load_decl = true;
      }
  
+   if (node && vectype)
+     stmt_cost
+       = aarch64_external_adjust_stmt_cost (kind, node, vectype, stmt_cost);
+ 
    return record_stmt_cost (stmt_info, where, (count * stmt_cost).ceil ());
  }
  
*************** initialize_aarch64_code_model (struct gc
*** 20216,20224 ****
    aarch64_cmodel = opts->x_aarch64_cmodel_var;
    if (aarch64_cmodel == AARCH64_CMODEL_LARGE)
      {
-       if (opts->x_flag_pic)
- 	sorry ("code model %qs with %<-f%s%>", "large",
- 	       opts->x_flag_pic > 1 ? "PIC" : "pic");
        if (opts->x_aarch64_abi == AARCH64_ABI_ILP32)
  	sorry ("code model %qs not supported in ilp32 mode", "large");
      }
--- 20358,20363 ----
*************** aarch64_classify_symbol (rtx x, HOST_WID
*** 22147,22155 ****
        if (aarch64_cmodel == AARCH64_CMODEL_TINY)
  	return SYMBOL_TINY_ABSOLUTE;
  
-       if (aarch64_cmodel == AARCH64_CMODEL_LARGE)
- 	return SYMBOL_FORCE_TO_MEM;
- 
        return SYMBOL_SMALL_ABSOLUTE;
      }
  
--- 22286,22291 ----
*************** aarch64_classify_symbol (rtx x, HOST_WID
*** 22199,22212 ****
  	  return SYMBOL_SMALL_ABSOLUTE;
  
  	case AARCH64_CMODEL_LARGE:
! 	  /* This is alright even in PIC code as the constant
! 	     pool reference is always PC relative and within
! 	     the same translation unit.  */
! 	  if (!aarch64_pcrelative_literal_loads && CONSTANT_POOL_ADDRESS_P (x))
! 	    return SYMBOL_SMALL_ABSOLUTE;
! 	  else
  	    return SYMBOL_FORCE_TO_MEM;
  
  	default:
  	  gcc_unreachable ();
  	}
--- 22335,22367 ----
  	  return SYMBOL_SMALL_ABSOLUTE;
  
  	case AARCH64_CMODEL_LARGE:
! 	  if (!TARGET_PECOFF
! 	      && (flag_pic || SYMBOL_REF_WEAK (x))
! 	      && !aarch64_symbol_binds_local_p (x))
! 	    return SYMBOL_SMALL_GOT_4G;
! 
! 	  /* Read-only data uses ADRP/ADD, writable data uses the GOT.  */
! 
! 	  if (!(IN_RANGE (offset, -0x100000, 0x100000)
! 		|| offset_within_block_p (x, offset)))
  	    return SYMBOL_FORCE_TO_MEM;
  
+ 	  if (SYMBOL_REF_DECL (x) && TREE_READONLY (SYMBOL_REF_DECL (x)))
+ 	    return SYMBOL_SMALL_ABSOLUTE;
+ 
+ 	  if (CONSTANT_POOL_ADDRESS_P (x))
+ 	    return SYMBOL_SMALL_ABSOLUTE;
+ 
+ 	  if (SYMBOL_REF_HAS_BLOCK_INFO_P (x) && SYMBOL_REF_BLOCK (x) != NULL)
+ 	    {
+ 	      section *sect = SYMBOL_REF_BLOCK (x)->sect;
+ 
+ 	      if (sect != NULL && !(sect->common.flags & SECTION_WRITE))
+ 		return SYMBOL_SMALL_ABSOLUTE;
+ 	    }
+ 
+ 	  return SYMBOL_SMALL_GOT_4G;
+ 
  	default:
  	  gcc_unreachable ();
  	}
diff -Nrcpad gcc-17-20260517/gcc/config/aarch64/aarch64.md gcc-17-20260524/gcc/config/aarch64/aarch64.md
*** gcc-17-20260517/gcc/config/aarch64/aarch64.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/aarch64/aarch64.md	Sun May 24 22:32:05 2026
***************
*** 4988,4995 ****
      else
        /* Otherwise, generate table-based CRC.  */
        expand_reversed_crc_table_based (operands[0], operands[1], operands[2],
! 				       operands[3], <ALLI:MODE>mode,
! 				       generate_reflecting_code_standard);
      DONE;
    }
  )
--- 4988,4994 ----
      else
        /* Otherwise, generate table-based CRC.  */
        expand_reversed_crc_table_based (operands[0], operands[1], operands[2],
! 				       operands[3], <ALLI:MODE>mode);
      DONE;
    }
  )
***************
*** 5786,5791 ****
--- 5785,5795 ----
    [(set_attr "type" "rbit")]
  )
  
+ (define_expand "bitreverse<mode>2"
+   [(set (match_operand:GPI 0 "register_operand")
+ 	(bitreverse:GPI (match_operand:GPI 1 "register_operand")))]
+ )
+ 
  (define_expand "ffs<mode>2"
    [(match_operand:GPI 0 "register_operand")
     (match_operand:GPI 1 "register_operand")]
diff -Nrcpad gcc-17-20260517/gcc/config/arc/arc.cc gcc-17-20260524/gcc/config/arc/arc.cc
*** gcc-17-20260517/gcc/config/arc/arc.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/arc/arc.cc	Sun May 24 22:32:05 2026
*************** legitimate_small_data_address_p (rtx x,
*** 386,412 ****
        return SYMBOL_REF_SMALL_P (x);
      case PLUS:
        {
! 	bool p0 = (GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
! 	  && SYMBOL_REF_SMALL_P (XEXP (x, 0));
  
  	/* If no constant then we cannot do small data.  */
  	if (!CONST_INT_P (XEXP (x, 1)))
  	  return false;
  
! 	/* Small data relocs works with scalled addresses, check if
  	   the immediate fits the requirements.  */
! 	switch (GET_MODE_SIZE (mode))
  	  {
  	  case 1:
! 	    return p0;
  	  case 2:
! 	    return p0 && ((INTVAL (XEXP (x, 1)) & 0x1) == 0);
  	  case 4:
! 	  case 8:
! 	    return p0 && ((INTVAL (XEXP (x, 1)) & 0x3) == 0);
  	  default:
  	    return false;
  	  }
        }
      default:
        return false;
--- 386,426 ----
        return SYMBOL_REF_SMALL_P (x);
      case PLUS:
        {
! 	if ((GET_CODE (XEXP (x, 0)) != SYMBOL_REF)
! 	    || !SYMBOL_REF_SMALL_P (XEXP (x, 0)))
! 	  return false;
  
  	/* If no constant then we cannot do small data.  */
  	if (!CONST_INT_P (XEXP (x, 1)))
  	  return false;
  
! 	const int offset = INTVAL (XEXP (x, 1));
! 	int size = GET_MODE_SIZE (mode);
! 	size = size == 8 ? 4 : size;
! 
! 	/* Small data relocs works with scaled addresses, check if
  	   the immediate fits the requirements.  */
! 	switch (size)
  	  {
  	  case 1:
! 	    break;
  	  case 2:
! 	    if ((offset & 0x1) == 0)
! 	      break;
! 	    else
! 	      return false;
  	  case 4:
! 	    if ((offset & 0x3) == 0)
! 	      break;
! 	    else
! 	      return false;
  	  default:
  	    return false;
  	  }
+ 
+ 	/* Reloc allows scaled signed 9 bits.  */
+ 	const int v = (offset / size) >> 8;
+ 	return v == 0 || v == -1;
        }
      default:
        return false;
diff -Nrcpad gcc-17-20260517/gcc/config/arm/arm-mve-builtins-base.cc gcc-17-20260524/gcc/config/arm/arm-mve-builtins-base.cc
*** gcc-17-20260517/gcc/config/arm/arm-mve-builtins-base.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/arm/arm-mve-builtins-base.cc	Sun May 24 22:32:05 2026
*************** public:
*** 294,302 ****
      : m_to_int_mode (to_int_mode)
    {}
  
!   unsigned int call_properties (const function_instance &) const override
    {
!     return CP_WRITE_MEMORY;
    }
  
    machine_mode memory_vector_mode (const function_instance &fi) const override
--- 294,305 ----
      : m_to_int_mode (to_int_mode)
    {}
  
!   unsigned int call_properties (const function_instance &fi) const override
    {
!     if (fi.mode_suffix_id == MODE_wb)
!       return CP_WRITE_MEMORY | CP_READ_MEMORY;
!     else
!       return CP_WRITE_MEMORY;
    }
  
    machine_mode memory_vector_mode (const function_instance &fi) const override
*************** public:
*** 480,485 ****
--- 483,496 ----
      return type_suffixes[suffix].vector_mode;
    }
  
+   unsigned int call_properties (const function_instance &fi) const override
+   {
+     if (fi.mode_suffix_id == MODE_wb)
+       return CP_WRITE_MEMORY | CP_READ_MEMORY;
+     else
+       return CP_READ_MEMORY;
+   }
+ 
    rtx expand (function_expander &e) const override
    {
      insn_code icode;
diff -Nrcpad gcc-17-20260517/gcc/config/avr/avr.md gcc-17-20260524/gcc/config/avr/avr.md
*** gcc-17-20260517/gcc/config/avr/avr.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/avr/avr.md	Sun May 24 22:32:05 2026
***************
*** 9036,9239 ****
     (set (reg:QI 25)
          (const_int 0))])
  
- ;; Count Leading Zeros
  
! (define_expand "clzhi2"
!   [(set (reg:HI 24)
!         (match_operand:HI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (clz:HI (reg:HI 24)))
!               (clobber (reg:QI 26))])
!    (set (match_operand:HI 0 "register_operand" "")
!         (reg:HI 24))])
! 
! (define_expand "clzsi2"
!   [(set (reg:SI 22)
!         (match_operand:SI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (truncate:HI (clz:SI (reg:SI 22))))
!               (clobber (reg:QI 26))])
!    (set (match_dup 2)
!         (reg:HI 24))
!    (set (match_operand:SI 0 "register_operand" "")
!         (zero_extend:SI (match_dup 2)))]
!   ""
!   {
!     operands[2] = gen_reg_rtx (HImode);
!   })
  
! (define_insn_and_split "*clzhi2.libgcc_split"
!   [(set (reg:HI 24)
!         (clz:HI (reg:HI 24)))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*clzhi2.libgcc"
!   [(set (reg:HI 24)
!         (clz:HI (reg:HI 24)))
!    (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __clzhi2"
!   [(set_attr "type" "xcall")])
  
! (define_insn_and_split "*clzsihi2.libgcc_split"
!   [(set (reg:HI 24)
!         (truncate:HI (clz:SI (reg:SI 22))))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*clzsihi2.libgcc"
    [(set (reg:HI 24)
!         (truncate:HI (clz:SI (reg:SI 22))))
!    (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __clzsi2"
    [(set_attr "type" "xcall")])
  
! ;; Count Trailing Zeros
! 
! (define_expand "ctzhi2"
!   [(set (reg:HI 24)
!         (match_operand:HI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (ctz:HI (reg:HI 24)))
!               (clobber (reg:QI 26))])
!    (set (match_operand:HI 0 "register_operand" "")
!         (reg:HI 24))])
! 
! (define_expand "ctzsi2"
!   [(set (reg:SI 22)
!         (match_operand:SI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (truncate:HI (ctz:SI (reg:SI 22))))
!               (clobber (reg:QI 22))
!               (clobber (reg:QI 26))])
!    (set (match_dup 2)
!         (reg:HI 24))
!    (set (match_operand:SI 0 "register_operand" "")
!         (zero_extend:SI (match_dup 2)))]
!   ""
!   {
!     operands[2] = gen_reg_rtx (HImode);
!   })
! 
! (define_insn_and_split "*ctzhi2.libgcc_split"
!   [(set (reg:HI 24)
!         (ctz:HI (reg:HI 24)))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*ctzhi2.libgcc"
!   [(set (reg:HI 24)
!         (ctz:HI (reg:HI 24)))
!    (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __ctzhi2"
    [(set_attr "type" "xcall")])
  
! (define_insn_and_split "*ctzsihi2.libgcc_split"
!   [(set (reg:HI 24)
!         (truncate:HI (ctz:SI (reg:SI 22))))
!    (clobber (reg:QI 22))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*ctzsihi2.libgcc"
    [(set (reg:HI 24)
!         (truncate:HI (ctz:SI (reg:SI 22))))
!    (clobber (reg:QI 22))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __ctzsi2"
    [(set_attr "type" "xcall")])
  
! ;; Find First Set
! 
! (define_expand "ffshi2"
!   [(set (reg:HI 24)
!         (match_operand:HI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (ffs:HI (reg:HI 24)))
!               (clobber (reg:QI 26))])
!    (set (match_operand:HI 0 "register_operand" "")
!         (reg:HI 24))])
! 
! (define_expand "ffssi2"
!   [(set (reg:SI 22)
!         (match_operand:SI 1 "register_operand" ""))
!    (parallel [(set (reg:HI 24)
!                    (truncate:HI (ffs:SI (reg:SI 22))))
!               (clobber (reg:QI 22))
!               (clobber (reg:QI 26))])
!    (set (match_dup 2)
!         (reg:HI 24))
!    (set (match_operand:SI 0 "register_operand" "")
!         (zero_extend:SI (match_dup 2)))]
!   ""
!   {
!     operands[2] = gen_reg_rtx (HImode);
!   })
! 
! (define_insn_and_split "*ffshi2.libgcc_split"
!   [(set (reg:HI 24)
!         (ffs:HI (reg:HI 24)))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*ffshi2.libgcc"
    [(set (reg:HI 24)
!         (ffs:HI (reg:HI 24)))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __ffshi2"
    [(set_attr "type" "xcall")])
  
! (define_insn_and_split "*ffssihi2.libgcc_split"
!   [(set (reg:HI 24)
!         (truncate:HI (ffs:SI (reg:SI 22))))
!    (clobber (reg:QI 22))
!    (clobber (reg:QI 26))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*ffssihi2.libgcc"
    [(set (reg:HI 24)
!         (truncate:HI (ffs:SI (reg:SI 22))))
     (clobber (reg:QI 22))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __ffssi2"
    [(set_attr "type" "xcall")])
  
  ;; Copysign
  
  (define_insn "copysignsf3"
--- 9036,9193 ----
     (set (reg:QI 25)
          (const_int 0))])
  
  
! ;; Bit Reverse
  
! (define_insn_and_split "bitreverseqi2"
!   [(set (match_operand:QI 0 "register_operand"               "=r")
!         (bitreverse:QI (match_operand:QI 1 "register_operand" "r")))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*bitreverseqi2"
!   [(set (match_operand:QI 0 "register_operand"               "=r")
!         (bitreverse:QI (match_operand:QI 1 "register_operand" "r")))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   {
!     return REGNO (operands[0]) == REGNO (operands[1])
!       ? "mov __tmp_reg__,%0"            CR_TAB
!         "lsl %0"                        CR_TAB
!         "adc %0,__zero_reg__"           CR_TAB
!         "bst __tmp_reg__,0 $ bld %0,7"  CR_TAB
!         "bst __tmp_reg__,1 $ bld %0,6"  CR_TAB
!         "bst __tmp_reg__,2 $ bld %0,5"  CR_TAB
!         "bst __tmp_reg__,4 $ bld %0,3"  CR_TAB
!         "bst __tmp_reg__,5 $ bld %0,2"  CR_TAB
!         "bst __tmp_reg__,6 $ bld %0,1"
!       : "mov %0,%1"            CR_TAB
!         "lsl %0"               CR_TAB
!         "adc %0,__zero_reg__"  CR_TAB
!         "bst %1,0 $ bld %0,7"  CR_TAB
!         "bst %1,1 $ bld %0,6"  CR_TAB
!         "bst %1,2 $ bld %0,5"  CR_TAB
!         "bst %1,4 $ bld %0,3"  CR_TAB
!         "bst %1,5 $ bld %0,2"  CR_TAB
!         "bst %1,6 $ bld %0,1";
!   }
!   [(set_attr "length" "15")])
  
! (define_insn_and_split "bitreversehi2"
!   [(set (match_operand:HI 0 "register_operand"               "={r24}")
!         (bitreverse:HI (match_operand:HI 1 "register_operand" "{r24}")))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*bitreversehi2.libgcc"
    [(set (reg:HI 24)
!         (bitreverse:HI (reg:HI 24)))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __bitreverse16"
    [(set_attr "type" "xcall")])
  
! (define_insn_and_split "bitreversesi2"
!   [(set (match_operand:SI 0 "register_operand"               "={r22}")
!         (bitreverse:SI (match_operand:SI 1 "register_operand" "{r22}")))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*bitreversesi2.libgcc"
!   [(set (reg:SI 22)
!         (bitreverse:SI (reg:SI 22)))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __bitreverse32"
    [(set_attr "type" "xcall")])
  
! 
! ;; Count Leading Zeros
! ;; Count Trailing Zeros
! ;; Find First Set
! 
! (define_code_iterator ctz_ffs  [ctz ffs])
! (define_code_iterator cxz_ffs  [clz ctz ffs])
! 
! ;; "clzhi2"
! ;; "ctzhi2"
! ;; "ffshi2"
! (define_insn_and_split "<code>hi2"
!   [(set (match_operand:HI 0 "register_operand"            "={r24}")
!         (cxz_ffs:HI (match_operand:HI 1 "register_operand" "{r24}")))
!    (clobber (match_scratch:QI 2                           "={r26}"))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! ;; "*clzhi2.libgcc"
! ;; "*ctzhi2.libgcc"
! ;; "*ffshi2.libgcc"
! (define_insn "*<code>hi2.libgcc"
    [(set (reg:HI 24)
!         (cxz_ffs:HI (reg:HI 24)))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __<code>hi2"
    [(set_attr "type" "xcall")])
  
! (define_insn_and_split "clzsi2"
!   [(set (match_operand:HI 0 "register_operand"        "={r24}")
!         (clz:HI (match_operand:SI 1 "register_operand" "{r22}")))
!    (clobber (match_scratch:QI 2                       "={r26}"))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! (define_insn "*clzsihi2.libgcc"
    [(set (reg:HI 24)
!         (clz:HI (reg:SI 22)))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __clzsi2"
    [(set_attr "type" "xcall")])
  
! ;; "ctzsi2"
! ;; "ffssi2"
! (define_insn_and_split "<code>si2"
!   [(set (match_operand:HI 0 "register_operand"            "={r24}")
!         (ctz_ffs:HI (match_operand:SI 1 "register_operand" "{r22}")))
!    (clobber (match_scratch:QI 2                           "={r22}"))
!    (clobber (match_scratch:QI 3                           "={r26}"))]
    ""
    "#"
    "&& reload_completed"
    [(scratch)]
    { DONE_ADD_CCC })
  
! ;; "*ctzsihi2.libgcc"
! ;; "*ffssihi2.libgcc"
! (define_insn "*<code>hi2.libgcc"
    [(set (reg:HI 24)
!         (ctz_ffs:HI (reg:SI 22)))
     (clobber (reg:QI 22))
     (clobber (reg:QI 26))
     (clobber (reg:CC REG_CC))]
    "reload_completed"
!   "%~call __<code>si2"
    [(set_attr "type" "xcall")])
  
+ 
  ;; Copysign
  
  (define_insn "copysignsf3"
***************
*** 9253,9269 ****
  
  ;; Swap Bytes (change byte-endianness)
  
! (define_expand "bswapsi2"
!   [(set (reg:SI 22)
!         (match_operand:SI 1 "register_operand" ""))
!    (set (reg:SI 22)
!         (bswap:SI (reg:SI 22)))
!    (set (match_operand:SI 0 "register_operand" "")
!         (reg:SI 22))])
! 
! (define_insn_and_split "*bswapsi2.libgcc_split"
!   [(set (reg:SI 22)
!         (bswap:SI (reg:SI 22)))]
    ""
    "#"
    "&& reload_completed"
--- 9207,9215 ----
  
  ;; Swap Bytes (change byte-endianness)
  
! (define_insn_and_split "bswapsi2"
!   [(set (match_operand:SI 0 "register_operand"          "={r22}")
!         (bswap:SI (match_operand:SI 1 "register_operand" "{r22}")))]
    ""
    "#"
    "&& reload_completed"
diff -Nrcpad gcc-17-20260517/gcc/config/i386/i386-expand.cc gcc-17-20260524/gcc/config/i386/i386-expand.cc
*** gcc-17-20260517/gcc/config/i386/i386-expand.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/i386/i386-expand.cc	Sun May 24 22:32:05 2026
*************** ix86_expand_vec_perm (rtx operands[])
*** 5578,5584 ****
        switch (mode)
  	{
  	case E_V16SImode:
! 	  gen =gen_avx512f_permvarv16si;
  	  break;
  	case E_V16SFmode:
  	  gen = gen_avx512f_permvarv16sf;
--- 5578,5584 ----
        switch (mode)
  	{
  	case E_V16SImode:
! 	  gen = gen_avx512f_permvarv16si;
  	  break;
  	case E_V16SFmode:
  	  gen = gen_avx512f_permvarv16sf;
*************** ix86_expand_vec_perm (rtx operands[])
*** 5702,5707 ****
--- 5702,5709 ----
  	  return;
  
          case E_V4SImode:
+ 	  if (one_operand_shuffle)
+ 	    break; /* Handled below for TARGET_AVX.  */
  	  /* By combining the two 128-bit input vectors into one 256-bit
  	     input vector, we can use VPERMD and VPERMPS for the full
  	     two-operand shuffle.  */
*************** ix86_expand_vec_perm (rtx operands[])
*** 5714,5719 ****
--- 5716,5723 ----
  	  return;
  
          case E_V4SFmode:
+ 	  if (one_operand_shuffle)
+ 	    break; /* Handled below for TARGET_AVX.  */
  	  t1 = gen_reg_rtx (V8SFmode);
  	  t2 = gen_reg_rtx (V8SImode);
  	  mask = gen_lowpart (V4SImode, mask);
*************** ix86_expand_vec_perm (rtx operands[])
*** 5820,5825 ****
--- 5824,5858 ----
  	}
      }
  
+   if (TARGET_AVX && one_operand_shuffle)
+     switch (mode)
+       {
+       case V4SImode:
+ 	op0 = gen_lowpart (V4SFmode, op0);
+ 	t1 = gen_reg_rtx (V4SFmode);
+ 	emit_insn (gen_avx_vpermilvarv4sf3 (t1, op0, mask));
+ 	emit_move_insn (target, gen_lowpart (mode, t1));
+ 	return;
+       case V4SFmode:
+ 	emit_insn (gen_avx_vpermilvarv4sf3 (target, op0, mask));
+ 	return;
+       case V2DImode:
+ 	op0 = gen_lowpart (V2DFmode, op0);
+ 	t1 = gen_reg_rtx (V2DImode);
+ 	t2 = gen_reg_rtx (V2DFmode);
+ 	emit_insn (gen_addv2di3 (t1, mask, mask));
+ 	emit_insn (gen_avx_vpermilvarv2df3 (t2, op0, t1));
+ 	emit_move_insn (target, gen_lowpart (mode, t2));
+ 	return;
+       case V2DFmode:
+ 	t1 = gen_reg_rtx (V2DImode);
+ 	emit_insn (gen_addv2di3 (t1, mask, mask));
+ 	emit_insn (gen_avx_vpermilvarv2df3 (target, op0, t1));
+ 	return;
+       default:
+ 	break;
+       }
+ 
    if (TARGET_XOP)
      {
        /* The XOP VPPERM insn supports three inputs.  By ignoring the
*************** ix86_expand_movmem (rtx operands[])
*** 10454,10460 ****
  {
    /* Since there are much less registers available in 32-bit mode, don't
       inline movmem in 32-bit mode.  */
!   if (!TARGET_64BIT)
      return false;
  
    rtx dst = operands[0];
--- 10487,10493 ----
  {
    /* Since there are much less registers available in 32-bit mode, don't
       inline movmem in 32-bit mode.  */
!   if (!TARGET_64BIT || optimize_insn_for_size_p ())
      return false;
  
    rtx dst = operands[0];
*************** ix86_expand_sse_ptest (const struct buil
*** 11979,12013 ****
    machine_mode mode0 = insn_data[d->icode].operand[0].mode;
    machine_mode mode1 = insn_data[d->icode].operand[1].mode;
    enum rtx_code comparison = d->comparison;
! 
!   /* ptest reg, reg sets the carry flag.  */
!   if (comparison == LTU
!       && (d->code == IX86_BUILTIN_PTESTC
! 	  || d->code == IX86_BUILTIN_PTESTC256)
!       && rtx_equal_p (op0, op1))
!     {
!       if (!target)
! 	target = gen_reg_rtx (SImode);
!       emit_move_insn (target, const1_rtx);
!       return target;
!     }
  
    if (VECTOR_MODE_P (mode0))
      op0 = safe_vector_operand (op0, mode0);
    if (VECTOR_MODE_P (mode1))
      op1 = safe_vector_operand (op1, mode1);
  
!   target = gen_reg_rtx (SImode);
!   emit_move_insn (target, const0_rtx);
!   target = gen_rtx_SUBREG (QImode, target, 0);
  
    if ((optimize && !register_operand (op0, mode0))
!       || !insn_data[d->icode].operand[0].predicate (op0, mode0))
      op0 = copy_to_mode_reg (mode0, op0);
    if ((optimize && !register_operand (op1, mode1))
!       || !insn_data[d->icode].operand[1].predicate (op1, mode1))
      op1 = copy_to_mode_reg (mode1, op1);
  
    pat = GEN_FCN (d->icode) (op0, op1);
    if (! pat)
      return 0;
--- 12012,12090 ----
    machine_mode mode0 = insn_data[d->icode].operand[0].mode;
    machine_mode mode1 = insn_data[d->icode].operand[1].mode;
    enum rtx_code comparison = d->comparison;
!   rtx result = NULL_RTX;
  
    if (VECTOR_MODE_P (mode0))
      op0 = safe_vector_operand (op0, mode0);
    if (VECTOR_MODE_P (mode1))
      op1 = safe_vector_operand (op1, mode1);
  
!   switch (d->code)
!     {
!     case IX86_BUILTIN_PTESTZ:
!     case IX86_BUILTIN_PTESTZ256:
!       // Returns (OP0 & OP1) == 0
!       if (rtx_equal_p (op0, CONST0_RTX (mode0))
! 	  || rtx_equal_p (op1, CONST0_RTX (mode1)))
! 	result = const1_rtx;
!       else if (rtx_equal_p (op0, CONSTM1_RTX (mode0)))
! 	{
! 	  op1 = force_reg (mode1, op1);
! 	  op0 = op1;
! 	}
!       else if (rtx_equal_p (op1, CONSTM1_RTX (mode1)))
! 	{
! 	  op0 = force_reg (mode0, op0);
! 	  op1 = op0;
! 	}
!       else if (MEM_P (op0) && !MEM_P (op1))
! 	std::swap (op0, op1);
!       break;
! 
!     case IX86_BUILTIN_PTESTC:
!     case IX86_BUILTIN_PTESTC256:
!       // Returns (~OP0 & OP1) == 0
!       if (rtx_equal_p (op0, CONSTM1_RTX (mode0))
! 	  || rtx_equal_p (op1, CONST0_RTX (mode1))
! 	  || rtx_equal_p (op0, op1))
! 	result = const1_rtx;
!       break;
! 
!     case IX86_BUILTIN_PTESTNZC:
!     case IX86_BUILTIN_PTESTNZC256:
!       // Returns ((OP0 && OP1) != 0) && ((~OP0 && OP1) != 0)
!       if (rtx_equal_p (op0, CONST0_RTX (mode0))
! 	  || rtx_equal_p (op0, CONSTM1_RTX (mode0))
! 	  || rtx_equal_p (op1, CONST0_RTX (mode1))
! 	  || rtx_equal_p (op0, op1))
! 	result = const0_rtx;
!       break;
! 
!     default:
!       break;
!     }
  
    if ((optimize && !register_operand (op0, mode0))
!       || !insn_data[d->icode].operand[0].predicate (op0, mode0)
!       || result)
      op0 = copy_to_mode_reg (mode0, op0);
    if ((optimize && !register_operand (op1, mode1))
!       || !insn_data[d->icode].operand[1].predicate (op1, mode1)
!       || result)
      op1 = copy_to_mode_reg (mode1, op1);
  
+   if (result)
+     {
+       if (!target)
+ 	target = gen_reg_rtx (SImode);
+       emit_move_insn (target, result);
+       return target;
+     }
+ 
+   target = gen_reg_rtx (SImode);
+   emit_move_insn (target, const0_rtx);
+   target = gen_rtx_SUBREG (QImode, target, 0);
+ 
    pat = GEN_FCN (d->icode) (op0, op1);
    if (! pat)
      return 0;
*************** ix86_expand_builtin (tree exp, rtx targe
*** 15243,15249 ****
  	else
  	  {
  	    if (INTVAL (op3) != 0)
! 	      warning (0, "invalid forth argument to"
  			  " %<__builtin_ia32_prefetch%>; using zero");
  
  	    if (!address_operand (op0, VOIDmode))
--- 15320,15326 ----
  	else
  	  {
  	    if (INTVAL (op3) != 0)
! 	      warning (0, "invalid fourth argument to"
  			  " %<__builtin_ia32_prefetch%>; using zero");
  
  	    if (!address_operand (op0, VOIDmode))
*************** ix86_expand_vector_bf2sf_with_vec_perm (
*** 28069,28073 ****
--- 28146,28267 ----
    emit_move_insn (dest, lowpart_subreg (GET_MODE (dest), target, vperm_mode));
  }
  
+ /* Implement bitreverse<mode>2 using gf2p8affineqb.  */
+ 
+ void
+ ix86_expand_gfni_bitreverse (rtx dest, rtx src)
+ {
+   machine_mode mode = GET_MODE (dest);
+   rtx temp;
+   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+     {
+       rtx temp1 = gen_reg_rtx (mode == TImode ? V2DImode : V4SImode);
+       rtx temp2 = gen_reg_rtx (mode == TImode ? V2DImode : V4SImode);
+       if (mode == TImode)
+ 	{
+ 	  temp = lowpart_subreg (DImode, src, TImode);
+ 	  emit_insn (gen_rtx_SET (temp1, gen_rtx_VEC_CONCAT (V2DImode, temp,
+ 							     const0_rtx)));
+ 	  temp = gen_highpart (DImode, src);
+ 	  emit_insn (gen_rtx_SET (temp2, gen_rtx_VEC_CONCAT (V2DImode, temp,
+ 							     const0_rtx)));
+ 	}
+       else
+ 	{
+ 	  temp = lowpart_subreg (SImode, src, DImode);
+ 	  emit_insn (gen_vec_setv4si_0 (temp1, CONST0_RTX (V4SImode), temp));
+ 	  temp = gen_highpart (SImode, src);
+ 	  emit_insn (gen_vec_setv4si_0 (temp2, CONST0_RTX (V4SImode), temp));
+ 	  temp1 = lowpart_subreg (V2DImode, temp1, V4SImode);
+ 	  temp2 = lowpart_subreg (V2DImode, temp2, V4SImode);
+ 	}
+       temp = gen_reg_rtx (V2DImode);
+       emit_insn (gen_vec_interleave_lowv2di (temp, temp1, temp2));
+     }
+   else if (mode != DImode)
+     {
+       if (mode != SImode)
+ 	{
+ 	  src = force_reg (mode, src);
+ 	  src = lowpart_subreg (SImode, src, mode);
+ 	}
+       temp = gen_reg_rtx (V4SImode);
+       emit_insn (gen_vec_setv4si_0 (temp, CONST0_RTX (V4SImode), src));
+     }
+   else
+     {
+       temp = gen_reg_rtx (V2DImode);
+       emit_insn (gen_rtx_SET (temp, gen_rtx_VEC_CONCAT (V2DImode, src,
+ 							const0_rtx)));
+     }
+   src = temp;
+   temp = gen_reg_rtx (V16QImode);
+   rtx src2 = gen_rtx_CONST_VECTOR (V16QImode,
+ 				   gen_rtvec (16, GEN_INT (1), GEN_INT (2),
+ 					      GEN_INT (4), GEN_INT (8),
+ 					      GEN_INT (16), GEN_INT (32),
+ 					      GEN_INT (64), GEN_INT (-128),
+ 					      GEN_INT (1), GEN_INT (2),
+ 					      GEN_INT (4), GEN_INT (8),
+ 					      GEN_INT (16), GEN_INT (32),
+ 					      GEN_INT (64), GEN_INT (-128)));
+   src2 = validize_mem (force_const_mem (V16QImode, src2));
+   src = lowpart_subreg (V16QImode, src, GET_MODE (src));
+   emit_insn (gen_vgf2p8affineqb_v16qi (temp, src, src2, const0_rtx));
+   if (mode == QImode)
+     {
+       rtx temp1 = gen_reg_rtx (SImode);
+       rtx temp2 = lowpart_subreg (V4SImode, temp, V16QImode);
+       rtx temp3 = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
+       emit_insn (gen_rtx_SET (temp1,
+ 			      gen_rtx_VEC_SELECT (SImode, temp2, temp3)));
+       emit_move_insn (dest, lowpart_subreg (QImode, temp1, SImode));
+       return;
+     }
+   rtx target = gen_reg_rtx ((GET_MODE_SIZE (mode) < 4 || !TARGET_64BIT)
+ 			    ? SImode : mode == TImode ? DImode : mode);
+   emit_move_insn (target, lowpart_subreg (GET_MODE (target), temp, V16QImode));
+   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+     {
+       rtx temp1 = gen_reg_rtx (GET_MODE (target));
+       if (mode == TImode || TARGET_SSE4_1)
+ 	{
+ 	  rtx temp2 = lowpart_subreg (mode == TImode ? V2DImode : V4SImode,
+ 				      temp, V16QImode);
+ 	  rtx temp3 = gen_rtx_PARALLEL (VOIDmode,
+ 					gen_rtvec (1, GEN_INT (mode == TImode
+ 							       ? 1 : 2)));
+ 	  emit_insn (gen_rtx_SET (temp1,
+ 				  gen_rtx_VEC_SELECT (GET_MODE (target), temp2,
+ 						      temp3)));
+ 	}
+       else
+ 	{
+ 	  rtx temp2 = gen_reg_rtx (V4SImode);
+ 	  rtx temp3 = lowpart_subreg (V4SImode, temp, V16QImode);
+ 	  emit_insn (gen_sse2_pshufd (temp2, temp3, GEN_INT (0xaa)));
+ 	  emit_move_insn (temp1, lowpart_subreg (GET_MODE (target), temp2,
+ 						 V4SImode));
+ 	}
+       rtx temp4 = gen_reg_rtx (GET_MODE (target));
+       rtx temp5 = gen_reg_rtx (GET_MODE (target));
+       rtx (*gen_bswap) (rtx, rtx)
+ 	= mode == TImode ? gen_bswapdi2 : gen_bswapsi2;
+       emit_insn (gen_bswap (temp4, target));
+       emit_insn (gen_bswap (temp5, temp1));
+       temp4 = gen_rtx_ZERO_EXTEND (mode, temp4);
+       temp5 = gen_rtx_ZERO_EXTEND (mode, temp5);
+       rtx shift = GEN_INT (GET_MODE_PRECISION (GET_MODE (target)));
+       temp4 = gen_rtx_ASHIFT (mode, temp4, shift);
+       emit_insn (gen_rtx_SET (dest, gen_rtx_IOR (mode, temp4, temp5)));
+       return;
+     }
+   if (mode == HImode)
+     target = lowpart_subreg (mode, target, SImode);
+   if (mode == SImode)
+     emit_insn (gen_bswapsi2 (dest, target));
+   else
+     emit_insn (gen_rtx_SET (dest, gen_rtx_BSWAP (mode, target)));
+ }
  
  #include "gt-i386-expand.h"
diff -Nrcpad gcc-17-20260517/gcc/config/i386/i386-protos.h gcc-17-20260524/gcc/config/i386/i386-protos.h
*** gcc-17-20260517/gcc/config/i386/i386-protos.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/i386/i386-protos.h	Sun May 24 22:32:05 2026
*************** extern rtx ix86_expand_ternlog (machine_
*** 263,268 ****
--- 263,269 ----
  				int idx, rtx target);
  extern void ix86_expand_vector_sf2bf_with_vec_perm (rtx, rtx);
  extern void ix86_expand_vector_bf2sf_with_vec_perm (rtx, rtx);
+ extern void ix86_expand_gfni_bitreverse (rtx, rtx);
  
  
  #ifdef TREE_CODE
diff -Nrcpad gcc-17-20260517/gcc/config/i386/i386.h gcc-17-20260524/gcc/config/i386/i386.h
*** gcc-17-20260517/gcc/config/i386/i386.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/i386/i386.h	Sun May 24 22:32:05 2026
*************** extern unsigned char ix86_tune_features[
*** 401,407 ****
  	ix86_tune_features[X86_TUNE_PROLOGUE_USING_MOVE]
  #define TARGET_EPILOGUE_USING_MOVE \
  	ix86_tune_features[X86_TUNE_EPILOGUE_USING_MOVE]
- #define TARGET_SHIFT1		ix86_tune_features[X86_TUNE_SHIFT1]
  #define TARGET_USE_FFREEP	ix86_tune_features[X86_TUNE_USE_FFREEP]
  #define TARGET_INTER_UNIT_MOVES_TO_VEC \
  	ix86_tune_features[X86_TUNE_INTER_UNIT_MOVES_TO_VEC]
--- 401,406 ----
diff -Nrcpad gcc-17-20260517/gcc/config/i386/i386.md gcc-17-20260524/gcc/config/i386/i386.md
*** gcc-17-20260517/gcc/config/i386/i386.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/i386/i386.md	Sun May 24 22:32:05 2026
***************
*** 16346,16361 ****
        return "<nf_prefix>add{<imodesuffix>}\t%0, %0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  /* For NDD form instructions related to TARGET_SHIFT1, the $1
! 	     immediate do not need to be omitted as assembler will map it
! 	     to use shorter encoding. */
! 	  && !use_ndd && !<nf_applied>)
! 	return "sal{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "<nf_prefix>sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix>sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,*,bmi2,avx512bw,apx_ndd")
--- 16346,16353 ----
        return "<nf_prefix>add{<imodesuffix>}\t%0, %0";
  
      default:
!       return use_ndd ? "<nf_prefix>sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,*,bmi2,avx512bw,apx_ndd")
***************
*** 16364,16386 ****
  	      (const_string "lea")
  	    (eq_attr "alternative" "2")
  	      (const_string "ishiftx")
  	    (eq_attr "alternative" "4")
  	      (const_string "ishift")
!             (and (and (match_test "TARGET_DOUBLE_WITH_ADD")
  		      (match_operand 0 "register_operand"))
  		 (match_operand 2 "const1_operand"))
  	      (const_string "alu")
- 	    (eq_attr "alternative" "3")
- 	      (const_string "msklog")
  	   ]
  	   (const_string "ishift")))
     (set (attr "length_immediate")
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 16356,16376 ----
  	      (const_string "lea")
  	    (eq_attr "alternative" "2")
  	      (const_string "ishiftx")
+ 	    (eq_attr "alternative" "3")
+ 	      (const_string "msklog")
  	    (eq_attr "alternative" "4")
  	      (const_string "ishift")
! 	    (and (and (match_test "TARGET_DOUBLE_WITH_ADD")
  		      (match_operand 0 "register_operand"))
  		 (match_operand 2 "const1_operand"))
  	      (const_string "alu")
  	   ]
  	   (const_string "ishift")))
     (set (attr "length_immediate")
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 16461,16473 ****
        return "add{l}\t%k0, %k0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "sal{l}\t%k0";
!       else
! 	return use_ndd ? "sal{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		       : "sal{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,*,bmi2,apx_ndd")
--- 16451,16458 ----
        return "add{l}\t%k0, %k0";
  
      default:
!       return use_ndd ? "sal{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		     : "sal{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,*,bmi2,apx_ndd")
***************
*** 16487,16495 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
--- 16472,16478 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
***************
*** 16530,16542 ****
        return "<nf_prefix>add{w}\t%0, %0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd && !<nf_applied>)
! 	return "sal{w}\t%0";
!       else
! 	return use_ndd ? "<nf_prefix>sal{w}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix>sal{w}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,*,avx512f,apx_ndd")
--- 16513,16520 ----
        return "<nf_prefix>add{w}\t%0, %0";
  
      default:
!       return use_ndd ? "<nf_prefix>sal{w}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>sal{w}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,*,avx512f,apx_ndd")
***************
*** 16557,16565 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 16535,16541 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 16592,16614 ****
  	return "<nf_prefix>add{b}\t%0, %0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd && !<nf_applied>)
! 	{
! 	  if (get_attr_mode (insn) == MODE_SI)
! 	    return "sal{l}\t%k0";
! 	  else
! 	    return "sal{b}\t%0";
! 	}
        else
! 	{
! 	  if (get_attr_mode (insn) == MODE_SI)
! 	    return "<nf_prefix>sal{l}\t{%2, %k0|%k0, %2}";
! 	  else
! 	    return use_ndd ? "<nf_prefix>sal{b}\t{%2, %1, %0|%0, %1, %2}"
! 			   : "<nf_prefix>sal{b}\t{%2, %0|%0, %2}";
! 	}
      }
  }
    [(set_attr "isa" "*,*,*,avx512dq,apx_ndd")
--- 16568,16578 ----
  	return "<nf_prefix>add{b}\t%0, %0";
  
      default:
!       if (get_attr_mode (insn) == MODE_SI)
! 	return "<nf_prefix>sal{l}\t{%2, %k0|%k0, %2}";
        else
! 	return use_ndd ? "<nf_prefix>sal{b}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix>sal{b}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,*,*,avx512dq,apx_ndd")
***************
*** 16629,16637 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 16593,16599 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 16660,16670 ****
        return "add{<imodesuffix>}\t%0, %0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
! 	return "sal{<imodesuffix>}\t%0";
!       else
! 	return "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    "&& reload_completed
--- 16622,16628 ----
        return "add{<imodesuffix>}\t%0, %0";
  
      default:
!       return "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    "&& reload_completed
***************
*** 16685,16693 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 16643,16649 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 16758,16766 ****
  	(ashift:SWI (match_dup 1) (match_dup 2)))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || (operands[2] == const1_rtx
! 	&& (TARGET_SHIFT1
! 	    || (TARGET_DOUBLE_WITH_ADD && REG_P (operands[0])))))
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands, TARGET_APX_NDD)"
  {
--- 16714,16720 ----
  	(ashift:SWI (match_dup 1) (match_dup 2)))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (ASHIFT, <MODE>mode, operands, TARGET_APX_NDD)"
  {
***************
*** 16772,16784 ****
        return "add{<imodesuffix>}\t%0, %0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "sal{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
--- 16726,16733 ----
        return "add{<imodesuffix>}\t%0, %0";
  
      default:
!       return use_ndd ? "sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
***************
*** 16795,16803 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 16744,16750 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 16813,16821 ****
    "TARGET_64BIT
     && (optimize_function_for_size_p (cfun)
         || !TARGET_PARTIAL_FLAG_REG_STALL
!        || (operands[2] == const1_rtx
! 	   && (TARGET_SHIFT1
! 	       || TARGET_DOUBLE_WITH_ADD)))
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (ASHIFT, SImode, operands, TARGET_APX_NDD)"
  {
--- 16760,16766 ----
    "TARGET_64BIT
     && (optimize_function_for_size_p (cfun)
         || !TARGET_PARTIAL_FLAG_REG_STALL
!        || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (ASHIFT, SImode, operands, TARGET_APX_NDD)"
  {
***************
*** 16827,16839 ****
        return "add{l}\t%k0, %k0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "sal{l}\t%k0";
!       else
! 	return use_ndd ? "sal{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		       : "sal{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
--- 16772,16779 ----
        return "add{l}\t%k0, %k0";
  
      default:
!       return use_ndd ? "sal{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		     : "sal{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
***************
*** 16849,16857 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
--- 16789,16795 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
***************
*** 16865,16873 ****
     (clobber (match_scratch:SWI 0 "=<r>,r"))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || (operands[2] == const1_rtx
! 	&& (TARGET_SHIFT1
! 	    || TARGET_DOUBLE_WITH_ADD)))
     && ix86_match_ccmode (insn, CCGOCmode)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
--- 16803,16809 ----
     (clobber (match_scratch:SWI 0 "=<r>,r"))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
***************
*** 16877,16890 ****
        gcc_assert (operands[2] == const1_rtx);
        return "add{<imodesuffix>}\t%0, %0";
  
!   default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "sal{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
--- 16813,16821 ----
        gcc_assert (operands[2] == const1_rtx);
        return "add{<imodesuffix>}\t%0, %0";
  
!     default:
!       return use_ndd ? "sal{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "sal{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,apx_ndd")
***************
*** 16901,16909 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 16832,16838 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 16933,16943 ****
        return "add{b}\t%h0, %h0";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
! 	return "sal{b}\t%h0";
!       else
! 	return "sal{b}\t{%2, %h0|%h0, %2}";
      }
  }
    "reload_completed
--- 16862,16868 ----
        return "add{b}\t%h0, %h0";
  
      default:
!       return "sal{b}\t{%2, %h0|%h0, %2}";
      }
  }
    "reload_completed
***************
*** 16967,16975 ****
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (and (match_operand 2 "const1_operand")
! 		      (ior (match_test "TARGET_SHIFT1")
! 			   (match_test "optimize_function_for_size_p (cfun)")))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "QI")])
--- 16892,16898 ----
       (if_then_else
         (ior (eq_attr "type" "alu")
  	    (and (eq_attr "type" "ishift")
! 		 (match_operand 2 "const1_operand")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "QI")])
***************
*** 17746,17767 ****
        return "#";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd && !<nf_applied>)
! 	return "sar{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "<nf_prefix>sar{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix>sar{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
     (set_attr "type" "ishift,ishiftx,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 17669,17683 ----
        return "#";
  
      default:
!       return use_ndd ? "<nf_prefix>sar{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>sar{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
     (set_attr "type" "ishift,ishiftx,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 17809,17831 ****
        return "#";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd && !<nf_applied>)
! 	return "shr{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "<nf_prefix>shr{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix>shr{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,avx512bw,apx_ndd")
     (set_attr "type" "ishift,ishiftx,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (and (match_operand 2 "const1_operand")
! 		 (eq_attr "alternative" "0"))
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 17725,17740 ----
        return "#";
  
      default:
!       return use_ndd ? "<nf_prefix>shr{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>shr{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,avx512bw,apx_ndd")
     (set_attr "type" "ishift,ishiftx,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (eq_attr "type" "ishift")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 17898,17924 ****
    switch (get_attr_type (insn))
      {
      case TYPE_ISHIFTX:
-       return "#";
- 
      case TYPE_MSKLOG:
        return "#";
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "<shift>{l}\t%k0";
!       else
! 	return use_ndd ? "<shift>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		       : "<shift>{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd,avx512bw")
     (set_attr "type" "ishift,ishiftx,ishift,msklog")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")
--- 17807,17826 ----
    switch (get_attr_type (insn))
      {
      case TYPE_ISHIFTX:
      case TYPE_MSKLOG:
        return "#";
+ 
      default:
!       return use_ndd ? "<shift>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		     : "<shift>{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd,avx512bw")
     (set_attr "type" "ishift,ishiftx,ishift,msklog")
     (set (attr "length_immediate")
       (if_then_else
!        (and (eq_attr "type" "ishift")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")
***************
*** 17949,17969 ****
     && <nf_condition>"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
!       && !use_ndd && !<nf_applied>)
!     return "sar{<imodesuffix>}\t%0";
!   else
!     return use_ndd ? "<nf_prefix>sar{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		   : "<nf_prefix>sar{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*, apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 17851,17865 ----
     && <nf_condition>"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
! 
!   return use_ndd ? "<nf_prefix>sar{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		 : "<nf_prefix>sar{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*, apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 17980,18007 ****
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
    switch (get_attr_type (insn))
      {
-     case TYPE_ISHIFT:
-       if (operands[2] == const1_rtx
- 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
- 	  && !use_ndd && !<nf_applied>)
- 	return "shr{b}\t%0";
-       else
- 	return use_ndd ? "<nf_prefix>shr{b}\t{%2, %1, %0|%0, %1, %2}"
- 		       : "<nf_prefix>shr{b}\t{%2, %0|%0, %2}";
      case TYPE_MSKLOG:
        return "#";
      default:
!       gcc_unreachable ();
      }
  }
    [(set_attr "isa" "*,avx512dq,apx_ndd")
     (set_attr "type" "ishift,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (and (match_operand 2 "const1_operand")
! 		 (eq_attr "alternative" "0"))
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 17876,17895 ----
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
    switch (get_attr_type (insn))
      {
      case TYPE_MSKLOG:
        return "#";
+ 
      default:
!       return use_ndd ? "<nf_prefix>shr{b}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>shr{b}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,avx512dq,apx_ndd")
     (set_attr "type" "ishift,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (eq_attr "type" "ishift")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 18018,18045 ****
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
    switch (get_attr_type (insn))
      {
-     case TYPE_ISHIFT:
-       if (operands[2] == const1_rtx
- 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
- 	  && !use_ndd && !<nf_applied>)
- 	return "shr{w}\t%0";
-       else
- 	return use_ndd ? "<nf_prefix>shr{w}\t{%2, %1, %0|%0, %1, %2}"
- 		       : "<nf_prefix>shr{w}\t{%2, %0|%0, %2}";
      case TYPE_MSKLOG:
        return "#";
      default:
!       gcc_unreachable ();
      }
  }
    [(set_attr "isa" "*, avx512f, apx_ndd")
     (set_attr "type" "ishift,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (and (match_operand 2 "const1_operand")
! 		 (eq_attr "alternative" "0"))
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 17906,17925 ----
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
    switch (get_attr_type (insn))
      {
      case TYPE_MSKLOG:
        return "#";
+ 
      default:
!       return use_ndd ? "<nf_prefix>shr{w}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix>shr{w}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*, avx512f, apx_ndd")
     (set_attr "type" "ishift,msklog,ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (eq_attr "type" "ishift")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 18056,18066 ****
    if (which_alternative)
      return "#";
  
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
!     return "<shift>{<imodesuffix>}\t%0";
!   else
!     return "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    "&& reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
--- 17936,17942 ----
    if (which_alternative)
      return "#";
  
!   return "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    "&& reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
***************
*** 18073,18081 ****
    [(set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 17949,17955 ----
    [(set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 18094,18120 ****
  	(any_shiftrt:SWI (match_dup 1) (match_dup 2)))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || (operands[2] == const1_rtx
! 	&& TARGET_SHIFT1))
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands, TARGET_APX_NDD)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
!       && !use_ndd)
!     return "<shift>{<imodesuffix>}\t%0";
!   else
!     return use_ndd ? "<shift>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		   : "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 17968,17986 ----
  	(any_shiftrt:SWI (match_dup 1) (match_dup 2)))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands, TARGET_APX_NDD)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   return use_ndd ? "<shift>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		 : "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 18130,18156 ****
    "TARGET_64BIT
     && (optimize_function_for_size_p (cfun)
         || !TARGET_PARTIAL_FLAG_REG_STALL
!        || (operands[2] == const1_rtx
! 	   && TARGET_SHIFT1))
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (<CODE>, SImode, operands, TARGET_APX_NDD)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
!       && !use_ndd)
!     return "<shift>{l}\t%k0";
!   else
!     return use_ndd ? "<shift>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		   : "<shift>{l}\t{%2, %k0|%k0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
--- 17996,18014 ----
    "TARGET_64BIT
     && (optimize_function_for_size_p (cfun)
         || !TARGET_PARTIAL_FLAG_REG_STALL
!        || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)
     && ix86_binary_operator_ok (<CODE>, SImode, operands, TARGET_APX_NDD)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   return use_ndd ? "<shift>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		 : "<shift>{l}\t{%2, %k0|%k0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
***************
*** 18165,18191 ****
     (clobber (match_scratch:SWI 0 "=<r>,r"))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || (operands[2] == const1_rtx
! 	&& TARGET_SHIFT1))
     && ix86_match_ccmode (insn, CCGOCmode)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
!       && !use_ndd)
!     return "<shift>{<imodesuffix>}\t%0";
!   else
!     return use_ndd
! 	   ? "<shift>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 	   : "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 18023,18040 ----
     (clobber (match_scratch:SWI 0 "=<r>,r"))]
    "(optimize_function_for_size_p (cfun)
      || !TARGET_PARTIAL_FLAG_REG_STALL
!     || operands[2] == const1_rtx)
     && ix86_match_ccmode (insn, CCGOCmode)"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   return use_ndd ? "<shift>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		 : "<shift>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 18208,18218 ****
    if (which_alternative)
      return "#";
  
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
!     return "<shift>{b}\t%h0";
!   else
!     return "<shift>{b}\t{%2, %h0|%h0, %2}";
  }
    "reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
--- 18057,18063 ----
    if (which_alternative)
      return "#";
  
!   return "<shift>{b}\t{%2, %h0|%h0, %2}";
  }
    "reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
***************
*** 18234,18242 ****
    [(set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "QI")])
--- 18079,18085 ----
    [(set_attr "type" "ishift")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "QI")])
***************
*** 18928,18940 ****
  	return "#";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd && !<nf_applied>)
! 	return "<rotate>{<imodesuffix>}\t%0";
!       else
! 	return use_ndd ? "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		       : "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
--- 18771,18778 ----
  	return "#";
  
      default:
!       return use_ndd ? "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		     : "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
***************
*** 18946,18954 ****
     (set (attr "length_immediate")
       (if_then_else
         (and (eq_attr "type" "rotate")
! 	    (and (match_operand 2 "const1_operand")
! 		 (ior (match_test "TARGET_SHIFT1")
! 		      (match_test "optimize_function_for_size_p (cfun)"))))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 18784,18790 ----
     (set (attr "length_immediate")
       (if_then_else
         (and (eq_attr "type" "rotate")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 19039,19051 ****
        return "#";
  
      default:
!       if (operands[2] == const1_rtx
! 	  && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
! 	  && !use_ndd)
! 	return "<rotate>{l}\t%k0";
!       else
! 	return use_ndd ? "<rotate>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		       : "<rotate>{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
--- 18875,18882 ----
        return "#";
  
      default:
!       return use_ndd ? "<rotate>{l}\t{%2, %1, %k0|%k0, %1, %2}"
! 		     : "<rotate>{l}\t{%2, %k0|%k0, %2}";
      }
  }
    [(set_attr "isa" "*,bmi2,apx_ndd")
***************
*** 19057,19065 ****
     (set (attr "length_immediate")
       (if_then_else
         (and (eq_attr "type" "rotate")
! 	    (and (match_operand 2 "const1_operand")
! 		 (ior (match_test "TARGET_SHIFT1")
! 		      (match_test "optimize_function_for_size_p (cfun)"))))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
--- 18888,18894 ----
     (set (attr "length_immediate")
       (if_then_else
         (and (eq_attr "type" "rotate")
! 	    (match_operand 2 "const1_operand"))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "SI")])
***************
*** 19100,19121 ****
     && <nf_condition>"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
!       && !use_ndd && !<nf_applied>)
!     return "<rotate>{<imodesuffix>}\t%0";
!   else
!     return use_ndd
! 	   ? "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 	   : "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "rotate")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
--- 18929,18942 ----
     && <nf_condition>"
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
!   return use_ndd ? "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}"
! 		 : "<nf_prefix><rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    [(set_attr "isa" "*,apx_ndd")
     (set_attr "type" "rotate")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "has_nf" "1")
***************
*** 19132,19142 ****
    if (which_alternative)
      return "#";
  
!   if (operands[2] == const1_rtx
!       && (TARGET_SHIFT1 || optimize_function_for_size_p (cfun)))
!     return "<rotate>{<imodesuffix>}\t%0";
!   else
!     return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    "&& reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
--- 18953,18959 ----
    if (which_alternative)
      return "#";
  
!   return "<rotate>{<imodesuffix>}\t{%2, %0|%0, %2}";
  }
    "&& reload_completed
     && !(rtx_equal_p (operands[0], operands[1]))"
***************
*** 19149,19157 ****
    [(set_attr "type" "rotate")
     (set (attr "length_immediate")
       (if_then_else
!        (and (match_operand 2 "const1_operand")
! 	    (ior (match_test "TARGET_SHIFT1")
! 		 (match_test "optimize_function_for_size_p (cfun)")))
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
--- 18966,18972 ----
    [(set_attr "type" "rotate")
     (set (attr "length_immediate")
       (if_then_else
!        (match_operand 2 "const1_operand")
         (const_string "0")
         (const_string "*")))
     (set_attr "mode" "<MODE>")])
***************
*** 19211,19230 ****
    ""
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
-   if ((TARGET_SHIFT1 || optimize_function_for_size_p (cfun))
-       && !use_ndd)
-     return "<shift>{<imodesuffix>}\t%0";
    return use_ndd ? "<shift>{<imodesuffix>}\t{$1, %1, %0|%0, %1, 1}"
  		 : "<shift>{<imodesuffix>}\t{$1, %0|%0, 1}";
  }
    [(set_attr "isa" "*, apx_ndd")
     (set_attr "type" "ishift1")
!    (set (attr "length_immediate")
!      (if_then_else
!        (ior (match_test "TARGET_SHIFT1")
! 	    (match_test "optimize_function_for_size_p (cfun)"))
!        (const_string "0")
!        (const_string "*")))
     (set_attr "mode" "<MODE>")])
  
  ;; Bit set / bit test instructions
--- 19026,19037 ----
    ""
  {
    bool use_ndd = get_attr_isa (insn) == ISA_APX_NDD;
    return use_ndd ? "<shift>{<imodesuffix>}\t{$1, %1, %0|%0, %1, 1}"
  		 : "<shift>{<imodesuffix>}\t{$1, %0|%0, 1}";
  }
    [(set_attr "isa" "*, apx_ndd")
     (set_attr "type" "ishift1")
!    (set_attr "length_immediate" "0")
     (set_attr "mode" "<MODE>")])
  
  ;; Bit set / bit test instructions
***************
*** 23157,23162 ****
--- 22964,22978 ----
    operands[3] = gen_lowpart (HImode, operands[2]);
  })
  
+ (define_expand "bitreverse<mode>2"
+   [(set (match_operand:SWIDWI 0 "register_operand")
+ 	(bitreverse:SWIDWI (match_operand:SWIDWI 1 "nonimmediate_operand")))]
+   "TARGET_GFNI && TARGET_SSE2"
+ {
+   ix86_expand_gfni_bitreverse (operands[0], operands[1]);
+   DONE;
+ })
+ 
  (define_expand "paritydi2"
    [(set (match_operand:DI 0 "register_operand")
  	(parity:DI (match_operand:DI 1 "register_operand")))]
***************
*** 29563,29569 ****
  (define_peephole2
    [(parallel
      [(set (match_operand:SWI48 0 "register_operand")
! 	  (mult:SWI48 (match_operand:SWI48 1 "register_operand")
  		      (match_operand:SWI48 2 "const359_operand")))
       (clobber (reg:CC FLAGS_REG))])]
    "!TARGET_PARTIAL_REG_STALL
--- 29379,29385 ----
  (define_peephole2
    [(parallel
      [(set (match_operand:SWI48 0 "register_operand")
! 	  (mult:SWI48 (match_operand:SWI48 1 "index_reg_operand")
  		      (match_operand:SWI48 2 "const359_operand")))
       (clobber (reg:CC FLAGS_REG))])]
    "!TARGET_PARTIAL_REG_STALL
***************
*** 29576,29582 ****
  
  (define_peephole2
    [(parallel
!     [(set (match_operand:SWI48 0 "register_operand")
  	  (mult:SWI48 (match_operand:SWI48 1 "nonimmediate_operand")
  		      (match_operand:SWI48 2 "const359_operand")))
       (clobber (reg:CC FLAGS_REG))])]
--- 29392,29398 ----
  
  (define_peephole2
    [(parallel
!     [(set (match_operand:SWI48 0 "index_reg_operand")
  	  (mult:SWI48 (match_operand:SWI48 1 "nonimmediate_operand")
  		      (match_operand:SWI48 2 "const359_operand")))
       (clobber (reg:CC FLAGS_REG))])]
***************
*** 29890,29897 ****
      emit_insn (gen_sse4_2_crc32<mode> (operands[0], operands[1], operands[2]));
    else
      expand_reversed_crc_table_based (operands[0], operands[1], operands[2],
! 				     operands[3], <SWI124:MODE>mode,
! 				     generate_reflecting_code_standard);
    DONE;
  })
  
--- 29706,29712 ----
      emit_insn (gen_sse4_2_crc32<mode> (operands[0], operands[1], operands[2]));
    else
      expand_reversed_crc_table_based (operands[0], operands[1], operands[2],
! 				     operands[3], <SWI124:MODE>mode);
    DONE;
  })
  
***************
*** 30303,30309 ****
    [(unspec_volatile [(match_operand:SWI48 0 "nonimmediate_operand" "rm")]
  		    UNSPECV_PTWRITE)]
    "TARGET_PTWRITE"
!   "ptwrite<imodesuffix>\t%0"
    [(set_attr "type" "other")
     (set_attr "prefix_0f" "1")
     (set_attr "prefix_rep" "1")])
--- 30118,30124 ----
    [(unspec_volatile [(match_operand:SWI48 0 "nonimmediate_operand" "rm")]
  		    UNSPECV_PTWRITE)]
    "TARGET_PTWRITE"
!   "ptwrite{<imodesuffix>|}\t%0"
    [(set_attr "type" "other")
     (set_attr "prefix_0f" "1")
     (set_attr "prefix_rep" "1")])
diff -Nrcpad gcc-17-20260517/gcc/config/i386/x86-tune.def gcc-17-20260524/gcc/config/i386/x86-tune.def
*** gcc-17-20260517/gcc/config/i386/x86-tune.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/i386/x86-tune.def	Sun May 24 22:32:05 2026
*************** DEF_TUNE (X86_TUNE_ALWAYS_FANCY_MATH_387
*** 682,691 ****
     is bad.  */
  DEF_TUNE (X86_TUNE_UNROLL_STRLEN, "unroll_strlen", ~m_386)
  
- /* X86_TUNE_SHIFT1: Enables use of short encoding of "sal reg" instead of
-    longer "sal $1, reg".  */
- DEF_TUNE (X86_TUNE_SHIFT1, "shift1", ~m_486)
- 
  /* X86_TUNE_ZERO_EXTEND_WITH_AND: Use AND instruction instead
     of mozbl/movwl.  */
  DEF_TUNE (X86_TUNE_ZERO_EXTEND_WITH_AND, "zero_extend_with_and",
--- 682,687 ----
diff -Nrcpad gcc-17-20260517/gcc/config/loongarch/loongarch.md gcc-17-20260524/gcc/config/loongarch/loongarch.md
*** gcc-17-20260517/gcc/config/loongarch/loongarch.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/loongarch/loongarch.md	Sun May 24 22:32:05 2026
***************
*** 4741,4747 ****
    [(set_attr "type" "unknown")
     (set_attr "mode" "DI")])
  
! (define_insn "@rbit<mode>"
    [(set (match_operand:GPR 0 "register_operand" "=r")
  	(bitreverse:GPR (match_operand:GPR 1 "register_operand" "r")))]
    "TARGET_64BIT || TARGET_32BIT_S"
--- 4741,4747 ----
    [(set_attr "type" "unknown")
     (set_attr "mode" "DI")])
  
! (define_insn "@bitreverse<mode>2"
    [(set (match_operand:GPR 0 "register_operand" "=r")
  	(bitreverse:GPR (match_operand:GPR 1 "register_operand" "r")))]
    "TARGET_64BIT || TARGET_32BIT_S"
***************
*** 4749,4755 ****
    [(set_attr "type" "unknown")
     (set_attr "mode" "<MODE>")])
  
! (define_insn "rbitsi_extended"
    [(set (match_operand:DI 0 "register_operand" "=r")
  	(sign_extend:DI
  	  (bitreverse:SI (match_operand:SI 1 "register_operand" "r"))))]
--- 4749,4755 ----
    [(set_attr "type" "unknown")
     (set_attr "mode" "<MODE>")])
  
! (define_insn "bitreversesi2_extended"
    [(set (match_operand:DI 0 "register_operand" "=r")
  	(sign_extend:DI
  	  (bitreverse:SI (match_operand:SI 1 "register_operand" "r"))))]
***************
*** 4760,4766 ****
  
  ;; If we don't care high bits, bitrev.4b can reverse bits of values in
  ;; QImode.
! (define_insn "rbitqi"
    [(set (match_operand:QI 0 "register_operand" "=r")
  	(bitreverse:QI (match_operand:QI 1 "register_operand" "r")))]
    "TARGET_64BIT || TARGET_32BIT_S"
--- 4760,4766 ----
  
  ;; If we don't care high bits, bitrev.4b can reverse bits of values in
  ;; QImode.
! (define_insn "bitreverseqi2"
    [(set (match_operand:QI 0 "register_operand" "=r")
  	(bitreverse:QI (match_operand:QI 1 "register_operand" "r")))]
    "TARGET_64BIT || TARGET_32BIT_S"
***************
*** 4768,4785 ****
    [(set_attr "type" "unknown")
     (set_attr "mode" "SI")])
  
! ;; For HImode it's a little complicated...
! (define_expand "rbithi"
!   [(match_operand:HI 0 "register_operand")
!    (match_operand:HI 1 "register_operand")]
    ""
    {
      rtx t = gen_reg_rtx (word_mode);
  
      /* Oh, using paradoxical subreg.  I learnt the trick from RISC-V,
         hoping we won't be blown up altogether one day.  */
!     emit_insn (gen_rbit(word_mode, t,
! 			gen_lowpart (word_mode, operands[1])));
      t = expand_simple_binop (word_mode, LSHIFTRT, t,
  			     GEN_INT (GET_MODE_BITSIZE (word_mode) - 16),
  			     NULL_RTX, false, OPTAB_DIRECT);
--- 4768,4784 ----
    [(set_attr "type" "unknown")
     (set_attr "mode" "SI")])
  
! (define_expand "bitreversehi2"
!   [(set (match_operand:HI 0 "register_operand" "=r")
! 	(bitreverse:HI (match_operand:HI 1 "register_operand" "r")))]
    ""
    {
      rtx t = gen_reg_rtx (word_mode);
  
      /* Oh, using paradoxical subreg.  I learnt the trick from RISC-V,
         hoping we won't be blown up altogether one day.  */
!     emit_insn (gen_bitreverse2 (word_mode, t,
! 				gen_lowpart (word_mode, operands[1])));
      t = expand_simple_binop (word_mode, LSHIFTRT, t,
  			     GEN_INT (GET_MODE_BITSIZE (word_mode) - 16),
  			     NULL_RTX, false, OPTAB_DIRECT);
***************
*** 4958,4980 ****
        }
      else
        {
- 	/* No CRC instruction is suitable, use the generic table-based
- 	   implementation but optimize bit reversion.  */
- 	auto rbit = [](rtx *r)
- 	  {
- 	    /* Well, this is ugly.  The problem is
- 	       expand_reversed_crc_table_based only accepts one helper
- 	       for reversing data elements and CRC states.  */
- 	    auto mode = GET_MODE (*r);
- 	    auto rbit = (mode == <MODE>mode ? gen_rbit<mode> : gen_rbitsi);
- 	    rtx out = gen_reg_rtx (mode);
- 
- 	    emit_insn (rbit (out, *r));
- 	    *r = out;
- 	  };
  	expand_reversed_crc_table_based (operands[0], operands[1],
! 					 msg, operands[3], <MODE>mode,
! 					 rbit);
        }
      DONE;
    })
--- 4957,4964 ----
        }
      else
        {
  	expand_reversed_crc_table_based (operands[0], operands[1],
! 					 msg, operands[3], <MODE>mode);
        }
      DONE;
    })
diff -Nrcpad gcc-17-20260517/gcc/config/loongarch/t-loongarch gcc-17-20260524/gcc/config/loongarch/t-loongarch
*** gcc-17-20260517/gcc/config/loongarch/t-loongarch	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/loongarch/t-loongarch	Sun May 24 22:32:05 2026
***************
*** 18,23 ****
--- 18,24 ----
  
  
  GTM_H += loongarch-multilib.h
+ TM_H += $(srcdir)/common/config/loongarch/cpu-features.h
  OPTIONS_H_EXTRA += $(srcdir)/config/loongarch/loongarch-def.h	    \
  		   $(srcdir)/config/loongarch/loongarch-def-array.h \
  		   $(srcdir)/config/loongarch/loongarch-tune.h	    \
diff -Nrcpad gcc-17-20260517/gcc/config/pru/constraints.md gcc-17-20260524/gcc/config/pru/constraints.md
*** gcc-17-20260517/gcc/config/pru/constraints.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/pru/constraints.md	Sun May 24 22:32:05 2026
***************
*** 32,38 ****
  ;;  m: Memory operand.
  ;;
  ;; The following constraints are intended for internal use only:
- ;;  Rmd0, Rms0, Rms1: Registers for MUL instruction operands.
  ;;  Rsib: Jump address register suitable for sibling calls.
  ;;  Rrio: The R30 and R31 I/O registers.
  ;;  M: -255 to 0 (for converting ADD to SUB with suitable UBYTE OP2).
--- 32,37 ----
***************
*** 51,68 ****
    "@internal
    A register suitable for an indirect sibcall.")
  
- (define_register_constraint "Rmd0" "MULDST_REGS"
-   "@internal
-   The multiply destination register.")
- 
- (define_register_constraint "Rms0" "MULSRC0_REGS"
-   "@internal
-   The multiply source 0 register.")
- 
- (define_register_constraint "Rms1" "MULSRC1_REGS"
-   "@internal
-   The multiply source 1 register.")
- 
  (define_register_constraint "Rrio" "REGIO_REGS"
    "@internal
    The R30 and R31 I/O registers.")
--- 50,55 ----
diff -Nrcpad gcc-17-20260517/gcc/config/pru/predicates.md gcc-17-20260524/gcc/config/pru/predicates.md
*** gcc-17-20260517/gcc/config/pru/predicates.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/pru/predicates.md	Sun May 24 22:32:05 2026
***************
*** 83,90 ****
        else
  	return 0;
  
!       return REGNO_REG_CLASS (regno) == MULDST_REGS
! 	     || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
--- 83,89 ----
        else
  	return 0;
  
!       return regno == MULDST_REGNUM || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
***************
*** 103,110 ****
        else
  	return 0;
  
!       return REGNO_REG_CLASS (regno) == MULSRC0_REGS
! 	     || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
--- 102,108 ----
        else
  	return 0;
  
!       return regno == MULSRC0_REGNUM || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
***************
*** 123,130 ****
        else
  	return 0;
  
!       return REGNO_REG_CLASS (regno) == MULSRC1_REGS
! 	     || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
--- 121,127 ----
        else
  	return 0;
  
!       return regno == MULSRC1_REGNUM || regno >= FIRST_PSEUDO_REGISTER;
      }
    return 0;
  })
diff -Nrcpad gcc-17-20260517/gcc/config/pru/pru.h gcc-17-20260524/gcc/config/pru/pru.h
*** gcc-17-20260517/gcc/config/pru/pru.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/pru/pru.h	Sun May 24 22:32:05 2026
*************** enum reg_class
*** 216,225 ****
  {
    NO_REGS,
    SIB_REGS,
-   LOOPCNTR_REGS,
-   MULDST_REGS,
-   MULSRC0_REGS,
-   MULSRC1_REGS,
    REGIO_REGS,
    GP_REGS,
    ALL_REGS,
--- 216,221 ----
*************** enum reg_class
*** 231,240 ****
  #define REG_CLASS_NAMES   \
    {  "NO_REGS",		  \
       "SIB_REGS",	  \
-      "LOOPCNTR_REGS",	  \
-      "MULDST_REGS",	  \
-      "MULSRC0_REGS",	  \
-      "MULSRC1_REGS",	  \
       "REGIO_REGS",	  \
       "GP_REGS",		  \
       "ALL_REGS" }
--- 227,232 ----
*************** enum reg_class
*** 245,254 ****
    {								\
      /* NO_REGS	      */ { 0, 0, 0, 0, 0},			\
      /* SIB_REGS	      */ { 0xf, 0xff000000u, ~0u, 0xffffffu, 0},\
-     /* LOOPCNTR_REGS  */ { 0, 0, 0, 0, 0xf},			\
-     /* MULDST_REGS    */ { 0, 0, 0, 0x00000f00u, 0},		\
-     /* MULSRC0_REGS   */ { 0, 0, 0, 0x000f0000u, 0},		\
-     /* MULSRC1_REGS   */ { 0, 0, 0, 0x00f00000u, 0},		\
      /* REGIO_REGS     */ { 0, 0, 0, 0xff000000u, 0},		\
      /* GP_REGS	      */ { ~0u, ~0u, ~0u, ~0u, 0},		\
      /* ALL_REGS	      */ { ~0u, ~0u, ~0u, ~0u, ~0u}		\
--- 237,242 ----
*************** enum reg_class
*** 257,271 ****
  
  #define GP_REG_P(REGNO) ((unsigned)(REGNO) <= LAST_GP_REGNUM)
  #define REGNO_REG_CLASS(REGNO)						    \
! 	((REGNO) == MULDST_REGNUM ? MULDST_REGS				    \
! 	 : (REGNO) == MULSRC0_REGNUM ? MULSRC0_REGS			    \
! 	 : (REGNO) == MULSRC1_REGNUM ? MULSRC1_REGS			    \
! 	 : (REGNO) == R30_REGNUM ? REGIO_REGS				    \
  	 : (REGNO) == R31_REGNUM ? REGIO_REGS				    \
  	 : (REGNO) >= FIRST_ARG_REGNUM					    \
  	    && (REGNO) <= LAST_ARG_REGNUM ? SIB_REGS			    \
  	 : (REGNO) == STATIC_CHAIN_REGNUM ? SIB_REGS			    \
- 	 : (REGNO) == LOOPCNTR_REGNUM ? LOOPCNTR_REGS			    \
  	 : (REGNO) <= LAST_NONIO_GP_REGNUM ? GP_REGS			    \
  	 : ALL_REGS)
  
--- 245,255 ----
  
  #define GP_REG_P(REGNO) ((unsigned)(REGNO) <= LAST_GP_REGNUM)
  #define REGNO_REG_CLASS(REGNO)						    \
! 	((REGNO) == R30_REGNUM ? REGIO_REGS				    \
  	 : (REGNO) == R31_REGNUM ? REGIO_REGS				    \
  	 : (REGNO) >= FIRST_ARG_REGNUM					    \
  	    && (REGNO) <= LAST_ARG_REGNUM ? SIB_REGS			    \
  	 : (REGNO) == STATIC_CHAIN_REGNUM ? SIB_REGS			    \
  	 : (REGNO) <= LAST_NONIO_GP_REGNUM ? GP_REGS			    \
  	 : ALL_REGS)
  
diff -Nrcpad gcc-17-20260517/gcc/config/pru/pru.md gcc-17-20260524/gcc/config/pru/pru.md
*** gcc-17-20260517/gcc/config/pru/pru.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/pru/pru.md	Sun May 24 22:32:05 2026
***************
*** 1208,1225 ****
    [(set_attr "type" "alu")
     (set_attr "length" "8")])
  
! ;; Multiply instruction.  The nop is required to ensure that Rmd0 and Rms0
  ;; registers are sampled and multiplication is executed on those values.
  ;; Only after that one cycle can xin obtain the result.
  
  (define_insn "mulsi3"
!   [(set (match_operand:SI 0 "pru_muldst_operand"	   "=Rmd0")
! 	(mult:SI (match_operand:SI 1 "pru_mulsrc0_operand" "%Rms0")
! 		 (match_operand:SI 2 "pru_mulsrc1_operand" "Rms1")))]
    "TARGET_OPT_MUL"
    "nop\;xin\\t0, %0, 4"
    [(set_attr "type" "alu")
     (set_attr "length" "8")])
  
  ;; Prologue, Epilogue and Return
  
--- 1208,1301 ----
    [(set_attr "type" "alu")
     (set_attr "length" "8")])
  
! ;; Multiply instruction.  The nop is required to ensure that source
  ;; registers are sampled and multiplication is executed on those values.
  ;; Only after that one cycle can xin obtain the result.
  
  (define_insn "mulsi3"
!   [(set (match_operand:SI 0 "pru_muldst_operand"	   "={r26}")
! 	(mult:SI (match_operand:SI 1 "pru_mulsrc0_operand" "%{r28}")
! 		 (match_operand:SI 2 "pru_mulsrc1_operand" "{r29}")))]
    "TARGET_OPT_MUL"
    "nop\;xin\\t0, %0, 4"
    [(set_attr "type" "alu")
     (set_attr "length" "8")])
+ 
+ (define_insn "umulsidi3"
+   [(set (match_operand:DI 0 "pru_muldst_operand"	   "={r26}")
+ 	(mult:DI
+ 	  (zero_extend:DI
+ 	    (match_operand:SI 1 "pru_mulsrc0_operand"	   "%{r28}"))
+ 	  (zero_extend:DI
+ 	    (match_operand:SI 2 "pru_mulsrc1_operand"	   "{r29}"))))]
+   "TARGET_OPT_MUL"
+   "nop\;xin\\t0, %0, 8"
+   [(set_attr "type" "alu")
+    (set_attr "length" "8")])
+ 
+ 
+ ;; If optimizing for speed, prefer to inline 64-bit multiplication,
+ ;; in order to avoid the overhead of calling a library function.
+ (define_expand "muldi3"
+   [(parallel [(set (match_operand:DI 0 "register_operand")
+ 	(mult:DI (match_operand:DI 1 "register_operand")
+ 		 (match_operand:DI 2 "register_operand")))
+ 		 (clobber (reg:DI MULDST_REGNUM))
+ 		 (clobber (reg:SI MULSRC0_REGNUM))
+ 		 (clobber (reg:SI MULSRC1_REGNUM))
+ 		 ])]
+   "TARGET_OPT_MUL && !optimize_size && can_create_pseudo_p ()"
+ {
+   rtx op0_lo = simplify_gen_subreg (SImode, operands[0], DImode, 0);
+   rtx op0_hi = simplify_gen_subreg (SImode, operands[0], DImode, 4);
+   rtx op1_lo = simplify_gen_subreg (SImode, operands[1], DImode, 0);
+   rtx op1_hi = simplify_gen_subreg (SImode, operands[1], DImode, 4);
+   rtx op2_lo = simplify_gen_subreg (SImode, operands[2], DImode, 0);
+   rtx op2_hi = simplify_gen_subreg (SImode, operands[2], DImode, 4);
+ 
+   gcc_assert (!reload_completed);
+ 
+   rtx cross_product1 = gen_reg_rtx (SImode);
+   rtx cross_product2 = gen_reg_rtx (SImode);
+   rtx low_product = gen_reg_rtx (DImode);
+   rtx cross_scratch1_hi = gen_reg_rtx (SImode);
+ 
+   rtx reg_mulsrc0_si = gen_reg_rtx (SImode);
+   rtx reg_mulsrc1_si = gen_reg_rtx (SImode);
+   rtx reg_muldst_di = gen_reg_rtx (DImode);
+ 
+   /* (al + C * ah) * (bl + C * bh) =	al * bl
+ 					+ C * ah * bl
+ 					+ C * al * bh
+ 					+ C * C * ah * bh  -> discard, overflow
+       Where C=(1 << 32).  */
+ 
+   emit_move_insn (cross_product1,
+ 		  gen_rtx_MULT (SImode, op1_hi, op2_lo));
+   emit_move_insn (cross_product2,
+ 		  gen_rtx_MULT (SImode, op1_lo, op2_hi));
+ 
+   /* Calculate "al * bl".  */
+   emit_move_insn (reg_mulsrc0_si, op1_lo);
+   emit_move_insn (reg_mulsrc1_si, op2_lo);
+   emit_insn (gen_umulsidi3 (reg_muldst_di, reg_mulsrc0_si, reg_mulsrc1_si));
+   emit_move_insn (low_product, reg_muldst_di);
+ 
+   emit_move_insn (cross_scratch1_hi,
+ 		  gen_rtx_PLUS (SImode,
+ 				cross_product1,
+ 				cross_product2));
+   emit_move_insn (op0_lo,
+ 		  simplify_gen_subreg (SImode, low_product, DImode, 0));
+   emit_move_insn (op0_hi,
+ 		  gen_rtx_PLUS (SImode,
+ 				simplify_gen_subreg (SImode,
+ 						     low_product,
+ 						     DImode,
+ 						     4),
+ 				cross_scratch1_hi));
+   DONE;
+ })
  
  ;; Prologue, Epilogue and Return
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/andes.def gcc-17-20260524/gcc/config/riscv/andes.def
*** gcc-17-20260517/gcc/config/riscv/andes.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/andes.def	Sun May 24 22:32:05 2026
***************
*** 1,14 ****
  // XANDESPERF
  /* Andes Performance Extension */
! RISCV_BUILTIN (nds_ffbsi, "nds_ffb_32", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffbdi, "nds_ffb_64", RISCV_BUILTIN_DIRECT, RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_ffzmismsi, "nds_ffzmism_32", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffzmismdi, "nds_ffzmism_64", RISCV_BUILTIN_DIRECT, RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_ffmismsi, "nds_ffmism_32", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffmismdi, "nds_ffmism_64", RISCV_BUILTIN_DIRECT, RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_flmismsi, "nds_flmism_32", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_flmismdi, "nds_flmism_64", RISCV_BUILTIN_DIRECT, RISCV_DI_FTYPE_UDI_UDI, andesperf64),
  
  /* Andes Scalar BFLOAT16 Conversion Extension */
! RISCV_BUILTIN_NO_PREFIX (extendbfsf2, "nds_fcvt_s_bf16", RISCV_BUILTIN_DIRECT, RISCV_SF_FTYPE_BF, andesbfhcvt),
! RISCV_BUILTIN_NO_PREFIX (truncsfbf2, "nds_fcvt_bf16_s", RISCV_BUILTIN_DIRECT, RISCV_BF_FTYPE_SF, andesbfhcvt),
--- 1,14 ----
  // XANDESPERF
  /* Andes Performance Extension */
! RISCV_BUILTIN (nds_ffbsi, "nds_ffb_32", RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffbdi, "nds_ffb_64", RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_ffzmismsi, "nds_ffzmism_32", RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffzmismdi, "nds_ffzmism_64", RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_ffmismsi, "nds_ffmism_32", RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_ffmismdi, "nds_ffmism_64", RISCV_DI_FTYPE_UDI_UDI, andesperf64),
! RISCV_BUILTIN (nds_flmismsi, "nds_flmism_32", RISCV_SI_FTYPE_USI_USI, andesperf32),
! RISCV_BUILTIN (nds_flmismdi, "nds_flmism_64", RISCV_DI_FTYPE_UDI_UDI, andesperf64),
  
  /* Andes Scalar BFLOAT16 Conversion Extension */
! RISCV_BUILTIN_NO_PREFIX (extendbfsf2, "nds_fcvt_s_bf16", RISCV_SF_FTYPE_BF, andesbfhcvt),
! RISCV_BUILTIN_NO_PREFIX (truncsfbf2, "nds_fcvt_bf16_s", RISCV_BF_FTYPE_SF, andesbfhcvt),
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/andes_vector.h gcc-17-20260524/gcc/config/riscv/andes_vector.h
*** gcc-17-20260517/gcc/config/riscv/andes_vector.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/andes_vector.h	Sun May 24 22:32:05 2026
***************
*** 25,30 ****
--- 25,35 ----
  #ifndef __ANDES_VECTOR_H
  #define __ANDES_VECTOR_H
  
+ #define __riscv_intrinsic_xandesvbfhcvt 1
+ #define __riscv_intrinsic_xandesvdot 1
+ #define __riscv_intrinsic_xandesvpackfph 1
+ #define __riscv_intrinsic_xandesvsintload 1
+ 
  /* TODO: This should have a separate pragma to include only the Andes
  	 vector intrinsics.  For now, we are including riscv_vector.h.  */
  #include <riscv_vector.h>
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/autovec.md gcc-17-20260524/gcc/config/riscv/autovec.md
*** gcc-17-20260517/gcc/config/riscv/autovec.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/autovec.md	Sun May 24 22:32:05 2026
***************
*** 3017,3099 ****
    }
  )
  
- ;; Implement cond_len_vec_cbranch_any and cond_len_vec_cbranch_all
- ;; Vector comparison with length and mask, then branch for integer types.
- (define_expand "<cbranch_optab><mode>"
-   [(set (pc)
- 	(unspec:V_VLSI
- 	  [(if_then_else
- 	    (match_operator 0 "riscv_cbranch_comparison_operator"
- 	      [(match_operand:<VM> 1 "register_operand")
- 	       (match_operand:V_VLSI 2 "register_operand")
- 	       (match_operand:V_VLSI 3 "nonmemory_operand")
- 	       (match_operand 4 "autovec_length_operand")
- 	       (match_operand 5 "const_0_operand")])
- 	    (label_ref (match_operand 6 ""))
- 	    (pc))]
- 	 COND_LEN_CBRANCH_CMP))]
-   "TARGET_VECTOR"
- {
-   rtx_code code = GET_CODE (operands[0]);
-   rtx mask = gen_reg_rtx (<VM>mode);
- 
-   /* Generate the masked comparison.  */
-   rtx maskoff = CONST0_RTX (<VM>mode);
-   riscv_vector::expand_vec_cmp (mask, code, operands[2], operands[3],
- 				operands[1], maskoff);
- 
-   /* Use vcpop to count the number of active elements.  */
-   rtx count = gen_reg_rtx (Pmode);
-   rtx cpop_ops[] = {count, mask};
-   riscv_vector::emit_vlmax_insn (code_for_pred_popcount (<VM>mode, Pmode),
- 				 riscv_vector::CPOP_OP, cpop_ops);
- 
-   /* Branch based on whether count is zero or non-zero.  */
-   riscv_expand_conditional_branch (operands[6], <cbranch_op>, count,
- 				   const0_rtx);
-   DONE;
- })
- 
- ;; Floating-point version with length and mask
- (define_expand "<cbranch_optab><mode>"
-   [(set (pc)
- 	(unspec:V_VLSF
- 	  [(if_then_else
- 	    (match_operator 0 "riscv_cbranch_comparison_operator"
- 	      [(match_operand:<VM> 1 "register_operand")
- 	       (match_operand:V_VLSF 2 "register_operand")
- 	       (match_operand:V_VLSF 3 "register_operand")
- 	       (match_operand 4 "autovec_length_operand")
- 	       (match_operand 5 "const_0_operand")])
- 	    (label_ref (match_operand 6 ""))
- 	    (pc))]
- 	 COND_LEN_CBRANCH_CMP))]
-   "TARGET_VECTOR"
- {
-   rtx_code code = GET_CODE (operands[0]);
-   rtx mask = gen_reg_rtx (<VM>mode);
- 
-   rtx tmp = gen_reg_rtx (<VM>mode);
-   riscv_vector::expand_vec_cmp_float (tmp, code, operands[2], operands[3],
- 				      false);
- 
-   /* Combine with the incoming mask using AND.  */
-   rtx ops[] = {mask, operands[1], tmp};
-   riscv_vector::emit_vlmax_insn (code_for_pred (AND, <VM>mode),
- 				 riscv_vector::BINARY_MASK_OP, ops);
- 
-   /* Use vcpop to count the number of active elements.  */
-   rtx count = gen_reg_rtx (Pmode);
-   rtx cpop_ops[] = {count, mask};
-   riscv_vector::emit_vlmax_insn (code_for_pred_popcount (<VM>mode, Pmode),
- 				 riscv_vector::CPOP_OP, cpop_ops);
- 
-   /* Branch based on whether count is zero or non-zero.  */
-   riscv_expand_conditional_branch (operands[6], <cbranch_op>, count,
- 				   const0_rtx);
-   DONE;
- })
- 
  ;; -------------------------------------------------------------------------
  ;; - vrol.vv vror.vv
  ;; -------------------------------------------------------------------------
--- 3017,3022 ----
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/bitmanip.md gcc-17-20260524/gcc/config/riscv/bitmanip.md
*** gcc-17-20260517/gcc/config/riscv/bitmanip.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/bitmanip.md	Sun May 24 22:32:05 2026
***************
*** 123,128 ****
--- 123,176 ----
    [(set_attr "type" "bitmanip")
     (set_attr "mode" "DI")])
  
+ ;; A shift-left, zext.w, shift-left sequence should turn into a
+ ;; shift-left followed by slli.uw.
+ ;; The "TARGET_ZBA && clz_hwi (operands[3]) <= 32" check in the
+ ;; "*zero_extendsidi2_shifted" pattern over in riscv.md ensures
+ ;; that we fall through to here, if appropriate.
+ ;;
+ ;; Due to the anonymous pattern which utilizes zext.w to clear
+ ;; the upper half of a 64bit register and avoid constant synthesis
+ ;; this must be a define_insn_and_split for now.
+ ;;
+ (define_insn_and_split "*slli_slli_uw"
+   [(set (match_operand:DI 0 "register_operand" "=r")
+ 	(and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
+ 			   (match_operand:QI 2 "dimode_shift_operand" ""))
+ 		(match_operand:DI 3 "consecutive_bits_operand" "")))
+    (clobber (match_scratch:DI 4 "=&r"))]
+   "TARGET_64BIT && TARGET_ZBA
+    && popcount_hwi (INTVAL (operands[3])) < 32
+    && riscv_shamt_matches_mask_p (INTVAL (operands[2]), INTVAL (operands[3]))
+    && IN_RANGE (clz_hwi (INTVAL (operands[3])), 29, 32)"
+   "#"
+   "&& reload_completed"
+   [(const_int 0)]
+ {
+   unsigned HOST_WIDE_INT mask = INTVAL (operands[3]);
+   /* scale: shamt for the slli.uw */
+   int scale = 32 - clz_hwi (mask);
+   /* bias:  shamt for the prior shift (can be zero) */
+   int bias = ctz_hwi (mask) - scale;
+ 
+   /* Don't emit a zero count shift.  Nothing post-reload will clean
+      that up.  */
+   if (bias != 0)
+     emit_insn (gen_rtx_SET (operands[4],
+ 			    gen_rtx_ASHIFT (DImode, operands[1],
+ 					    GEN_INT (bias))));
+ 
+   /* If BIAS was zero, then the source is still in operands[1], else
+      it's in the scratch register.  */
+   emit_insn (gen_riscv_slli_uw (operands[0],
+ 				bias ? operands[4] : operands[1],
+ 				GEN_INT (scale),
+ 				GEN_INT (HOST_WIDE_INT_C (0xffffffff) << scale)));
+   DONE;
+ }
+   [(set_attr "type" "bitmanip")])
+ 
+ 
  ;; During combine, we may encounter an attempt to combine
  ;;   slli rtmp, rs, #imm
  ;;   zext.w rtmp, rtmp
***************
*** 130,171 ****
  ;; which will lead to the immediate not satisfying the above constraints.
  ;; By splitting the compound expression, we can simplify to a slli and a
  ;; sh[123]add.uw.
! (define_split
!   [(set (match_operand:DI 0 "register_operand")
! 	(plus:DI (and:DI (ashift:DI (match_operand:DI 1 "register_operand")
! 				    (match_operand:QI 2 "immediate_operand"))
! 			 (match_operand:DI 3 "consecutive_bits_operand"))
! 		 (match_operand:DI 4 "register_operand")))
!    (clobber (match_operand:DI 5 "register_operand"))]
!   "TARGET_64BIT && TARGET_ZBA"
    [(set (match_dup 5) (ashift:DI (match_dup 1) (match_dup 6)))
     (set (match_dup 0) (plus:DI (and:DI (ashift:DI (match_dup 5)
  						  (match_dup 7))
  				       (match_dup 8))
  			       (match_dup 4)))]
  {
! 	unsigned HOST_WIDE_INT mask = UINTVAL (operands[3]);
! 	/* scale: shift within the sh[123]add.uw */
! 	unsigned HOST_WIDE_INT scale = 32 - clz_hwi (mask);
! 	/* bias:  pre-scale amount (i.e. the prior shift amount) */
! 	int bias = ctz_hwi (mask) - scale;
! 
! 	/* If the bias + scale don't add up to operand[2], reject. */
! 	if ((scale + bias) != UINTVAL (operands[2]))
! 	   FAIL;
  
! 	/* If the shift-amount is out-of-range for sh[123]add.uw, reject. */
! 	if ((scale < 1) || (scale > 3))
! 	   FAIL;
  
! 	/* If there's no bias, the '*shNadduw' pattern should have matched. */
! 	if (bias == 0)
! 	   FAIL;
  
- 	operands[6] = GEN_INT (bias);
- 	operands[7] = GEN_INT (scale);
- 	operands[8] = GEN_INT (0xffffffffULL << scale);
- })
  
  (define_insn "*add.uw"
    [(set (match_operand:DI 0 "register_operand" "=r")
--- 178,223 ----
  ;; which will lead to the immediate not satisfying the above constraints.
  ;; By splitting the compound expression, we can simplify to a slli and a
  ;; sh[123]add.uw.
! 
! ;; To match this target sequence, the final result must be shifted
! ;; using the sh[123]add.uw instruction by 1, 2 or 3 bits into the high
! ;; word.  To test for this property, we count the leading zero-bits of
! ;; the mask (which must be in the range [29, 31]).
! 
! (define_insn_and_split "*shift_then_shNadd.uw"
!   [(set (match_operand:DI 0 "register_operand" "=r")
! 	(plus:DI (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
! 				    (match_operand:QI 2 "dimode_shift_operand" ""))
! 			 (match_operand:DI 3 "consecutive_bits_operand" ""))
! 		 (match_operand:DI 4 "register_operand" "r")))
!    (clobber (match_scratch:DI 5 "=&r"))]
!   "TARGET_64BIT && TARGET_ZBA
!    && riscv_shamt_matches_mask_p (UINTVAL (operands[2]), UINTVAL (operands[3]))
!    && IN_RANGE (clz_hwi (UINTVAL (operands[3])), 29, 31)"
!   "#"
!   "&& reload_completed"
    [(set (match_dup 5) (ashift:DI (match_dup 1) (match_dup 6)))
     (set (match_dup 0) (plus:DI (and:DI (ashift:DI (match_dup 5)
  						  (match_dup 7))
  				       (match_dup 8))
  			       (match_dup 4)))]
  {
!   unsigned HOST_WIDE_INT mask = INTVAL (operands[3]);
!   /* scale: shamt for the sh[123]add.uw */
!   unsigned HOST_WIDE_INT scale = 32 - clz_hwi (mask);
!   /* bias:  shamt for the prior shift */
!   unsigned HOST_WIDE_INT bias = ctz_hwi (mask) - scale;
  
!   /* If there's no bias, the '*shNadduw' pattern should have matched.  */
!   if (bias == 0)
!     FAIL;
  
!   operands[6] = GEN_INT (bias);
!   operands[7] = GEN_INT (scale);
!   operands[8] = GEN_INT (HOST_WIDE_INT_C (0xffffffff) << scale);
! }
!   [(set_attr "type" "bitmanip")])
  
  
  (define_insn "*add.uw"
    [(set (match_operand:DI 0 "register_operand" "=r")
***************
*** 177,183 ****
    [(set_attr "type" "bitmanip")
     (set_attr "mode" "DI")])
  
! (define_insn "*slliuw"
    [(set (match_operand:DI 0 "register_operand" "=r")
  	(and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
  			   (match_operand:QI 2 "immediate_operand" "I"))
--- 229,235 ----
    [(set_attr "type" "bitmanip")
     (set_attr "mode" "DI")])
  
! (define_insn "riscv_slli_uw"
    [(set (match_operand:DI 0 "register_operand" "=r")
  	(and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
  			   (match_operand:QI 2 "immediate_operand" "I"))
***************
*** 1237,1261 ****
       it is possible to store the quotient within a single variable
       (E.g.  CRC64's quotient may need 65 bits,
       we can't keep it in 64 bit variable.)
!      then use clmul instruction to implement the CRC,
!      otherwise (TARGET_ZBKB) generate table based using brev.  */
    if ((TARGET_ZBKC || TARGET_ZBC || TARGET_ZVBC) && <ANYI:MODE>mode < word_mode)
      expand_reversed_crc_using_clmul (<ANYI:MODE>mode, <ANYI1:MODE>mode,
  				     operands);
-   else if (TARGET_ZBKB)
-     /* Generate table-based CRC.
-        To reflect values use brev and bswap instructions.  */
-     expand_reversed_crc_table_based (operands[0], operands[1],
- 				     operands[2], operands[3],
- 				     GET_MODE (operands[2]),
- 				     generate_reflecting_code_using_brev);
    else
      /* Generate table-based CRC.
         To reflect values use standard reflecting algorithm.  */
      expand_reversed_crc_table_based (operands[0], operands[1],
  				     operands[2], operands[3],
! 				     GET_MODE (operands[2]),
! 				     generate_reflecting_code_standard);
    DONE;
  })
  
--- 1289,1304 ----
       it is possible to store the quotient within a single variable
       (E.g.  CRC64's quotient may need 65 bits,
       we can't keep it in 64 bit variable.)
!      then use clmul instruction to implement the CRC.  */
    if ((TARGET_ZBKC || TARGET_ZBC || TARGET_ZVBC) && <ANYI:MODE>mode < word_mode)
      expand_reversed_crc_using_clmul (<ANYI:MODE>mode, <ANYI1:MODE>mode,
  				     operands);
    else
      /* Generate table-based CRC.
         To reflect values use standard reflecting algorithm.  */
      expand_reversed_crc_table_based (operands[0], operands[1],
  				     operands[2], operands[3],
! 				     GET_MODE (operands[2]));
    DONE;
  })
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/corev.def gcc-17-20260524/gcc/config/riscv/corev.def
*** gcc-17-20260517/gcc/config/riscv/corev.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/corev.def	Sun May 24 22:32:05 2026
***************
*** 1,202 ****
  // XCVMAC
! RISCV_BUILTIN (cv_mac_mac,       "cv_mac_mac",    RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI,      cvmac),
! RISCV_BUILTIN (cv_mac_msu,       "cv_mac_msu",    RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI,      cvmac),
! RISCV_BUILTIN (cv_mac_muluN,     "cv_mac_muluN",      RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulhhuN,   "cv_mac_mulhhuN",    RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulsN,     "cv_mac_mulsN",      RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_mulhhsN,   "cv_mac_mulhhsN",    RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_muluRN,    "cv_mac_muluRN",     RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulhhuRN,  "cv_mac_mulhhuRN",   RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulsRN,    "cv_mac_mulsRN",     RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_mulhhsRN,  "cv_mac_mulhhsRN",   RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_macuN,     "cv_mac_macuN",      RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_machhuN,   "cv_mac_machhuN",    RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_macsN,     "cv_mac_macsN",      RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_machhsN,   "cv_mac_machhsN",    RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_macuRN,    "cv_mac_macuRN",     RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_machhuRN,  "cv_mac_machhuRN",   RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_macsRN,    "cv_mac_macsRN",     RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_machhsRN,  "cv_mac_machhsRN",   RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
  
  // XCVALU
! RISCV_BUILTIN (cv_alu_slet,     "cv_alu_slet",  RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_sletu,    "cv_alu_sletu", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_USI_USI,   cvalu),
! RISCV_BUILTIN (cv_alu_min,      "cv_alu_min",   RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_minu,     "cv_alu_minu",  RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI,  cvalu),
! RISCV_BUILTIN (cv_alu_max,      "cv_alu_max",   RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_maxu,     "cv_alu_maxu",  RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI,  cvalu),
  
! RISCV_BUILTIN (cv_alu_exths,    "cv_alu_exths", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_HI,        cvalu),
! RISCV_BUILTIN (cv_alu_exthz,    "cv_alu_exthz", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_UHI,      cvalu),
! RISCV_BUILTIN (cv_alu_extbs,    "cv_alu_extbs", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_QI,        cvalu),
! RISCV_BUILTIN (cv_alu_extbz,    "cv_alu_extbz", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_UQI,      cvalu),
  
! RISCV_BUILTIN (cv_alu_clip,     "cv_alu_clip",  RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_clipu,    "cv_alu_clipu", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI,  cvalu),
! RISCV_BUILTIN (cv_alu_addN,     "cv_alu_addN",  RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_adduN,    "cv_alu_adduN", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_addRN,    "cv_alu_addRN", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_adduRN,   "cv_alu_adduRN",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_subN,     "cv_alu_subN", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_subuN,    "cv_alu_subuN", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_subRN,    "cv_alu_subRN", RISCV_BUILTIN_DIRECT, RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_subuRN,   "cv_alu_subuRN",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
  
  // XCVELW
! RISCV_BUILTIN (cv_elw_elw_si, "cv_elw_elw", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_VOID_PTR, cvelw),
  
  // XCVSIMD
  //ALU Operations
! RISCV_BUILTIN (cv_simd_add_h_si,		"cv_simd_add_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_add_b_si,		"cv_simd_add_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_add_sc_h_si,		"cv_simd_add_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_add_sc_b_si,		"cv_simd_add_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_h_si,		"cv_simd_sub_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sub_b_si,		"cv_simd_sub_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_sc_h_si,		"cv_simd_sub_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_sc_b_si,		"cv_simd_sub_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_h_si,		"cv_simd_avg_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_b_si,		"cv_simd_avg_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_sc_h_si,		"cv_simd_avg_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_sc_b_si,		"cv_simd_avg_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_h_si,		"cv_simd_avgu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_b_si,		"cv_simd_avgu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_sc_h_si,		"cv_simd_avgu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_sc_b_si,		"cv_simd_avgu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_h_si,		"cv_simd_min_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_b_si,		"cv_simd_min_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_sc_h_si,		"cv_simd_min_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_sc_b_si,		"cv_simd_min_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_h_si,		"cv_simd_minu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_b_si,		"cv_simd_minu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_sc_h_si,		"cv_simd_minu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_sc_b_si,		"cv_simd_minu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_h_si,		"cv_simd_max_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_b_si,		"cv_simd_max_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_sc_h_si,		"cv_simd_max_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_sc_b_si,		"cv_simd_max_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_h_si,		"cv_simd_maxu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_b_si,		"cv_simd_maxu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_sc_h_si,		"cv_simd_maxu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_sc_b_si,		"cv_simd_maxu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_h_si,		"cv_simd_srl_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_b_si,		"cv_simd_srl_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_sc_h_si,		"cv_simd_srl_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_sc_b_si,		"cv_simd_srl_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_h_si,		"cv_simd_sra_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_b_si,		"cv_simd_sra_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_sc_h_si,		"cv_simd_sra_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_sc_b_si,		"cv_simd_sra_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_h_si,		"cv_simd_sll_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_b_si,		"cv_simd_sll_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_sc_h_si,		"cv_simd_sll_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_sc_b_si,		"cv_simd_sll_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_h_si,			"cv_simd_or_h",		RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_b_si,			"cv_simd_or_b",		RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_sc_h_si,		"cv_simd_or_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_sc_b_si,		"cv_simd_or_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_h_si,		"cv_simd_xor_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_b_si,		"cv_simd_xor_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_sc_h_si,		"cv_simd_xor_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_sc_b_si,		"cv_simd_xor_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_h_si,		"cv_simd_and_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_b_si,		"cv_simd_and_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_sc_h_si,		"cv_simd_and_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_sc_b_si,		"cv_simd_and_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_abs_h_si,		"cv_simd_abs_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_abs_b_si,		"cv_simd_abs_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_neg_h_si,                "cv_simd_neg_h",        RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,              cvsimd),
! RISCV_BUILTIN (cv_simd_neg_b_si,                "cv_simd_neg_b",        RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,              cvsimd),
  //BIT MANIPULATION
! RISCV_BUILTIN (cv_simd_extract_h_si,		"cv_simd_extract_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extract_b_si,		"cv_simd_extract_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extractu_h_si,		"cv_simd_extractu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extractu_b_si,		"cv_simd_extractu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_insert_h_si,		"cv_simd_insert_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_QI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_insert_b_si,		"cv_simd_insert_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_QI, 	cvsimd),
  //DOT PRODUCT
! RISCV_BUILTIN (cv_simd_dotup_h_si,		"cv_simd_dotup_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_b_si,		"cv_simd_dotup_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_sc_h_si,		"cv_simd_dotup_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_sc_b_si,		"cv_simd_dotup_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_h_si,		"cv_simd_dotusp_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_b_si,		"cv_simd_dotusp_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_sc_h_si,		"cv_simd_dotusp_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_sc_b_si,		"cv_simd_dotusp_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_h_si,		"cv_simd_dotsp_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_b_si,		"cv_simd_dotsp_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_sc_h_si,		"cv_simd_dotsp_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_sc_b_si,		"cv_simd_dotsp_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_h_si,		"cv_simd_sdotup_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_b_si,		"cv_simd_sdotup_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_sc_h_si,		"cv_simd_sdotup_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_sc_b_si,		"cv_simd_sdotup_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_h_si,		"cv_simd_sdotusp_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_b_si,		"cv_simd_sdotusp_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_sc_h_si,		"cv_simd_sdotusp_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_sc_b_si,		"cv_simd_sdotusp_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_h_si,		"cv_simd_sdotsp_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_b_si,		"cv_simd_sdotsp_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_sc_h_si,		"cv_simd_sdotsp_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_sc_b_si,		"cv_simd_sdotsp_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI_USI, 	cvsimd),
  //SHUFFLE AND PACK
! RISCV_BUILTIN (cv_simd_shuffle_h_si,		"cv_simd_shuffle_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_sci_h_si,	"cv_simd_shuffle_sci_h",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_b_si,		"cv_simd_shuffle_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_sci_b_si,	"cv_simd_shuffle_sci_b",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle2_h_si,		"cv_simd_shuffle2_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle2_b_si,		"cv_simd_shuffle2_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_packhi_h_si,		"cv_simd_packhi_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packlo_h_si,		"cv_simd_packlo_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packhi_b_si,		"cv_simd_packhi_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packlo_b_si,		"cv_simd_packlo_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI,  	cvsimd),
! //RISCV_BUILTIN (cv_simd_pack_si,		"cv_simd_pack",		RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! //RISCV_BUILTIN (cv_simd_pack_h_si,		"cv_simd_pack_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! //RISCV_BUILTIN (cv_simd_packhi_b_si,		"cv_simd_packhi_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! //RISCV_BUILTIN (cv_simd_packlo_b_si,		"cv_simd_packlo_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
  //COMPARISON OPERATIONS
! RISCV_BUILTIN (cv_simd_cmpeq_h_si,		"cv_simd_cmpeq_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_b_si,		"cv_simd_cmpeq_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_sc_h_si,		"cv_simd_cmpeq_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_sc_b_si,		"cv_simd_cmpeq_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_h_si,		"cv_simd_cmpne_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_b_si,		"cv_simd_cmpne_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_sc_h_si,		"cv_simd_cmpne_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_sc_b_si,		"cv_simd_cmpne_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_h_si,		"cv_simd_cmpgt_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_b_si,		"cv_simd_cmpgt_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_sc_h_si,		"cv_simd_cmpgt_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_sc_b_si,		"cv_simd_cmpgt_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_h_si,		"cv_simd_cmpge_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_b_si,		"cv_simd_cmpge_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_sc_h_si,		"cv_simd_cmpge_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_sc_b_si,		"cv_simd_cmpge_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_h_si,		"cv_simd_cmplt_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_b_si,		"cv_simd_cmplt_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_sc_h_si,		"cv_simd_cmplt_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_sc_b_si,		"cv_simd_cmplt_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_h_si,		"cv_simd_cmple_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_b_si,		"cv_simd_cmple_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_sc_h_si,		"cv_simd_cmple_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_sc_b_si,		"cv_simd_cmple_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_h_si,		"cv_simd_cmpgtu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_b_si,		"cv_simd_cmpgtu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_sc_h_si,		"cv_simd_cmpgtu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_sc_b_si,		"cv_simd_cmpgtu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_h_si,		"cv_simd_cmpgeu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_b_si,		"cv_simd_cmpgeu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_sc_h_si,		"cv_simd_cmpgeu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_sc_b_si,		"cv_simd_cmpgeu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_h_si,		"cv_simd_cmpltu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_b_si,		"cv_simd_cmpltu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_sc_h_si,		"cv_simd_cmpltu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_sc_b_si,		"cv_simd_cmpltu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_h_si,		"cv_simd_cmpleu_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_b_si,		"cv_simd_cmpleu_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_sc_h_si,		"cv_simd_cmpleu_sc_h",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_sc_b_si,		"cv_simd_cmpleu_sc_b",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
  //COMPLEX NUMBER
! RISCV_BUILTIN (cv_simd_cplxmul_r_si,		"cv_simd_cplxmul_r",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_cplxmul_i_si,		"cv_simd_cplxmul_i",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_cplxconj_si,		"cv_simd_cplxconj",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_subrotmj_si,		"cv_simd_subrotmj",	RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
--- 1,202 ----
  // XCVMAC
! RISCV_BUILTIN (cv_mac_mac,       "cv_mac_mac",    RISCV_SI_FTYPE_SI_SI_SI,      cvmac),
! RISCV_BUILTIN (cv_mac_msu,       "cv_mac_msu",    RISCV_SI_FTYPE_SI_SI_SI,      cvmac),
! RISCV_BUILTIN (cv_mac_muluN,     "cv_mac_muluN",      RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulhhuN,   "cv_mac_mulhhuN",    RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulsN,     "cv_mac_mulsN",      RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_mulhhsN,   "cv_mac_mulhhsN",    RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_muluRN,    "cv_mac_muluRN",     RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulhhuRN,  "cv_mac_mulhhuRN",   RISCV_USI_FTYPE_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_mulsRN,    "cv_mac_mulsRN",     RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_mulhhsRN,  "cv_mac_mulhhsRN",   RISCV_SI_FTYPE_SI_SI_UQI,     cvmac),
! RISCV_BUILTIN (cv_mac_macuN,     "cv_mac_macuN",      RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_machhuN,   "cv_mac_machhuN",    RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_macsN,     "cv_mac_macsN",      RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_machhsN,   "cv_mac_machhsN",    RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_macuRN,    "cv_mac_macuRN",     RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_machhuRN,  "cv_mac_machhuRN",   RISCV_USI_FTYPE_USI_USI_USI_UQI,  cvmac),
! RISCV_BUILTIN (cv_mac_macsRN,    "cv_mac_macsRN",     RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
! RISCV_BUILTIN (cv_mac_machhsRN,  "cv_mac_machhsRN",   RISCV_SI_FTYPE_SI_SI_SI_UQI,      cvmac),
  
  // XCVALU
! RISCV_BUILTIN (cv_alu_slet,     "cv_alu_slet",  RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_sletu,    "cv_alu_sletu", RISCV_SI_FTYPE_USI_USI,   cvalu),
! RISCV_BUILTIN (cv_alu_min,      "cv_alu_min",   RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_minu,     "cv_alu_minu",  RISCV_USI_FTYPE_USI_USI,  cvalu),
! RISCV_BUILTIN (cv_alu_max,      "cv_alu_max",   RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_maxu,     "cv_alu_maxu",  RISCV_USI_FTYPE_USI_USI,  cvalu),
  
! RISCV_BUILTIN (cv_alu_exths,    "cv_alu_exths", RISCV_SI_FTYPE_HI,        cvalu),
! RISCV_BUILTIN (cv_alu_exthz,    "cv_alu_exthz", RISCV_USI_FTYPE_UHI,      cvalu),
! RISCV_BUILTIN (cv_alu_extbs,    "cv_alu_extbs", RISCV_SI_FTYPE_QI,        cvalu),
! RISCV_BUILTIN (cv_alu_extbz,    "cv_alu_extbz", RISCV_USI_FTYPE_UQI,      cvalu),
  
! RISCV_BUILTIN (cv_alu_clip,     "cv_alu_clip",  RISCV_SI_FTYPE_SI_SI,     cvalu),
! RISCV_BUILTIN (cv_alu_clipu,    "cv_alu_clipu", RISCV_USI_FTYPE_USI_USI,  cvalu),
! RISCV_BUILTIN (cv_alu_addN,     "cv_alu_addN",  RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_adduN,    "cv_alu_adduN", RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_addRN,    "cv_alu_addRN", RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_adduRN,   "cv_alu_adduRN",RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_subN,     "cv_alu_subN", RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_subuN,    "cv_alu_subuN", RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
! RISCV_BUILTIN (cv_alu_subRN,    "cv_alu_subRN", RISCV_SI_FTYPE_SI_SI_UQI, cvalu),
! RISCV_BUILTIN (cv_alu_subuRN,   "cv_alu_subuRN",RISCV_USI_FTYPE_USI_USI_UQI,  cvalu),
  
  // XCVELW
! RISCV_BUILTIN (cv_elw_elw_si, "cv_elw_elw", RISCV_USI_FTYPE_VOID_PTR, cvelw),
  
  // XCVSIMD
  //ALU Operations
! RISCV_BUILTIN (cv_simd_add_h_si,		"cv_simd_add_h",	RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_add_b_si,		"cv_simd_add_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_add_sc_h_si,		"cv_simd_add_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_add_sc_b_si,		"cv_simd_add_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_h_si,		"cv_simd_sub_h",	RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sub_b_si,		"cv_simd_sub_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_sc_h_si,		"cv_simd_sub_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sub_sc_b_si,		"cv_simd_sub_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_h_si,		"cv_simd_avg_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_b_si,		"cv_simd_avg_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_sc_h_si,		"cv_simd_avg_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avg_sc_b_si,		"cv_simd_avg_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_h_si,		"cv_simd_avgu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_b_si,		"cv_simd_avgu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_sc_h_si,		"cv_simd_avgu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_avgu_sc_b_si,		"cv_simd_avgu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_h_si,		"cv_simd_min_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_b_si,		"cv_simd_min_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_sc_h_si,		"cv_simd_min_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_min_sc_b_si,		"cv_simd_min_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_h_si,		"cv_simd_minu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_b_si,		"cv_simd_minu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_sc_h_si,		"cv_simd_minu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_minu_sc_b_si,		"cv_simd_minu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_h_si,		"cv_simd_max_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_b_si,		"cv_simd_max_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_sc_h_si,		"cv_simd_max_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_max_sc_b_si,		"cv_simd_max_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_h_si,		"cv_simd_maxu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_b_si,		"cv_simd_maxu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_sc_h_si,		"cv_simd_maxu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_maxu_sc_b_si,		"cv_simd_maxu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_h_si,		"cv_simd_srl_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_b_si,		"cv_simd_srl_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_sc_h_si,		"cv_simd_srl_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_srl_sc_b_si,		"cv_simd_srl_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_h_si,		"cv_simd_sra_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_b_si,		"cv_simd_sra_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_sc_h_si,		"cv_simd_sra_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sra_sc_b_si,		"cv_simd_sra_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_h_si,		"cv_simd_sll_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_b_si,		"cv_simd_sll_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_sc_h_si,		"cv_simd_sll_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sll_sc_b_si,		"cv_simd_sll_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_h_si,			"cv_simd_or_h",		RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_b_si,			"cv_simd_or_b",		RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_sc_h_si,		"cv_simd_or_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_or_sc_b_si,		"cv_simd_or_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_h_si,		"cv_simd_xor_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_b_si,		"cv_simd_xor_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_sc_h_si,		"cv_simd_xor_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_xor_sc_b_si,		"cv_simd_xor_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_h_si,		"cv_simd_and_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_b_si,		"cv_simd_and_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_sc_h_si,		"cv_simd_and_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_and_sc_b_si,		"cv_simd_and_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_abs_h_si,		"cv_simd_abs_h",	RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_abs_b_si,		"cv_simd_abs_b",	RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_neg_h_si,                "cv_simd_neg_h",        RISCV_USI_FTYPE_USI,              cvsimd),
! RISCV_BUILTIN (cv_simd_neg_b_si,                "cv_simd_neg_b",        RISCV_USI_FTYPE_USI,              cvsimd),
  //BIT MANIPULATION
! RISCV_BUILTIN (cv_simd_extract_h_si,		"cv_simd_extract_h",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extract_b_si,		"cv_simd_extract_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extractu_h_si,		"cv_simd_extractu_h",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_extractu_b_si,		"cv_simd_extractu_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_insert_h_si,		"cv_simd_insert_h",	RISCV_USI_FTYPE_USI_USI_QI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_insert_b_si,		"cv_simd_insert_b",	RISCV_USI_FTYPE_USI_USI_QI, 	cvsimd),
  //DOT PRODUCT
! RISCV_BUILTIN (cv_simd_dotup_h_si,		"cv_simd_dotup_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_b_si,		"cv_simd_dotup_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_sc_h_si,		"cv_simd_dotup_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotup_sc_b_si,		"cv_simd_dotup_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_h_si,		"cv_simd_dotusp_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_b_si,		"cv_simd_dotusp_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_sc_h_si,		"cv_simd_dotusp_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotusp_sc_b_si,		"cv_simd_dotusp_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_h_si,		"cv_simd_dotsp_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_b_si,		"cv_simd_dotsp_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_sc_h_si,		"cv_simd_dotsp_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_dotsp_sc_b_si,		"cv_simd_dotsp_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_h_si,		"cv_simd_sdotup_h",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_b_si,		"cv_simd_sdotup_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_sc_h_si,		"cv_simd_sdotup_sc_h",	RISCV_USI_FTYPE_USI_UHI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotup_sc_b_si,		"cv_simd_sdotup_sc_b",	RISCV_USI_FTYPE_USI_UQI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_h_si,		"cv_simd_sdotusp_h",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_b_si,		"cv_simd_sdotusp_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_sc_h_si,		"cv_simd_sdotusp_sc_h",	RISCV_USI_FTYPE_USI_HI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotusp_sc_b_si,		"cv_simd_sdotusp_sc_b",	RISCV_USI_FTYPE_USI_QI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_h_si,		"cv_simd_sdotsp_h",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_b_si,		"cv_simd_sdotsp_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_sc_h_si,		"cv_simd_sdotsp_sc_h",	RISCV_USI_FTYPE_USI_HI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_sdotsp_sc_b_si,		"cv_simd_sdotsp_sc_b",	RISCV_USI_FTYPE_USI_QI_USI, 	cvsimd),
  //SHUFFLE AND PACK
! RISCV_BUILTIN (cv_simd_shuffle_h_si,		"cv_simd_shuffle_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_sci_h_si,	"cv_simd_shuffle_sci_h",RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_b_si,		"cv_simd_shuffle_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle_sci_b_si,	"cv_simd_shuffle_sci_b",RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle2_h_si,		"cv_simd_shuffle2_h",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_shuffle2_b_si,		"cv_simd_shuffle2_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_packhi_h_si,		"cv_simd_packhi_h",	RISCV_USI_FTYPE_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packlo_h_si,		"cv_simd_packlo_h",	RISCV_USI_FTYPE_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packhi_b_si,		"cv_simd_packhi_b",	RISCV_USI_FTYPE_USI_USI_USI,  	cvsimd),
! RISCV_BUILTIN (cv_simd_packlo_b_si,		"cv_simd_packlo_b",	RISCV_USI_FTYPE_USI_USI_USI,  	cvsimd),
! //RISCV_BUILTIN (cv_simd_pack_si,		"cv_simd_pack",		RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! //RISCV_BUILTIN (cv_simd_pack_h_si,		"cv_simd_pack_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! //RISCV_BUILTIN (cv_simd_packhi_b_si,		"cv_simd_packhi_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
! //RISCV_BUILTIN (cv_simd_packlo_b_si,		"cv_simd_packlo_b",	RISCV_USI_FTYPE_USI_USI_USI, 	cvsimd),
  //COMPARISON OPERATIONS
! RISCV_BUILTIN (cv_simd_cmpeq_h_si,		"cv_simd_cmpeq_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_b_si,		"cv_simd_cmpeq_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_sc_h_si,		"cv_simd_cmpeq_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpeq_sc_b_si,		"cv_simd_cmpeq_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_h_si,		"cv_simd_cmpne_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_b_si,		"cv_simd_cmpne_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_sc_h_si,		"cv_simd_cmpne_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpne_sc_b_si,		"cv_simd_cmpne_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_h_si,		"cv_simd_cmpgt_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_b_si,		"cv_simd_cmpgt_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_sc_h_si,		"cv_simd_cmpgt_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgt_sc_b_si,		"cv_simd_cmpgt_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_h_si,		"cv_simd_cmpge_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_b_si,		"cv_simd_cmpge_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_sc_h_si,		"cv_simd_cmpge_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpge_sc_b_si,		"cv_simd_cmpge_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_h_si,		"cv_simd_cmplt_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_b_si,		"cv_simd_cmplt_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_sc_h_si,		"cv_simd_cmplt_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmplt_sc_b_si,		"cv_simd_cmplt_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_h_si,		"cv_simd_cmple_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_b_si,		"cv_simd_cmple_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_sc_h_si,		"cv_simd_cmple_sc_h",	RISCV_USI_FTYPE_USI_HI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmple_sc_b_si,		"cv_simd_cmple_sc_b",	RISCV_USI_FTYPE_USI_QI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_h_si,		"cv_simd_cmpgtu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_b_si,		"cv_simd_cmpgtu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_sc_h_si,		"cv_simd_cmpgtu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgtu_sc_b_si,		"cv_simd_cmpgtu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_h_si,		"cv_simd_cmpgeu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_b_si,		"cv_simd_cmpgeu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_sc_h_si,		"cv_simd_cmpgeu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpgeu_sc_b_si,		"cv_simd_cmpgeu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_h_si,		"cv_simd_cmpltu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_b_si,		"cv_simd_cmpltu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_sc_h_si,		"cv_simd_cmpltu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpltu_sc_b_si,		"cv_simd_cmpltu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_h_si,		"cv_simd_cmpleu_h",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_b_si,		"cv_simd_cmpleu_b",	RISCV_USI_FTYPE_USI_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_sc_h_si,		"cv_simd_cmpleu_sc_h",	RISCV_USI_FTYPE_USI_UHI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_cmpleu_sc_b_si,		"cv_simd_cmpleu_sc_b",	RISCV_USI_FTYPE_USI_UQI, 		cvsimd),
  //COMPLEX NUMBER
! RISCV_BUILTIN (cv_simd_cplxmul_r_si,		"cv_simd_cplxmul_r",	RISCV_USI_FTYPE_USI_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_cplxmul_i_si,		"cv_simd_cplxmul_i",	RISCV_USI_FTYPE_USI_USI_USI_UQI, 	cvsimd),
! RISCV_BUILTIN (cv_simd_cplxconj_si,		"cv_simd_cplxconj",	RISCV_USI_FTYPE_USI, 		cvsimd),
! RISCV_BUILTIN (cv_simd_subrotmj_si,		"cv_simd_subrotmj",	RISCV_USI_FTYPE_USI_USI_UQI, 	cvsimd),
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/predicates.md gcc-17-20260524/gcc/config/riscv/predicates.md
*** gcc-17-20260517/gcc/config/riscv/predicates.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/predicates.md	Sun May 24 22:32:05 2026
***************
*** 231,236 ****
--- 231,240 ----
                      : IN_RANGE (REGNO (op), S0_REGNUM, S1_REGNUM)
                      || IN_RANGE (REGNO (op), S2_REGNUM, S7_REGNUM)")))
  
+ (define_predicate "dimode_shift_operand"
+   (and (match_code "const_int")
+        (match_test "IN_RANGE (INTVAL (op), 1, GET_MODE_BITSIZE (DImode) - 1)")))
+ 
  ;; Only use branch-on-bit sequences when the mask is not an ANDI immediate.
  (define_predicate "branch_on_bit_operand"
    (and (match_code "const_int")
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-builtins.cc gcc-17-20260524/gcc/config/riscv/riscv-builtins.cc
*** gcc-17-20260517/gcc/config/riscv/riscv-builtins.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-builtins.cc	Sun May 24 22:32:05 2026
*************** enum riscv_function_type {
*** 58,72 ****
    RISCV_MAX_FTYPE_MAX
  };
  
- /* Specifies how a built-in function should be converted into rtl.  */
- enum riscv_builtin_type {
-   /* The function corresponds directly to an .md pattern.  */
-   RISCV_BUILTIN_DIRECT,
- 
-   /* Likewise, but with return type VOID.  */
-   RISCV_BUILTIN_DIRECT_NO_TARGET
- };
- 
  /* Declare an availability predicate for built-in functions.  */
  #define AVAIL(NAME, COND)		\
   static unsigned int			\
--- 58,63 ----
*************** enum riscv_builtin_type {
*** 77,94 ****
  
  /* This structure describes a single built-in function.  */
  struct riscv_builtin_description {
-   /* The code of the main .md file instruction.  See riscv_builtin_type
-      for more information.  */
-   enum insn_code icode;
- 
    /* The name of the built-in function.  */
    const char *name;
  
!   /* Specifies how the function should be expanded.  */
!   enum riscv_builtin_type builtin_type;
  
    /* The function's prototype.  */
!   enum riscv_function_type prototype;
  
    /* Whether the function is available.  */
    unsigned int (*avail) (void);
--- 68,85 ----
  
  /* This structure describes a single built-in function.  */
  struct riscv_builtin_description {
    /* The name of the built-in function.  */
    const char *name;
  
!   /* The code of the main .md file instruction.  See riscv_builtin_type
!      for more information.  */
!   enum insn_code icode;
  
    /* The function's prototype.  */
!   enum riscv_function_type prototype : 24;
! 
!   /* True, if the function returns void (and so expansion has no target RTL).  */
!   bool no_target : 8;
  
    /* Whether the function is available.  */
    unsigned int (*avail) (void);
*************** AVAIL (andesperf32, !TARGET_64BIT && TAR
*** 142,191 ****
  AVAIL (andesperf64, TARGET_64BIT && TARGET_XANDESPERF)
  AVAIL (andesbfhcvt, TARGET_XANDESBFHCVT)
  
! /* Construct a riscv_builtin_description from the given arguments.
! 
!    INSN is the name of the associated instruction pattern, without the
!    leading CODE_FOR_riscv_.
  
     NAME is the name of the function itself, without the leading
     "__builtin_riscv_".
  
-    BUILTIN_TYPE and FUNCTION_TYPE are riscv_builtin_description fields.
- 
-    AVAIL is the name of the availability predicate, without the leading
-    riscv_builtin_avail_.  */
- #define RISCV_BUILTIN(INSN, NAME, BUILTIN_TYPE,	FUNCTION_TYPE, AVAIL)	\
-   { CODE_FOR_riscv_ ## INSN, "__builtin_riscv_" NAME,			\
-     BUILTIN_TYPE, FUNCTION_TYPE, riscv_builtin_avail_ ## AVAIL }
- 
- /* Construct a riscv_builtin_description from the given arguments like RISCV_BUILTIN.
- 
     INSN is the name of the associated instruction pattern, without the
     leading CODE_FOR_.
  
!    NAME is the name of the function itself, without the leading
!    "__builtin_riscv_".
! 
!    BUILTIN_TYPE and FUNCTION_TYPE are riscv_builtin_description fields.
  
     AVAIL is the name of the availability predicate, without the leading
     riscv_builtin_avail_.  */
! #define RISCV_BUILTIN_NO_PREFIX(INSN, NAME, BUILTIN_TYPE,	FUNCTION_TYPE, AVAIL)	\
!   { CODE_FOR_ ## INSN, "__builtin_riscv_" NAME,			\
!     BUILTIN_TYPE, FUNCTION_TYPE, riscv_builtin_avail_ ## AVAIL }
  
! /* Define __builtin_riscv_<INSN>, which is a RISCV_BUILTIN_DIRECT function
!    mapped to instruction CODE_FOR_riscv_<INSN>,  FUNCTION_TYPE and AVAIL
!    are as for RISCV_BUILTIN.  */
  #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)			\
!   RISCV_BUILTIN (INSN, #INSN, RISCV_BUILTIN_DIRECT, FUNCTION_TYPE, AVAIL)
  
- /* Define __builtin_riscv_<INSN>, which is a RISCV_BUILTIN_DIRECT_NO_TARGET
-    function mapped to instruction CODE_FOR_riscv_<INSN>,  FUNCTION_TYPE
-    and AVAIL are as for RISCV_BUILTIN.  */
- #define DIRECT_NO_TARGET_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)		\
-   RISCV_BUILTIN (INSN, #INSN, RISCV_BUILTIN_DIRECT_NO_TARGET,		\
- 		FUNCTION_TYPE, AVAIL)
  
  /* Argument types.  */
  #define RISCV_ATYPE_VOID void_type_node
--- 133,165 ----
  AVAIL (andesperf64, TARGET_64BIT && TARGET_XANDESPERF)
  AVAIL (andesbfhcvt, TARGET_XANDESBFHCVT)
  
! /* Construct a riscv_builtin_description from the given arguments like RISCV_BUILTIN.
  
     NAME is the name of the function itself, without the leading
     "__builtin_riscv_".
  
     INSN is the name of the associated instruction pattern, without the
     leading CODE_FOR_.
  
!    FUNCTION_TYPE is the builtin type enumerator.
  
     AVAIL is the name of the availability predicate, without the leading
     riscv_builtin_avail_.  */
! #define RISCV_BUILTIN_NO_PREFIX(INSN, NAME, FUNCTION_TYPE, AVAIL)	\
!   { "__builtin_riscv_" NAME, CODE_FOR_ ## INSN,				\
!       FUNCTION_TYPE, false, riscv_builtin_avail_ ## AVAIL }
  
! /* Like RISCV_BUiLTIN_NO_PREFIX but with a 'riscv_' prefix added to the
!    instruction code.  */
! #define RISCV_BUILTIN(INSN, NAME, FUNCTION_TYPE, AVAIL)			\
!   RISCV_BUILTIN_NO_PREFIX (riscv_ ## INSN, NAME, FUNCTION_TYPE, AVAIL)
! 
! /* Define __builtin_riscv_<INSN>, which is builtin function mapped to
!    instruction CODE_FOR_riscv_<INSN>, FUNCTION_TYPE and AVAIL are as for
!    RISCV_BUILTIN.  */
  #define DIRECT_BUILTIN(INSN, FUNCTION_TYPE, AVAIL)			\
!   RISCV_BUILTIN (INSN, #INSN, FUNCTION_TYPE, AVAIL)
  
  
  /* Argument types.  */
  #define RISCV_ATYPE_VOID void_type_node
*************** AVAIL (andesbfhcvt, TARGET_XANDESBFHCVT)
*** 216,230 ****
    RISCV_ATYPE_##A, RISCV_ATYPE_##B, RISCV_ATYPE_##C, RISCV_ATYPE_##D, \
    RISCV_ATYPE_##E
  
! static const struct riscv_builtin_description riscv_builtins[] = {
    #include "riscv-cmo.def"
    #include "riscv-scalar-crypto.def"
    #include "corev.def"
    #include "andes.def"
  
    DIRECT_BUILTIN (frflags, RISCV_USI_FTYPE, hard_float),
!   DIRECT_NO_TARGET_BUILTIN (fsflags, RISCV_VOID_FTYPE_USI, hard_float),
!   RISCV_BUILTIN (pause, "pause", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE, hint_pause),
  };
  
  /* Index I is the function declaration for riscv_builtins[I], or null if the
--- 190,204 ----
    RISCV_ATYPE_##A, RISCV_ATYPE_##B, RISCV_ATYPE_##C, RISCV_ATYPE_##D, \
    RISCV_ATYPE_##E
  
! static struct riscv_builtin_description riscv_builtins[] = {
    #include "riscv-cmo.def"
    #include "riscv-scalar-crypto.def"
    #include "corev.def"
    #include "andes.def"
  
    DIRECT_BUILTIN (frflags, RISCV_USI_FTYPE, hard_float),
!   DIRECT_BUILTIN (fsflags, RISCV_VOID_FTYPE_USI, hard_float),
!   RISCV_BUILTIN (pause, "pause", RISCV_VOID_FTYPE, hint_pause),
  };
  
  /* Index I is the function declaration for riscv_builtins[I], or null if the
*************** riscv_init_builtins (void)
*** 310,319 ****
  
    for (size_t i = 0; i < ARRAY_SIZE (riscv_builtins); i++)
      {
!       const struct riscv_builtin_description *d = &riscv_builtins[i];
        if (d->avail ())
  	{
  	  tree type = riscv_build_function_type (d->prototype);
  	  riscv_builtin_decls[i]
  	    = add_builtin_function (d->name, type,
  				    (i << RISCV_BUILTIN_SHIFT)
--- 284,295 ----
  
    for (size_t i = 0; i < ARRAY_SIZE (riscv_builtins); i++)
      {
!       struct riscv_builtin_description *d = &riscv_builtins[i];
        if (d->avail ())
  	{
  	  tree type = riscv_build_function_type (d->prototype);
+ 	  if (VOID_TYPE_P (TREE_TYPE (type)))
+ 	    d->no_target = true;
  	  riscv_builtin_decls[i]
  	    = add_builtin_function (d->name, type,
  				    (i << RISCV_BUILTIN_SHIFT)
*************** riscv_expand_builtin (tree exp, rtx targ
*** 443,456 ****
        case RISCV_BUILTIN_GENERAL: {
  	const struct riscv_builtin_description *d = &riscv_builtins[subcode];
  
! 	switch (d->builtin_type)
! 	  {
! 	  case RISCV_BUILTIN_DIRECT:
! 	    return riscv_expand_builtin_direct (d->icode, target, exp, true);
! 
! 	  case RISCV_BUILTIN_DIRECT_NO_TARGET:
! 	    return riscv_expand_builtin_direct (d->icode, target, exp, false);
! 	  }
        }
      }
  
--- 419,425 ----
        case RISCV_BUILTIN_GENERAL: {
  	const struct riscv_builtin_description *d = &riscv_builtins[subcode];
  
! 	return riscv_expand_builtin_direct (d->icode, target, exp, !d->no_target);
        }
      }
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-cmo.def gcc-17-20260524/gcc/config/riscv/riscv-cmo.def
*** gcc-17-20260517/gcc/config/riscv/riscv-cmo.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-cmo.def	Sun May 24 22:32:05 2026
***************
*** 1,27 ****
  // zicbom
! RISCV_BUILTIN (clean_si, "zicbom_cbo_clean", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, clean32),
! RISCV_BUILTIN (clean_di, "zicbom_cbo_clean", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, clean64),
  
! RISCV_BUILTIN (flush_si, "zicbom_cbo_flush", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, flush32),
! RISCV_BUILTIN (flush_di, "zicbom_cbo_flush", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, flush64),
  
! RISCV_BUILTIN (inval_si, "zicbom_cbo_inval", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, inval32),
! RISCV_BUILTIN (inval_di, "zicbom_cbo_inval", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, inval64),
  
  // zicboz
! RISCV_BUILTIN (zero_si, "zicboz_cbo_zero", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, zero32),
! RISCV_BUILTIN (zero_di, "zicboz_cbo_zero", RISCV_BUILTIN_DIRECT_NO_TARGET, RISCV_VOID_FTYPE_VOID_PTR, zero64),
  
  // zicbop
! RISCV_BUILTIN (prefetchi_si, "zicbop_cbo_prefetchi", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, prefetchi32),
! RISCV_BUILTIN (prefetchi_di, "zicbop_cbo_prefetchi", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI, prefetchi64),
  
  // zbkc or zbc
! RISCV_BUILTIN (clmul_si, "clmul_32", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, clmul_zbkc_or_zbc),
! RISCV_BUILTIN (clmul_di, "clmul_64", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UDI, clmul_zbkc64_or_zbc64),
! RISCV_BUILTIN (clmulh_si, "clmulh_32", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, clmul_zbkc32_or_zbc32),
! RISCV_BUILTIN (clmulh_di, "clmulh_64", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UDI, clmul_zbkc64_or_zbc64),
  
  // zbc
! RISCV_BUILTIN (clmulr_si, "clmulr_32", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, clmulr_zbc32),
! RISCV_BUILTIN (clmulr_di, "clmulr_64", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UDI, clmulr_zbc64),
--- 1,27 ----
  // zicbom
! RISCV_BUILTIN (clean_si, "zicbom_cbo_clean", RISCV_VOID_FTYPE_VOID_PTR, clean32),
! RISCV_BUILTIN (clean_di, "zicbom_cbo_clean", RISCV_VOID_FTYPE_VOID_PTR, clean64),
  
! RISCV_BUILTIN (flush_si, "zicbom_cbo_flush", RISCV_VOID_FTYPE_VOID_PTR, flush32),
! RISCV_BUILTIN (flush_di, "zicbom_cbo_flush", RISCV_VOID_FTYPE_VOID_PTR, flush64),
  
! RISCV_BUILTIN (inval_si, "zicbom_cbo_inval", RISCV_VOID_FTYPE_VOID_PTR, inval32),
! RISCV_BUILTIN (inval_di, "zicbom_cbo_inval", RISCV_VOID_FTYPE_VOID_PTR, inval64),
  
  // zicboz
! RISCV_BUILTIN (zero_si, "zicboz_cbo_zero", RISCV_VOID_FTYPE_VOID_PTR, zero32),
! RISCV_BUILTIN (zero_di, "zicboz_cbo_zero", RISCV_VOID_FTYPE_VOID_PTR, zero64),
  
  // zicbop
! RISCV_BUILTIN (prefetchi_si, "zicbop_cbo_prefetchi", RISCV_USI_FTYPE_USI, prefetchi32),
! RISCV_BUILTIN (prefetchi_di, "zicbop_cbo_prefetchi", RISCV_UDI_FTYPE_UDI, prefetchi64),
  
  // zbkc or zbc
! RISCV_BUILTIN (clmul_si, "clmul_32", RISCV_USI_FTYPE_USI_USI, clmul_zbkc_or_zbc),
! RISCV_BUILTIN (clmul_di, "clmul_64", RISCV_UDI_FTYPE_UDI_UDI, clmul_zbkc64_or_zbc64),
! RISCV_BUILTIN (clmulh_si, "clmulh_32", RISCV_USI_FTYPE_USI_USI, clmul_zbkc32_or_zbc32),
! RISCV_BUILTIN (clmulh_di, "clmulh_64", RISCV_UDI_FTYPE_UDI_UDI, clmul_zbkc64_or_zbc64),
  
  // zbc
! RISCV_BUILTIN (clmulr_si, "clmulr_32", RISCV_USI_FTYPE_USI_USI, clmulr_zbc32),
! RISCV_BUILTIN (clmulr_di, "clmulr_64", RISCV_UDI_FTYPE_UDI_UDI, clmulr_zbc64),
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-cores.def gcc-17-20260524/gcc/config/riscv/riscv-cores.def
*** gcc-17-20260517/gcc/config/riscv/riscv-cores.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-cores.def	Sun May 24 22:32:05 2026
*************** RISCV_TUNE("xt-c910", generic, generic_o
*** 48,53 ****
--- 48,54 ----
  RISCV_TUNE("xt-c910v2", generic, generic_ooo_tune_info)
  RISCV_TUNE("xt-c920", generic, generic_ooo_tune_info)
  RISCV_TUNE("xt-c920v2", generic, generic_ooo_tune_info)
+ RISCV_TUNE("xt-c9501fdvt", generic_ooo, generic_ooo_tune_info)
  RISCV_TUNE("xiangshan-nanhu", xiangshan, xiangshan_nanhu_tune_info)
  RISCV_TUNE("xiangshan-kunminghu", xiangshan, generic_ooo_tune_info)
  RISCV_TUNE("spacemit-x60", spacemit_x60, spacemit_x60_tune_info)
*************** RISCV_CORE("xt-c920v2",       "rv64imafd
*** 150,155 ****
--- 151,165 ----
  			      "xtheadsync",
  			       "xt-c920v2")
  
+ RISCV_CORE("xt-c9501fdvt",    "rva23s64_zfbfmin_zfh_zicfilp_zicfiss_zkr_zmmul_"
+ 			      "zbc_zca_zcd_zabha_zacas_zama16b_zvbc_zvfbfmin_"
+ 			      "zvfbfwma_zvfh_zvkb_zvkg_zvkn_zvknc_zvkned_"
+ 			      "zvkng_zvknha_zvknhb_zvksc_zvksed_zvksg_zvksh_"
+ 			      "zvl256b_smaia_smcntrpmf_smcsrind_smepmp_smmpm_"
+ 			      "smnpm_smrnmi_ssaia_sscsrind_sspm_ssstrict_"
+ 			      "svadu_svvptc",
+ 			      "xt-c9501fdvt")
+ 
  RISCV_CORE("tt-ascalon-d8",   "rva23s64_zfbfmin_zfh_zkr_zvbc_zvfbfmin_zvfbfwma_"
  			      "zvfh_zvkng_zvl256b_smaia_smmpm_smnpm_smrnmi_"
  			      "smstateen_ssaia_ssstrict_svadu",
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-ext.def gcc-17-20260524/gcc/config/riscv/riscv-ext.def
*** gcc-17-20260517/gcc/config/riscv/riscv-ext.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-ext.def	Sun May 24 22:32:05 2026
*************** DEFINE_RISCV_EXT(
*** 229,236 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 229,236 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 20,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 242,249 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 242,249 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 25,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 333,340 ****
    /* DEP_EXTS */ ({"zicsr"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 333,340 ----
    /* DEP_EXTS */ ({"zicsr"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 26,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 346,353 ****
    /* DEP_EXTS */ ({"zicsr", "zimop"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 346,353 ----
    /* DEP_EXTS */ ({"zicsr", "zimop"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 27,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 359,366 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{2, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 359,366 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{2, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 15,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 385,392 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{2, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 385,392 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{2, 0}}),
    /* FLAG_GROUP */ zi,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 16,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 489,496 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 489,496 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 21,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 528,535 ****
    /* DEP_EXTS */ ({"zaamo"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 528,535 ----
    /* DEP_EXTS */ ({"zaamo"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 23,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 554,561 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 554,561 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 24,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 567,574 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 567,574 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ za,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 22,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 621,628 ****
    /* DEP_EXTS */ ({"zfhmin"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zf,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 621,628 ----
    /* DEP_EXTS */ ({"zfhmin"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zf,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 17,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 1165,1172 ****
    /* DEP_EXTS */ ({"zve32f"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zvf,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 1165,1172 ----
    /* DEP_EXTS */ ({"zve32f"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zvf,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 18,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 1178,1185 ****
    /* DEP_EXTS */ ({"zvfbfmin", "zfbfmin"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zvf,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 1178,1185 ----
    /* DEP_EXTS */ ({"zvfbfmin", "zfbfmin"}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ zvf,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 19,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
*************** DEFINE_RISCV_EXT(
*** 1999,2006 ****
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ su,
!   /* BITMASK_GROUP_ID */ BITMASK_NOT_YET_ALLOCATED,
!   /* BITMASK_BIT_POSITION*/ BITMASK_NOT_YET_ALLOCATED,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
--- 1999,2006 ----
    /* DEP_EXTS */ ({}),
    /* SUPPORTED_VERSIONS */ ({{1, 0}}),
    /* FLAG_GROUP */ su,
!   /* BITMASK_GROUP_ID */ 1,
!   /* BITMASK_BIT_POSITION*/ 14,
    /* EXTRA_EXTENSION_FLAGS */ 0)
  
  DEFINE_RISCV_EXT(
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-opts.h gcc-17-20260524/gcc/config/riscv/riscv-opts.h
*** gcc-17-20260517/gcc/config/riscv/riscv-opts.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-opts.h	Sun May 24 22:32:05 2026
*************** enum riscv_align_data {
*** 75,80 ****
--- 75,88 ----
    riscv_align_data_type_natural
  };
  
+ /* Alignment policy for Zilsd 2 * XLEN memory accesses.  */
+ enum riscv_zilsd_align_type {
+   RISCV_ZILSD_ALIGN_DEFAULT,
+   RISCV_ZILSD_ALIGN_BYTE,
+   RISCV_ZILSD_ALIGN_WORD,
+   RISCV_ZILSD_ALIGN_STRICT
+ };
+ 
  /* Where to get the canary for the stack protector.  */
  enum stack_protector_guard {
    SSP_TLS,			/* per-thread canary in TLS block */
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-protos.h gcc-17-20260524/gcc/config/riscv/riscv-protos.h
*** gcc-17-20260517/gcc/config/riscv/riscv-protos.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-protos.h	Sun May 24 22:32:05 2026
*************** extern rtx riscv_emit_binary (enum rtx_c
*** 156,161 ****
--- 156,163 ----
  #endif
  extern bool riscv_expand_conditional_move (rtx, rtx, rtx, rtx);
  extern rtx riscv_legitimize_call_address (rtx);
+ extern bool riscv_expand_zilsd_misaligned_move (rtx, rtx);
+ extern bool riscv_zilsd_valid_mem_p (rtx, machine_mode);
  extern void riscv_set_return_address (rtx, rtx);
  extern rtx riscv_return_addr (int, rtx);
  extern poly_int64 riscv_initial_elimination_offset (int, int);
*************** extern bool riscv_reg_frame_related (rtx
*** 181,187 ****
  extern void riscv_split_sum_of_two_s12 (HOST_WIDE_INT, HOST_WIDE_INT *,
  					HOST_WIDE_INT *);
  extern bool riscv_vector_float_type_p (const_tree type);
- extern void generate_reflecting_code_using_brev (rtx *);
  extern void expand_crc_using_clmul (scalar_mode, scalar_mode, rtx *);
  extern void expand_reversed_crc_using_clmul (scalar_mode, scalar_mode, rtx *);
  
--- 183,188 ----
*************** struct common_vector_cost
*** 279,284 ****
--- 280,300 ----
  
    /* Cost of an unaligned vector store.  */
    const int unalign_store_cost;
+ 
+   /* Cost of vector reduction operations (unordered / tree reduction).
+      Indexed by element type.  */
+   const int reduc_i8_cost;
+   const int reduc_i16_cost;
+   const int reduc_i32_cost;
+   const int reduc_i64_cost;
+   const int reduc_f16_cost;
+   const int reduc_f32_cost;
+   const int reduc_f64_cost;
+ 
+   /* Cost of ordered (fold-left) floating-point reductions.  */
+   const int reduc_f16_ordered_cost;
+   const int reduc_f32_ordered_cost;
+   const int reduc_f64_ordered_cost;
  };
  
  /* scalable vectorization (VLA) specific cost.  */
*************** struct scalable_vector_cost : common_vec
*** 288,295 ****
      : common_vector_cost (base)
    {}
  
-   /* TODO: We will need more other kinds of vector cost for VLA.
-      E.g. fold_left reduction cost, lanes load/store cost, ..., etc.  */
  };
  
  /* Additional costs for register copies.  Cost is for one register.  */
--- 304,309 ----
*************** bool neg_simm5_p (rtx);
*** 661,667 ****
  #ifdef RTX_CODE
  bool has_vi_variant_p (rtx_code, rtx);
  void expand_vec_cmp (rtx, rtx_code, rtx, rtx, rtx = nullptr, rtx = nullptr);
! bool expand_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool);
  void expand_cond_len_unop (unsigned, rtx *);
  void expand_cond_len_binop (unsigned, rtx *);
  void expand_reduction (unsigned, unsigned, unsigned, rtx *, rtx);
--- 675,682 ----
  #ifdef RTX_CODE
  bool has_vi_variant_p (rtx_code, rtx);
  void expand_vec_cmp (rtx, rtx_code, rtx, rtx, rtx = nullptr, rtx = nullptr);
! bool expand_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool, rtx = nullptr,
! 			   rtx = nullptr);
  void expand_cond_len_unop (unsigned, rtx *);
  void expand_cond_len_binop (unsigned, rtx *);
  void expand_reduction (unsigned, unsigned, unsigned, rtx *, rtx);
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-scalar-crypto.def gcc-17-20260524/gcc/config/riscv/riscv-scalar-crypto.def
*** gcc-17-20260517/gcc/config/riscv/riscv-scalar-crypto.def	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-scalar-crypto.def	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 18,42 ****
  <http://www.gnu.org/licenses/>.  */
  
  // ZBKB
! RISCV_BUILTIN (pack_sihi, "pack", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_UHI_UHI, crypto_zbkb32),
! RISCV_BUILTIN (pack_disi, "pack", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_USI_USI, crypto_zbkb64),
  
! RISCV_BUILTIN (packh_si, "packh", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_UQI_UQI, crypto_zbkb32),
! RISCV_BUILTIN (packh_di, "packh", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UQI_UQI, crypto_zbkb64),
  
! RISCV_BUILTIN (packw, "packw", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UHI_UHI, crypto_zbkb64),
  
! RISCV_BUILTIN (zip, "zip", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zbkb32),
! RISCV_BUILTIN (unzip, "unzip", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zbkb32),
  
! RISCV_BUILTIN (brev8_si, "brev8_32", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zbkb),
! RISCV_BUILTIN (brev8_di, "brev8_64", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI, crypto_zbkb64),
  
  // ZBKX
! RISCV_BUILTIN (xperm4_si, "xperm4", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, crypto_zbkx32),
! RISCV_BUILTIN (xperm4_di, "xperm4", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UDI, crypto_zbkx64),
! RISCV_BUILTIN (xperm8_si, "xperm8", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI, crypto_zbkx32),
! RISCV_BUILTIN (xperm8_di, "xperm8", RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UDI, crypto_zbkx64),
  
  // ZKND
  DIRECT_BUILTIN (aes32dsi, RISCV_USI_FTYPE_USI_USI_USI, crypto_zknd32),
--- 18,42 ----
  <http://www.gnu.org/licenses/>.  */
  
  // ZBKB
! RISCV_BUILTIN (pack_sihi, "pack", RISCV_USI_FTYPE_UHI_UHI, crypto_zbkb32),
! RISCV_BUILTIN (pack_disi, "pack", RISCV_UDI_FTYPE_USI_USI, crypto_zbkb64),
  
! RISCV_BUILTIN (packh_si, "packh", RISCV_USI_FTYPE_UQI_UQI, crypto_zbkb32),
! RISCV_BUILTIN (packh_di, "packh", RISCV_UDI_FTYPE_UQI_UQI, crypto_zbkb64),
  
! RISCV_BUILTIN (packw, "packw", RISCV_UDI_FTYPE_UHI_UHI, crypto_zbkb64),
  
! RISCV_BUILTIN (zip, "zip", RISCV_USI_FTYPE_USI, crypto_zbkb32),
! RISCV_BUILTIN (unzip, "unzip", RISCV_USI_FTYPE_USI, crypto_zbkb32),
  
! RISCV_BUILTIN (brev8_si, "brev8_32", RISCV_USI_FTYPE_USI, crypto_zbkb),
! RISCV_BUILTIN (brev8_di, "brev8_64", RISCV_UDI_FTYPE_UDI, crypto_zbkb64),
  
  // ZBKX
! RISCV_BUILTIN (xperm4_si, "xperm4", RISCV_USI_FTYPE_USI_USI, crypto_zbkx32),
! RISCV_BUILTIN (xperm4_di, "xperm4", RISCV_UDI_FTYPE_UDI_UDI, crypto_zbkx64),
! RISCV_BUILTIN (xperm8_si, "xperm8", RISCV_USI_FTYPE_USI_USI, crypto_zbkx32),
! RISCV_BUILTIN (xperm8_di, "xperm8", RISCV_UDI_FTYPE_UDI_UDI, crypto_zbkx64),
  
  // ZKND
  DIRECT_BUILTIN (aes32dsi, RISCV_USI_FTYPE_USI_USI_USI, crypto_zknd32),
*************** DIRECT_BUILTIN (aes64es, RISCV_UDI_FTYPE
*** 54,63 ****
  DIRECT_BUILTIN (aes64esm, RISCV_UDI_FTYPE_UDI_UDI, crypto_zkne64),
  
  // ZKNH
! RISCV_BUILTIN (sha256sig0_si, "sha256sig0", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sig1_si, "sha256sig1", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sum0_si, "sha256sum0", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sum1_si, "sha256sum1", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zknh),
  
  DIRECT_BUILTIN (sha512sig0h, RISCV_USI_FTYPE_USI_USI, crypto_zknh32),
  DIRECT_BUILTIN (sha512sig0l, RISCV_USI_FTYPE_USI_USI, crypto_zknh32),
--- 54,63 ----
  DIRECT_BUILTIN (aes64esm, RISCV_UDI_FTYPE_UDI_UDI, crypto_zkne64),
  
  // ZKNH
! RISCV_BUILTIN (sha256sig0_si, "sha256sig0", RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sig1_si, "sha256sig1", RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sum0_si, "sha256sum0", RISCV_USI_FTYPE_USI, crypto_zknh),
! RISCV_BUILTIN (sha256sum1_si, "sha256sum1", RISCV_USI_FTYPE_USI, crypto_zknh),
  
  DIRECT_BUILTIN (sha512sig0h, RISCV_USI_FTYPE_USI_USI, crypto_zknh32),
  DIRECT_BUILTIN (sha512sig0l, RISCV_USI_FTYPE_USI_USI, crypto_zknh32),
*************** DIRECT_BUILTIN (sha512sum0, RISCV_UDI_FT
*** 72,98 ****
  DIRECT_BUILTIN (sha512sum1, RISCV_UDI_FTYPE_UDI, crypto_zknh64),
  
  // ZKSH
! RISCV_BUILTIN (sm3p0_si, "sm3p0", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zksh),
! RISCV_BUILTIN (sm3p1_si, "sm3p1", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI, crypto_zksh),
  
  // ZKSED
! RISCV_BUILTIN (sm4ed_si, "sm4ed", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, crypto_zksed),
! RISCV_BUILTIN (sm4ks_si, "sm4ks", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_USI_USI, crypto_zksed),
  
  
  // ZBB
  
! RISCV_BUILTIN_NO_PREFIX (clzsi2,"clz_32",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (clzdi2,"clz_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (ctzsi2,"ctz_32",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (ctzdi2,"ctz_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (popcountsi2,"popcount_32",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (popcountdi2,"popcount_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (orcbsi2,"orc_b_32", RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (orcbdi2,"orc_b_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI,zbb64),
  
  // ZBKB
! RISCV_BUILTIN_NO_PREFIX (rotrsi3,"ror_32",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI,zbb_or_zbkb),
! RISCV_BUILTIN_NO_PREFIX (rotlsi3,"rol_32",RISCV_BUILTIN_DIRECT, RISCV_USI_FTYPE_USI_UQI,zbb_or_zbkb),
! RISCV_BUILTIN_NO_PREFIX (rotrdi3,"ror_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UQI,zbb64_or_zbkb64),
! RISCV_BUILTIN_NO_PREFIX (rotldi3,"rol_64",RISCV_BUILTIN_DIRECT, RISCV_UDI_FTYPE_UDI_UQI,zbb64_or_zbkb64),
--- 72,98 ----
  DIRECT_BUILTIN (sha512sum1, RISCV_UDI_FTYPE_UDI, crypto_zknh64),
  
  // ZKSH
! RISCV_BUILTIN (sm3p0_si, "sm3p0", RISCV_USI_FTYPE_USI, crypto_zksh),
! RISCV_BUILTIN (sm3p1_si, "sm3p1", RISCV_USI_FTYPE_USI, crypto_zksh),
  
  // ZKSED
! RISCV_BUILTIN (sm4ed_si, "sm4ed", RISCV_USI_FTYPE_USI_USI_USI, crypto_zksed),
! RISCV_BUILTIN (sm4ks_si, "sm4ks", RISCV_USI_FTYPE_USI_USI_USI, crypto_zksed),
  
  
  // ZBB
  
! RISCV_BUILTIN_NO_PREFIX (clzsi2,"clz_32",RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (clzdi2,"clz_64",RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (ctzsi2,"ctz_32",RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (ctzdi2,"ctz_64",RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (popcountsi2,"popcount_32",RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (popcountdi2,"popcount_64",RISCV_UDI_FTYPE_UDI,zbb64),
! RISCV_BUILTIN_NO_PREFIX (orcbsi2,"orc_b_32", RISCV_USI_FTYPE_USI,zbb),
! RISCV_BUILTIN_NO_PREFIX (orcbdi2,"orc_b_64",RISCV_UDI_FTYPE_UDI,zbb64),
  
  // ZBKB
! RISCV_BUILTIN_NO_PREFIX (rotrsi3,"ror_32",RISCV_USI_FTYPE_USI_UQI,zbb_or_zbkb),
! RISCV_BUILTIN_NO_PREFIX (rotlsi3,"rol_32",RISCV_USI_FTYPE_USI_UQI,zbb_or_zbkb),
! RISCV_BUILTIN_NO_PREFIX (rotrdi3,"ror_64",RISCV_UDI_FTYPE_UDI_UQI,zbb64_or_zbkb64),
! RISCV_BUILTIN_NO_PREFIX (rotldi3,"rol_64",RISCV_UDI_FTYPE_UDI_UQI,zbb64_or_zbkb64),
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-v.cc gcc-17-20260524/gcc/config/riscv/riscv-v.cc
*** gcc-17-20260517/gcc/config/riscv/riscv-v.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-v.cc	Sun May 24 22:32:05 2026
*************** vectorize_related_mode (machine_mode vec
*** 3111,3117 ****
  
  void
  expand_vec_cmp (rtx target, rtx_code code, rtx op0, rtx op1, rtx mask,
! 		rtx maskoff)
  {
    machine_mode mask_mode = GET_MODE (target);
    machine_mode data_mode = GET_MODE (op0);
--- 3111,3117 ----
  
  void
  expand_vec_cmp (rtx target, rtx_code code, rtx op0, rtx op1, rtx mask,
! 		rtx els)
  {
    machine_mode mask_mode = GET_MODE (target);
    machine_mode data_mode = GET_MODE (op0);
*************** expand_vec_cmp (rtx target, rtx_code cod
*** 3121,3128 ****
      {
        rtx lt = gen_reg_rtx (mask_mode);
        rtx gt = gen_reg_rtx (mask_mode);
!       expand_vec_cmp (lt, LT, op0, op1, mask, maskoff);
!       expand_vec_cmp (gt, GT, op0, op1, mask, maskoff);
        icode = code_for_pred (IOR, mask_mode);
        rtx ops[] = {target, lt, gt};
        emit_vlmax_insn (icode, BINARY_MASK_OP, ops);
--- 3121,3128 ----
      {
        rtx lt = gen_reg_rtx (mask_mode);
        rtx gt = gen_reg_rtx (mask_mode);
!       expand_vec_cmp (lt, LT, op0, op1, mask, els);
!       expand_vec_cmp (gt, GT, op0, op1, mask, els);
        icode = code_for_pred (IOR, mask_mode);
        rtx ops[] = {target, lt, gt};
        emit_vlmax_insn (icode, BINARY_MASK_OP, ops);
*************** expand_vec_cmp (rtx target, rtx_code cod
*** 3130,3143 ****
      }
  
    rtx cmp = gen_rtx_fmt_ee (code, mask_mode, op0, op1);
!   if (!mask && !maskoff)
      {
        rtx ops[] = {target, cmp, op0, op1};
        emit_vlmax_insn (icode, COMPARE_OP, ops);
      }
    else
      {
!       rtx ops[] = {target, mask, maskoff, cmp, op0, op1};
        emit_vlmax_insn (icode, COMPARE_OP_MU, ops);
      }
  }
--- 3130,3143 ----
      }
  
    rtx cmp = gen_rtx_fmt_ee (code, mask_mode, op0, op1);
!   if (!mask && !els)
      {
        rtx ops[] = {target, cmp, op0, op1};
        emit_vlmax_insn (icode, COMPARE_OP, ops);
      }
    else
      {
!       rtx ops[] = {target, mask, els, cmp, op0, op1};
        emit_vlmax_insn (icode, COMPARE_OP_MU, ops);
      }
  }
*************** expand_vec_cmp (rtx target, rtx_code cod
*** 3145,3158 ****
  /* Expand an RVV floating-point comparison:
  
     If CAN_INVERT_P is true, the caller can also handle inverted results;
!    return true if the result is in fact inverted.  */
  
  bool
  expand_vec_cmp_float (rtx target, rtx_code code, rtx op0, rtx op1,
! 		      bool can_invert_p)
  {
    machine_mode mask_mode = GET_MODE (target);
    machine_mode data_mode = GET_MODE (op0);
  
    /* If can_invert_p = true:
       It suffices to implement a u>= b as !(a < b) but with the NaNs masked off:
--- 3145,3162 ----
  /* Expand an RVV floating-point comparison:
  
     If CAN_INVERT_P is true, the caller can also handle inverted results;
!    return true if the result is in fact inverted.
! 
!    If MASK is non-null, inactive lanes get the respective element from
!    ELS.  */
  
  bool
  expand_vec_cmp_float (rtx target, rtx_code code, rtx op0, rtx op1,
! 		      bool can_invert_p, rtx mask, rtx els)
  {
    machine_mode mask_mode = GET_MODE (target);
    machine_mode data_mode = GET_MODE (op0);
+   gcc_assert (!mask || !can_invert_p);
  
    /* If can_invert_p = true:
       It suffices to implement a u>= b as !(a < b) but with the NaNs masked off:
*************** expand_vec_cmp_float (rtx target, rtx_co
*** 3192,3198 ****
      case GE:
      case LTGT:
        /* There is native support for the comparison.  */
!       expand_vec_cmp (target, code, op0, op1);
        return false;
      case UNEQ:
      case ORDERED:
--- 3196,3202 ----
      case GE:
      case LTGT:
        /* There is native support for the comparison.  */
!       expand_vec_cmp (target, code, op0, op1, mask, els);
        return false;
      case UNEQ:
      case ORDERED:
*************** expand_vec_cmp_float (rtx target, rtx_co
*** 3226,3240 ****
  
    if (code == ORDERED)
      {
!       emit_move_insn (target, eq0);
        return false;
      }
  
    /* There is native support for the inverse comparison.  */
    code = reverse_condition_maybe_unordered (code);
!   if (code == ORDERED)
!     emit_move_insn (target, eq0);
!   else
      expand_vec_cmp (eq0, code, op0, op1, eq0, eq0);
  
    if (can_invert_p)
--- 3230,3248 ----
  
    if (code == ORDERED)
      {
!       if (mask)
! 	{
! 	  rtx ops[] = {target, eq0, mask};
! 	  emit_vlmax_insn (code_for_pred (AND, mask_mode), BINARY_MASK_OP, ops);
! 	}
!       else
! 	emit_move_insn (target, eq0);
        return false;
      }
  
    /* There is native support for the inverse comparison.  */
    code = reverse_condition_maybe_unordered (code);
!   if (code != ORDERED)
      expand_vec_cmp (eq0, code, op0, op1, eq0, eq0);
  
    if (can_invert_p)
*************** expand_vec_cmp_float (rtx target, rtx_co
*** 3245,3251 ****
  
    /* We use one_cmpl<mode>2 to make Combine PASS to combine mask instructions
       into: vmand.mm/vmnor.mm/vmnand.mm/vmxnor.mm.  */
!   emit_insn (gen_rtx_SET (target, gen_rtx_NOT (mask_mode, eq0)));
    return false;
  }
  
--- 3253,3267 ----
  
    /* We use one_cmpl<mode>2 to make Combine PASS to combine mask instructions
       into: vmand.mm/vmnor.mm/vmnand.mm/vmxnor.mm.  */
!   rtx not_eq0 = gen_reg_rtx (mask_mode);
!   emit_insn (gen_rtx_SET (not_eq0, gen_rtx_NOT (mask_mode, eq0)));
!   if (mask)
!     {
!       rtx ops[] = {target, not_eq0, mask};
!       emit_vlmax_insn (code_for_pred (AND, mask_mode), BINARY_MASK_OP, ops);
!     }
!   else
!     emit_move_insn (target, not_eq0);
    return false;
  }
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv-vector-costs.cc gcc-17-20260524/gcc/config/riscv/riscv-vector-costs.cc
*** gcc-17-20260517/gcc/config/riscv/riscv-vector-costs.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv-vector-costs.cc	Sun May 24 22:32:05 2026
*************** get_lmul_cost_scaling (machine_mode mode
*** 1274,1279 ****
--- 1274,1331 ----
      }
  }
  
+ /* Return true if STMT_INFO or NODE represents a reduction operation.  */
+ 
+ static bool
+ is_reduction (stmt_vec_info stmt_info, slp_tree node)
+ {
+   return (stmt_info && vect_is_reduction (stmt_info))
+ 	 || (node && vect_is_reduction (node));
+ }
+ 
+ /* Return the per-type reduction cost for VECTYPE, or 0 if no specific cost
+    applies.  For FP types, distinguish ordered vs unordered reductions.  */
+ 
+ static int
+ get_reduction_cost (vec_info *vinfo, const cpu_vector_cost *costs,
+ 		    loop_vec_info loop, slp_tree node, tree vectype)
+ {
+   const common_vector_cost *common_costs
+     = loop && riscv_vla_mode_p (loop->vector_mode)
+       ? costs->vla : costs->vls;
+ 
+   bool is_ordered = false;
+   if (FLOAT_TYPE_P (vectype) && node)
+     {
+       int reduc_type = vect_reduc_type (vinfo, node);
+       is_ordered = (reduc_type == FOLD_LEFT_REDUCTION);
+     }
+ 
+   switch (GET_MODE_INNER (TYPE_MODE (vectype)))
+     {
+     case E_QImode:
+       return common_costs->reduc_i8_cost;
+     case E_HImode:
+       return common_costs->reduc_i16_cost;
+     case E_SImode:
+       return common_costs->reduc_i32_cost;
+     case E_DImode:
+       return common_costs->reduc_i64_cost;
+     case E_HFmode:
+     case E_BFmode:
+       return is_ordered ? common_costs->reduc_f16_ordered_cost
+ 			: common_costs->reduc_f16_cost;
+     case E_SFmode:
+       return is_ordered ? common_costs->reduc_f32_ordered_cost
+ 			: common_costs->reduc_f32_cost;
+     case E_DFmode:
+       return is_ordered ? common_costs->reduc_f64_ordered_cost
+ 			: common_costs->reduc_f64_cost;
+     default:
+       return 0;
+     }
+ }
+ 
  /* Adjust vectorization cost after calling riscv_builtin_vectorization_cost.
     For some statement, we would like to further fine-grain tweak the cost on
     top of riscv_builtin_vectorization_cost handling which doesn't have any
*************** costs::adjust_stmt_cost (enum vect_cost_
*** 1292,1300 ****
  	+= (FLOAT_TYPE_P (vectype) ? get_fr2vr_cost () : get_gr2vr_cost ());
        break;
      case vec_to_scalar:
!       stmt_cost
! 	+= (FLOAT_TYPE_P (vectype) ? get_vr2fr_cost () : get_vr2gr_cost ());
!       break;
      case vector_load:
      case vector_store:
  	{
--- 1344,1361 ----
  	+= (FLOAT_TYPE_P (vectype) ? get_fr2vr_cost () : get_gr2vr_cost ());
        break;
      case vec_to_scalar:
!       {
! 	int reduc_cost = 0;
! 	if (vectype && is_reduction (stmt_info, node))
! 	  reduc_cost = get_reduction_cost (m_vinfo, costs, loop, node, vectype);
! 
! 	if (reduc_cost)
! 	  stmt_cost = reduc_cost;
! 
! 	stmt_cost
! 	  += (FLOAT_TYPE_P (vectype) ? get_vr2fr_cost () : get_vr2gr_cost ());
! 	break;
!       }
      case vector_load:
      case vector_store:
  	{
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv.cc gcc-17-20260524/gcc/config/riscv/riscv.cc
*** gcc-17-20260517/gcc/config/riscv/riscv.cc	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv.cc	Sun May 24 22:32:05 2026
*************** along with GCC; see the file COPYING3.
*** 53,58 ****
--- 53,59 ----
  #include "basic-block.h"
  #include "expr.h"
  #include "optabs.h"
+ #include "expmed.h"
  #include "bitmap.h"
  #include "df.h"
  #include "function-abi.h"
*************** static const common_vector_cost rvv_vls_
*** 396,401 ****
--- 397,412 ----
    1, /* align_store_cost  */
    2, /* unalign_load_cost  */
    2, /* unalign_store_cost  */
+   2, /* reduc_i8_cost  */
+   2, /* reduc_i16_cost  */
+   2, /* reduc_i32_cost  */
+   2, /* reduc_i64_cost  */
+   2, /* reduc_f16_cost  */
+   2, /* reduc_f32_cost  */
+   2, /* reduc_f64_cost  */
+   20, /* reduc_f16_ordered_cost  */
+   10, /* reduc_f32_ordered_cost  */
+   5, /* reduc_f64_ordered_cost  */
  };
  
  /* RVV costs for VLA vector operations.  */
*************** static const scalable_vector_cost rvv_vl
*** 419,424 ****
--- 430,445 ----
      1, /* align_store_cost  */
      2, /* unalign_load_cost  */
      2, /* unalign_store_cost  */
+     2, /* reduc_i8_cost  */
+     2, /* reduc_i16_cost  */
+     2, /* reduc_i32_cost  */
+     2, /* reduc_i64_cost  */
+     2, /* reduc_f16_cost  */
+     2, /* reduc_f32_cost  */
+     2, /* reduc_f64_cost  */
+     20, /* reduc_f16_ordered_cost  */
+     10, /* reduc_f32_ordered_cost  */
+     5, /* reduc_f64_ordered_cost  */
    },
  };
  
*************** riscv_2x_xlen_mode_p (machine_mode mode)
*** 1018,1023 ****
--- 1039,1097 ----
  	 && (mode_size.to_constant () == UNITS_PER_WORD * 2);
  }
  
+ /* Return the required alignment, in bytes, for Zilsd memory accesses.  */
+ 
+ static unsigned int
+ riscv_zilsd_required_align (enum riscv_zilsd_align_type align,
+ 			    bool strict_align_p)
+ {
+   switch (align)
+     {
+     case RISCV_ZILSD_ALIGN_BYTE:
+       return 1;
+ 
+     case RISCV_ZILSD_ALIGN_WORD:
+       return 4;
+ 
+     case RISCV_ZILSD_ALIGN_STRICT:
+       return 8;
+ 
+     case RISCV_ZILSD_ALIGN_DEFAULT:
+       return strict_align_p ? 8 : 1;
+ 
+     default:
+       gcc_unreachable ();
+     }
+ }
+ 
+ /* Return the required alignment, in bytes, for Zilsd memory accesses.  */
+ 
+ static unsigned int
+ riscv_zilsd_required_align (void)
+ {
+   return riscv_zilsd_required_align (riscv_zilsd_align, TARGET_STRICT_ALIGN);
+ }
+ 
+ /* Return true if MEM can be accessed by a Zilsd 2 * XLEN load/store.  */
+ 
+ bool
+ riscv_zilsd_valid_mem_p (rtx mem, machine_mode mode)
+ {
+   return (TARGET_ZILSD
+ 	  && riscv_2x_xlen_mode_p (mode)
+ 	  && MEM_P (mem)
+ 	  && MEM_ALIGN (mem) >= riscv_zilsd_required_align () * BITS_PER_UNIT);
+ }
+ 
+ /* Return the effective Zilsd memory access alignment policy.  */
+ 
+ static unsigned int
+ riscv_zilsd_required_align (const struct cl_target_option *opts)
+ {
+   return riscv_zilsd_required_align
+     (opts->x_riscv_zilsd_align, TARGET_STRICT_ALIGN_P (opts->x_target_flags));
+ }
+ 
  /* Implement TARGET_MIN_ARITHMETIC_PRECISION.  */
  
  static unsigned int
*************** riscv_legitimize_move (machine_mode mode
*** 3879,3885 ****
        scalar_mode smode = as_a<scalar_mode> (mode);
        unsigned int index = SUBREG_BYTE (src).to_constant () / mode_size;
        unsigned int num = known_eq (GET_MODE_SIZE (smode), 8)
! 	&& !TARGET_VECTOR_ELEN_64 ? 2 : 1;
        bool need_int_reg_p = false;
  
        if (num == 2)
--- 3953,3959 ----
        scalar_mode smode = as_a<scalar_mode> (mode);
        unsigned int index = SUBREG_BYTE (src).to_constant () / mode_size;
        unsigned int num = known_eq (GET_MODE_SIZE (smode), 8)
! 	&& (!TARGET_VECTOR_ELEN_64 || !TARGET_64BIT) ? 2 : 1;
        bool need_int_reg_p = false;
  
        if (num == 2)
*************** riscv_legitimize_move (machine_mode mode
*** 3905,3911 ****
  	  if (need_int_reg_p)
  	    {
  	      int_reg = gen_reg_rtx (DImode);
! 	      emit_move_insn (int_reg, gen_lowpart (GET_MODE (int_reg), dest));
  	    }
  
  	  for (unsigned int i = 0; i < num; i++)
--- 3979,3985 ----
  	  if (need_int_reg_p)
  	    {
  	      int_reg = gen_reg_rtx (DImode);
! 	      emit_move_insn (int_reg, gen_lowpart (DImode, dest));
  	    }
  
  	  for (unsigned int i = 0; i < num; i++)
*************** riscv_legitimize_move (machine_mode mode
*** 3923,3929 ****
  
  	      /* The low-part must be zero-extended when ELEN == 32 and
  		 mode == 64.  */
! 	      if (num == 2 && i == 0)
  		int_reg = convert_modes (mode, smode, result, true);
  
  	      if (i == 1)
--- 3997,4005 ----
  
  	      /* The low-part must be zero-extended when ELEN == 32 and
  		 mode == 64.  */
! 	      if (num == 2
! 		  && i == 0
! 		  && FLOAT_MODE_P (mode) == FLOAT_MODE_P (smode))
  		int_reg = convert_modes (mode, smode, result, true);
  
  	      if (i == 1)
*************** riscv_legitimize_move (machine_mode mode
*** 3956,3962 ****
  	     already we can just elide the nop move here and be done.  */
  	  if (need_int_reg_p)
  	    emit_move_insn (dest, gen_lowpart (GET_MODE (dest), int_reg));
! 	  else if (!rtx_equal_p (dest, int_reg)) 
  	    emit_move_insn (dest, int_reg);
  	  return true;
  	}
--- 4032,4038 ----
  	     already we can just elide the nop move here and be done.  */
  	  if (need_int_reg_p)
  	    emit_move_insn (dest, gen_lowpart (GET_MODE (dest), int_reg));
! 	  else if (!rtx_equal_p (dest, int_reg))
  	    emit_move_insn (dest, int_reg);
  	  return true;
  	}
*************** riscv_rtx_costs (rtx x, machine_mode mod
*** 4263,4270 ****
  	    }
  
  	  /* Load for XLEN * 2.  */
! 	  if (TARGET_ZILSD && MEM_P (SET_SRC (x))
! 	      && riscv_2x_xlen_mode_p (mode))
  	    {
  	      /* TODO: Add riscv_tune_param for this.  */
  	      *total = COSTS_N_INSNS (1);
--- 4339,4345 ----
  	    }
  
  	  /* Load for XLEN * 2.  */
! 	  if (riscv_zilsd_valid_mem_p (SET_SRC (x), mode))
  	    {
  	      /* TODO: Add riscv_tune_param for this.  */
  	      *total = COSTS_N_INSNS (1);
*************** riscv_rtx_costs (rtx x, machine_mode mod
*** 4276,4283 ****
  	}
  
        /* Store for XLEN * 2.  */
!       if (TARGET_ZILSD && MEM_P (SET_DEST (x)) && REG_P (SET_SRC (x))
! 	  && riscv_2x_xlen_mode_p (mode))
  	{
  	  /* TODO: Add riscv_tune_param for this.  */
  	  *total = COSTS_N_INSNS (1);
--- 4351,4357 ----
  	}
  
        /* Store for XLEN * 2.  */
!       if (REG_P (SET_SRC (x)) && riscv_zilsd_valid_mem_p (SET_DEST (x), mode))
  	{
  	  /* TODO: Add riscv_tune_param for this.  */
  	  *total = COSTS_N_INSNS (1);
*************** riscv_rtx_costs (rtx x, machine_mode mod
*** 4435,4440 ****
--- 4509,4534 ----
        gcc_fallthrough ();
      case IOR:
      case XOR:
+       /* packh for zbkb.  Alternate forms haven't shown up as a
+ 	 costing problem.  Obviously we can add the additional
+ 	 variants if needed.  */
+       if (TARGET_ZBKB
+ 	  && GET_CODE (x) == IOR
+ 	  && GET_CODE (XEXP (x, 0)) == AND
+ 	  && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
+ 	  && register_operand (XEXP (XEXP (XEXP (x, 0), 0), 0), word_mode)
+ 	  && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
+ 	  && INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) == 8
+ 	  && CONST_INT_P (XEXP (XEXP (x, 0), 1))
+ 	  && INTVAL (XEXP (XEXP (x, 0), 1)) == 0xff00
+ 	  && GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
+ 	  && GET_MODE (XEXP (x, 1)) == word_mode
+ 	  && GET_MODE (XEXP (XEXP (x, 1), 0)) == QImode)
+ 	{
+ 	  *total = COSTS_N_INSNS (1);
+ 	  return true;
+ 	}
+ 
        /* orn, andn and xorn pattern for zbb.  */
        if (TARGET_ZBB
  	  && GET_CODE (XEXP (x, 0)) == NOT)
*************** riscv_split_64bit_move_p (rtx dest, rtx
*** 4995,5001 ****
        /* GCC may still generating some load/store with odd-even reg pair
  	 because the ABI handling, but that's fine, just split that later.  */
        if (GP_REG_P (regno))
! 	return (regno < FIRST_PSEUDO_REGISTER) && ((regno % 2) != 0);
      }
  
    /* There is no need to split if the FLI instruction in the `Zfa` extension can be used.  */
--- 5089,5101 ----
        /* GCC may still generating some load/store with odd-even reg pair
  	 because the ABI handling, but that's fine, just split that later.  */
        if (GP_REG_P (regno))
! 	{
! 	  rtx mem = MEM_P (dest) ? dest : src;
! 	  if (!riscv_zilsd_valid_mem_p (mem, GET_MODE (mem)))
! 	    return true;
! 
! 	  return (regno < FIRST_PSEUDO_REGISTER) && ((regno % 2) != 0);
! 	}
      }
  
    /* There is no need to split if the FLI instruction in the `Zfa` extension can be used.  */
*************** riscv_split_64bit_move_p (rtx dest, rtx
*** 5014,5019 ****
--- 5114,5169 ----
    return true;
  }
  
+ /* Expand a potentially misaligned Zilsd-sized memory move.  */
+ 
+ bool
+ riscv_expand_zilsd_misaligned_move (rtx dest, rtx src)
+ {
+   machine_mode mode = GET_MODE (dest);
+   if (mode == VOIDmode)
+     mode = GET_MODE (src);
+ 
+   if (TARGET_64BIT || !TARGET_ZILSD || !riscv_2x_xlen_mode_p (mode))
+     return false;
+ 
+   if (!MEM_P (src) && !MEM_P (dest))
+     return false;
+ 
+   if (MEM_P (src) && MEM_P (dest))
+     {
+       rtx tmp = gen_reg_rtx (mode);
+       if (!riscv_expand_zilsd_misaligned_move (tmp, src))
+ 	return false;
+       return riscv_expand_zilsd_misaligned_move (dest, tmp);
+     }
+ 
+   if ((MEM_P (src) && riscv_zilsd_valid_mem_p (src, mode))
+       || (MEM_P (dest) && riscv_zilsd_valid_mem_p (dest, mode)))
+     {
+       emit_move_insn (dest, src);
+       return true;
+     }
+ 
+   if (MEM_P (src))
+     {
+       rtx target = REG_P (dest) ? dest : NULL_RTX;
+       rtx value = extract_bit_field (src, GET_MODE_BITSIZE (mode), 0,
+ 				     false, target, mode, mode, false, NULL);
+       if (value != dest)
+ 	emit_move_insn (dest, value);
+       return true;
+     }
+ 
+   if (MEM_P (dest))
+     {
+       store_bit_field (dest, GET_MODE_BITSIZE (mode), 0, 0, 0, mode, src,
+ 		       false, false);
+       return true;
+     }
+ 
+   return false;
+ }
+ 
  /* Split a doubleword move from SRC to DEST.  On 32-bit targets,
     this function handles 64-bit moves for which riscv_split_64bit_move_p
     holds.  For 64-bit targets, this function handles 128-bit moves.  */
*************** riscv_can_inline_p (tree caller, tree ca
*** 9039,9044 ****
--- 9189,9198 ----
        != callee_opts->x_rvv_vector_strict_align)
      return false;
  
+   if (riscv_zilsd_required_align (caller_opts)
+       != riscv_zilsd_required_align (callee_opts))
+     return false;
+ 
    return true;
  }
  
*************** riscv_hard_regno_mode_ok (unsigned int r
*** 10960,10967 ****
    else if (VTYPE_REG_P (regno) || VL_REG_P (regno) || VXRM_REG_P (regno)
  	   || FRM_REG_P (regno))
      return true;
-   else
-     return false;
  
    /* Require same callee-savedness for all registers.  */
    for (unsigned i = 1; i < nregs; i++)
--- 11114,11119 ----
*************** riscv_override_options_internal (struct
*** 11690,11695 ****
--- 11842,11851 ----
        && ((target_flags_explicit & MASK_FDIV) == 0))
      opts->x_target_flags |= MASK_FDIV;
  
+   if (TARGET_64BIT && opts->x_riscv_zilsd_align_explicit)
+     error ("%<-mzilsd-word-align%> and %<-mzilsd-strict-align%> are only "
+ 	   "supported for RV32");
+ 
    /* Handle -mtune, use -mcpu if -mtune is not given, and use default -mtune
       if both -mtune and -mcpu are not given.  */
    const char *tune_string = get_tune_str (opts);
*************** riscv_check_target_clone_version (string
*** 14488,14495 ****
  
    if (!ok && loc_p)
      warning_at (*loc_p, OPT_Wattributes,
! 		"invalid version %qB for %<target_clones%> attribute",
! 		&str);
  
    return ok;
  }
--- 14644,14651 ----
  
    if (!ok && loc_p)
      warning_at (*loc_p, OPT_Wattributes,
! 		"invalid version %<%.*s%> for %<target_clones%> attribute",
! 		(int) str.size (), str.begin ());
  
    return ok;
  }
*************** riscv_use_by_pieces_infrastructure_p (un
*** 15054,15092 ****
    return default_use_by_pieces_infrastructure_p (size, alignment, op, speed_p);
  }
  
- /* Generate instruction sequence
-    which reflects the value of the OP using bswap and brev8 instructions.
-    OP's mode may be less than word_mode, to get the correct number,
-    after reflecting we shift right the value by SHIFT_VAL.
-    E.g. we have 1111 0001, after reflection (target 32-bit) we will get
-    1000 1111 0000 0000, if we shift-out 16 bits,
-    we will get the desired one: 1000 1111.  */
- 
- void
- generate_reflecting_code_using_brev (rtx *op_p)
- {
-   rtx op = *op_p;
-   machine_mode op_mode = GET_MODE (op);
- 
-   /* OP may be smaller than a word.  We can use a paradoxical subreg
-      to compensate for that.  It should never be larger than a word
-      for RISC-V.  */
-   gcc_assert (op_mode <= word_mode);
-   if (op_mode != word_mode)
-     op = gen_lowpart (word_mode, op);
- 
-   HOST_WIDE_INT shift_val = (BITS_PER_WORD
- 			     - GET_MODE_BITSIZE (op_mode).to_constant ());
-   riscv_expand_op (BSWAP, word_mode, op, op, op);
-   riscv_expand_op (LSHIFTRT, word_mode, op, op,
- 		   gen_int_mode (shift_val, word_mode));
-   if (TARGET_64BIT)
-     emit_insn (gen_riscv_brev8_di (op, op));
-   else
-     emit_insn (gen_riscv_brev8_si (op, op));
- }
- 
- 
  /* Generate assembly to calculate CRC using clmul instruction.
     The following code will be generated when the CRC and data sizes are equal:
       li      a4,quotient
--- 15210,15215 ----
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv.md gcc-17-20260524/gcc/config/riscv/riscv.md
*** gcc-17-20260517/gcc/config/riscv/riscv.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv.md	Sun May 24 22:32:05 2026
***************
*** 1858,1890 ****
  	(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand")))]
    "TARGET_64BIT"
  {
    if (SUBREG_P (operands[1]) && SUBREG_PROMOTED_VAR_P (operands[1])
        && SUBREG_PROMOTED_UNSIGNED_P (operands[1]))
      {
        emit_insn (gen_movdi (operands[0], SUBREG_REG (operands[1])));
        DONE;
      }
  })
  
! (define_insn_and_split "*zero_extendsidi2_internal"
!   [(set (match_operand:DI     0 "register_operand"     "=r,r")
! 	(zero_extend:DI
! 	    (match_operand:SI 1 "nonimmediate_operand" " r,m")))]
    "TARGET_64BIT && !TARGET_ZBA && !TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX
!    && !TARGET_XANDESPERF
!    && !(REG_P (operands[1]) && VL_REG_P (REGNO (operands[1])))"
!   "@
!    #
!    lwu\t%0,%1"
!   "&& reload_completed
!    && REG_P (operands[1])
!    && !paradoxical_subreg_p (operands[0])"
!   [(set (match_dup 0)
! 	(ashift:DI (match_dup 1) (const_int 32)))
!    (set (match_dup 0)
! 	(lshiftrt:DI (match_dup 0) (const_int 32)))]
!   { operands[1] = gen_lowpart (DImode, operands[1]); }
!   [(set_attr "move_type" "shift_shift,load")
     (set_attr "type" "load")
     (set_attr "mode" "DI")])
  
--- 1858,1898 ----
  	(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand")))]
    "TARGET_64BIT"
  {
+   /* If the source is a suitably extended subreg, then this is just
+      a simple move.  */
    if (SUBREG_P (operands[1]) && SUBREG_PROMOTED_VAR_P (operands[1])
        && SUBREG_PROMOTED_UNSIGNED_P (operands[1]))
      {
        emit_insn (gen_movdi (operands[0], SUBREG_REG (operands[1])));
        DONE;
      }
+ 
+   /* If the source is a register and we do not have ZBA or similar
+      extensions with similar capabilities, then emit the two
+      shifts now.  */
+   if (!TARGET_ZBA && !TARGET_XTHEADBB
+       && !TARGET_XTHEADMEMIDX && !TARGET_XANDESPERF
+       && register_operand (operands[1], SImode))
+     {
+       /* Intermediate register.  */
+       rtx ireg = gen_reg_rtx (DImode);
+       operands[1] = gen_lowpart (DImode, operands[1]);
+       rtx shiftval = GEN_INT (32);
+       rtx t = gen_rtx_ASHIFT (DImode, operands[1], shiftval);
+       emit_move_insn (ireg, t);
+       t = gen_rtx_LSHIFTRT (DImode, ireg, shiftval);
+       emit_move_insn (operands[0], t);
+       DONE;
+     }
  })
  
! (define_insn "*zero_extendsidi2_internal"
!   [(set (match_operand:DI     0 "register_operand"     "=r")
! 	(zero_extend:DI (match_operand:SI 1 "memory_operand" "m")))]
    "TARGET_64BIT && !TARGET_ZBA && !TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX
!    && !TARGET_XANDESPERF"
!   "lwu\t%0,%1"
!   [(set_attr "move_type" "load")
     (set_attr "type" "load")
     (set_attr "mode" "DI")])
  
***************
*** 1892,1920 ****
    [(set (match_operand:GPR    0 "register_operand")
  	(zero_extend:GPR
  	    (match_operand:HI 1 "nonimmediate_operand")))]
!   "")
  
! (define_insn_and_split "*zero_extendhi<GPR:mode>2"
!   [(set (match_operand:GPR    0 "register_operand"     "=r,r")
! 	(zero_extend:GPR
! 	    (match_operand:HI 1 "nonimmediate_operand" " r,m")))]
    "!TARGET_ZBB && !TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX
     && !TARGET_XANDESPERF"
!   "@
!    #
!    lhu\t%0,%1"
!   "&& reload_completed
!    && REG_P (operands[1])
!    && !paradoxical_subreg_p (operands[0])"
!   [(set (match_dup 0)
! 	(ashift:GPR (match_dup 1) (match_dup 2)))
!    (set (match_dup 0)
! 	(lshiftrt:GPR (match_dup 0) (match_dup 2)))]
!   {
!     operands[1] = gen_lowpart (<GPR:MODE>mode, operands[1]);
!     operands[2] = GEN_INT(GET_MODE_BITSIZE(<GPR:MODE>mode) - 16);
!   }
!   [(set_attr "move_type" "shift_shift,load")
     (set_attr "type" "load")
     (set_attr "mode" "<GPR:MODE>")])
  
--- 1900,1942 ----
    [(set (match_operand:GPR    0 "register_operand")
  	(zero_extend:GPR
  	    (match_operand:HI 1 "nonimmediate_operand")))]
!   ""
! {
!   /* If the source is a suitably extended subreg, then this is just
!      a simple move.  */
!   if (SUBREG_P (operands[1]) && SUBREG_PROMOTED_VAR_P (operands[1])
!       && SUBREG_PROMOTED_UNSIGNED_P (operands[1]))
!     {
!       emit_insn (gen_mov<GPR:mode> (operands[0], SUBREG_REG (operands[1])));
!       DONE;
!     }
  
!   /* If the source is a register and we do not have ZBB or similar
!      extensions with similar capabilities, then emit the two
!      shifts now.  */
!   if (!TARGET_ZBB && !TARGET_XTHEADBB
!       && !TARGET_XTHEADMEMIDX && !TARGET_XANDESPERF
!       && register_operand (operands[1], HImode))
!     {
!       /* Intermediate register.  */
!       rtx ireg = gen_reg_rtx (<GPR:MODE>mode);
!       operands[1] = gen_lowpart (<GPR:MODE>mode, operands[1]);
!       rtx shiftval = GEN_INT (GET_MODE_BITSIZE (<GPR:MODE>mode) - 16);
!       rtx t = gen_rtx_ASHIFT (<GPR:MODE>mode, operands[1], shiftval);
!       emit_move_insn (ireg, t);
!       t = gen_rtx_LSHIFTRT (<GPR:MODE>mode, ireg, shiftval);
!       emit_move_insn (operands[0], t);
!       DONE;
!     }
! })
! 
! (define_insn "*zero_extendhi<GPR:mode>2"
!   [(set (match_operand:GPR    0 "register_operand"     "=r")
! 	(zero_extend:GPR (match_operand:HI 1 "memory_operand" "m")))]
    "!TARGET_ZBB && !TARGET_XTHEADBB && !TARGET_XTHEADMEMIDX
     && !TARGET_XANDESPERF"
!   "lhu\t%0,%1"
!   [(set_attr "move_type" "load")
     (set_attr "type" "load")
     (set_attr "mode" "<GPR:MODE>")])
  
***************
*** 2578,2583 ****
--- 2600,2616 ----
     (set_attr "type" "move,move,load,store,mtc,fpload,mfc,fmove,fpstore,move")
     (set_attr "ext" "base,base,base,base,d,d,d,d,d,vector")])
  
+ (define_expand "movmisaligndi"
+   [(set (match_operand:DI 0 "nonimmediate_operand")
+ 	(match_operand:DI 1 "general_operand"))]
+   "!TARGET_64BIT && TARGET_ZILSD"
+ {
+   if (riscv_expand_zilsd_misaligned_move (operands[0], operands[1]))
+     DONE;
+   else
+     FAIL;
+ })
+ 
  ;; 32-bit Integer moves
  
  (define_expand "mov<mode>"
***************
*** 2752,2757 ****
--- 2785,2801 ----
     (set_attr "type" "fmove,fpload,fpstore")
     (set_attr "mode" "DF")])
  
+ (define_expand "movmisaligndf"
+   [(set (match_operand:DF 0 "nonimmediate_operand")
+ 	(match_operand:DF 1 "general_operand"))]
+   "!TARGET_64BIT && TARGET_ZILSD"
+ {
+   if (riscv_expand_zilsd_misaligned_move (operands[0], operands[1]))
+     DONE;
+   else
+     FAIL;
+ })
+ 
  (define_insn "movsidf2_low_rv32"
    [(set (match_operand:SI      0 "register_operand" "=  r")
  	(unspec:SI
***************
*** 3186,3209 ****
  ;; Handle SImode to DImode zero-extend combined with a left shift.  This can
  ;; occur when unsigned int is used for array indexing.  Split this into two
  ;; shifts.  Otherwise we can get 3 shifts.
! 
! (define_insn_and_split "zero_extendsidi2_shifted"
!   [(set (match_operand:DI 0 "register_operand" "=r")
! 	(and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
! 			   (match_operand:QI 2 "immediate_operand" "I"))
! 		(match_operand 3 "immediate_operand" "")))
!    (clobber (match_scratch:DI 4 "=&r"))]
!   "TARGET_64BIT && !TARGET_ZBA
!    && ((INTVAL (operands[3]) >> INTVAL (operands[2])) == 0xffffffff)"
!   "#"
!   "&& reload_completed"
!   [(set (match_dup 4)
! 	(ashift:DI (match_dup 1) (const_int 32)))
!    (set (match_dup 0)
! 	(lshiftrt:DI (match_dup 4) (match_dup 5)))]
!   "operands[5] = GEN_INT (32 - (INTVAL (operands [2])));"
!   [(set_attr "type" "shift")
!    (set_attr "mode" "DI")])
  
  ;; Handle logical AND feeding an equality test against zero where an operand
  ;; to the AND is a constant requiring synthesis.  Because we only care about
--- 3230,3254 ----
  ;; Handle SImode to DImode zero-extend combined with a left shift.  This can
  ;; occur when unsigned int is used for array indexing.  Split this into two
  ;; shifts.  Otherwise we can get 3 shifts.
! (define_split
!   [(set (match_operand:DI 0 "register_operand")
! 	(and:DI (ashift:DI (match_operand:DI 1 "register_operand")
! 			   (match_operand:QI 2 "dimode_shift_operand"))
! 		(match_operand 3 "consecutive_bits_operand")))
!    (clobber (match_operand:DI 4 "register_operand"))]
!   "TARGET_64BIT
!    && riscv_shamt_matches_mask_p (INTVAL (operands[2]), INTVAL (operands[3]))
!    && !(TARGET_ZBA && clz_hwi (INTVAL (operands[3])) <= 32)"
!   [(set (match_dup 4) (ashift:DI (match_dup 1) (match_dup 5)))
!    (set (match_dup 0) (lshiftrt:DI (match_dup 4) (match_dup 6)))]
! {
!   unsigned HOST_WIDE_INT mask = INTVAL (operands[3]);
!   int leading  = clz_hwi (mask);
!   int trailing = ctz_hwi (mask);
!  
!   operands[5] = GEN_INT (leading + trailing);
!   operands[6] = GEN_INT (leading);
! })
  
  ;; Handle logical AND feeding an equality test against zero where an operand
  ;; to the AND is a constant requiring synthesis.  Because we only care about
***************
*** 4481,4487 ****
  	 UNSPEC_SSP_SET))
     (set (match_scratch:GPR 2 "=&r") (const_int 0))]
    ""
!   "<load>\t%2, %1\;<store>\t%2, %0\;li\t%2, 0"
    [(set_attr "type" "multi")
     (set_attr "length" "12")])
  
--- 4526,4541 ----
  	 UNSPEC_SSP_SET))
     (set (match_scratch:GPR 2 "=&r") (const_int 0))]
    ""
!   {
!     rtx moves[][2] = {
!       {operands[2], operands[1]},
!       {operands[0], operands[2]},
!     };
!     for (rtx *op: moves)
!       output_asm_insn (riscv_output_move (op[0], op[1]), op);
! 
!     return "li\t%2, 0";
!   }
    [(set_attr "type" "multi")
     (set_attr "length" "12")])
  
***************
*** 4521,4527 ****
  	 UNSPEC_SSP_TEST))
     (clobber (match_scratch:GPR 3 "=&r"))]
    ""
!   "<load>\t%3, %1\;<load>\t%0, %2\;xor\t%0, %3, %0\;li\t%3, 0"
    [(set_attr "type" "multi")
     (set_attr "length" "12")])
  
--- 4575,4590 ----
  	 UNSPEC_SSP_TEST))
     (clobber (match_scratch:GPR 3 "=&r"))]
    ""
!   {
!     rtx moves[][2] = {
!       {operands[3], operands[1]},
!       {operands[0], operands[2]},
!     };
!     for (rtx *op: moves)
!       output_asm_insn (riscv_output_move (op[0], op[1]), op);
! 
!     return "xor\t%0, %3, %0\;li\t%3, 0";
!   }
    [(set_attr "type" "multi")
     (set_attr "length" "12")])
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv.opt gcc-17-20260524/gcc/config/riscv/riscv.opt
*** gcc-17-20260517/gcc/config/riscv/riscv.opt	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv.opt	Sun May 24 22:32:05 2026
*************** mscalar-strict-align
*** 132,137 ****
--- 132,145 ----
  Target Save Alias(mstrict-align)
  Do not generate unaligned scalar memory accesses.
  
+ mzilsd-word-align
+ Target RejectNegative
+ Allow Zilsd/Zclsd memory accesses to be 4-byte aligned.
+ 
+ mzilsd-strict-align
+ Target RejectNegative
+ Force Zilsd/Zclsd memory accesses to be 8-byte aligned.
+ 
  mvector-strict-align
  Target Save Var(rvv_vector_strict_align) Init(1)
  Do not create element-misaligned vector memory accesses.
*************** Omit the frame pointer in leaf functions
*** 171,176 ****
--- 179,190 ----
  TargetVariable
  int riscv_isa_flags
  
+ TargetVariable
+ enum riscv_zilsd_align_type riscv_zilsd_align = RISCV_ZILSD_ALIGN_DEFAULT
+ 
+ TargetVariable
+ int riscv_zilsd_align_explicit = 0
+ 
  Mask(64BIT) Var(riscv_isa_flags)
  
  Mask(VECTOR) Var(riscv_isa_flags)
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv.opt.urls gcc-17-20260524/gcc/config/riscv/riscv.opt.urls
*** gcc-17-20260517/gcc/config/riscv/riscv.opt.urls	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv.opt.urls	Sun May 24 22:32:05 2026
*************** UrlSuffix(gcc/RISC-V-Options.html#index-
*** 50,55 ****
--- 50,61 ----
  mscalar-strict-align
  UrlSuffix(gcc/RISC-V-Options.html#index-mscalar-strict-align)
  
+ mzilsd-word-align
+ UrlSuffix(gcc/RISC-V-Options.html#index-mzilsd-word-align)
+ 
+ mzilsd-strict-align
+ UrlSuffix(gcc/RISC-V-Options.html#index-mzilsd-strict-align)
+ 
  mvector-strict-align
  UrlSuffix(gcc/RISC-V-Options.html#index-mvector-strict-align)
  
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv_bitmanip.h gcc-17-20260524/gcc/config/riscv/riscv_bitmanip.h
*** gcc-17-20260517/gcc/config/riscv/riscv_bitmanip.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv_bitmanip.h	Sun May 24 22:32:05 2026
***************
*** 27,32 ****
--- 27,57 ----
  
  #include <stdint.h>
  
+ #define __riscv_intrinsic_zbb 1
+ #define __riscv_intrinsic_zbc 1
+ #define __riscv_intrinsic_zbkb 1
+ #define __riscv_intrinsic_zbkc 1
+ #define __riscv_intrinsic_zbkx 1
+ 
+ #if !defined (__riscv_intrinsic_zkn) \
+     && defined (__riscv_intrinsic_zbkb) \
+     && defined (__riscv_intrinsic_zbkc) \
+     && defined (__riscv_intrinsic_zbkx) \
+     && defined (__riscv_intrinsic_zknd) \
+     && defined (__riscv_intrinsic_zkne) \
+     && defined (__riscv_intrinsic_zknh)
+ #define __riscv_intrinsic_zkn 1
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_zks) \
+     && defined (__riscv_intrinsic_zbkb) \
+     && defined (__riscv_intrinsic_zbkc) \
+     && defined (__riscv_intrinsic_zbkx) \
+     && defined (__riscv_intrinsic_zksed) \
+     && defined (__riscv_intrinsic_zksh)
+ #define __riscv_intrinsic_zks 1
+ #endif
+ 
  #ifdef __cplusplus
  extern "C" {
  #endif
*************** __riscv_xperm8_64 (uint64_t rs1, uint64_
*** 294,297 ****
  #if defined (__cplusplus)
  }
  #endif // __cplusplus
! #endif // __RISCV_BITMANIP_H
\ No newline at end of file
--- 319,322 ----
  #if defined (__cplusplus)
  }
  #endif // __cplusplus
! #endif // __RISCV_BITMANIP_H
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv_crypto.h gcc-17-20260524/gcc/config/riscv/riscv_crypto.h
*** gcc-17-20260517/gcc/config/riscv/riscv_crypto.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv_crypto.h	Sun May 24 22:32:05 2026
***************
*** 27,32 ****
--- 27,57 ----
  
  #include <stdint.h>
  
+ #define __riscv_intrinsic_zknd 1
+ #define __riscv_intrinsic_zkne 1
+ #define __riscv_intrinsic_zknh 1
+ #define __riscv_intrinsic_zksed 1
+ #define __riscv_intrinsic_zksh 1
+ 
+ #if !defined (__riscv_intrinsic_zkn) \
+     && defined (__riscv_intrinsic_zbkb) \
+     && defined (__riscv_intrinsic_zbkc) \
+     && defined (__riscv_intrinsic_zbkx) \
+     && defined (__riscv_intrinsic_zknd) \
+     && defined (__riscv_intrinsic_zkne) \
+     && defined (__riscv_intrinsic_zknh)
+ #define __riscv_intrinsic_zkn 1
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_zks) \
+     && defined (__riscv_intrinsic_zbkb) \
+     && defined (__riscv_intrinsic_zbkc) \
+     && defined (__riscv_intrinsic_zbkx) \
+     && defined (__riscv_intrinsic_zksed) \
+     && defined (__riscv_intrinsic_zksh)
+ #define __riscv_intrinsic_zks 1
+ #endif
+ 
  #ifdef __cplusplus
  extern "C" {
  #endif
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/riscv_vector.h gcc-17-20260524/gcc/config/riscv/riscv_vector.h
*** gcc-17-20260517/gcc/config/riscv/riscv_vector.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/riscv_vector.h	Sun May 24 22:32:05 2026
***************
*** 28,33 ****
--- 28,81 ----
  #include <stdint.h>
  #include <stddef.h>
  
+ #define __riscv_intrinsic_v 1
+ #define __riscv_intrinsic_zve32f 1
+ #define __riscv_intrinsic_zve32x 1
+ #define __riscv_intrinsic_zve64d 1
+ #define __riscv_intrinsic_zve64f 1
+ #define __riscv_intrinsic_zve64x 1
+ #define __riscv_intrinsic_zvbb 1
+ #define __riscv_intrinsic_zvbc 1
+ #define __riscv_intrinsic_zvfbfmin 1
+ #define __riscv_intrinsic_zvfbfwma 1
+ #define __riscv_intrinsic_zvfh 1
+ #define __riscv_intrinsic_zvfhmin 1
+ #define __riscv_intrinsic_zvkb 1
+ #define __riscv_intrinsic_zvkg 1
+ #define __riscv_intrinsic_zvkned 1
+ #define __riscv_intrinsic_zvknha 1
+ #define __riscv_intrinsic_zvknhb 1
+ #define __riscv_intrinsic_zvksed 1
+ #define __riscv_intrinsic_zvksh 1
+ 
+ #if defined (__riscv_intrinsic_zvkned) \
+     && defined (__riscv_intrinsic_zvknhb) \
+     && defined (__riscv_intrinsic_zvkb)
+ #define __riscv_intrinsic_zvkn 1
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zvkn) && defined (__riscv_intrinsic_zvbc)
+ #define __riscv_intrinsic_zvknc 1
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zvkn) && defined (__riscv_intrinsic_zvkg)
+ #define __riscv_intrinsic_zvkng 1
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zvksed) \
+     && defined (__riscv_intrinsic_zvksh) \
+     && defined (__riscv_intrinsic_zvkb)
+ #define __riscv_intrinsic_zvks 1
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zvks) && defined (__riscv_intrinsic_zvbc)
+ #define __riscv_intrinsic_zvksc 1
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zvks) && defined (__riscv_intrinsic_zvkg)
+ #define __riscv_intrinsic_zvksg 1
+ #endif
+ 
  #ifdef __cplusplus
  extern "C" {
  #endif
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/sifive_vector.h gcc-17-20260524/gcc/config/riscv/sifive_vector.h
*** gcc-17-20260517/gcc/config/riscv/sifive_vector.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/sifive_vector.h	Sun May 24 22:32:05 2026
***************
*** 25,30 ****
--- 25,35 ----
  #ifndef __SIFIVE_VECTOR_H
  #define __SIFIVE_VECTOR_H
  
+ #define __riscv_intrinsic_xsfvcp 1
+ #define __riscv_intrinsic_xsfvfnrclipxfqf 1
+ #define __riscv_intrinsic_xsfvqmaccdod 1
+ #define __riscv_intrinsic_xsfvqmaccqoq 1
+ 
  /* TODO: This should have a separate pragma to include only the SiFive
           vector intrinsics. For now, we are including riscv_vector.h. */
  #include <riscv_vector.h>
diff -Nrcpad gcc-17-20260517/gcc/config/riscv/vector-iterators.md gcc-17-20260524/gcc/config/riscv/vector-iterators.md
*** gcc-17-20260517/gcc/config/riscv/vector-iterators.md	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/riscv/vector-iterators.md	Sun May 24 22:32:05 2026
***************
*** 122,131 ****
    UNSPEC_SF_VFNRCLIP
    UNSPEC_SF_VFNRCLIPU
    UNSPEC_SF_CV
- 
-   ;; Vector conditional branch optabs
-   UNSPEC_COND_LEN_CMP_ALL
-   UNSPEC_COND_LEN_CMP_ANY
  ])
  
  (define_c_enum "unspecv" [
--- 122,127 ----
***************
*** 6524,6540 ****
    (V32DI "V32HI") (V64DI "V64HI") (V128DI "V128HI") (V256DI "V256HI")
    (V512DI "V512HI")
  ])
- 
- ;; Vector conditional branch iterators
- (define_int_iterator COND_LEN_CBRANCH_CMP
-  [UNSPEC_COND_LEN_CMP_ALL UNSPEC_COND_LEN_CMP_ANY])
- 
- (define_int_attr cbranch_op [
-   (UNSPEC_COND_LEN_CMP_ALL "EQ")
-   (UNSPEC_COND_LEN_CMP_ANY "NE")
- ])
- 
- (define_int_attr cbranch_optab [
-   (UNSPEC_COND_LEN_CMP_ALL "cond_len_vec_cbranch_all")
-   (UNSPEC_COND_LEN_CMP_ANY "cond_len_vec_cbranch_any")
- ])
--- 6520,6522 ----
diff -Nrcpad gcc-17-20260517/gcc/config/rs6000/amo.h gcc-17-20260524/gcc/config/rs6000/amo.h
*** gcc-17-20260517/gcc/config/rs6000/amo.h	Sun May 17 22:32:05 2026
--- gcc-17-20260524/gcc/config/rs6000/amo.h	Sun May 24 22:32:05 2026
*************** NAME (TYPE *_PTR, TYPE _VALUE)						\
*** 71,76 ****
--- 71,122 ----
    return _RET;								\
  }
  
+ /* Implementation of the LWAT/LDAT operations that take two input registers
+    and modify one word or double-word of memory and return the value that was
+    previously in the memory location.  The destination and two source
+    registers are encoded with only one register number, so we need three
+    consecutive GPR registers and there is no C/C++ type that will give
+    us that, so we have to use register asm variables to achieve that.
+ 
+    The LWAT/LDAT opcode requires the address to be a single register,
+    and that points to a suitably aligned memory location. Load atomic
+    instructions have side effects, so the asm is marked as volatile.  */
+ 
+ #define _AMO_LD_CMPSWP(NAME, TYPE, OPCODE, FC)				\
+ static __inline__ TYPE							\
+ NAME (TYPE *_ADDR, TYPE _COND, TYPE _VALUE)				\
+ {									\
+   register TYPE _ret asm ("r8");					\
+   register TYPE _cond asm ("r9") = _COND;				\
+   register TYPE _value asm ("r10") = _VALUE;				\
+   __asm__ volatile (OPCODE " %0,%P1,%4\n"				\
+ 			: "=r" (_ret), "+Q" (*_ADDR)			\
+ 			: "r" (_cond), "r" (_value), "n" (FC));		\
+   return _ret;								\
+ }
+ 
+ #define _AMO_LD_INCREMENT(NAME, TYPE, OPCODE, FC)			\
+ static __inline__ TYPE							\
+ NAME (TYPE *_ADDR)							\
+ {									\
+   TYPE _RET;								\
+   __asm__ volatile (OPCODE " %0,%P1,%3\n"				\
+ 			: "=r" (_RET), "+Q" (_ADDR[0])			\
+ 			: "Q" (_ADDR[1]), "n" (FC));			\
+   return _RET;								\
+ }
+ 
+ #define _AMO_LD_DECREMENT(NAME, TYPE, OPCODE, FC)			\
+ static __inline__ TYPE							\
+ NAME (TYPE *_ADDR)							\
+ {									\
+   TYPE _RET;								\
+   __asm__ volatile (OPCODE " %0,%P1,%3\n"				\
+ 			: "=r" (_RET), "+Q" (_ADDR[1])			\
+ 			: "Q" (_ADDR[0]), "n" (FC));			\
+   return _RET;								\
+ }
+ 
  _AMO_LD_SIMPLE (amo_lwat_add,   uint32_t, "lwat", _AMO_LD_ADD)
  _AMO_LD_SIMPLE (amo_lwat_xor,   uint32_t, "lwat", _AMO_LD_XOR)
  _AMO_LD_SIMPLE (amo_lwat_ior,   uint32_t, "lwat", _AMO_LD_IOR)
*************** _AMO_LD_SIMPLE (amo_lwat_and,   uint32_t
*** 78,88 ****
--- 124,142 ----
  _AMO_LD_SIMPLE (amo_lwat_umax,  uint32_t, "lwat", _AMO_LD_UMAX)
  _AMO_LD_SIMPLE (amo_lwat_umin,  uint32_t, "lwat", _AMO_LD_UMIN)
  _AMO_LD_SIMPLE (amo_lwat_swap,  uint32_t, "lwat", _AMO_LD_SWAP)
+ _AMO_LD_CMPSWP    (amo_lwat_cas_neq,     uint32_t, "lwat", _AMO_LD_CS_NE)
+ _AMO_LD_INCREMENT (amo_lwat_inc_eq,      uint32_t, "lwat", _AMO_LD_INC_EQUAL)
+ _AMO_LD_INCREMENT (amo_lwat_inc_bounded, uint32_t, "lwat", _AMO_LD_INC_BOUNDED)
+ _AMO_LD_DECREMENT (amo_lwat_dec_bounded, uint32_t, "lwat", _AMO_LD_DEC_BOUNDED)
  
  _AMO_LD_SIMPLE (amo_lwat_sadd,  int32_t,  "lwat", _AMO_LD_ADD)
  _AMO_LD_SIMPLE (amo_lwat_smax,  int32_t,  "lwat", _AMO_LD_SMAX)
  _AMO_LD_SIMPLE (amo_lwat_smin,  int32_t,  "lwat", _AMO_LD_SMIN)
  _AMO_LD_SIMPLE (amo_lwat_sswap, int32_t,  "lwat", _AMO_LD_SWAP)
+ _AMO_LD_CMPSWP    (amo_lwat_scas_neq,     int32_t, "lwat", _AMO_LD_CS_NE)
+ _AMO_LD_INCREMENT (amo_lwat_sinc_eq,      int32_t, "lwat", _AMO_LD_INC_EQUAL)
+ _AMO_LD_INCREMENT (amo_lwat_sinc_bounded, int32_t, "lwat", _AMO_LD_INC_BOUNDED)
+ _AMO_LD_DECREMENT (amo_lwat_sdec_bounded, int32_t, "lwat", _AMO_LD_DEC_BOUNDED)
  
  _AMO_LD_SIMPLE (amo_ldat_add,   uint64_t, "ldat", _AMO_LD_ADD)
  _AMO_LD_SIMPLE (amo_ldat_xor,   uint64_t, "ldat", _AMO_LD_XOR)
*************** _AMO_LD_SIMPLE (amo_ldat_and,   uint64_t
*** 91,101 ****
--- 145,163 ----
  _AMO_LD_SIMPLE (amo_ldat_umax,  uint64_t, "ldat", _AMO_LD_UMAX)
  _AMO_LD_SIMPLE (amo_ldat_umin,  uint64_t, "ldat", _AMO_LD_UMIN)
  _AMO_LD_SIMPLE (amo_ldat_swap,  uint64_t, "ldat", _AMO_LD_SWAP)
+ _AMO_LD_CMPSWP    (amo_ldat_cas_neq,     uint64_t, "ldat", _AMO_LD_CS_NE)
+ _AMO_LD_INCREMENT (amo_ldat_inc_eq,      uint64_t, "ldat", _AMO_LD_INC_EQUAL)
+ _AMO_LD_INCREMENT (amo_ldat_inc_bounded, uint64_t, "ldat", _AMO_LD_INC_BOUNDED)
+ _AMO_LD_DECREMENT (amo_ldat_dec_bounded, uint64_t, "ldat", _AMO_LD_DEC_BOUNDED)
  
  _AMO_LD_SIMPLE (amo_ldat_sadd,  int64_t,  "ldat", _AMO_LD_ADD)
  _AMO_LD_SIMPLE (amo_ldat_smax,  int64_t,  "ldat", _AMO_LD_SMAX)
  _AMO_LD_SIMPLE (amo_ldat_smin,  int64_t,  "ldat", _AMO_LD_SMIN)
  _AMO_LD_SIMPLE (amo_ldat_sswap, int64_t,  "ldat", _AMO_LD_SWAP)
+ _AMO_LD_CMPSWP    (amo_ldat_scas_neq,     int64_t, "ldat", _AMO_LD_CS_NE)
+ _AMO_LD_INCREMENT (amo_ldat_sinc_eq,      int64_t, "ldat", _AMO_LD_INC_EQUAL)
+ _AMO_LD_INCREMENT (amo_ldat_sinc_bounded, int64_t, "ldat", _AMO_LD_INC_BOUNDED)
+ _AMO_LD_DECREMENT (amo_ldat_sdec_bounded, int64_t, "ldat", _AMO_LD_DEC_BOUNDED)
  
  /* Enumeration of the STWAT/STDAT sub-opcodes.  */
  enum _AMO_ST {
*************** NAME (TYPE *_PTR, TYPE _VALUE)						\
*** 127,142 ****
--- 189,224 ----
    return;								\
  }
  
+ /* Implementation of the STWAT/STDAT store twin operation that takes
+    one register and modifies two words or double-words of memory.
+    No value is returned.
+ 
+    The STWAT/STDAT opcode requires the address to be a single register
+    that points to a suitably aligned memory location. Store atomic
+    instructions have side effects, so the asm is marked as volatile.  */
+ 
+ #define _AMO_ST_TWIN(NAME, TYPE, OPCODE, FC)				\
+ static __inline__ void							\
+ NAME (TYPE *_ADDR, TYPE _VALUE)						\
+ {									\
+   __asm__ volatile (OPCODE " %2,%P0,%3"					\
+ 		    : "+Q" (_ADDR[0]), "+Q" (_ADDR[1])			\
+ 		    : "r" (_VALUE),  "n" (FC));				\
+   return;								\
+ }
+ 
  _AMO_ST_SIMPLE (amo_stwat_add,  uint32_t, "stwat", _AMO_ST_ADD)
  _AMO_ST_SIMPLE (amo_stwat_xor,  uint32_t, "stwat", _AMO_ST_XOR)
  _AMO_ST_SIMPLE (amo_stwat_ior,  uint32_t, "stwat", _AMO_ST_IOR)
  _AMO_ST_SIMPLE (amo_stwat_and,  uint32_t, "stwat", _AMO_ST_AND)
  _AMO_ST_SIMPLE (amo_stwat_umax, uint32_t, "stwat", _AMO_ST_UMAX)
  _AMO_ST_SIMPLE (amo_stwat_umin, uint32_t, "stwat", _AMO_ST_UMIN)
+ _AMO_ST_TWIN (amo_stwat_twin, uint32_t, "stwat", _AMO_ST_TWIN)
  
  _AMO_ST_SIMPLE (amo_stwat_sadd, int32_t,  "stwat", _AMO_ST_ADD)
  _AMO_ST_SIMPLE (amo_stwat_smax, int32_t,  "stwat", _AMO_ST_SMAX)
  _AMO_ST_SIMPLE (amo_stwat_smin, int32_t,  "stwat", _AMO_ST_SMIN)
+ _AMO_ST_TWIN (amo_stwat_stwin, int32_t, "stwat", _AMO_ST_TWIN)
  
  _AMO_ST_SIMPLE (amo_stdat_add,  uint64_t, "stdat", _AMO_ST_ADD)
  _AMO_ST_SIMPLE (amo_stdat_xor,  uint64_t, "stdat", _AMO_ST_XOR)
*************** _AMO_ST_SIMPLE (amo_stdat_ior,  uint64_t
*** 144,152 ****
--- 226,236 ----
  _AMO_ST_SIMPLE (amo_stdat_and,  uint64_t, "stdat", _AMO_ST_AND)
  _AMO_ST_SIMPLE (amo_stdat_umax, uint64_t, "stdat", _AMO_ST_UMAX)
  _AMO_ST_SIMPLE (amo_stdat_umin, uint64_t, "stdat", _AMO_ST_UMIN)
+ _AMO_ST_TWIN (amo_stdat_twin, uint64_t, "stdat", _AMO_ST_TWIN)
  
  _AMO_ST_SIMPLE (amo_stdat_sadd, int64_t,  "stdat", _AMO_ST_ADD)
  _AMO_ST_SIMPLE (amo_stdat_smax, int64_t,  "stdat", _AMO_ST_SMAX)
  _AMO_ST_SIMPLE (amo_stdat_smin, int64_t,  "stdat", _AMO_ST_SMIN)
+ _AMO_ST_TWIN (amo_stdat_stwin, int64_t, "stdat", _AMO_ST_TWIN)
  #endif	/* _ARCH_PWR9 && _ARCH_PPC64.  */
  #endif	/* _POWERPC_AMO_H.  */
diff -Nrcpad gcc-17-20260517/gcc/config/rs6000/rs6000.h gcc-17-20260524/gcc/config/rs6000/rs6000.h
*** gcc-17-20260517/gcc/config/rs6000/rs6000.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/config/rs6000/rs6000.h	Sun May 24 22:32:05 2026
*************** extern int rs6000_vector_align[];
*** 533,541 ****
  				 || TARGET_VSX				 \
  				 || TARGET_HARD_FLOAT)
  
! /* E500 cores only support plain "sync", not lwsync.  */
  #define TARGET_NO_LWSYNC (rs6000_cpu == PROCESSOR_PPC8540 \
! 			  || rs6000_cpu == PROCESSOR_PPC8548)
  
  
  /* Which machine supports the various reciprocal estimate instructions.  */
--- 533,545 ----
  				 || TARGET_VSX				 \
  				 || TARGET_HARD_FLOAT)
  
! /* E500 and MPC8xx cores require all should-be-zero bits in sync to
!    actually be zero; using lwsync (L=1) causes a fault on these cores.
!    Classic cores (601, 603, 604, 750 etc.) simply ignore the L field
!    and always do a full hwsync.  */
  #define TARGET_NO_LWSYNC (rs6000_cpu == PROCESSOR_PPC8540 \
! 			  || rs6000_cpu == PROCESSOR_PPC8548 \
! 			  || rs6000_cpu == PROCESSOR_MPCCORE)
  
  
  /* Which machine supports the various reciprocal estimate instructions.  */
diff -Nrcpad gcc-17-20260517/gcc/config/rx/rx.cc gcc-17-20260524/gcc/config/rx/rx.cc
*** gcc-17-20260517/gcc/config/rx/rx.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/config/rx/rx.cc	Sun May 24 22:32:05 2026
*************** rx_gen_move_template (rtx * operands, bo
*** 1000,1009 ****
    const char * dst_template;
    rtx          dest = operands[0];
    rtx          src  = operands[1];
  
!   /* Decide which extension, if any, should be given to the move instruction.  */
!   /* When zero-extending, always check the size of the source. */
!   switch ((is_movu || MEM_P (src)) ? GET_MODE (src) : GET_MODE (dest))
      {
      case E_QImode:
        /* The .B extension is not valid when
--- 1000,1025 ----
    const char * dst_template;
    rtx          dest = operands[0];
    rtx          src  = operands[1];
+   machine_mode mode;
+   machine_mode src_mode;
  
!   /* Determine the size to transfer.  */
!   if (CONST_INT_P (src))
!     /* Since constants have no size, the destination is used.  */
!     mode = GET_MODE (dest);
!   else
!     {
!       /* Otherwise, use the smaller size.  */
!       if (GET_MODE (src) == SIGN_EXTEND || GET_MODE (src) == ZERO_EXTEND)
! 	/* When expanding, the original size will be used. */
! 	src_mode = GET_MODE (XEXP (src, 0));
!       else
! 	src_mode = GET_MODE (src);
!       mode = (GET_MODE_SIZE (src_mode) < GET_MODE_SIZE(GET_MODE(dest)))
! 	 ? src_mode : GET_MODE(dest);
!     }
! 
!   switch (mode)
      {
      case E_QImode:
        /* The .B extension is not valid when
*************** rx_gen_move_template (rtx * operands, bo
*** 1022,1030 ****
        gcc_assert (!is_movu);
        extension = ".L";
        break;
-     case E_VOIDmode:
-       /* This mode is used by constants.  */
-       break;
      default:
        debug_rtx (src);
        gcc_unreachable ();
--- 1038,1043 ----
diff -Nrcpad gcc-17-20260517/gcc/cp/ChangeLog gcc-17-20260524/gcc/cp/ChangeLog
*** gcc-17-20260517/gcc/cp/ChangeLog	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/ChangeLog	Sun May 24 22:32:05 2026
***************
*** 1,3 ****
--- 1,86 ----
+ 2026-05-23  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/125135
+ 	* pt.cc (check_non_deducible_conversions): Handle LOOKUP_DEFAULTED.
+ 
+ 2026-05-22  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* parser.cc (cp_parser_omp_clause_from_to): Add parsing for
+ 	mapper modifier.
+ 	(cp_parser_omp_target_update): Instantiate mappers.
+ 
+ 2026-05-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/119059
+ 	* method.cc: Implement C++26 P3074R7 - trivial unions (was
+ 	std::uninitialized<T>) (except the sentence removed again in P3726R2)
+ 	and proposed resolution of CWG3189 - Implicitly deleted destructors
+ 	for union-like classes.
+ 	(walk_field_subobs): Don't do default_init_uninitialized_part checks
+ 	for variant members.  Don't check subobject ctor/dtor for variant
+ 	members for ctor/inheriting ctor or when subobject doesn't have member
+ 	initializer for dtor and it is either the dtor_from_ctor case or
+ 	the current class doesn't have user provided ctors.
+ 	* class.cc (check_field_decl): Don't or in
+ 	TYPE_HAS_NONTRIVIAL_DESTRUCTOR or TYPE_HAS_DEFAULT_CONSTRUCTOR of
+ 	variant subobjects for C++26.
+ 
+ 2026-05-21  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125330
+ 	* parser.cc (cp_parser_parameter_declaration_list): Also
+ 	pushdecl when parameter->default_argument is this_identifier.
+ 
+ 2026-05-21  Jason Merrill  <jason@redhat.com>
+ 
+ 	* constexpr.cc (init_subob_ctx): Check is_empty_field.
+ 
+ 2026-05-21  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/125384
+ 	PR c++/113563
+ 	* lambda.cc (build_capture_proxy): 'this' capture proxy is const.
+ 
+ 2026-05-21  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125284
+ 	PR c++/125333
+ 	* pt.cc (tsubst_decl) <case USING_DECL>: Copy targs before
+ 	modifying them.
+ 
+ 2026-05-21  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/125376
+ 	* coroutines.cc (register_local_var_uses): Ignore DECL_NAME for
+ 	name independent decls.
+ 
+ 2026-05-19  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123536
+ 	* cp-tree.h (process_outer_var_ref): Remove a parameter's name.
+ 	* expr.cc (mark_use): Return if mark_rvalue_use returns
+ 	error_mark_node.
+ 	* semantics.cc (process_outer_var_ref): Return decl when it is
+ 	instantiation-dependent.
+ 
+ 2026-05-19  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125336
+ 	* constexpr.cc (cxx_eval_bare_aggregate): Don't call
+ 	get_or_insert_ctor_field when there is no CONSTRUCTOR.  Assert
+ 	is_empty_class.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* semantics.cc (finish_omp_clauses): Likewise.
+ 
+ 2026-05-18  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* constexpr.cc (cxx_eval_bare_aggregate): Remove dead code.
+ 
  2026-05-15  Jakub Jelinek  <jakub@redhat.com>
  
  	PR c++/125081
diff -Nrcpad gcc-17-20260517/gcc/cp/class.cc gcc-17-20260524/gcc/cp/class.cc
*** gcc-17-20260517/gcc/cp/class.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/class.cc	Sun May 24 22:32:05 2026
*************** check_field_decl (tree field,
*** 3903,3919 ****
        else
  	{
  	  TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type);
- 	  TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
- 	    |= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type);
  	  TYPE_HAS_COMPLEX_COPY_ASSIGN (t)
  	    |= (TYPE_HAS_COMPLEX_COPY_ASSIGN (type)
  		|| !TYPE_HAS_COPY_ASSIGN (type));
  	  TYPE_HAS_COMPLEX_COPY_CTOR (t) |= (TYPE_HAS_COMPLEX_COPY_CTOR (type)
  					     || !TYPE_HAS_COPY_CTOR (type));
! 	  TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) |= TYPE_HAS_COMPLEX_MOVE_ASSIGN (type);
  	  TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_HAS_COMPLEX_MOVE_CTOR (type);
! 	  TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type)
! 					|| TYPE_HAS_COMPLEX_DFLT (type));
  	}
  
        if (TYPE_HAS_COPY_CTOR (type)
--- 3903,3930 ----
        else
  	{
  	  TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type);
  	  TYPE_HAS_COMPLEX_COPY_ASSIGN (t)
  	    |= (TYPE_HAS_COMPLEX_COPY_ASSIGN (type)
  		|| !TYPE_HAS_COPY_ASSIGN (type));
  	  TYPE_HAS_COMPLEX_COPY_CTOR (t) |= (TYPE_HAS_COMPLEX_COPY_CTOR (type)
  					     || !TYPE_HAS_COPY_CTOR (type));
! 	  TYPE_HAS_COMPLEX_MOVE_ASSIGN (t)
! 	    |= TYPE_HAS_COMPLEX_MOVE_ASSIGN (type);
  	  TYPE_HAS_COMPLEX_MOVE_CTOR (t) |= TYPE_HAS_COMPLEX_MOVE_CTOR (type);
! 	  /* In C++26, triviality of default ctor or dtor of a variant member
! 	     doesn't matter for triviality of the t's default ctor or dtor.
! 	     Before C++26, non-trivial default ctor or dtor of a variant
! 	     member makes it deleted with the exception of default ctor
! 	     when DMI is present, but in that case default ctor is
! 	     non-trivial.   */
! 	  if (TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE)
! 	    {
! 	      TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
! 		|= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type);
! 	      TYPE_HAS_COMPLEX_DFLT (t)
! 		|= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type)
! 		    || TYPE_HAS_COMPLEX_DFLT (type));
! 	    }
  	}
  
        if (TYPE_HAS_COPY_CTOR (type)
diff -Nrcpad gcc-17-20260517/gcc/cp/constexpr.cc gcc-17-20260524/gcc/cp/constexpr.cc
*** gcc-17-20260517/gcc/cp/constexpr.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/constexpr.cc	Sun May 24 22:32:05 2026
*************** init_subob_ctx (const constexpr_ctx *ctx
*** 6721,6727 ****
      {
        /* This can happen if the enclosing object is also an empty subobject
  	 (c++/125315).  */
!       gcc_checking_assert (is_empty_class (type));
        return;
      }
  
--- 6721,6727 ----
      {
        /* This can happen if the enclosing object is also an empty subobject
  	 (c++/125315).  */
!       gcc_checking_assert (is_empty_field (index));
        return;
      }
  
*************** init_subob_ctx (const constexpr_ctx *ctx
*** 6745,6751 ****
  	new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
      }
  
!   if (is_empty_class (type)
        && TREE_CODE (ctxtype) != UNION_TYPE)
      /* Leave ctor null for an empty subobject of a non-union class, they aren't
         represented in the result of evaluation.  */
--- 6745,6751 ----
  	new_ctx.object = build_ctor_subob_ref (index, type, ctx->object);
      }
  
!   if (is_empty_field (index)
        && TREE_CODE (ctxtype) != UNION_TYPE)
      /* Leave ctor null for an empty subobject of a non-union class, they aren't
         represented in the result of evaluation.  */
*************** cxx_eval_bare_aggregate (const constexpr
*** 6841,6847 ****
        /* Like in cxx_eval_store_expression, omit entries for empty fields.  */
        bool no_slot = new_ctx.ctor == NULL_TREE;
        int pos_hint = -1;
!       if (new_ctx.ctor != ctx->ctor && !no_slot)
  	{
  	  /* If we built a new CONSTRUCTOR, attach it now so that other
  	     initializers can refer to it.  */
--- 6841,6851 ----
        /* Like in cxx_eval_store_expression, omit entries for empty fields.  */
        bool no_slot = new_ctx.ctor == NULL_TREE;
        int pos_hint = -1;
!       if (!ctx->ctor)
! 	/* The enclosing object could be an empty subobject so we have no
! 	   CONSTRUCTOR (c++/125336).  */
! 	gcc_checking_assert (is_empty_class (type));
!       else if (new_ctx.ctor != ctx->ctor && !no_slot)
  	{
  	  /* If we built a new CONSTRUCTOR, attach it now so that other
  	     initializers can refer to it.  */
*************** cxx_eval_bare_aggregate (const constexpr
*** 6883,6898 ****
  	/* This is an initializer for an empty field; now that we've
  	   checked that it's constant, we can ignore it.  */
  	changed = true;
!       else if (index
! 	       && (TREE_CODE (index) == NOP_EXPR
! 		   || TREE_CODE (index) == POINTER_PLUS_EXPR))
! 	{
! 	  /* Old representation of empty bases.  FIXME remove.  */
! 	  gcc_checking_assert (false);
! 	  gcc_assert (is_empty_class (TREE_TYPE (TREE_TYPE (index))));
! 	  changed = true;
! 	}
!       else
  	{
  	  if (TREE_CODE (type) == UNION_TYPE
  	      && (*p)->last().index != index)
--- 6887,6893 ----
  	/* This is an initializer for an empty field; now that we've
  	   checked that it's constant, we can ignore it.  */
  	changed = true;
!       else if (ctx->ctor)
  	{
  	  if (TREE_CODE (type) == UNION_TYPE
  	      && (*p)->last().index != index)
diff -Nrcpad gcc-17-20260517/gcc/cp/coroutines.cc gcc-17-20260524/gcc/cp/coroutines.cc
*** gcc-17-20260517/gcc/cp/coroutines.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/coroutines.cc	Sun May 24 22:32:05 2026
*************** register_local_var_uses (tree *stmt, int
*** 4403,4408 ****
--- 4403,4410 ----
  	 identify them in the coroutine frame.  */
        tree lvname = DECL_NAME (lvar);
        char *buf = NULL;
+       if (name_independent_decl_p (lvar))
+ 	lvname = NULL_TREE;
  
        /* The outermost bind scope contains the artificial variables that
  	 we inject to implement the coro state machine.  We want to be able
diff -Nrcpad gcc-17-20260517/gcc/cp/cp-tree.h gcc-17-20260524/gcc/cp/cp-tree.h
*** gcc-17-20260517/gcc/cp/cp-tree.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/cp-tree.h	Sun May 24 22:32:05 2026
*************** extern tree finish_base_specifier		(tree
*** 8584,8590 ****
  extern void finish_member_declaration		(tree);
  extern bool outer_automatic_var_p		(tree);
  extern bool parsing_lambda_declarator		();
! extern tree process_outer_var_ref		(tree, tsubst_flags_t, bool force_use = false);
  extern cp_expr finish_id_expression		(tree, tree, tree,
  						 cp_id_kind *,
  						 bool, bool, bool *,
--- 8584,8591 ----
  extern void finish_member_declaration		(tree);
  extern bool outer_automatic_var_p		(tree);
  extern bool parsing_lambda_declarator		();
! extern tree process_outer_var_ref		(tree, tsubst_flags_t,
! 						 bool = false);
  extern cp_expr finish_id_expression		(tree, tree, tree,
  						 cp_id_kind *,
  						 bool, bool, bool *,
diff -Nrcpad gcc-17-20260517/gcc/cp/expr.cc gcc-17-20260524/gcc/cp/expr.cc
*** gcc-17-20260517/gcc/cp/expr.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/expr.cc	Sun May 24 22:32:05 2026
*************** mark_use (tree expr, bool rvalue_p, bool
*** 182,187 ****
--- 182,189 ----
  		}
  	    }
  	  tree r = mark_rvalue_use (ref, loc, reject_builtin);
+ 	  if (r == error_mark_node)
+ 	    return error_mark_node;
  	  if (r != ref)
  	    {
  	      if (!rvalue_p)
diff -Nrcpad gcc-17-20260517/gcc/cp/lambda.cc gcc-17-20260524/gcc/cp/lambda.cc
*** gcc-17-20260517/gcc/cp/lambda.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/lambda.cc	Sun May 24 22:32:05 2026
*************** build_capture_proxy (tree member, tree i
*** 450,456 ****
         constness of the closure doesn't matter just like it doesn't matter to
         other by-ref capture.  It's simpler to handle this special case here
         than in lambda_proxy_type.  */
!     type = TREE_TYPE (member);
    else
      {
        type = lambda_proxy_type (object);
--- 450,456 ----
         constness of the closure doesn't matter just like it doesn't matter to
         other by-ref capture.  It's simpler to handle this special case here
         than in lambda_proxy_type.  */
!     type = cp_build_qualified_type (TREE_TYPE (member), TYPE_QUAL_CONST);
    else
      {
        type = lambda_proxy_type (object);
diff -Nrcpad gcc-17-20260517/gcc/cp/method.cc gcc-17-20260524/gcc/cp/method.cc
*** gcc-17-20260517/gcc/cp/method.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/method.cc	Sun May 24 22:32:05 2026
*************** walk_field_subobs (tree fields, special_
*** 2692,2697 ****
--- 2692,2698 ----
    enum { unknown, no, yes }
    only_dmi_mem = (sfk == sfk_constructor && TREE_CODE (ctx) == UNION_TYPE
  		  ? unknown : no);
+   int has_user_provided_ctor = -1;
  
   again:
    for (tree field = fields; field; field = DECL_CHAIN (field))
*************** walk_field_subobs (tree fields, special_
*** 2771,2776 ****
--- 2772,2778 ----
  
  	  bad = false;
  	  if (CP_TYPE_CONST_P (mem_type)
+ 	      && TREE_CODE (ctx) != UNION_TYPE
  	      && default_init_uninitialized_part (mem_type))
  	    {
  	      if (diag)
*************** walk_field_subobs (tree fields, special_
*** 2847,2852 ****
--- 2849,2906 ----
        else
  	argtype = NULL_TREE;
  
+       if (cxx_dialect >= cxx26 && TREE_CODE (ctx) == UNION_TYPE)
+ 	{
+ 	  /* C++26 [class.default.ctor]/2:
+ 	     A defaulted default constructor for class X is defined as deleted
+ 	     if
+ 	     ...
+ 	     - any non-variant potentially constructed subobject, except for
+ 	       a non-static data member with a brace-or-equal-initializer, has
+ 	       class type M (or possibly multidimensional array thereof) and
+ 	       overload resolution as applied to find M's corresponding
+ 	       constructor does not result in a usable candidate,
+ 	     So, for C++26 this ignores default constructors of variant
+ 	     members.  */
+ 	  if (sfk == sfk_constructor || sfk == sfk_inheriting_constructor)
+ 	    continue;
+ 
+ 	  /* C++26 [class.default.ctor]/2:
+ 	     ...
+ 	     - any potentially constructed subobject S has class type M (or
+ 	       possibly multidimensional array thereof), M has a destructor
+ 	       that is deleted or inaccessible from the defaulted default
+ 	       constructor, and either S is non-variant or S has a default
+ 	       member initializer.
+ 	     This is the dtor_from_ctor case, so ignore destructors of
+ 	     variant members unless they have a DMI.
+ 	     C++26 with CWG3189 [class.dtor]/4:
+ 	     A defaulted destructor for a class X is defined as deleted if
+ 	     ...
+ 	     - X is has a non-union class and any non-variant potentially
+ 	       constructed subobject has S of class type M (or possibly
+ 	       multidimensional array thereof) where either
+ 	       - S is not a variant member and M has a destructor that is
+ 		 deleted or is inaccessible from the defaulted destructor, or
+ 	       - S is a variant member, M has a destructor that is deleted,
+ 		 inaccessible from the defaulted destructor, or non-trivial,
+ 		 and either
+ 		 - V S has a default member initializer or
+ 		 - X has a user-provided constructor.
+ 	     This is the !dtor_from_ctor case, so ignore destructors of
+ 	     variant members unless they have a DMI or X has user-provided
+ 	     constructor.  */
+ 	  if (sfk == sfk_destructor)
+ 	    {
+ 	      if (!dtor_from_ctor && has_user_provided_ctor == -1)
+ 		has_user_provided_ctor
+ 		  = type_has_user_provided_constructor (current_class_type);
+ 	      if (DECL_INITIAL (field) == NULL_TREE
+ 		  && (dtor_from_ctor || !has_user_provided_ctor))
+ 		continue;
+ 	    }
+ 	}
+ 
        rval = locate_fn_flags (mem_type, fnname, argtype, flags, complain);
  
        process_subob_fn (rval, sfk, spec_p, trivial_p, deleted_p,
diff -Nrcpad gcc-17-20260517/gcc/cp/parser.cc gcc-17-20260524/gcc/cp/parser.cc
*** gcc-17-20260517/gcc/cp/parser.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/parser.cc	Sun May 24 22:32:05 2026
*************** cp_parser_parameter_declaration_list (cp
*** 28347,28353 ****
  	  /* If we saw a default argument, we've already pushed this decl.
  	     (An ill-formed default argument should have been parsed to
  	     error_mark_node.)  */
! 	  else if (!parameter->default_argument)
  	    decl = pushdecl (decl);
  	}
  
--- 28347,28354 ----
  	  /* If we saw a default argument, we've already pushed this decl.
  	     (An ill-formed default argument should have been parsed to
  	     error_mark_node.)  */
! 	  else if (!parameter->default_argument
! 		   || parameter->default_argument == this_identifier)
  	    decl = pushdecl (decl);
  	}
  
*************** cp_parser_omp_clause_doacross (cp_parser
*** 45178,45184 ****
     to ( [motion-modifier[,] [motion-modifier[,]...]:] variable-list )
  
     motion-modifier:
!      present | iterator (iterators-definition)  */
  
  static tree
  cp_parser_omp_clause_from_to (cp_parser *parser, enum omp_clause_code kind,
--- 45179,45185 ----
     to ( [motion-modifier[,] [motion-modifier[,]...]:] variable-list )
  
     motion-modifier:
!      present | iterator (iterators-definition) | mapper (id) */
  
  static tree
  cp_parser_omp_clause_from_to (cp_parser *parser, enum omp_clause_code kind,
*************** cp_parser_omp_clause_from_to (cp_parser
*** 45217,45224 ****
  	}
      }
  
!   bool present = false;
    tree iterators = NULL_TREE;
  
    for (int pos = 1; pos < colon_pos; ++pos)
      {
--- 45218,45226 ----
  	}
      }
  
!   bool present = false, mapper_modifier = false;
    tree iterators = NULL_TREE;
+   tree mapper_name = NULL_TREE;
  
    for (int pos = 1; pos < colon_pos; ++pos)
      {
*************** cp_parser_omp_clause_from_to (cp_parser
*** 45258,45269 ****
  	  iterators = cp_parser_omp_iterators (parser);
  	  pos += iterator_length - 1;
  	}
! 
        else
  	{
  	  error_at (token->location,
! 		    "%qs clause with modifier other than %<iterator%> "
! 		    "or %<present%>",
  		    kind == OMP_CLAUSE_TO ? "to" : "from");
  	  cp_parser_skip_to_closing_parenthesis (parser,
  						 /*recovering=*/true,
--- 45260,45329 ----
  	  iterators = cp_parser_omp_iterators (parser);
  	  pos += iterator_length - 1;
  	}
!       else if (strcmp ("mapper", p) == 0)
! 	{
! 	  cp_lexer_consume_token (parser->lexer);
! 	  matching_parens parens;
! 	  if (parens.require_open (parser))
! 	    {
! 	      if (mapper_modifier)
! 		{
! 		  cp_parser_error (parser, "too many %<mapper%> modifiers");
! 		  /* Assume it's a well-formed mapper modifier, even if it
! 		     seems to be in the wrong place.  */
! 		  cp_lexer_consume_token (parser->lexer);
! 		  parens.require_close (parser);
! 		  cp_parser_skip_to_closing_parenthesis (parser,
! 							 /*recovering=*/true,
! 							 /*or_comma=*/false,
! 							 /*consume_paren=*/
! 							 true);
! 		  return list;
! 		}
! 	      token = cp_lexer_peek_token (parser->lexer);
! 	      switch (token->type)
! 		{
! 		case CPP_NAME:
! 		  {
! 		    cp_expr e = cp_parser_identifier (parser);
! 		    if (e != error_mark_node)
! 		      mapper_name = e;
! 		    else
! 		      goto err;
! 		  }
! 		  break;
! 		case CPP_KEYWORD:
! 		  if (token->keyword == RID_DEFAULT)
! 		    {
! 		      cp_lexer_consume_token (parser->lexer);
! 		      break;
! 		    }
! 		  /* Fallthrough.  */
! 		  /* FALLTHROUGH.  */
! 		default:
! 		err:
! 		  cp_parser_error (parser,
! 				   "expected identifier or %<default%>");
! 		  return list;
! 		}
! 	      if (!parens.require_close (parser))
! 		{
! 		  cp_parser_skip_to_closing_parenthesis (parser,
! 							 /*recovering=*/true,
! 							 /*or_comma=*/false,
! 							 /*consume_paren=*/
! 							 true);
! 		  return list;
! 		}
! 	      mapper_modifier = true;
! 	      pos += 3;
! 	    }
! 	}
        else
  	{
  	  error_at (token->location,
! 		    "%qs clause with modifier other than %<iterator%>, "
! 		    "%<mapper%>, or %<present%>",
  		    kind == OMP_CLAUSE_TO ? "to" : "from");
  	  cp_parser_skip_to_closing_parenthesis (parser,
  						 /*recovering=*/true,
*************** cp_parser_omp_clause_from_to (cp_parser
*** 45294,45299 ****
--- 45354,45380 ----
      for (tree c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
        OMP_CLAUSE_ITERATORS (c) = iterators;
  
+   if (mapper_name)
+     {
+       tree last_new = NULL_TREE;
+       for (tree c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
+ 	last_new = c;
+ 
+       tree name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_PUSH_MAPPER_NAME);
+       OMP_CLAUSE_DECL (name) = mapper_name;
+       OMP_CLAUSE_CHAIN (name) = nl;
+       nl = name;
+ 
+       gcc_assert (last_new);
+ 
+       name = build_omp_clause (input_location, OMP_CLAUSE_MAP);
+       OMP_CLAUSE_SET_MAP_KIND (name, GOMP_MAP_POP_MAPPER_NAME);
+       OMP_CLAUSE_DECL (name) = null_pointer_node;
+       OMP_CLAUSE_CHAIN (name) = OMP_CLAUSE_CHAIN (last_new);
+       OMP_CLAUSE_CHAIN (last_new) = name;
+     }
+ 
    return nl;
  }
  
*************** cp_parser_omp_target_update (cp_parser *
*** 51924,51930 ****
  
    tree clauses
      = cp_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
! 				 "#pragma omp target update", pragma_tok);
    if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
        && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
      {
--- 52005,52016 ----
  
    tree clauses
      = cp_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
! 				 "#pragma omp target update", pragma_tok,
! 				 /* finish_p = */ false);
!   if (!processing_template_decl)
!     clauses = c_omp_instantiate_mappers (clauses, C_ORT_OMP_UPDATE);
!   clauses = finish_omp_clauses (clauses, C_ORT_OMP_UPDATE);
! 
    if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
        && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
      {
diff -Nrcpad gcc-17-20260517/gcc/cp/pt.cc gcc-17-20260524/gcc/cp/pt.cc
*** gcc-17-20260517/gcc/cp/pt.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/pt.cc	Sun May 24 22:32:06 2026
*************** tsubst_decl (tree t, tree args, tsubst_f
*** 16086,16091 ****
--- 16086,16092 ----
  		  r = error_mark_node;
  		  break;
  		}
+ 	      name = copy_node (name);
  	      for (tree& elt : tree_vec_range (name))
  		elt = make_conv_op_name (elt);
  	      variadic_p = true;
*************** check_non_deducible_conversions (tree pa
*** 23923,23928 ****
--- 23924,23939 ----
  	  conversion **conv_p = convs ? &convs[ia+offset] : NULL;
  	  int lflags = conv_flags (ia, nargs, fn, arg, flags);
  
+ 	  /* As in add_function_candidate, don't consider conversion to an
+ 	     unrelated type when LOOKUP_DEFAULTED.  */
+ 	  if ((flags & LOOKUP_DEFAULTED)
+ 	      && ia == 0
+ 	      && (DECL_CONSTRUCTOR_P (fn)
+ 		  || DECL_ASSIGNMENT_OPERATOR_P (fn))
+ 	      && !reference_related_p (non_reference (parm),
+ 				       DECL_CONTEXT (fn)))
+ 	    return 1;
+ 
  	  if (check_non_deducible_conversion (parm, arg, strict, lflags,
  					      conv_p, explain_p, noninst_only_p))
  	    return 1;
diff -Nrcpad gcc-17-20260517/gcc/cp/semantics.cc gcc-17-20260524/gcc/cp/semantics.cc
*** gcc-17-20260517/gcc/cp/semantics.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cp/semantics.cc	Sun May 24 22:32:06 2026
*************** set_contract_capture_flag (tree d, bool
*** 4595,4601 ****
     id-expression, and we do lambda capture.  */
  
  tree
! process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use)
  {
    if (cp_unevaluated_operand)
      {
--- 4595,4602 ----
     id-expression, and we do lambda capture.  */
  
  tree
! process_outer_var_ref (tree decl, tsubst_flags_t complain,
! 		       bool odr_use/*=false*/)
  {
    if (cp_unevaluated_operand)
      {
*************** process_outer_var_ref (tree decl, tsubst
*** 4697,4702 ****
--- 4698,4707 ----
       constant without odr-use.  So don't complain yet.  */
    else if (!odr_use && decl_constant_var_p (var))
      return var;
+   /* Don't complain when DECL is dependent, because it can turn out to
+      be constant (and therefore needing no capture) when instantiating.  */
+   else if (VAR_P (var) && instantiation_dependent_expression_p (var))
+     return var;
    else if (lambda_expr)
      {
        if (complain & tf_error)
*************** process_outer_var_ref (tree decl, tsubst
*** 4715,4721 ****
  	}
        return error_mark_node;
      }
!   else if (processing_contract_condition && (TREE_CODE (decl) == PARM_DECL))
      /* Use of a parameter in a contract condition is fine.  */
      return decl;
    else
--- 4720,4726 ----
  	}
        return error_mark_node;
      }
!   else if (processing_contract_condition && TREE_CODE (decl) == PARM_DECL)
      /* Use of a parameter in a contract condition is fine.  */
      return decl;
    else
*************** finish_omp_clauses (tree clauses, enum c
*** 7873,7878 ****
--- 7878,7886 ----
    tree init_no_targetsync_clause = NULL_TREE;
    tree depend_clause = NULL_TREE;
  
+   if (!openacc)
+     clauses = omp_remove_duplicate_maps (clauses, true);
+ 
    bitmap_obstack_initialize (NULL);
    bitmap_initialize (&generic_head, &bitmap_default_obstack);
    bitmap_initialize (&firstprivate_head, &bitmap_default_obstack);
*************** finish_omp_clauses (tree clauses, enum c
*** 9612,9618 ****
  	      {
  		if (bitmap_bit_p (&generic_head, DECL_UID (t))
  		    || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
! 		    || bitmap_bit_p (&map_firstprivate_head, DECL_UID (t)))
  		  {
  		    error_at (OMP_CLAUSE_LOCATION (c),
  			      "%qD appears more than once in data clauses", t);
--- 9620,9627 ----
  	      {
  		if (bitmap_bit_p (&generic_head, DECL_UID (t))
  		    || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
! 		    || (openacc
! 			&& bitmap_bit_p (&map_firstprivate_head, DECL_UID (t))))
  		  {
  		    error_at (OMP_CLAUSE_LOCATION (c),
  			      "%qD appears more than once in data clauses", t);
*************** finish_omp_clauses (tree clauses, enum c
*** 9636,9641 ****
--- 9645,9651 ----
  	    else if (bitmap_bit_p (&map_head, DECL_UID (t))
  		     && !bitmap_bit_p (&map_field_head, DECL_UID (t))
  		     && ort != C_ORT_OMP
+ 		     && ort != C_ORT_OMP_TARGET
  		     && ort != C_ORT_OMP_EXIT_DATA)
  	      {
  		if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
diff -Nrcpad gcc-17-20260517/gcc/cselib.cc gcc-17-20260524/gcc/cselib.cc
*** gcc-17-20260517/gcc/cselib.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cselib.cc	Sun May 24 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 34,39 ****
--- 34,40 ----
  #include "function-abi.h"
  #include "alias.h"
  #include "predict.h"
+ #include "rtl-iter.h"
  
  /* A list of cselib_val structures.  */
  struct elt_list
*************** static hash_table<cselib_hasher> *cselib
*** 177,182 ****
--- 178,193 ----
  /* A table to hold preserved values.  */
  static hash_table<cselib_hasher> *cselib_preserved_hash_table;
  
+ /* The subset of cselib_preserved_hash_table that might have useless locations.
+    It excludes values for which all_locs_preserved_p is true.
+ 
+    This is an important compile-time optimization for inputs that have
+    many preserved values and many basic blocks (such as insn-extract.cc
+    at the time of writing, especially with RTL checking enabled).
+    If remove_useless_values iterated over the whole hash table for every
+    block, it would repeat a lot of useless and cache-unfriendly work.  */
+ static vec<cselib_val *> cselib_preserved_prune_list;
+ 
  /* The unique id that the next create value will take.  */
  static unsigned int next_uid;
  
*************** new_elt_list (struct elt_list *next, cse
*** 304,309 ****
--- 315,335 ----
    return el;
  }
  
+ /* Record that all_locs_preserved_p might no longer hold for VAL.  */
+ 
+ static inline void
+ cselib_clear_all_locs_preserved (cselib_val *val)
+ {
+   if (val->all_locs_preserved_p)
+     {
+       val->all_locs_preserved_p = false;
+       if (val->in_preserved_table_p)
+ 	/* VAL would have been removed from cselib_preserved_prune_list
+ 	   but now needs to be considered by remove_useless_values.  */
+ 	cselib_preserved_prune_list.safe_push (val);
+     }
+ }
+ 
  /* Allocate a struct elt_loc_list with LOC and prepend it to VAL's loc
     list.  */
  
*************** new_elt_loc_list (cselib_val *val, rtx l
*** 327,384 ****
    if (GET_CODE (loc) == VALUE)
      {
        loc = canonical_cselib_val (CSELIB_VAL_PTR (loc))->val_rtx;
  
        gcc_checking_assert (PRESERVED_VALUE_P (loc)
  			   == PRESERVED_VALUE_P (val->val_rtx));
  
        if (val->val_rtx == loc)
  	return;
!       else if (val->uid > CSELIB_VAL_PTR (loc)->uid)
  	{
  	  /* Reverse the insertion.  */
! 	  new_elt_loc_list (CSELIB_VAL_PTR (loc), val->val_rtx);
  	  return;
  	}
  
!       gcc_checking_assert (val->uid < CSELIB_VAL_PTR (loc)->uid);
  
!       if (CSELIB_VAL_PTR (loc)->locs)
  	{
  	  /* Bring all locs from LOC to VAL.  */
! 	  for (el = CSELIB_VAL_PTR (loc)->locs; el->next; el = el->next)
  	    {
  	      /* Adjust values that have LOC as canonical so that VAL
  		 becomes their canonical.  */
  	      if (el->loc && GET_CODE (el->loc) == VALUE)
  		{
! 		  gcc_checking_assert (CSELIB_VAL_PTR (el->loc)->locs->loc
! 				       == loc);
! 		  CSELIB_VAL_PTR (el->loc)->locs->loc = val->val_rtx;
  		}
  	    }
  	  el->next = val->locs;
! 	  next = val->locs = CSELIB_VAL_PTR (loc)->locs;
  	}
  
!       if (CSELIB_VAL_PTR (loc)->addr_list)
  	{
  	  /* Bring in addr_list into canonical node.  */
! 	  struct elt_list *last = CSELIB_VAL_PTR (loc)->addr_list;
  	  while (last->next)
  	    last = last->next;
  	  last->next = val->addr_list;
! 	  val->addr_list = CSELIB_VAL_PTR (loc)->addr_list;
! 	  CSELIB_VAL_PTR (loc)->addr_list = NULL;
  	}
  
!       if (CSELIB_VAL_PTR (loc)->next_containing_mem != NULL
  	  && val->next_containing_mem == NULL)
  	{
  	  /* Add VAL to the containing_mem list after LOC.  LOC will
  	     be removed when we notice it doesn't contain any
  	     MEMs.  */
! 	  val->next_containing_mem = CSELIB_VAL_PTR (loc)->next_containing_mem;
! 	  CSELIB_VAL_PTR (loc)->next_containing_mem = val;
  	}
  
        /* Chain LOC back to VAL.  */
--- 353,412 ----
    if (GET_CODE (loc) == VALUE)
      {
        loc = canonical_cselib_val (CSELIB_VAL_PTR (loc))->val_rtx;
+       auto *loc_val = CSELIB_VAL_PTR (loc);
  
        gcc_checking_assert (PRESERVED_VALUE_P (loc)
  			   == PRESERVED_VALUE_P (val->val_rtx));
  
        if (val->val_rtx == loc)
  	return;
!       else if (val->uid > loc_val->uid)
  	{
  	  /* Reverse the insertion.  */
! 	  new_elt_loc_list (loc_val, val->val_rtx);
  	  return;
  	}
  
!       gcc_checking_assert (val->uid < loc_val->uid);
  
!       if (loc_val->locs)
  	{
  	  /* Bring all locs from LOC to VAL.  */
! 	  for (el = loc_val->locs; el->next; el = el->next)
  	    {
  	      /* Adjust values that have LOC as canonical so that VAL
  		 becomes their canonical.  */
  	      if (el->loc && GET_CODE (el->loc) == VALUE)
  		{
! 		  auto *el_val = CSELIB_VAL_PTR (el->loc);
! 		  gcc_checking_assert (el_val->locs->loc == loc);
! 		  el_val->locs->loc = val->val_rtx;
! 		  cselib_clear_all_locs_preserved (el_val);
  		}
  	    }
  	  el->next = val->locs;
! 	  next = val->locs = loc_val->locs;
  	}
  
!       if (loc_val->addr_list)
  	{
  	  /* Bring in addr_list into canonical node.  */
! 	  struct elt_list *last = loc_val->addr_list;
  	  while (last->next)
  	    last = last->next;
  	  last->next = val->addr_list;
! 	  val->addr_list = loc_val->addr_list;
! 	  loc_val->addr_list = NULL;
  	}
  
!       if (loc_val->next_containing_mem != NULL
  	  && val->next_containing_mem == NULL)
  	{
  	  /* Add VAL to the containing_mem list after LOC.  LOC will
  	     be removed when we notice it doesn't contain any
  	     MEMs.  */
! 	  val->next_containing_mem = loc_val->next_containing_mem;
! 	  loc_val->next_containing_mem = val;
  	}
  
        /* Chain LOC back to VAL.  */
*************** new_elt_loc_list (cselib_val *val, rtx l
*** 386,392 ****
        el->loc = val->val_rtx;
        el->setting_insn = cselib_current_insn;
        el->next = NULL;
!       CSELIB_VAL_PTR (loc)->locs = el;
      }
  
    el = elt_loc_list_pool.allocate ();
--- 414,421 ----
        el->loc = val->val_rtx;
        el->setting_insn = cselib_current_insn;
        el->next = NULL;
!       loc_val->locs = el;
!       cselib_clear_all_locs_preserved (loc_val);
      }
  
    el = elt_loc_list_pool.allocate ();
*************** new_elt_loc_list (cselib_val *val, rtx l
*** 394,399 ****
--- 423,429 ----
    el->setting_insn = cselib_current_insn;
    el->next = next;
    val->locs = el;
+   cselib_clear_all_locs_preserved (val);
  }
  
  /* Promote loc L to a nondebug cselib_current_insn if L is marked as
*************** invariant_or_equiv_p (cselib_val *v)
*** 485,491 ****
      {
        if (CONSTANT_P (v->locs->loc)
  	  && (GET_CODE (v->locs->loc) != CONST
! 	      || !references_value_p (v->locs->loc, 0)))
  	return true;
        /* Although a debug expr may be bound to different expressions,
  	 we can preserve it as if it was constant, to get unification
--- 515,521 ----
      {
        if (CONSTANT_P (v->locs->loc)
  	  && (GET_CODE (v->locs->loc) != CONST
! 	      || !references_value_p (v->locs->loc)))
  	return true;
        /* Although a debug expr may be bound to different expressions,
  	 we can preserve it as if it was constant, to get unification
*************** preserve_constants_and_equivs (cselib_va
*** 525,530 ****
--- 555,563 ----
  							    v->hash, INSERT);
        gcc_assert (!*slot);
        *slot = v;
+       v->in_preserved_table_p = true;
+       if (!v->all_locs_preserved_p)
+ 	cselib_preserved_prune_list.safe_push (v);
      }
  
    cselib_hash_table->clear_slot (x);
*************** cselib_find_slot (machine_mode mode, rtx
*** 625,630 ****
--- 658,664 ----
  {
    cselib_val **slot = NULL;
    cselib_hasher::key lookup = { mode, x, memmode };
+   hash &= cselib_val::HASH_MASK;
    if (cselib_preserve_constants)
      slot = cselib_preserved_hash_table->find_slot_with_hash (&lookup, hash,
  							     NO_INSERT);
*************** cselib_find_slot (machine_mode mode, rtx
*** 639,665 ****
     removed.  */
  
  bool
! references_value_p (const_rtx x, int only_useless)
  {
!   const enum rtx_code code = GET_CODE (x);
!   const char *fmt = GET_RTX_FORMAT (code);
!   int i, j;
! 
!   if (GET_CODE (x) == VALUE
!       && (! only_useless
! 	  || (CSELIB_VAL_PTR (x)->locs == 0 && !PRESERVED_VALUE_P (x))))
!     return true;
! 
!   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
!     {
!       if (fmt[i] == 'e' && references_value_p (XEXP (x, i), only_useless))
! 	return true;
!       else if (fmt[i] == 'E')
! 	for (j = 0; j < XVECLEN (x, i); j++)
! 	  if (references_value_p (XVECEXP (x, i, j), only_useless))
! 	    return true;
!     }
! 
    return false;
  }
  
--- 673,684 ----
     removed.  */
  
  bool
! references_value_p (const_rtx x)
  {
!   subrtx_iterator::array_type array;
!   FOR_EACH_SUBRTX (iter, array, x, ALL)
!     if (GET_CODE (*iter) == VALUE)
!       return true;
    return false;
  }
  
*************** cselib_useless_value_p (cselib_val *v)
*** 673,698 ****
  	  && !SP_DERIVED_VALUE_P (v->val_rtx));
  }
  
! /* For all locations found in X, delete locations that reference useless
!    values (i.e. values without any location).  Called through
!    htab_traverse.  */
  
! int
! discard_useless_locs (cselib_val **x, void *info ATTRIBUTE_UNUSED)
  {
-   cselib_val *v = *x;
    struct elt_loc_list **p = &v->locs;
    bool had_locs = v->locs != NULL;
    rtx_insn *setting_insn = v->locs ? v->locs->setting_insn : NULL;
  
    while (*p)
      {
!       if (references_value_p ((*p)->loc, 1))
! 	unchain_one_elt_loc_list (p);
        else
! 	p = &(*p)->next;
      }
  
    if (had_locs && cselib_useless_value_p (v))
      {
        if (setting_insn && DEBUG_INSN_P (setting_insn))
--- 692,742 ----
  	  && !SP_DERIVED_VALUE_P (v->val_rtx));
  }
  
! /* For all locations found in V, delete locations that reference useless
!    values (i.e. values without any location).  */
  
! static void
! discard_useless_locs (cselib_val *v)
  {
    struct elt_loc_list **p = &v->locs;
    bool had_locs = v->locs != NULL;
    rtx_insn *setting_insn = v->locs ? v->locs->setting_insn : NULL;
  
+   if (v->all_locs_preserved_p)
+     return;
+ 
+   bool all_locs_preserved_p = true;
    while (*p)
      {
!       /* True if every value referenced by (*p)->loc is preserved.  */
!       bool preserved_p = true;
!       bool keep_p = true;
!       subrtx_iterator::array_type array;
!       FOR_EACH_SUBRTX (iter, array, (*p)->loc, ALL)
! 	{
! 	  const_rtx x = *iter;
! 	  if (GET_CODE (x) == VALUE && !PRESERVED_VALUE_P (x))
! 	    {
! 	      preserved_p = false;
! 	      if (CSELIB_VAL_PTR (x)->locs == 0)
! 		{
! 		  keep_p = false;
! 		  break;
! 		}
! 	    }
! 	}
!       if (keep_p)
! 	{
! 	  all_locs_preserved_p &= preserved_p;
! 	  p = &(*p)->next;
! 	}
        else
! 	unchain_one_elt_loc_list (p);
      }
  
+   if (all_locs_preserved_p)
+     v->all_locs_preserved_p = true;
+ 
    if (had_locs && cselib_useless_value_p (v))
      {
        if (setting_insn && DEBUG_INSN_P (setting_insn))
*************** discard_useless_locs (cselib_val **x, vo
*** 701,706 ****
--- 745,758 ----
  	n_useless_values++;
        values_became_useless = 1;
      }
+ }
+ 
+ /* A hash-table traversal callback for the above.  */
+ 
+ int
+ discard_useless_locs (cselib_val **x, void *info ATTRIBUTE_UNUSED)
+ {
+   discard_useless_locs (*x);
    return 1;
  }
  
*************** remove_useless_values (void)
*** 754,761 ****
    *p = &dummy_val;
  
    if (cselib_preserve_constants)
!     cselib_preserved_hash_table->traverse <void *,
! 					   discard_useless_locs> (NULL);
    gcc_assert (!values_became_useless);
  
    n_useless_values += n_useless_debug_values;
--- 806,833 ----
    *p = &dummy_val;
  
    if (cselib_preserve_constants)
!     {
!       /* Apply discard_useless_locs to each element of
! 	 cselib_preserved_prune_list.  Remove from consideration any values
! 	 whose locations only reference preserved values, since those
! 	 locations will never be useless in their current form.  */
!       unsigned int len = cselib_preserved_prune_list.length ();
!       unsigned int dest_i = 0;
!       unsigned int src_i = 0;
!       for (; src_i < len; ++src_i)
! 	{
! 	  auto *val = cselib_preserved_prune_list[src_i];
! 	  discard_useless_locs (val);
! 	  if (!val->all_locs_preserved_p)
! 	    {
! 	      if (dest_i < src_i)
! 		cselib_preserved_prune_list[dest_i] = val;
! 	      dest_i += 1;
! 	    }
! 	}
!       if (src_i != dest_i)
! 	cselib_preserved_prune_list.truncate (dest_i);
!     }
    gcc_assert (!values_became_useless);
  
    n_useless_values += n_useless_debug_values;
*************** new_cselib_val (hashval_t hash, machine_
*** 1609,1614 ****
--- 1681,1688 ----
    gcc_assert (next_uid);
  
    e->hash = hash;
+   e->in_preserved_table_p = false;
+   e->all_locs_preserved_p = false;
    e->uid = next_uid++;
    /* We use an alloc pool to allocate this RTL construct because it
       accounts for about 8% of the overall memory usage.  We know
*************** cselib_finish (void)
*** 3454,3459 ****
--- 3528,3534 ----
    cselib_hash_table = NULL;
    if (preserved)
      delete cselib_preserved_hash_table;
+   cselib_preserved_prune_list.release ();
    cselib_preserved_hash_table = NULL;
    free (used_regs);
    used_regs = 0;
diff -Nrcpad gcc-17-20260517/gcc/cselib.h gcc-17-20260524/gcc/cselib.h
*** gcc-17-20260517/gcc/cselib.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/cselib.h	Sun May 24 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 23,30 ****
  /* Describe a value.  */
  struct cselib_val
  {
    /* The hash value.  */
!   unsigned int hash;
  
    /* A unique id assigned to values.  */
    int uid;
--- 23,40 ----
  /* Describe a value.  */
  struct cselib_val
  {
+   /* A mask equivalent of HASH's bitfield width.  */
+   static const unsigned int HASH_MASK = 0x3fffffff;
+ 
    /* The hash value.  */
!   unsigned int hash : 30;
! 
!   /* True if this value is entered in cselib_preserved_hash_table.  */
!   unsigned int in_preserved_table_p : 1;
! 
!   /* True if every value referenced by every element of LOCS is known
!      to be a preserved value.  */
!   unsigned int all_locs_preserved_p : 1;
  
    /* A unique id assigned to values.  */
    int uid;
*************** extern bool fp_setter_insn (rtx_insn *);
*** 84,90 ****
  extern machine_mode cselib_reg_set_mode (const_rtx);
  extern bool rtx_equal_for_cselib_1 (rtx, rtx, machine_mode, int);
  extern bool cselib_redundant_set_p (rtx);
! extern bool references_value_p (const_rtx, int);
  extern rtx cselib_expand_value_rtx (rtx, bitmap, int);
  typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
  extern rtx cselib_expand_value_rtx_cb (rtx, bitmap, int,
--- 94,100 ----
  extern machine_mode cselib_reg_set_mode (const_rtx);
  extern bool rtx_equal_for_cselib_1 (rtx, rtx, machine_mode, int);
  extern bool cselib_redundant_set_p (rtx);
! extern bool references_value_p (const_rtx);
  extern rtx cselib_expand_value_rtx (rtx, bitmap, int);
  typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
  extern rtx cselib_expand_value_rtx_cb (rtx, bitmap, int,
diff -Nrcpad gcc-17-20260517/gcc/doc/analyzer.texi gcc-17-20260524/gcc/doc/analyzer.texi
*** gcc-17-20260517/gcc/doc/analyzer.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/analyzer.texi	Sun May 24 22:32:06 2026
*************** just emit warnings.
*** 34,40 ****
  The gimple representation can be seen using @option{-fdump-ipa-analyzer}.
  @quotation Tip
  If the analyzer ICEs before this is written out, one workaround is to use
! @option{--param=analyzer-bb-explosion-factor=0} to force the analyzer
  to bail out after analyzing the first basic block.
  @end quotation
  
--- 34,40 ----
  The gimple representation can be seen using @option{-fdump-ipa-analyzer}.
  @quotation Tip
  If the analyzer ICEs before this is written out, one workaround is to use
! @option{--param=analyzer-supernode-explosion-factor=0} to force the analyzer
  to bail out after analyzing the first basic block.
  @end quotation
  
diff -Nrcpad gcc-17-20260517/gcc/doc/extend.texi gcc-17-20260524/gcc/doc/extend.texi
*** gcc-17-20260517/gcc/doc/extend.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/extend.texi	Sun May 24 22:32:06 2026
*************** uint32_t amo_lwat_and (uint32_t *, uint3
*** 26998,27008 ****
--- 26998,27016 ----
  uint32_t amo_lwat_umax (uint32_t *, uint32_t);
  uint32_t amo_lwat_umin (uint32_t *, uint32_t);
  uint32_t amo_lwat_swap (uint32_t *, uint32_t);
+ uint32_t amo_lwat_cas_neq (uint32_t *, uint32_t, uint32_t);
+ uint32_t amo_lwat_inc_eq (uint32_t *);
+ uint32_t amo_lwat_inc_bounded (uint32_t *);
+ uint32_t amo_lwat_dec_bounded (uint32_t *);
  
  int32_t amo_lwat_sadd (int32_t *, int32_t);
  int32_t amo_lwat_smax (int32_t *, int32_t);
  int32_t amo_lwat_smin (int32_t *, int32_t);
  int32_t amo_lwat_sswap (int32_t *, int32_t);
+ int32_t amo_lwat_scas_neq (int32_t *, int32_t, int32_t);
+ int32_t amo_lwat_sinc_eq (int32_t *);
+ int32_t amo_lwat_sinc_bounded (int32_t *);
+ int32_t amo_lwat_sdec_bounded (int32_t *);
  
  uint64_t amo_ldat_add (uint64_t *, uint64_t);
  uint64_t amo_ldat_xor (uint64_t *, uint64_t);
*************** uint64_t amo_ldat_and (uint64_t *, uint6
*** 27011,27021 ****
--- 27019,27037 ----
  uint64_t amo_ldat_umax (uint64_t *, uint64_t);
  uint64_t amo_ldat_umin (uint64_t *, uint64_t);
  uint64_t amo_ldat_swap (uint64_t *, uint64_t);
+ uint64_t amo_ldat_cas_neq (uint64_t *, uint64_t, uint64_t);
+ uint64_t amo_ldat_inc_eq (uint64_t *);
+ uint64_t amo_ldat_inc_bounded (uint64_t *);
+ uint64_t amo_ldat_dec_bounded (uint64_t *);
  
  int64_t amo_ldat_sadd (int64_t *, int64_t);
  int64_t amo_ldat_smax (int64_t *, int64_t);
  int64_t amo_ldat_smin (int64_t *, int64_t);
  int64_t amo_ldat_sswap (int64_t *, int64_t);
+ int64_t amo_ldat_scas_neq (int64_t *, int64_t, int64_t);
+ int64_t amo_ldat_sinc_eq (int64_t *);
+ int64_t amo_ldat_sinc_bounded (int64_t *);
+ int64_t amo_ldat_sdec_bounded (int64_t *);
  
  void amo_stwat_add (uint32_t *, uint32_t);
  void amo_stwat_xor (uint32_t *, uint32_t);
*************** void amo_stwat_ior (uint32_t *, uint32_t
*** 27023,27032 ****
--- 27039,27050 ----
  void amo_stwat_and (uint32_t *, uint32_t);
  void amo_stwat_umax (uint32_t *, uint32_t);
  void amo_stwat_umin (uint32_t *, uint32_t);
+ void amo_stwat_twin (uint32_t *, uint32_t);
  
  void amo_stwat_sadd (int32_t *, int32_t);
  void amo_stwat_smax (int32_t *, int32_t);
  void amo_stwat_smin (int32_t *, int32_t);
+ void amo_stwat_stwin (int32_t *, int32_t);
  
  void amo_stdat_add (uint64_t *, uint64_t);
  void amo_stdat_xor (uint64_t *, uint64_t);
*************** void amo_stdat_ior (uint64_t *, uint64_t
*** 27034,27043 ****
--- 27052,27063 ----
  void amo_stdat_and (uint64_t *, uint64_t);
  void amo_stdat_umax (uint64_t *, uint64_t);
  void amo_stdat_umin (uint64_t *, uint64_t);
+ void amo_stdat_twin (uint64_t *, uint64_t);
  
  void amo_stdat_sadd (int64_t *, int64_t);
  void amo_stdat_smax (int64_t *, int64_t);
  void amo_stdat_smin (int64_t *, int64_t);
+ void amo_stdat_stwin (int64_t *, int64_t);
  @end smallexample
  
  @node PowerPC Matrix-Multiply Assist Built-in Functions
*************** of @var{bitval} is taken into account.
*** 27173,27178 ****
--- 27193,27208 ----
  These built-in functions are available for the RISC-V family of
  processors.
  
+ RISC-V intrinsic headers define macros of the form
+ @code{__riscv_intrinsic_@var{extension}} with the value @code{1} when
+ GCC supports intrinsics for @var{extension}.  These macros indicate
+ compiler support for the intrinsic API and are independent of whether the
+ corresponding ISA extension is enabled for the current compilation unit.
+ Include @file{riscv_bitmanip.h} for scalar bit-manipulation intrinsics,
+ @file{riscv_crypto.h} for scalar cryptography intrinsics,
+ @file{riscv_vector.h} for vector intrinsics, and vendor intrinsic
+ headers for vendor intrinsic extensions.
+ 
  @defbuiltin{{void *} __builtin_thread_pointer (void)}
  Returns the value that is currently set in the @samp{tp} register.
  @enddefbuiltin
diff -Nrcpad gcc-17-20260517/gcc/doc/install.texi gcc-17-20260524/gcc/doc/install.texi
*** gcc-17-20260517/gcc/doc/install.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/install.texi	Sun May 24 22:32:06 2026
*************** compiler, and was also the version that
*** 238,244 ****
  To build all languages in a cross-compiler or other configuration where
  3-stage bootstrap is not performed, you need to start with an existing
  GCC binary (of a new enough version) because source code for language
! frontends other than C might use GCC extensions.
  
  @item C standard library and headers
  
--- 238,244 ----
  To build all languages in a cross-compiler or other configuration where
  3-stage bootstrap is not performed, you need to start with an existing
  GCC binary (of a new enough version) because source code for language
! frontends other than C and C++ might use GCC extensions.
  
  @item C standard library and headers
  
diff -Nrcpad gcc-17-20260517/gcc/doc/invoke.texi gcc-17-20260524/gcc/doc/invoke.texi
*** gcc-17-20260517/gcc/doc/invoke.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/invoke.texi	Sun May 24 22:32:06 2026
*************** See RS/6000 and PowerPC Options.
*** 1338,1343 ****
--- 1338,1344 ----
  -msmall-data-limit=@var{N-bytes}
  -msave-restore  -mno-shorten-memrefs
  -mstrict-align  -mscalar-strict-align  -mno-vector-strict-align
+ -mzilsd-word-align  -mzilsd-strict-align
  -mcmodel=medlow  -mcmodel=medany  -mcmodel=large
  -mexplicit-relocs  -mrelax  -mriscv-attribute
  -malign-data=@var{type}
*************** Do not or do generate unaligned vector m
*** 31425,31430 ****
--- 31426,31445 ----
  to off unless the processor we are optimizing for explicitly supports
  element-misaligned vector memory access.
  
+ @opindex mzilsd-word-align
+ @item -mzilsd-word-align
+ Allow Zilsd/Zclsd memory accesses to be generated when they are known to be
+ 4-byte aligned.
+ 
+ @opindex mzilsd-strict-align
+ @item -mzilsd-strict-align
+ Require Zilsd/Zclsd memory accesses to be naturally 8-byte aligned.
+ 
+ The precedence among @option{-mzilsd-word-align},
+ @option{-mzilsd-strict-align}, @option{-mstrict-align},
+ @option{-mno-strict-align}, @option{-mscalar-strict-align}, and
+ @option{-mno-scalar-strict-align} is determined by the last one specified.
+ 
  @opindex mmax-vectorization
  @opindex mno-max-vectorization
  @item -mmax-vectorization
diff -Nrcpad gcc-17-20260517/gcc/doc/params.texi gcc-17-20260524/gcc/doc/params.texi
*** gcc-17-20260517/gcc/doc/params.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/params.texi	Sun May 24 22:32:06 2026
*************** a diagnostic as infeasible.
*** 1877,1885 ****
  The number of executions of a basic block that is considered hot.
  The parameter is used only in GIMPLE FE.
  
! @paindex analyzer-bb-explosion-factor
! @item analyzer-bb-explosion-factor
! The maximum number of ``after supernode'' exploded nodes within the analyzer
  per supernode, before terminating analysis.
  
  @paindex analyzer-text-art-string-ellipsis-threshold
--- 1877,1885 ----
  The number of executions of a basic block that is considered hot.
  The parameter is used only in GIMPLE FE.
  
! @paindex analyzer-supernode-explosion-factor
! @item analyzer-supernode-explosion-factor
! The maximum number of exploded nodes within the analyzer
  per supernode, before terminating analysis.
  
  @paindex analyzer-text-art-string-ellipsis-threshold
diff -Nrcpad gcc-17-20260517/gcc/doc/riscv-mcpu.texi gcc-17-20260524/gcc/doc/riscv-mcpu.texi
*** gcc-17-20260517/gcc/doc/riscv-mcpu.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/riscv-mcpu.texi	Sun May 24 22:32:06 2026
*************** by particular CPU name. Permissible valu
*** 60,65 ****
--- 60,67 ----
  
  @samp{xt-c920v2},
  
+ @samp{xt-c9501fdvt},
+ 
  @samp{tt-ascalon-d8},
  
  @samp{xiangshan-nanhu},
diff -Nrcpad gcc-17-20260517/gcc/doc/riscv-mtune.texi gcc-17-20260524/gcc/doc/riscv-mtune.texi
*** gcc-17-20260517/gcc/doc/riscv-mtune.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/doc/riscv-mtune.texi	Sun May 24 22:32:06 2026
*************** particular CPU name.  Permissible values
*** 46,51 ****
--- 46,53 ----
  
  @samp{xt-c920v2},
  
+ @samp{xt-c9501fdvt},
+ 
  @samp{xiangshan-nanhu},
  
  @samp{xiangshan-kunminghu},
diff -Nrcpad gcc-17-20260517/gcc/dump-context.h gcc-17-20260524/gcc/dump-context.h
*** gcc-17-20260517/gcc/dump-context.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/dump-context.h	Sun May 24 22:32:06 2026
*************** class dump_context
*** 119,125 ****
  
    void end_any_optinfo ();
  
!   void emit_optinfo (const optinfo *info);
    void emit_item (const optinfo_item &item, dump_flags_t dump_kind);
  
    bool apply_dump_filter_p (dump_flags_t dump_kind, dump_flags_t filter) const;
--- 119,125 ----
  
    void end_any_optinfo ();
  
!   void emit_optinfo (const optinfo &info);
    void emit_item (const optinfo_item &item, dump_flags_t dump_kind);
  
    bool apply_dump_filter_p (dump_flags_t dump_kind, dump_flags_t filter) const;
diff -Nrcpad gcc-17-20260517/gcc/dumpfile.cc gcc-17-20260524/gcc/dumpfile.cc
*** gcc-17-20260517/gcc/dumpfile.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/dumpfile.cc	Sun May 24 22:32:06 2026
*************** void
*** 1236,1242 ****
  dump_context::end_any_optinfo ()
  {
    if (m_pending)
!     emit_optinfo (m_pending);
    delete m_pending;
    m_pending = NULL;
  }
--- 1236,1242 ----
  dump_context::end_any_optinfo ()
  {
    if (m_pending)
!     emit_optinfo (*m_pending);
    delete m_pending;
    m_pending = NULL;
  }
*************** dump_context::end_any_optinfo ()
*** 1246,1252 ****
     dump_context::emit_item).  */
  
  void
! dump_context::emit_optinfo (const optinfo *info)
  {
    /* -fsave-optimization-record.  */
    if (m_json_writer)
--- 1246,1252 ----
     dump_context::emit_item).  */
  
  void
! dump_context::emit_optinfo (const optinfo &info)
  {
    /* -fsave-optimization-record.  */
    if (m_json_writer)
diff -Nrcpad gcc-17-20260517/gcc/emit-rtl.cc gcc-17-20260524/gcc/emit-rtl.cc
*** gcc-17-20260517/gcc/emit-rtl.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/emit-rtl.cc	Sun May 24 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 63,69 ****
  #include "rtx-vector-builder.h"
  #include "gimple.h"
  #include "gimple-ssa.h"
- #include "gimplify.h"
  #include "bbitmap.h"
  
  struct target_rtl default_target_rtl;
--- 63,68 ----
diff -Nrcpad gcc-17-20260517/gcc/expr.cc gcc-17-20260524/gcc/expr.cc
*** gcc-17-20260517/gcc/expr.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/expr.cc	Sun May 24 22:32:06 2026
*************** generate_crc_table (unsigned HOST_WIDE_I
*** 14515,14520 ****
--- 14515,14589 ----
    return assemble_crc_table (polynom, crc_bits);
  }
  
+ /* Calculate CRC for the initial CRC and given POLYNOMIAL.
+    CRC_BITS is CRC size.  */
+ 
+ static unsigned HOST_WIDE_INT
+ calculate_reversed_crc (unsigned HOST_WIDE_INT crc,
+ 			unsigned HOST_WIDE_INT polynomial,
+ 			unsigned short crc_bits)
+ {
+   unsigned HOST_WIDE_INT rev_polynom = reflect_hwi (polynomial, crc_bits);
+   for (int j = 0; j < 8; j++)
+     {
+       if (crc & 1)
+ 	crc = (crc >> 1) ^ rev_polynom;
+       else
+ 	crc >>= 1;
+     }
+   /* Zero out bits in crc beyond the specified number of crc_bits.  */
+   if (crc_bits < sizeof (crc) * CHAR_BIT)
+     crc &= (HOST_WIDE_INT_1U << crc_bits) - 1;
+   return crc;
+ }
+ 
+ /* Assemble CRC table with 256 elements for the given POLYNOM and CRC_BITS.
+    POLYNOM is the polynomial used to calculate the CRC table's elements.
+    CRC_BITS is the size of CRC, may be 8, 16, ... . */
+ 
+ static rtx
+ assemble_reversed_crc_table (unsigned HOST_WIDE_INT polynom, unsigned short crc_bits)
+ {
+   unsigned table_el_n = 0x100;
+   tree ar = build_array_type (make_unsigned_type (crc_bits),
+ 			      build_index_type (size_int (table_el_n - 1)));
+ 
+   /* Initialize the table.  */
+   vec<tree, va_gc> *initial_values;
+   vec_alloc (initial_values, table_el_n);
+   for (size_t i = 0; i < table_el_n; ++i)
+     {
+       unsigned HOST_WIDE_INT crc = calculate_reversed_crc (i, polynom, crc_bits);
+       tree element = build_int_cstu (make_unsigned_type (crc_bits), crc);
+       vec_safe_push (initial_values, element);
+     }
+   tree ctor = build_constructor_from_vec (ar, initial_values);
+   rtx mem = output_constant_def (ctor, 1);
+   gcc_assert (MEM_P (mem));
+   if (dump_file && (dump_flags & TDF_DETAILS))
+     {
+       fprintf (dump_file,
+ 	       ";; emitting reversed crc table crc_%u_polynomial_"
+ 	       HOST_WIDE_INT_PRINT_HEX " ",
+ 	       crc_bits, polynom);
+       print_rtl_single (dump_file, XEXP (mem, 0));
+       fprintf (dump_file, "\n");
+     }
+ 
+   return XEXP (mem, 0);
+ }
+ 
+ /* Generate reversed CRC table for the given POLYNOM and CRC_BITS.  */
+ 
+ static rtx
+ generate_reversed_crc_table (unsigned HOST_WIDE_INT polynom,
+ 			     unsigned short crc_bits)
+ {
+   gcc_assert (crc_bits <= 64);
+ 
+   return assemble_reversed_crc_table (polynom, crc_bits);
+ }
+ 
  /* Generate table-based CRC code for the given CRC, INPUT_DATA and the
     POLYNOMIAL (without leading 1).
  
*************** calculate_table_based_CRC (rtx *crc, con
*** 14594,14599 ****
--- 14663,14733 ----
      }
  }
  
+ /* Generate table-based reversed CRC code for the given CRC, INPUT_DATA
+    and the POLYNOMIAL (without leading 1).
+ 
+    This function generates code for reversed (bit-reflected) CRC calculation
+    using a pre-computed lookup table.  Unlike the standard CRC calculation,
+    this processes data from LSB to MSB, eliminating the need for explicit
+    bit reflection before and after the CRC computation.  */
+ 
+ static void
+ calculate_table_based_reversed_CRC (rtx *crc, const rtx &input_data,
+ 				    const rtx &polynomial,
+ 				    machine_mode data_mode)
+ {
+   machine_mode mode = GET_MODE (*crc);
+   unsigned short crc_bit_size = GET_MODE_BITSIZE (mode).to_constant ();
+   unsigned short data_size = GET_MODE_SIZE (data_mode).to_constant ();
+   rtx tab = generate_reversed_crc_table (UINTVAL (polynomial), crc_bit_size);
+ 
+   /* CRC's mode is always at least as wide as INPUT_DATA.  Convert
+      INPUT_DATA into CRC's mode once outside the loop since INPUT_DATA
+      is loop-invariant.  */
+   rtx data_in_crc_mode = gen_reg_rtx (mode);
+   convert_move (data_in_crc_mode, input_data, 1);
+ 
+   for (unsigned short i = 0; i < data_size; i++)
+     {
+       *crc = force_reg (mode, *crc);
+ 
+       /* data >> (8 * i).  */
+       unsigned range_8 = 8 * i;
+       rtx data = expand_shift (RSHIFT_EXPR, mode, data_in_crc_mode,
+ 			       range_8, NULL_RTX, 1);
+ 
+       /* crc ^ (data >> (8 * i)).  */
+       rtx in = expand_binop (mode, xor_optab, *crc, data,
+ 			     NULL_RTX, 1, OPTAB_WIDEN);
+ 
+       /* (crc ^ data) & 0xFF.  */
+       rtx index = expand_and (mode, in, gen_int_mode (255, mode),
+ 			      NULL_RTX);
+       int log_crc_size = exact_log2 (GET_MODE_SIZE (mode).to_constant ());
+       index = expand_shift (LSHIFT_EXPR, mode, index,
+ 			    log_crc_size, NULL_RTX, 0);
+ 
+       rtx addr = gen_reg_rtx (Pmode);
+       convert_move (addr, index, 1);
+       addr = expand_binop (Pmode, add_optab, addr, tab, NULL_RTX,
+ 			    0, OPTAB_DIRECT);
+ 
+       /* crc_table[(crc ^ data) & 0xFF].  */
+       rtx tab_el = validize_mem (gen_rtx_MEM (mode, addr));
+ 
+       /* (crc >> 8) if CRC is larger than 8, otherwise 0.  */
+       rtx high = NULL_RTX;
+       if (crc_bit_size != 8)
+ 	high = expand_shift (RSHIFT_EXPR, mode, *crc, 8, NULL_RTX, 1);
+       else
+ 	high = gen_int_mode (0, mode);
+ 
+       /* crc = (crc >> 8) ^ crc_table[(crc ^ data) & 0xFF].  */
+       *crc = expand_binop (mode, xor_optab, tab_el, high, NULL_RTX, 1,
+ 			   OPTAB_WIDEN);
+     }
+ }
+ 
  /* Generate table-based CRC code for the given CRC, INPUT_DATA and the
     POLYNOMIAL (without leading 1).
  
*************** generate_reflecting_code_standard (rtx *
*** 14731,14771 ****
     the POLYNOMIAL (without leading 1).
  
     CRC is OP1, data is OP2 and the polynomial is OP3.
!    This must generate CRC table and assembly for the following code,
     where crc_bit_size and data_bit_size may be 8, 16, 32, 64:
     uint_crc_bit_size_t
     crc_crc_bit_size (uint_crc_bit_size_t crc_init,
! 			   uint_data_bit_size_t data, size_t size)
     {
-      reflect (crc_init)
       uint_crc_bit_size_t crc = crc_init;
-      reflect (data);
       for (int i = 0; i < data_bit_size / 8; i++)
!        crc = (crc << 8) ^ crc_table[(crc >> (crc_bit_size - 8))
! 			  ^ (data >> (data_bit_size - (i + 1) * 8) & 0xFF))];
!      reflect (crc);
       return crc;
!    }  */
  
  void
  expand_reversed_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3,
! 				 machine_mode data_mode,
! 				 void (*gen_reflecting_code) (rtx *op))
  {
    gcc_assert (!CONST_INT_P (op0));
    gcc_assert (CONST_INT_P (op3));
    machine_mode crc_mode = GET_MODE (op0);
- 
    rtx crc = gen_reg_rtx (crc_mode);
    convert_move (crc, op1, 0);
!   gen_reflecting_code (&crc);
! 
!   rtx data = gen_reg_rtx (data_mode);
!   convert_move (data, op2, 0);
!   gen_reflecting_code (&data);
! 
!   calculate_table_based_CRC (&crc, data, op3, data_mode);
! 
!   gen_reflecting_code (&crc);
    convert_move (op0, crc, 0);
  }
--- 14865,14894 ----
     the POLYNOMIAL (without leading 1).
  
     CRC is OP1, data is OP2 and the polynomial is OP3.
!    This generates a reversed CRC table and assembly for the following code,
     where crc_bit_size and data_bit_size may be 8, 16, 32, 64:
     uint_crc_bit_size_t
     crc_crc_bit_size (uint_crc_bit_size_t crc_init,
! 		     uint_data_bit_size_t data)
     {
       uint_crc_bit_size_t crc = crc_init;
       for (int i = 0; i < data_bit_size / 8; i++)
!        crc = (crc >> 8) ^ crc_table[(crc ^ (data >> (i * 8))) & 0xFF];
       return crc;
!    }
! 
!    This approach uses a pre-computed reversed polynomial table, eliminating
!    the need for explicit bit reflection before and after the CRC computation.  */
  
  void
  expand_reversed_crc_table_based (rtx op0, rtx op1, rtx op2, rtx op3,
! 				 machine_mode data_mode)
  {
    gcc_assert (!CONST_INT_P (op0));
    gcc_assert (CONST_INT_P (op3));
    machine_mode crc_mode = GET_MODE (op0);
    rtx crc = gen_reg_rtx (crc_mode);
    convert_move (crc, op1, 0);
!   calculate_table_based_reversed_CRC (&crc, op2, op3, data_mode);
    convert_move (op0, crc, 0);
  }
diff -Nrcpad gcc-17-20260517/gcc/expr.h gcc-17-20260524/gcc/expr.h
*** gcc-17-20260517/gcc/expr.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/expr.h	Sun May 24 22:32:06 2026
*************** gf2n_poly_long_div_quotient (unsigned HO
*** 404,411 ****
  /* Generate table-based CRC.  */
  extern void generate_reflecting_code_standard (rtx *);
  extern void expand_crc_table_based (rtx, rtx, rtx, rtx, machine_mode);
! extern void expand_reversed_crc_table_based (rtx, rtx, rtx, rtx, machine_mode,
! 					     void (*) (rtx *));
  
  /* Cache of the "extended" flag in the target's _BitInt description
     for use during expand.  */
--- 404,410 ----
  /* Generate table-based CRC.  */
  extern void generate_reflecting_code_standard (rtx *);
  extern void expand_crc_table_based (rtx, rtx, rtx, rtx, machine_mode);
! extern void expand_reversed_crc_table_based (rtx, rtx, rtx, rtx, machine_mode);
  
  /* Cache of the "extended" flag in the target's _BitInt description
     for use during expand.  */
diff -Nrcpad gcc-17-20260517/gcc/ext-dce.cc gcc-17-20260524/gcc/ext-dce.cc
*** gcc-17-20260517/gcc/ext-dce.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/ext-dce.cc	Sun May 24 22:32:06 2026
*************** carry_backpropagate (unsigned HOST_WIDE_
*** 966,971 ****
--- 966,984 ----
        /* Recurse into the operand.  */
        return carry_backpropagate (mask, GET_CODE (XEXP (x, 0)), XEXP (x, 0));
  
+     /* If an AND/IOR unconditionally clears/sets bits in the output, then
+        we do not care about the liveness of those bits in the inputs.
+ 
+        So AND MASK with the constant for AND and with the complemented constant
+        for IOR.  */
+     case AND:
+     case IOR:
+       if (CONST_INT_P (XEXP (x, 1)))
+ 	mask &= (code == AND
+ 		 ? UINTVAL (XEXP (x, 1))
+ 		 : ~UINTVAL (XEXP (x, 1)));
+       return mask;
+ 
      /* We propagate for the shifted operand, but not the shift
         count.  The count is handled specially.  */
      case SS_ASHIFT:
diff -Nrcpad gcc-17-20260517/gcc/fold-const.cc gcc-17-20260524/gcc/fold-const.cc
*** gcc-17-20260517/gcc/fold-const.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fold-const.cc	Sun May 24 22:32:06 2026
*************** static tree range_successor (tree);
*** 138,145 ****
  static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
  static tree fold_cond_expr_with_comparison (location_t, tree, enum tree_code,
  					    tree, tree, tree, tree);
! static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *);
! static tree extract_muldiv_1 (tree, tree, enum tree_code, tree, bool *);
  static tree fold_binary_op_with_conditional_arg (location_t,
  						 enum tree_code, tree,
  						 tree, tree,
--- 138,145 ----
  static tree fold_range_test (location_t, enum tree_code, tree, tree, tree);
  static tree fold_cond_expr_with_comparison (location_t, tree, enum tree_code,
  					    tree, tree, tree, tree);
! static tree extract_muldiv (tree, tree, enum tree_code, tree);
! static tree extract_muldiv_1 (tree, tree, enum tree_code, tree);
  static tree fold_binary_op_with_conditional_arg (location_t,
  						 enum tree_code, tree,
  						 tree, tree,
*************** fold_deferring_overflow_warnings_p (void
*** 364,388 ****
    return fold_deferring_overflow_warnings > 0;
  }
  
- /* This is called when we fold something based on the fact that signed
-    overflow is undefined.  */
- 
- void
- fold_overflow_warning (const char* gmsgid, enum warn_strict_overflow_code wc)
- {
-   if (fold_deferring_overflow_warnings > 0)
-     {
-       if (fold_deferred_overflow_warning == NULL
- 	  || wc < fold_deferred_overflow_code)
- 	{
- 	  fold_deferred_overflow_warning = gmsgid;
- 	  fold_deferred_overflow_code = wc;
- 	}
-     }
-   else if (issue_strict_overflow_warning (wc))
-     warning (OPT_Wstrict_overflow, gmsgid);
- }
- 
  /* Return true if the built-in mathematical function specified by CODE
     is odd, i.e. -f(x) == f(-x).  */
  
--- 364,369 ----
*************** operand_compare::operand_equal_p (tree t
*** 3816,3821 ****
--- 3797,3805 ----
  	  }
  	return false;
  
+ 	case OMP_ARRAY_SECTION:
+ 	  return OP_SAME (0) && OP_SAME_WITH_NULL (1) && OP_SAME_WITH_NULL (2);
+ 
  	default:
  	  return false;
  	}
*************** range_binop (enum tree_code code, tree t
*** 5242,5249 ****
  
  tree
  make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
! 		 tree exp_type, tree *p_low, tree *p_high, int *p_in_p,
! 		 bool *strict_overflow_p)
  {
    tree arg0_type = TREE_TYPE (arg0);
    tree n_low, n_high, low = *p_low, high = *p_high;
--- 5226,5232 ----
  
  tree
  make_range_step (location_t loc, enum tree_code code, tree arg0, tree arg1,
! 		 tree exp_type, tree *p_low, tree *p_high, int *p_in_p)
  {
    tree arg0_type = TREE_TYPE (arg0);
    tree n_low, n_high, low = *p_low, high = *p_high;
*************** make_range_step (location_t loc, enum tr
*** 5378,5386 ****
  	  || (n_high != 0 && TREE_OVERFLOW (n_high)))
  	return NULL_TREE;
  
-       if (TYPE_OVERFLOW_UNDEFINED (arg0_type))
- 	*strict_overflow_p = true;
- 
        normalize:
  	/* Check for an unsigned range which has wrapped around the maximum
  	   value thus making n_high < n_low, and normalize it.  */
--- 5361,5366 ----
*************** make_range_step (location_t loc, enum tr
*** 5532,5545 ****
     variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
     actually being tested.  *PLOW and *PHIGH will be made of the same
     type as the returned expression.  If EXP is not a comparison, we
!    will most likely not be returning a useful value and range.  Set
!    *STRICT_OVERFLOW_P to true if the return value is only valid
!    because signed overflow is undefined; otherwise, do not change
!    *STRICT_OVERFLOW_P.  */
  
  tree
! make_range (tree exp, int *pin_p, tree *plow, tree *phigh,
! 	    bool *strict_overflow_p)
  {
    enum tree_code code;
    tree arg0, arg1 = NULL_TREE;
--- 5512,5521 ----
     variables denoted by PIN_P, PLOW, and PHIGH.  Return the expression
     actually being tested.  *PLOW and *PHIGH will be made of the same
     type as the returned expression.  If EXP is not a comparison, we
!    will most likely not be returning a useful value and range.  */
  
  tree
! make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
  {
    enum tree_code code;
    tree arg0, arg1 = NULL_TREE;
*************** make_range (tree exp, int *pin_p, tree *
*** 5577,5583 ****
  	break;
  
        nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low,
! 			      &high, &in_p, strict_overflow_p);
        if (nexp == NULL_TREE)
  	break;
        exp = nexp;
--- 5553,5559 ----
  	break;
  
        nexp = make_range_step (loc, code, arg0, arg1, exp_type, &low,
! 			      &high, &in_p);
        if (nexp == NULL_TREE)
  	break;
        exp = nexp;
*************** fold_range_test (location_t loc, enum tr
*** 6274,6288 ****
  	       || code == TRUTH_OR_EXPR);
    int in0_p, in1_p, in_p;
    tree low0, low1, low, high0, high1, high;
-   bool strict_overflow_p = false;
    tree tem, lhs, rhs;
-   const char * const warnmsg = G_("assuming signed overflow does not occur "
- 				  "when simplifying range test");
  
    if (!INTEGRAL_TYPE_P (type))
      return 0;
  
!   lhs = make_range (op0, &in0_p, &low0, &high0, &strict_overflow_p);
    /* If op0 is known true or false and this is a short-circuiting
       operation we must not merge with op1 since that makes side-effects
       unconditional.  So special-case this.  */
--- 6250,6261 ----
  	       || code == TRUTH_OR_EXPR);
    int in0_p, in1_p, in_p;
    tree low0, low1, low, high0, high1, high;
    tree tem, lhs, rhs;
  
    if (!INTEGRAL_TYPE_P (type))
      return 0;
  
!   lhs = make_range (op0, &in0_p, &low0, &high0);
    /* If op0 is known true or false and this is a short-circuiting
       operation we must not merge with op1 since that makes side-effects
       unconditional.  So special-case this.  */
*************** fold_range_test (location_t loc, enum tr
*** 6290,6296 ****
        && ((code == TRUTH_ORIF_EXPR && in0_p)
  	  || (code == TRUTH_ANDIF_EXPR && !in0_p)))
      return op0;
!   rhs = make_range (op1, &in1_p, &low1, &high1, &strict_overflow_p);
  
    /* If this is an OR operation, invert both sides; we will invert
       again at the end.  */
--- 6263,6269 ----
        && ((code == TRUTH_ORIF_EXPR && in0_p)
  	  || (code == TRUTH_ANDIF_EXPR && !in0_p)))
      return op0;
!   rhs = make_range (op1, &in1_p, &low1, &high1);
  
    /* If this is an OR operation, invert both sides; we will invert
       again at the end.  */
*************** fold_range_test (location_t loc, enum tr
*** 6309,6316 ****
  				    : rhs != 0 ? rhs : integer_zero_node,
  				    in_p, low, high))) != 0)
      {
-       if (strict_overflow_p)
- 	fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
        return or_op ? invert_truthvalue_loc (loc, tem) : tem;
      }
  
--- 6282,6287 ----
*************** fold_range_test (location_t loc, enum tr
*** 6347,6355 ****
  					   or_op ? ! in1_p : in1_p,
  					   low1, high1)) != 0)
  	    {
- 	      if (strict_overflow_p)
- 		fold_overflow_warning (warnmsg,
- 				       WARN_STRICT_OVERFLOW_COMPARISON);
  	      return build2_loc (loc, code == TRUTH_ANDIF_EXPR
  				 ? TRUTH_AND_EXPR : TRUTH_OR_EXPR,
  				 type, lhs, rhs);
--- 6318,6323 ----
*************** fold_truth_andor_1 (location_t loc, enum
*** 6573,6587 ****
     in the language in question.
  
     If we return a non-null expression, it is an equivalent form of the
!    original computation, but need not be in the original type.
! 
!    We set *STRICT_OVERFLOW_P to true if the return values depends on
!    signed overflow being undefined.  Otherwise we do not change
!    *STRICT_OVERFLOW_P.  */
  
  static tree
! extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type,
! 		bool *strict_overflow_p)
  {
    /* To avoid exponential search depth, refuse to allow recursion past
       three levels.  Beyond that (1) it's highly unlikely that we'll find
--- 6541,6550 ----
     in the language in question.
  
     If we return a non-null expression, it is an equivalent form of the
!    original computation, but need not be in the original type.  */
  
  static tree
! extract_muldiv (tree t, tree c, enum tree_code code, tree wide_type)
  {
    /* To avoid exponential search depth, refuse to allow recursion past
       three levels.  Beyond that (1) it's highly unlikely that we'll find
*************** extract_muldiv (tree t, tree c, enum tre
*** 6595,6609 ****
      return NULL;
  
    depth++;
!   ret = extract_muldiv_1 (t, c, code, wide_type, strict_overflow_p);
    depth--;
  
    return ret;
  }
  
  static tree
! extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
! 		  bool *strict_overflow_p)
  {
    tree type = TREE_TYPE (t);
    enum tree_code tcode = TREE_CODE (t);
--- 6558,6571 ----
      return NULL;
  
    depth++;
!   ret = extract_muldiv_1 (t, c, code, wide_type);
    depth--;
  
    return ret;
  }
  
  static tree
! extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
  {
    tree type = TREE_TYPE (t);
    enum tree_code tcode = TREE_CODE (t);
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6623,6629 ****
    tree t1, t2;
    bool same_p = tcode == code;
    tree op0 = NULL_TREE, op1 = NULL_TREE;
-   bool sub_strict_overflow_p;
  
    /* Don't deal with constants of zero here; they confuse the code below.  */
    if (integer_zerop (c))
--- 6585,6590 ----
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6693,6700 ****
  	  && TREE_CODE (t2) == INTEGER_CST
  	  && !TREE_OVERFLOW (t2)
  	  && (t1 = extract_muldiv (op0, t2, code,
! 				   code == MULT_EXPR ? ctype : NULL_TREE,
! 				   strict_overflow_p)) != 0)
  	return t1;
        break;
  
--- 6654,6661 ----
  	  && TREE_CODE (t2) == INTEGER_CST
  	  && !TREE_OVERFLOW (t2)
  	  && (t1 = extract_muldiv (op0, t2, code,
! 				   code == MULT_EXPR ? ctype : NULL_TREE))
! 				   != 0)
  	return t1;
        break;
  
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6704,6711 ****
        if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
          {
            tree cstype = (*signed_type_for) (ctype);
!           if ((t1 = extract_muldiv (op0, c, code, cstype, strict_overflow_p))
! 	      != 0)
              {
                t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
                return fold_convert (ctype, t1);
--- 6665,6671 ----
        if (TYPE_UNSIGNED (ctype) && !TYPE_UNSIGNED (type))
          {
            tree cstype = (*signed_type_for) (ctype);
! 	  if ((t1 = extract_muldiv (op0, c, code, cstype)) != 0)
              {
                t1 = fold_build1 (tcode, cstype, fold_convert (cstype, t1));
                return fold_convert (ctype, t1);
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6722,6729 ****
  	 For signed types, even with wrapping overflow, this is fine.  */
        if (code != MULT_EXPR && TYPE_UNSIGNED (type))
  	break;
!       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
! 	  != 0)
  	return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
        break;
  
--- 6682,6688 ----
  	 For signed types, even with wrapping overflow, this is fine.  */
        if (code != MULT_EXPR && TYPE_UNSIGNED (type))
  	break;
!       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
  	return fold_build1 (tcode, ctype, fold_convert (ctype, t1));
        break;
  
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6755,6770 ****
  	break;
  
        /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
!       sub_strict_overflow_p = false;
!       if ((t1 = extract_muldiv (op0, c, code, wide_type,
! 				&sub_strict_overflow_p)) != 0
! 	  && (t2 = extract_muldiv (op1, c, code, wide_type,
! 				   &sub_strict_overflow_p)) != 0)
  	{
  	  if (tree_int_cst_sgn (c) < 0)
  	    tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
- 	  if (sub_strict_overflow_p)
- 	    *strict_overflow_p = true;
  	  return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
  			      fold_convert (ctype, t2));
  	}
--- 6714,6724 ----
  	break;
  
        /* MIN (a, b) / 5 -> MIN (a / 5, b / 5)  */
!       if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0
! 	  && (t2 = extract_muldiv (op1, c, code, wide_type)) != 0)
  	{
  	  if (tree_int_cst_sgn (c) < 0)
  	    tcode = (tcode == MIN_EXPR ? MAX_EXPR : MIN_EXPR);
  	  return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
  			      fold_convert (ctype, t2));
  	}
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6792,6798 ****
  				       ctype,
  				       fold_convert (ctype, op0),
  				       t1),
! 			       c, code, wide_type, strict_overflow_p);
        break;
  
      case PLUS_EXPR:  case MINUS_EXPR:
--- 6746,6752 ----
  				       ctype,
  				       fold_convert (ctype, op0),
  				       t1),
! 				       c, code, wide_type);
        break;
  
      case PLUS_EXPR:  case MINUS_EXPR:
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6800,6808 ****
  	 can return a new PLUS or MINUS.  If we can't, the only remaining
  	 cases where we can do anything are if the second operand is a
  	 constant.  */
!       sub_strict_overflow_p = false;
!       t1 = extract_muldiv (op0, c, code, wide_type, &sub_strict_overflow_p);
!       t2 = extract_muldiv (op1, c, code, wide_type, &sub_strict_overflow_p);
        if (t1 != 0 && t2 != 0
  	  && TYPE_OVERFLOW_WRAPS (ctype)
  	  && (code == MULT_EXPR
--- 6754,6761 ----
  	 can return a new PLUS or MINUS.  If we can't, the only remaining
  	 cases where we can do anything are if the second operand is a
  	 constant.  */
!       t1 = extract_muldiv (op0, c, code, wide_type);
!       t2 = extract_muldiv (op1, c, code, wide_type);
        if (t1 != 0 && t2 != 0
  	  && TYPE_OVERFLOW_WRAPS (ctype)
  	  && (code == MULT_EXPR
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6811,6818 ****
  	      || (multiple_of_p (ctype, op0, c)
  	          && multiple_of_p (ctype, op1, c))))
  	{
- 	  if (sub_strict_overflow_p)
- 	    *strict_overflow_p = true;
  	  return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
  			      fold_convert (ctype, t2));
  	}
--- 6764,6769 ----
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6897,6903 ****
  	  && wi::multiple_of_p (wi::to_wide (op1), wi::to_wide (c),
  				TYPE_SIGN (type)))
  	{
- 	  *strict_overflow_p = true;
  	  return omit_one_operand (type, integer_zero_node, op0);
  	}
  
--- 6848,6853 ----
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6910,6923 ****
  	 do something only if the second operand is a constant.  */
        if (same_p
  	  && TYPE_OVERFLOW_WRAPS (ctype)
! 	  && (t1 = extract_muldiv (op0, c, code, wide_type,
! 				   strict_overflow_p)) != 0)
  	return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
  			    fold_convert (ctype, op1));
        else if (tcode == MULT_EXPR && code == MULT_EXPR
  	       && TYPE_OVERFLOW_WRAPS (ctype)
! 	       && (t1 = extract_muldiv (op1, c, code, wide_type,
! 					strict_overflow_p)) != 0)
  	return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
  			    fold_convert (ctype, t1));
        else if (TREE_CODE (op1) != INTEGER_CST)
--- 6860,6871 ----
  	 do something only if the second operand is a constant.  */
        if (same_p
  	  && TYPE_OVERFLOW_WRAPS (ctype)
! 	  && (t1 = extract_muldiv (op0, c, code, wide_type)) != 0)
  	return fold_build2 (tcode, ctype, fold_convert (ctype, t1),
  			    fold_convert (ctype, op1));
        else if (tcode == MULT_EXPR && code == MULT_EXPR
  	       && TYPE_OVERFLOW_WRAPS (ctype)
! 	       && (t1 = extract_muldiv (op1, c, code, wide_type)) != 0)
  	return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
  			    fold_convert (ctype, t1));
        else if (TREE_CODE (op1) != INTEGER_CST)
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6961,6967 ****
  	  if (wi::multiple_of_p (wi::to_wide (op1), wi::to_wide (c),
  				 TYPE_SIGN (type)))
  	    {
- 	      *strict_overflow_p = true;
  	      return fold_build2 (tcode, ctype, fold_convert (ctype, op0),
  				  fold_convert (ctype,
  						const_binop (TRUNC_DIV_EXPR,
--- 6909,6914 ----
*************** extract_muldiv_1 (tree t, tree c, enum t
*** 6970,6976 ****
  	  else if (wi::multiple_of_p (wi::to_wide (c), wi::to_wide (op1),
  				      TYPE_SIGN (type)))
  	    {
- 	      *strict_overflow_p = true;
  	      return fold_build2 (code, ctype, fold_convert (ctype, op0),
  				  fold_convert (ctype,
  						const_binop (TRUNC_DIV_EXPR,
--- 6917,6922 ----
*************** fold_truth_andor (location_t loc, enum t
*** 9766,9779 ****
     by changing CODE to reduce the magnitude of constants involved in
     ARG0 of the comparison.
     Returns a canonicalized comparison tree if a simplification was
!    possible, otherwise returns NULL_TREE.
!    Set *STRICT_OVERFLOW_P to true if the canonicalization is only
!    valid if signed overflow is undefined.  */
  
  static tree
  maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
! 				 tree arg0, tree arg1,
! 				 bool *strict_overflow_p)
  {
    enum tree_code code0 = TREE_CODE (arg0);
    tree t, cst0 = NULL_TREE;
--- 9712,9722 ----
     by changing CODE to reduce the magnitude of constants involved in
     ARG0 of the comparison.
     Returns a canonicalized comparison tree if a simplification was
!    possible, otherwise returns NULL_TREE.  */
  
  static tree
  maybe_canonicalize_comparison_1 (location_t loc, enum tree_code code, tree type,
! 				 tree arg0, tree arg1)
  {
    enum tree_code code0 = TREE_CODE (arg0);
    tree t, cst0 = NULL_TREE;
*************** maybe_canonicalize_comparison_1 (locatio
*** 9820,9826 ****
      code = GT_EXPR;
    else
      return NULL_TREE;
-   *strict_overflow_p = true;
  
    /* Now build the constant reduced in magnitude.  But not if that
       would produce one outside of its types range.  */
--- 9763,9768 ----
*************** maybe_canonicalize_comparison (location_
*** 9852,9934 ****
  			       tree arg0, tree arg1)
  {
    tree t;
-   bool strict_overflow_p;
-   const char * const warnmsg = G_("assuming signed overflow does not occur "
- 				  "when reducing constant in comparison");
  
    /* Try canonicalization by simplifying arg0.  */
!   strict_overflow_p = false;
!   t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1,
! 				       &strict_overflow_p);
    if (t)
!     {
!       if (strict_overflow_p)
! 	fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
!       return t;
!     }
  
    /* Try canonicalization by simplifying arg1 using the swapped
       comparison.  */
    code = swap_tree_comparison (code);
!   strict_overflow_p = false;
!   t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0,
! 				       &strict_overflow_p);
!   if (t && strict_overflow_p)
!     fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MAGNITUDE);
    return t;
  }
  
- /* Return whether BASE + OFFSET + BITPOS may wrap around the address
-    space.  This is used to avoid issuing overflow warnings for
-    expressions like &p->x which cannot wrap.  */
- 
- static bool
- pointer_may_wrap_p (tree base, tree offset, poly_int64 bitpos)
- {
-   if (!POINTER_TYPE_P (TREE_TYPE (base)))
-     return true;
- 
-   if (maybe_lt (bitpos, 0))
-     return true;
- 
-   poly_wide_int wi_offset;
-   int precision = TYPE_PRECISION (TREE_TYPE (base));
-   if (offset == NULL_TREE)
-     wi_offset = wi::zero (precision);
-   else if (!poly_int_tree_p (offset) || TREE_OVERFLOW (offset))
-     return true;
-   else
-     wi_offset = wi::to_poly_wide (offset);
- 
-   wi::overflow_type overflow;
-   poly_wide_int units = wi::shwi (bits_to_bytes_round_down (bitpos),
- 				  precision);
-   poly_wide_int total = wi::add (wi_offset, units, UNSIGNED, &overflow);
-   if (overflow)
-     return true;
- 
-   poly_uint64 total_hwi, size;
-   if (!total.to_uhwi (&total_hwi)
-       || !poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (base))),
- 			   &size)
-       || known_eq (size, 0U))
-     return true;
- 
-   if (known_le (total_hwi, size))
-     return false;
- 
-   /* We can do slightly better for SIZE if we have an ADDR_EXPR of an
-      array.  */
-   if (TREE_CODE (base) == ADDR_EXPR
-       && poly_int_tree_p (TYPE_SIZE_UNIT (TREE_TYPE (TREE_OPERAND (base, 0))),
- 			  &size)
-       && maybe_ne (size, 0U)
-       && known_le (total_hwi, size))
-     return false;
- 
-   return true;
- }
- 
  /* Return a positive integer when the symbol DECL is known to have
     a nonzero address, zero when it's known not to (e.g., it's a weak
     symbol), and a negative integer when the symbol is not yet in the
--- 9794,9812 ----
  			       tree arg0, tree arg1)
  {
    tree t;
  
    /* Try canonicalization by simplifying arg0.  */
!   t = maybe_canonicalize_comparison_1 (loc, code, type, arg0, arg1);
    if (t)
!     return t;
  
    /* Try canonicalization by simplifying arg1 using the swapped
       comparison.  */
    code = swap_tree_comparison (code);
!   t = maybe_canonicalize_comparison_1 (loc, code, type, arg1, arg0);
    return t;
  }
  
  /* Return a positive integer when the symbol DECL is known to have
     a nonzero address, zero when it's known not to (e.g., it's a weak
     symbol), and a negative integer when the symbol is not yet in the
*************** fold_comparison (location_t loc, enum tr
*** 10107,10121 ****
  		      && (DECL_P (base0) || CONSTANT_CLASS_P (base0)))
  		  || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))))
  	    {
- 	      if (!equality_code
- 		  && maybe_ne (bitpos0, bitpos1)
- 		  && (pointer_may_wrap_p (base0, offset0, bitpos0)
- 		      || pointer_may_wrap_p (base1, offset1, bitpos1)))
- 		fold_overflow_warning (("assuming pointer wraparound does not "
- 					"occur when comparing P +- C1 with "
- 					"P +- C2"),
- 				       WARN_STRICT_OVERFLOW_CONDITIONAL);
- 
  	      switch (code)
  		{
  		case EQ_EXPR:
--- 9985,9990 ----
*************** fold_comparison (location_t loc, enum tr
*** 10184,10197 ****
  	      else
  		offset1 = fold_convert_loc (loc, ssizetype, offset1);
  
- 	      if (!equality_code
- 		  && (pointer_may_wrap_p (base0, offset0, bitpos0)
- 		      || pointer_may_wrap_p (base1, offset1, bitpos1)))
- 		fold_overflow_warning (("assuming pointer wraparound does not "
- 					"occur when comparing P +- C1 with "
- 					"P +- C2"),
- 				       WARN_STRICT_OVERFLOW_COMPARISON);
- 
  	      return fold_build2_loc (loc, code, type, offset0, offset1);
  	    }
  	}
--- 10053,10058 ----
*************** fold_comparison (location_t loc, enum tr
*** 10267,10275 ****
        tree variable1 = TREE_OPERAND (arg0, 0);
        tree variable2 = TREE_OPERAND (arg1, 0);
        tree cst;
-       const char * const warnmsg = G_("assuming signed overflow does not "
- 				      "occur when combining constants around "
- 				      "a comparison");
  
        /* Put the constant on the side where it doesn't overflow and is
  	 of lower absolute value and of same sign than before.  */
--- 10128,10133 ----
*************** fold_comparison (location_t loc, enum tr
*** 10279,10292 ****
        if (!TREE_OVERFLOW (cst)
  	  && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
  	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
! 	{
! 	  fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
! 	  return fold_build2_loc (loc, code, type,
! 				  variable1,
! 				  fold_build2_loc (loc, TREE_CODE (arg1),
! 						   TREE_TYPE (arg1),
! 						   variable2, cst));
! 	}
  
        cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
  			     ? MINUS_EXPR : PLUS_EXPR,
--- 10137,10147 ----
        if (!TREE_OVERFLOW (cst)
  	  && tree_int_cst_compare (const2, cst) == tree_int_cst_sgn (const2)
  	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const2))
! 	return fold_build2_loc (loc, code, type,
! 				variable1,
! 				fold_build2_loc (loc, TREE_CODE (arg1),
! 						 TREE_TYPE (arg1),
! 						 variable2, cst));
  
        cst = int_const_binop (TREE_CODE (arg0) == TREE_CODE (arg1)
  			     ? MINUS_EXPR : PLUS_EXPR,
*************** fold_comparison (location_t loc, enum tr
*** 10294,10307 ****
        if (!TREE_OVERFLOW (cst)
  	  && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
  	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
! 	{
! 	  fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_COMPARISON);
! 	  return fold_build2_loc (loc, code, type,
! 				  fold_build2_loc (loc, TREE_CODE (arg0),
! 						   TREE_TYPE (arg0),
! 						   variable1, cst),
! 				  variable2);
! 	}
      }
  
    tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1);
--- 10149,10159 ----
        if (!TREE_OVERFLOW (cst)
  	  && tree_int_cst_compare (const1, cst) == tree_int_cst_sgn (const1)
  	  && tree_int_cst_sgn (cst) == tree_int_cst_sgn (const1))
! 	return fold_build2_loc (loc, code, type,
! 				fold_build2_loc (loc, TREE_CODE (arg0),
! 						 TREE_TYPE (arg0),
! 						 variable1, cst),
! 				variable2);
      }
  
    tem = maybe_canonicalize_comparison (loc, code, type, arg0, arg1);
*************** mask_with_tz (tree type, const wide_int
*** 10837,10850 ****
  
  /* Return true when T is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.
! 
!    If the return value is based on the assumption that signed overflow
!    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
!    change *STRICT_OVERFLOW_P.  */
  
! static bool
! tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
  {
    tree type = TREE_TYPE (t);
    enum tree_code code;
--- 10689,10698 ----
  
  /* Return true when T is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.  */
  
! bool
! tree_expr_nonzero_p (tree t)
  {
    tree type = TREE_TYPE (t);
    enum tree_code code;
*************** tree_expr_nonzero_warnv_p (tree t, bool
*** 10857,10874 ****
    switch (TREE_CODE_CLASS (code))
      {
      case tcc_unary:
!       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
! 					      strict_overflow_p);
      case tcc_binary:
      case tcc_comparison:
!       return tree_binary_nonzero_warnv_p (code, type,
! 					       TREE_OPERAND (t, 0),
! 					       TREE_OPERAND (t, 1),
! 					       strict_overflow_p);
      case tcc_constant:
      case tcc_declaration:
      case tcc_reference:
!       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
  
      default:
        break;
--- 10705,10720 ----
    switch (TREE_CODE_CLASS (code))
      {
      case tcc_unary:
!       return tree_unary_nonzero_p (code, type, TREE_OPERAND (t, 0));
      case tcc_binary:
      case tcc_comparison:
!       return tree_binary_nonzero_p (code, type,
! 				    TREE_OPERAND (t, 0),
! 				    TREE_OPERAND (t, 1));
      case tcc_constant:
      case tcc_declaration:
      case tcc_reference:
!       return tree_single_nonzero_p (t);
  
      default:
        break;
*************** tree_expr_nonzero_warnv_p (tree t, bool
*** 10877,10892 ****
    switch (code)
      {
      case TRUTH_NOT_EXPR:
!       return tree_unary_nonzero_warnv_p (code, type, TREE_OPERAND (t, 0),
! 					      strict_overflow_p);
  
      case TRUTH_AND_EXPR:
      case TRUTH_OR_EXPR:
      case TRUTH_XOR_EXPR:
!       return tree_binary_nonzero_warnv_p (code, type,
! 					       TREE_OPERAND (t, 0),
! 					       TREE_OPERAND (t, 1),
! 					       strict_overflow_p);
  
      case COND_EXPR:
      case CONSTRUCTOR:
--- 10723,10736 ----
    switch (code)
      {
      case TRUTH_NOT_EXPR:
!       return tree_unary_nonzero_p (code, type, TREE_OPERAND (t, 0));
  
      case TRUTH_AND_EXPR:
      case TRUTH_OR_EXPR:
      case TRUTH_XOR_EXPR:
!       return tree_binary_nonzero_p (code, type,
! 				    TREE_OPERAND (t, 0),
! 				    TREE_OPERAND (t, 1));
  
      case COND_EXPR:
      case CONSTRUCTOR:
*************** tree_expr_nonzero_warnv_p (tree t, bool
*** 10894,10910 ****
      case ADDR_EXPR:
      case WITH_SIZE_EXPR:
      case SSA_NAME:
!       return tree_single_nonzero_warnv_p (t, strict_overflow_p);
  
      case COMPOUND_EXPR:
      case MODIFY_EXPR:
      case BIND_EXPR:
!       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
! 					strict_overflow_p);
  
      case SAVE_EXPR:
!       return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
! 					strict_overflow_p);
  
      case CALL_EXPR:
        {
--- 10738,10752 ----
      case ADDR_EXPR:
      case WITH_SIZE_EXPR:
      case SSA_NAME:
!       return tree_single_nonzero_p (t);
  
      case COMPOUND_EXPR:
      case MODIFY_EXPR:
      case BIND_EXPR:
!       return tree_expr_nonzero_p (TREE_OPERAND (t, 1));
  
      case SAVE_EXPR:
!       return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
  
      case CALL_EXPR:
        {
*************** tree_expr_nonzero_warnv_p (tree t, bool
*** 10927,10950 ****
    return false;
  }
  
- /* Return true when T is an address and is known to be nonzero.
-    Handle warnings about undefined signed overflow.  */
- 
- bool
- tree_expr_nonzero_p (tree t)
- {
-   bool ret, strict_overflow_p;
- 
-   strict_overflow_p = false;
-   ret = tree_expr_nonzero_warnv_p (t, &strict_overflow_p);
-   if (strict_overflow_p)
-     fold_overflow_warning (("assuming signed overflow does not occur when "
- 			    "determining that expression is always "
- 			    "non-zero"),
- 			   WARN_STRICT_OVERFLOW_MISC);
-   return ret;
- }
- 
  /* Return true if T is known not to be equal to an integer W.
     If STMT is specified, the check is if T on STMT is not equal
     to W.  */
--- 10769,10774 ----
*************** fold_binary_loc (location_t loc, enum tr
*** 10989,10995 ****
    enum tree_code_class kind = TREE_CODE_CLASS (code);
    tree arg0, arg1, tem;
    tree t1 = NULL_TREE;
-   bool strict_overflow_p;
    unsigned int prec;
  
    gcc_assert (IS_EXPR_CODE_CLASS (kind)
--- 10813,10818 ----
*************** fold_binary_loc (location_t loc, enum tr
*** 11780,11795 ****
  				    fold_convert_loc (loc, type,
  						      negate_expr (op0)), tem);
  
- 	  strict_overflow_p = false;
  	  if (TREE_CODE (arg1) == INTEGER_CST
! 	      && (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
! 					&strict_overflow_p)) != 0)
  	    {
- 	      if (strict_overflow_p)
- 		fold_overflow_warning (("assuming signed overflow does not "
- 					"occur when simplifying "
- 					"multiplication"),
- 				       WARN_STRICT_OVERFLOW_MISC);
  	      return fold_convert_loc (loc, type, tem);
  	    }
  
--- 11603,11611 ----
  				    fold_convert_loc (loc, type,
  						      negate_expr (op0)), tem);
  
  	  if (TREE_CODE (arg1) == INTEGER_CST
! 	      && (tem = extract_muldiv (op0, arg1, code, NULL_TREE)) != 0)
  	    {
  	      return fold_convert_loc (loc, type, tem);
  	    }
  
*************** fold_binary_loc (location_t loc, enum tr
*** 12009,12018 ****
      case FLOOR_DIV_EXPR:
        /* Simplify A / (B << N) where A and B are positive and B is
  	 a power of 2, to A >> (N + log2(B)).  */
-       strict_overflow_p = false;
        if (TREE_CODE (arg1) == LSHIFT_EXPR
  	  && (TYPE_UNSIGNED (type)
! 	      || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
  	{
  	  tree sval = TREE_OPERAND (arg1, 0);
  	  if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
--- 11825,11833 ----
      case FLOOR_DIV_EXPR:
        /* Simplify A / (B << N) where A and B are positive and B is
  	 a power of 2, to A >> (N + log2(B)).  */
        if (TREE_CODE (arg1) == LSHIFT_EXPR
  	  && (TYPE_UNSIGNED (type)
! 	      || tree_expr_nonnegative_p (op0)))
  	{
  	  tree sval = TREE_OPERAND (arg1, 0);
  	  if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
*************** fold_binary_loc (location_t loc, enum tr
*** 12021,12031 ****
  	      tree pow2 = build_int_cst (TREE_TYPE (sh_cnt),
  					 wi::exact_log2 (wi::to_wide (sval)));
  
- 	      if (strict_overflow_p)
- 		fold_overflow_warning (("assuming signed overflow does not "
- 					"occur when simplifying A / (B << N)"),
- 				       WARN_STRICT_OVERFLOW_MISC);
- 
  	      sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
  					sh_cnt, pow2);
  	      return fold_build2_loc (loc, RSHIFT_EXPR, type,
--- 11836,11841 ----
*************** fold_binary_loc (location_t loc, enum tr
*** 12046,12076 ****
        if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
  	  && TREE_CODE (op0) == NEGATE_EXPR
  	  && negate_expr_p (op1))
! 	{
! 	  if (ANY_INTEGRAL_TYPE_P (type))
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when distributing negation across "
! 				    "division"),
! 				   WARN_STRICT_OVERFLOW_MISC);
! 	  return fold_build2_loc (loc, code, type,
  				  fold_convert_loc (loc, type,
  						    TREE_OPERAND (arg0, 0)),
  				  negate_expr (op1));
- 	}
        if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
  	  && TREE_CODE (arg1) == NEGATE_EXPR
  	  && negate_expr_p (op0))
! 	{
! 	  if (ANY_INTEGRAL_TYPE_P (type))
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when distributing negation across "
! 				    "division"),
! 				   WARN_STRICT_OVERFLOW_MISC);
! 	  return fold_build2_loc (loc, code, type,
! 				  negate_expr (op0),
! 				  fold_convert_loc (loc, type,
! 						    TREE_OPERAND (arg1, 0)));
! 	}
  
        /* If arg0 is a multiple of arg1, then rewrite to the fastest div
  	 operation, EXACT_DIV_EXPR.
--- 11856,11872 ----
        if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
  	  && TREE_CODE (op0) == NEGATE_EXPR
  	  && negate_expr_p (op1))
! 	return fold_build2_loc (loc, code, type,
  				  fold_convert_loc (loc, type,
  						    TREE_OPERAND (arg0, 0)),
  				  negate_expr (op1));
        if ((!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
  	  && TREE_CODE (arg1) == NEGATE_EXPR
  	  && negate_expr_p (op0))
! 	return fold_build2_loc (loc, code, type,
! 				negate_expr (op0),
! 				fold_convert_loc (loc, type,
! 						  TREE_OPERAND (arg1, 0)));
  
        /* If arg0 is a multiple of arg1, then rewrite to the fastest div
  	 operation, EXACT_DIV_EXPR.
*************** fold_binary_loc (location_t loc, enum tr
*** 12084,12100 ****
  				fold_convert (type, arg0),
  				fold_convert (type, arg1));
  
-       strict_overflow_p = false;
        if (TREE_CODE (arg1) == INTEGER_CST
! 	  && (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
! 				    &strict_overflow_p)) != 0)
! 	{
! 	  if (strict_overflow_p)
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when simplifying division"),
! 				   WARN_STRICT_OVERFLOW_MISC);
  	  return fold_convert_loc (loc, type, tem);
- 	}
  
        return NULL_TREE;
  
--- 11880,11888 ----
  				fold_convert (type, arg0),
  				fold_convert (type, arg1));
  
        if (TREE_CODE (arg1) == INTEGER_CST
! 	  && (tem = extract_muldiv (op0, arg1, code, NULL_TREE)) != 0)
  	  return fold_convert_loc (loc, type, tem);
  
        return NULL_TREE;
  
*************** fold_binary_loc (location_t loc, enum tr
*** 12102,12118 ****
      case FLOOR_MOD_EXPR:
      case ROUND_MOD_EXPR:
      case TRUNC_MOD_EXPR:
-       strict_overflow_p = false;
        if (TREE_CODE (arg1) == INTEGER_CST
! 	  && (tem = extract_muldiv (op0, arg1, code, NULL_TREE,
! 				    &strict_overflow_p)) != 0)
! 	{
! 	  if (strict_overflow_p)
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when simplifying modulus"),
! 				   WARN_STRICT_OVERFLOW_MISC);
  	  return fold_convert_loc (loc, type, tem);
- 	}
  
        return NULL_TREE;
  
--- 11890,11898 ----
      case FLOOR_MOD_EXPR:
      case ROUND_MOD_EXPR:
      case TRUNC_MOD_EXPR:
        if (TREE_CODE (arg1) == INTEGER_CST
! 	  && (tem = extract_muldiv (op0, arg1, code, NULL_TREE)) != 0)
  	  return fold_convert_loc (loc, type, tem);
  
        return NULL_TREE;
  
*************** fold_binary_loc (location_t loc, enum tr
*** 12624,12661 ****
  				    TREE_OPERAND (arg0, 0), arg1));
  
        /* Convert ABS_EXPR<x> >= 0 to true.  */
-       strict_overflow_p = false;
        if (code == GE_EXPR
  	  && (integer_zerop (arg1)
  	      || (! HONOR_NANS (arg0)
  		  && real_zerop (arg1)))
! 	  && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
! 	{
! 	  if (strict_overflow_p)
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when simplifying comparison of "
! 				    "absolute value and zero"),
! 				   WARN_STRICT_OVERFLOW_CONDITIONAL);
! 	  return omit_one_operand_loc (loc, type,
! 				       constant_boolean_node (true, type),
! 				       arg0);
! 	}
  
        /* Convert ABS_EXPR<x> < 0 to false.  */
-       strict_overflow_p = false;
        if (code == LT_EXPR
  	  && (integer_zerop (arg1) || real_zerop (arg1))
! 	  && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
! 	{
! 	  if (strict_overflow_p)
! 	    fold_overflow_warning (("assuming signed overflow does not occur "
! 				    "when simplifying comparison of "
! 				    "absolute value and zero"),
! 				   WARN_STRICT_OVERFLOW_CONDITIONAL);
! 	  return omit_one_operand_loc (loc, type,
! 				       constant_boolean_node (false, type),
! 				       arg0);
! 	}
  
        /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
  	 and similarly for >= into !=.  */
--- 12404,12425 ----
  				    TREE_OPERAND (arg0, 0), arg1));
  
        /* Convert ABS_EXPR<x> >= 0 to true.  */
        if (code == GE_EXPR
  	  && (integer_zerop (arg1)
  	      || (! HONOR_NANS (arg0)
  		  && real_zerop (arg1)))
! 	  && tree_expr_nonnegative_p (arg0))
! 	return omit_one_operand_loc (loc, type,
! 				     constant_boolean_node (true, type),
! 				     arg0);
  
        /* Convert ABS_EXPR<x> < 0 to false.  */
        if (code == LT_EXPR
  	  && (integer_zerop (arg1) || real_zerop (arg1))
! 	  && tree_expr_nonnegative_p (arg0))
! 	return omit_one_operand_loc (loc, type,
! 				     constant_boolean_node (false, type),
! 				     arg0);
  
        /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
  	 and similarly for >= into !=.  */
*************** tree_expr_maybe_real_minus_zero_p (const
*** 14687,14697 ****
    return true;
  }
  
! #define tree_expr_nonnegative_warnv_p(X, Y) \
    _Pragma ("GCC error \"Use RECURSE for recursive calls\"") 0
  
  #define RECURSE(X) \
!   ((tree_expr_nonnegative_warnv_p) (X, strict_overflow_p, depth + 1))
  
  /* Return true if CODE or TYPE is known to be non-negative. */
  
--- 14451,14461 ----
    return true;
  }
  
! #define tree_expr_nonnegative_p(X, Y) \
    _Pragma ("GCC error \"Use RECURSE for recursive calls\"") 0
  
  #define RECURSE(X) \
!   ((tree_expr_nonnegative_p) (X, depth + 1))
  
  /* Return true if CODE or TYPE is known to be non-negative. */
  
*************** tree_simple_nonnegative_warnv_p (enum tr
*** 14707,14720 ****
    return false;
  }
  
! /* Return true if (CODE OP0) is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_unary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
! 				bool *strict_overflow_p, int depth)
  {
    if (TYPE_UNSIGNED (type))
      return true;
--- 14471,14481 ----
    return false;
  }
  
! /* Return true if (CODE OP0) is known to be non-negative.
!   DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_unary_nonnegative_p (enum tree_code code, tree type, tree op0, int depth)
  {
    if (TYPE_UNSIGNED (type))
      return true;
*************** tree_unary_nonnegative_warnv_p (enum tre
*** 14727,14736 ****
        if (!ANY_INTEGRAL_TYPE_P (type))
  	return true;
        if (TYPE_OVERFLOW_UNDEFINED (type))
! 	{
! 	  *strict_overflow_p = true;
! 	  return true;
! 	}
        break;
  
      case NON_LVALUE_EXPR:
--- 14488,14494 ----
        if (!ANY_INTEGRAL_TYPE_P (type))
  	return true;
        if (TYPE_OVERFLOW_UNDEFINED (type))
! 	return true;
        break;
  
      case NON_LVALUE_EXPR:
*************** tree_unary_nonnegative_warnv_p (enum tre
*** 14773,14787 ****
    return false;
  }
  
! /* Return true if (CODE OP0 OP1) is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
! 				 tree op1, bool *strict_overflow_p,
! 				 int depth)
  {
    if (TYPE_UNSIGNED (type))
      return true;
--- 14531,14542 ----
    return false;
  }
  
! /* Return true if (CODE OP0 OP1) is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_binary_nonnegative_p (enum tree_code code, tree type, tree op0,
! 			   tree op1, int depth)
  {
    if (TYPE_UNSIGNED (type))
      return true;
*************** tree_binary_nonnegative_warnv_p (enum tr
*** 14818,14829 ****
  	     or without overflow.  */
  	  if (operand_equal_p (op0, op1, 0)
  	      || (RECURSE (op0) && RECURSE (op1)))
! 	    {
! 	      if (ANY_INTEGRAL_TYPE_P (type)
! 		  && TYPE_OVERFLOW_UNDEFINED (type))
! 		*strict_overflow_p = true;
! 	      return true;
! 	    }
  	}
  
        /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
--- 14573,14579 ----
  	     or without overflow.  */
  	  if (operand_equal_p (op0, op1, 0)
  	      || (RECURSE (op0) && RECURSE (op1)))
! 	    return true;
  	}
  
        /* zero_extend(x) * zero_extend(y) is non-negative if x and y are
*************** tree_binary_nonnegative_warnv_p (enum tr
*** 14900,14912 ****
    return false;
  }
  
! /* Return true if T is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth)
  {
    if (TYPE_UNSIGNED (TREE_TYPE (t)))
      return true;
--- 14650,14660 ----
    return false;
  }
  
! /* Return true if T is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_single_nonnegative_p (tree t, int depth)
  {
    if (TYPE_UNSIGNED (TREE_TYPE (t)))
      return true;
*************** tree_single_nonnegative_warnv_p (tree t,
*** 14933,14954 ****
  	 to provide it through dataflow propagation.  */
        return (!name_registered_for_update_p (t)
  	      && depth < param_max_ssa_name_query_depth
! 	      && gimple_stmt_nonnegative_warnv_p (SSA_NAME_DEF_STMT (t),
! 						  strict_overflow_p, depth));
  
      default:
        return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t));
      }
  }
  
! /* Return true if T is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_call_nonnegative_warnv_p (tree type, combined_fn fn, tree arg0, tree arg1,
! 			       bool *strict_overflow_p, int depth)
  {
    switch (fn)
      {
--- 14681,14699 ----
  	 to provide it through dataflow propagation.  */
        return (!name_registered_for_update_p (t)
  	      && depth < param_max_ssa_name_query_depth
! 	      && gimple_stmt_nonnegative_p (SSA_NAME_DEF_STMT (t), depth));
  
      default:
        return tree_simple_nonnegative_warnv_p (TREE_CODE (t), TREE_TYPE (t));
      }
  }
  
! /* Return true if T is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_call_nonnegative_p (tree type, combined_fn fn, tree arg0, tree arg1,
! 			 int depth)
  {
    switch (fn)
      {
*************** tree_call_nonnegative_warnv_p (tree type
*** 15132,15144 ****
    return tree_simple_nonnegative_warnv_p (CALL_EXPR, type);
  }
  
! /* Return true if T is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  static bool
! tree_invalid_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth)
  {
    enum tree_code code = TREE_CODE (t);
    if (TYPE_UNSIGNED (TREE_TYPE (t)))
--- 14877,14887 ----
    return tree_simple_nonnegative_warnv_p (CALL_EXPR, type);
  }
  
! /* Return true if T is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  static bool
! tree_invalid_nonnegative_p (tree t, int depth)
  {
    enum tree_code code = TREE_CODE (t);
    if (TYPE_UNSIGNED (TREE_TYPE (t)))
*************** tree_invalid_nonnegative_warnv_p (tree t
*** 15182,15192 ****
  	tree arg0 = call_expr_nargs (t) > 0 ? CALL_EXPR_ARG (t, 0) : NULL_TREE;
  	tree arg1 = call_expr_nargs (t) > 1 ? CALL_EXPR_ARG (t, 1) : NULL_TREE;
  
! 	return tree_call_nonnegative_warnv_p (TREE_TYPE (t),
! 					      get_call_combined_fn (t),
! 					      arg0,
! 					      arg1,
! 					      strict_overflow_p, depth);
        }
      case COMPOUND_EXPR:
      case MODIFY_EXPR:
--- 14925,14935 ----
  	tree arg0 = call_expr_nargs (t) > 0 ? CALL_EXPR_ARG (t, 0) : NULL_TREE;
  	tree arg1 = call_expr_nargs (t) > 1 ? CALL_EXPR_ARG (t, 1) : NULL_TREE;
  
! 	return tree_call_nonnegative_p (TREE_TYPE (t),
! 					get_call_combined_fn (t),
! 					arg0,
! 					arg1,
! 					depth);
        }
      case COMPOUND_EXPR:
      case MODIFY_EXPR:
*************** tree_invalid_nonnegative_warnv_p (tree t
*** 15204,15218 ****
  }
  
  #undef RECURSE
! #undef tree_expr_nonnegative_warnv_p
  
! /* Return true if T is known to be non-negative.  If the return
!    value is based on the assumption that signed overflow is undefined,
!    set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_expr_nonnegative_warnv_p (tree t, bool *strict_overflow_p, int depth)
  {
    enum tree_code code;
    if (error_operand_p (t))
--- 14947,14959 ----
  }
  
  #undef RECURSE
! #undef tree_expr_nonnegative_p
  
! /* Return true if T is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  bool
! tree_expr_nonnegative_p (tree t, int depth)
  {
    enum tree_code code;
    if (error_operand_p (t))
*************** tree_expr_nonnegative_warnv_p (tree t, b
*** 15223,15244 ****
      {
      case tcc_binary:
      case tcc_comparison:
!       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
! 					      TREE_TYPE (t),
! 					      TREE_OPERAND (t, 0),
! 					      TREE_OPERAND (t, 1),
! 					      strict_overflow_p, depth);
  
      case tcc_unary:
!       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
! 					     TREE_TYPE (t),
! 					     TREE_OPERAND (t, 0),
! 					     strict_overflow_p, depth);
  
      case tcc_constant:
      case tcc_declaration:
      case tcc_reference:
!       return tree_single_nonnegative_warnv_p (t, strict_overflow_p, depth);
  
      default:
        break;
--- 14964,14985 ----
      {
      case tcc_binary:
      case tcc_comparison:
!       return tree_binary_nonnegative_p (TREE_CODE (t),
! 					TREE_TYPE (t),
! 					TREE_OPERAND (t, 0),
! 					TREE_OPERAND (t, 1),
! 					depth);
  
      case tcc_unary:
!       return tree_unary_nonnegative_p (TREE_CODE (t),
! 				       TREE_TYPE (t),
! 				       TREE_OPERAND (t, 0),
! 				       depth);
  
      case tcc_constant:
      case tcc_declaration:
      case tcc_reference:
!       return tree_single_nonnegative_p (t, depth);
  
      default:
        break;
*************** tree_expr_nonnegative_warnv_p (tree t, b
*** 15249,15264 ****
      case TRUTH_AND_EXPR:
      case TRUTH_OR_EXPR:
      case TRUTH_XOR_EXPR:
!       return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
! 					      TREE_TYPE (t),
! 					      TREE_OPERAND (t, 0),
! 					      TREE_OPERAND (t, 1),
! 					      strict_overflow_p, depth);
      case TRUTH_NOT_EXPR:
!       return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
! 					     TREE_TYPE (t),
! 					     TREE_OPERAND (t, 0),
! 					     strict_overflow_p, depth);
  
      case COND_EXPR:
      case CONSTRUCTOR:
--- 14990,15005 ----
      case TRUTH_AND_EXPR:
      case TRUTH_OR_EXPR:
      case TRUTH_XOR_EXPR:
!       return tree_binary_nonnegative_p (TREE_CODE (t),
! 					TREE_TYPE (t),
! 					TREE_OPERAND (t, 0),
! 					TREE_OPERAND (t, 1),
! 					depth);
      case TRUTH_NOT_EXPR:
!       return tree_unary_nonnegative_p (TREE_CODE (t),
! 				       TREE_TYPE (t),
! 				       TREE_OPERAND (t, 0),
! 				       depth);
  
      case COND_EXPR:
      case CONSTRUCTOR:
*************** tree_expr_nonnegative_warnv_p (tree t, b
*** 15266,15314 ****
      case ADDR_EXPR:
      case WITH_SIZE_EXPR:
      case SSA_NAME:
!       return tree_single_nonnegative_warnv_p (t, strict_overflow_p, depth);
  
      default:
!       return tree_invalid_nonnegative_warnv_p (t, strict_overflow_p, depth);
      }
  }
  
- /* Return true if `t' is known to be non-negative.  Handle warnings
-    about undefined signed overflow.  */
- 
- bool
- tree_expr_nonnegative_p (tree t)
- {
-   bool ret, strict_overflow_p;
- 
-   strict_overflow_p = false;
-   ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
-   if (strict_overflow_p)
-     fold_overflow_warning (("assuming signed overflow does not occur when "
- 			    "determining that expression is always "
- 			    "non-negative"),
- 			   WARN_STRICT_OVERFLOW_MISC);
-   return ret;
- }
- 
  
  /* Return true when (CODE OP0) is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.
! 
!    If the return value is based on the assumption that signed overflow
!    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
!    change *STRICT_OVERFLOW_P.  */
  
  bool
! tree_unary_nonzero_warnv_p (enum tree_code code, tree type, tree op0,
! 				 bool *strict_overflow_p)
  {
    switch (code)
      {
      case ABS_EXPR:
!       return tree_expr_nonzero_warnv_p (op0,
! 					strict_overflow_p);
  
      case NOP_EXPR:
        {
--- 15007,15031 ----
      case ADDR_EXPR:
      case WITH_SIZE_EXPR:
      case SSA_NAME:
!       return tree_single_nonnegative_p (t, depth);
  
      default:
!       return tree_invalid_nonnegative_p (t, depth);
      }
  }
  
  
  /* Return true when (CODE OP0) is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.  */
  
  bool
! tree_unary_nonzero_p (enum tree_code code, tree type, tree op0)
  {
    switch (code)
      {
      case ABS_EXPR:
!       return tree_expr_nonzero_p (op0);
  
      case NOP_EXPR:
        {
*************** tree_unary_nonzero_warnv_p (enum tree_co
*** 15316,15329 ****
  	tree outer_type = type;
  
  	return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
! 		&& tree_expr_nonzero_warnv_p (op0,
! 					      strict_overflow_p));
        }
        break;
  
      case NON_LVALUE_EXPR:
!       return tree_expr_nonzero_warnv_p (op0,
! 					strict_overflow_p);
  
      default:
        break;
--- 15033,15044 ----
  	tree outer_type = type;
  
  	return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
! 		&& tree_expr_nonzero_p (op0));
        }
        break;
  
      case NON_LVALUE_EXPR:
!       return tree_expr_nonzero_p (op0);
  
      default:
        break;
*************** tree_unary_nonzero_warnv_p (enum tree_co
*** 15334,15352 ****
  
  /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.
! 
!    If the return value is based on the assumption that signed overflow
!    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
!    change *STRICT_OVERFLOW_P.  */
  
  bool
! tree_binary_nonzero_warnv_p (enum tree_code code,
! 			     tree type,
! 			     tree op0,
! 			     tree op1, bool *strict_overflow_p)
  {
-   bool sub_strict_overflow_p;
    switch (code)
      {
      case POINTER_PLUS_EXPR:
--- 15049,15059 ----
  
  /* Return true when (CODE OP0 OP1) is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.  */
  
  bool
! tree_binary_nonzero_p (enum tree_code code, tree type, tree op0, tree op1)
  {
    switch (code)
      {
      case POINTER_PLUS_EXPR:
*************** tree_binary_nonzero_warnv_p (enum tree_c
*** 15355,15437 ****
  	{
  	  /* With the presence of negative values it is hard
  	     to say something.  */
! 	  sub_strict_overflow_p = false;
! 	  if (!tree_expr_nonnegative_warnv_p (op0,
! 					      &sub_strict_overflow_p)
! 	      || !tree_expr_nonnegative_warnv_p (op1,
! 						 &sub_strict_overflow_p))
  	    return false;
  	  /* One of operands must be positive and the other non-negative.  */
! 	  /* We don't set *STRICT_OVERFLOW_P here: even if this value
! 	     overflows, on a twos-complement machine the sum of two
! 	     nonnegative numbers can never be zero.  */
! 	  return (tree_expr_nonzero_warnv_p (op0,
! 					     strict_overflow_p)
! 		  || tree_expr_nonzero_warnv_p (op1,
! 						strict_overflow_p));
  	}
        break;
  
      case MULT_EXPR:
        if (TYPE_OVERFLOW_UNDEFINED (type))
  	{
! 	  if (tree_expr_nonzero_warnv_p (op0,
! 					 strict_overflow_p)
! 	      && tree_expr_nonzero_warnv_p (op1,
! 					    strict_overflow_p))
! 	    {
! 	      *strict_overflow_p = true;
! 	      return true;
! 	    }
  	}
        break;
  
      case MIN_EXPR:
-       sub_strict_overflow_p = false;
-       if (tree_expr_nonzero_warnv_p (op0,
- 				     &sub_strict_overflow_p)
- 	  && tree_expr_nonzero_warnv_p (op1,
- 					&sub_strict_overflow_p))
- 	{
- 	  if (sub_strict_overflow_p)
- 	    *strict_overflow_p = true;
- 	}
        break;
  
      case MAX_EXPR:
!       sub_strict_overflow_p = false;
!       if (tree_expr_nonzero_warnv_p (op0,
! 				     &sub_strict_overflow_p))
  	{
- 	  if (sub_strict_overflow_p)
- 	    *strict_overflow_p = true;
  
  	  /* When both operands are nonzero, then MAX must be too.  */
! 	  if (tree_expr_nonzero_warnv_p (op1,
! 					 strict_overflow_p))
  	    return true;
  
  	  /* MAX where operand 0 is positive is positive.  */
! 	  return tree_expr_nonnegative_warnv_p (op0,
! 					       strict_overflow_p);
  	}
        /* MAX where operand 1 is positive is positive.  */
!       else if (tree_expr_nonzero_warnv_p (op1,
! 					  &sub_strict_overflow_p)
! 	       && tree_expr_nonnegative_warnv_p (op1,
! 						 &sub_strict_overflow_p))
! 	{
! 	  if (sub_strict_overflow_p)
! 	    *strict_overflow_p = true;
! 	  return true;
! 	}
        break;
  
      case BIT_IOR_EXPR:
!       return (tree_expr_nonzero_warnv_p (op1,
! 					 strict_overflow_p)
! 	      || tree_expr_nonzero_warnv_p (op0,
! 					    strict_overflow_p));
  
      default:
        break;
--- 15062,15108 ----
  	{
  	  /* With the presence of negative values it is hard
  	     to say something.  */
! 	  if (!tree_expr_nonnegative_p (op0)
! 	      || !tree_expr_nonnegative_p (op1))
  	    return false;
  	  /* One of operands must be positive and the other non-negative.  */
! 	  return (tree_expr_nonzero_p (op0)
! 		  || tree_expr_nonzero_p (op1));
  	}
        break;
  
      case MULT_EXPR:
        if (TYPE_OVERFLOW_UNDEFINED (type))
  	{
! 	  if (tree_expr_nonzero_p (op0)
! 	      && tree_expr_nonzero_p (op1))
! 	    return true;
  	}
        break;
  
      case MIN_EXPR:
        break;
  
      case MAX_EXPR:
!       if (tree_expr_nonzero_p (op0))
  	{
  
  	  /* When both operands are nonzero, then MAX must be too.  */
! 	  if (tree_expr_nonzero_p (op1))
  	    return true;
  
  	  /* MAX where operand 0 is positive is positive.  */
! 	  return tree_expr_nonnegative_p (op0);
  	}
        /* MAX where operand 1 is positive is positive.  */
!       else if (tree_expr_nonzero_p (op1)
! 	       && tree_expr_nonnegative_p (op1))
! 	return true;
        break;
  
      case BIT_IOR_EXPR:
!       return (tree_expr_nonzero_p (op1)
! 	      || tree_expr_nonzero_p (op0));
  
      default:
        break;
*************** tree_binary_nonzero_warnv_p (enum tree_c
*** 15442,15457 ****
  
  /* Return true when T is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.
! 
!    If the return value is based on the assumption that signed overflow
!    is undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't
!    change *STRICT_OVERFLOW_P.  */
  
  bool
! tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
  {
-   bool sub_strict_overflow_p;
    switch (TREE_CODE (t))
      {
      case INTEGER_CST:
--- 15113,15123 ----
  
  /* Return true when T is an address and is known to be nonzero.
     For floating point we further ensure that T is not denormal.
!    Similar logic is present in nonzero_address in rtlanal.h.  */
  
  bool
! tree_single_nonzero_p (tree t)
  {
    switch (TREE_CODE (t))
      {
      case INTEGER_CST:
*************** tree_single_nonzero_warnv_p (tree t, boo
*** 15485,15500 ****
        }
  
      case COND_EXPR:
!       sub_strict_overflow_p = false;
!       if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
! 				     &sub_strict_overflow_p)
! 	  && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
! 					&sub_strict_overflow_p))
! 	{
! 	  if (sub_strict_overflow_p)
! 	    *strict_overflow_p = true;
! 	  return true;
! 	}
        break;
  
      case SSA_NAME:
--- 15151,15159 ----
        }
  
      case COND_EXPR:
!       if (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
! 	  && tree_expr_nonzero_p (TREE_OPERAND (t, 2)))
! 	return true;
        break;
  
      case SSA_NAME:
diff -Nrcpad gcc-17-20260517/gcc/fold-const.h gcc-17-20260524/gcc/fold-const.h
*** gcc-17-20260517/gcc/fold-const.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fold-const.h	Sun May 24 22:32:06 2026
*************** extern void fold_defer_overflow_warnings
*** 103,109 ****
  extern void fold_undefer_overflow_warnings (bool, const gimple *, int);
  extern void fold_undefer_and_ignore_overflow_warnings (void);
  extern bool fold_deferring_overflow_warnings_p (void);
- extern void fold_overflow_warning (const char*, enum warn_strict_overflow_code);
  extern enum tree_code fold_div_compare (enum tree_code, tree, tree,
  					tree *, tree *, bool *);
  extern bool operand_equal_p (const_tree, const_tree, unsigned int flags = 0);
--- 103,108 ----
*************** extern bool ptr_difference_const (tree,
*** 162,178 ****
  extern enum tree_code invert_tree_comparison (enum tree_code, bool);
  extern bool inverse_conditions_p (const_tree, const_tree);
  
! extern bool tree_unary_nonzero_warnv_p (enum tree_code, tree, tree, bool *);
! extern bool tree_binary_nonzero_warnv_p (enum tree_code, tree, tree, tree op1,
!                                          bool *);
! extern bool tree_single_nonzero_warnv_p (tree, bool *);
! extern bool tree_unary_nonnegative_warnv_p (enum tree_code, tree, tree,
! 					    bool *, int);
! extern bool tree_binary_nonnegative_warnv_p (enum tree_code, tree, tree, tree,
! 					     bool *, int);
! extern bool tree_single_nonnegative_warnv_p (tree, bool *, int);
! extern bool tree_call_nonnegative_warnv_p (tree, combined_fn, tree, tree,
! 					   bool *, int);
  
  extern bool integer_valued_real_unary_p (tree_code, tree, int);
  extern bool integer_valued_real_binary_p (tree_code, tree, tree, int);
--- 161,173 ----
  extern enum tree_code invert_tree_comparison (enum tree_code, bool);
  extern bool inverse_conditions_p (const_tree, const_tree);
  
! extern bool tree_unary_nonzero_p (enum tree_code, tree, tree);
! extern bool tree_binary_nonzero_p (enum tree_code, tree, tree, tree op1);
! extern bool tree_single_nonzero_p (tree);
! extern bool tree_unary_nonnegative_p (enum tree_code, tree, tree, int);
! extern bool tree_binary_nonnegative_p (enum tree_code, tree, tree, tree, int);
! extern bool tree_single_nonnegative_p (tree, int);
! extern bool tree_call_nonnegative_p (tree, combined_fn, tree, tree, int);
  
  extern bool integer_valued_real_unary_p (tree_code, tree, int);
  extern bool integer_valued_real_binary_p (tree_code, tree, tree, int);
*************** extern tree size_diffop_loc (location_t,
*** 203,210 ****
  extern tree non_lvalue_loc (location_t, tree);
  
  extern bool tree_expr_nonzero_p (tree);
! extern bool tree_expr_nonnegative_p (tree);
! extern bool tree_expr_nonnegative_warnv_p (tree, bool *, int = 0);
  extern bool tree_expr_finite_p (const_tree);
  extern bool tree_expr_infinite_p (const_tree);
  extern bool tree_expr_maybe_infinite_p (const_tree);
--- 198,204 ----
  extern tree non_lvalue_loc (location_t, tree);
  
  extern bool tree_expr_nonzero_p (tree);
! extern bool tree_expr_nonnegative_p (tree, int = 0);
  extern bool tree_expr_finite_p (const_tree);
  extern bool tree_expr_infinite_p (const_tree);
  extern bool tree_expr_maybe_infinite_p (const_tree);
*************** extern bool tree_expr_maybe_signaling_na
*** 213,221 ****
  extern bool tree_expr_nan_p (const_tree);
  extern bool tree_expr_maybe_nan_p (const_tree);
  extern bool tree_expr_maybe_real_minus_zero_p (const_tree);
! extern tree make_range (tree, int *, tree *, tree *, bool *);
  extern tree make_range_step (location_t, enum tree_code, tree, tree, tree,
! 			     tree *, tree *, int *, bool *);
  extern tree range_check_type (tree);
  extern tree build_range_check (location_t, tree, tree, int, tree, tree);
  extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int,
--- 207,215 ----
  extern bool tree_expr_nan_p (const_tree);
  extern bool tree_expr_maybe_nan_p (const_tree);
  extern bool tree_expr_maybe_real_minus_zero_p (const_tree);
! extern tree make_range (tree, int *, tree *, tree *);
  extern tree make_range_step (location_t, enum tree_code, tree, tree, tree,
! 			     tree *, tree *, int *);
  extern tree range_check_type (tree);
  extern tree build_range_check (location_t, tree, tree, int, tree, tree);
  extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int,
diff -Nrcpad gcc-17-20260517/gcc/fortran/ChangeLog gcc-17-20260524/gcc/fortran/ChangeLog
*** gcc-17-20260517/gcc/fortran/ChangeLog	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/ChangeLog	Sun May 24 22:32:06 2026
***************
*** 1,3 ****
--- 1,92 ----
+ 2026-05-23  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/125263
+ 	* trans-expr.cc (gfc_trans_assignment_1): Pass scalar class to
+ 	derived type assignment expressions to gfc_trans_scalar_assign.
+ 
+ 2026-05-23  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/125391
+ 	* trans.cc (gfc_assignment_finalizer_call): For finalization of
+ 	allocatable and pointer lhs before assignment, gfc_conv_expr
+ 	should be used with se.descriptor_only. This avoids implicit of
+ 	set_factored_descriptor_value by gfc_conv_expr_descriptor.
+ 
+ 2026-05-22  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* dump-parse-tree.cc: Fix comment typo.
+ 	* gfortran.texi: Fix typo.
+ 	* intrinsic.texi: Likewise.
+ 	* invoke.texi: Likewise.
+ 
+ 2026-05-22  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	PR fortran/125416
+ 	* invoke.texi (fcoarray): Document 'shared'.
+ 
+ 2026-05-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/125379
+ 	* gfortran.h (gfc_find_symbol_by_name): Add prototype.
+ 	* resolve.cc (gfc_verify_binding_labels): Call gfc_find_symbol_by_name
+ 	if direct lookup fails.
+ 	* symbol.cc (compare_target_sym_name): New function.
+ 	(gfc_find_symbol_by_name): New function.
+ 
+ 2026-05-20  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/106546
+ 	* frontend-passes.cc (create_var): Set attr->automatic on
+ 	new symbol.
+ 	(create_do_loop): Likewise on iteration variable.
+ 
+ 2026-05-19  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* dump-parse-tree.cc (show_attr): Show omp_udm_artificial_var flag.
+ 	(show_omp_namelist): Support OMP_MAP_UNSET.
+ 	* gfortran.h (enum gfc_statement): Add ST_OMP_DECLARE_MAPPER.
+ 	(symbol_attribute): Add omp_udm_artificial_var attribute.
+ 	(enum gfc_omp_map_op): Add OMP_MAP_UNSET.
+ 	(gfc_omp_namelist_udm): New struct.
+ 	(gfc_omp_namelist): Add udm pointer to u2 union.
+ 	(gfc_symtree): Add omp_udm pointer.
+ 	(gfc_namespace): Add omp_udm_root symtree and omp_udm_ns flag.
+ 	(gfc_free_omp_udm, gfc_omp_udm_find, gfc_find_omp_udm,
+ 	gfc_resolve_omp_udms): Add prototypes.
+ 	* match.h (gfc_match_omp_declare_mapper): Add prototype.
+ 	* match.cc (gfc_free_omp_namelist): Update for declare mapper's udm.
+ 	* openmp.cc (gfc_omp_directives): Uncomment 'declare mapper'.
+ 	(gfc_free_omp_udm, gfc_find_omp_udm, gfc_omp_udm_find,
+ 	gfc_match_omp_declare_mapper, gfc_resolve_omp_udm,
+ 	gfc_resolve_omp_udms): New.
+ 	(gfc_match_omp_clauses): Take argument for the default map-type
+ 	modifier; add support for the 'mapper' modifier.
+ 	(resolve_omp_clauses): Update for declare-mapper map clauses.
+ 	* parse.cc (decode_omp_directive): Add declare mapper support.
+ 	(case_omp_decl): Add ST_OMP_DECLARE_MAPPER case.
+ 	(gfc_ascii_statement): Add ST_OMP_DECLARE_MAPPER case.
+ 	* resolve.cc (resolve_types): Call gfc_resolve_omp_udms.
+ 	* symbol.cc (free_omp_udm_tree): New function.
+ 	(gfc_free_namespace): Call it.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* gfortran.h (enum gfc_omp_map_op): Dedicate the two LSB to TO and FROM.
+ 	* openmp.cc (resolve_omp_clauses): Adjust to allow duplicate
+ 	mapped variables for OpenMP.
+ 	* trans-openmp.cc (gfc_trans_omp_clauses): Remove duplicates before
+ 	clause expansion.
+ 
+ 2026-05-19  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/115260
+ 	* trans-expr.cc (gfc_conv_subref_array_arg): Pass false to
+ 	dealloc argument of gfc_trans_scalar_assign if we are
+ 	converting a g77-style argument.
+ 
  2026-05-16  Thomas Koenig  <tkoenig@gcc.gnu.org>
  
  	PR fortran/122245
diff -Nrcpad gcc-17-20260517/gcc/fortran/dump-parse-tree.cc gcc-17-20260524/gcc/fortran/dump-parse-tree.cc
*** gcc-17-20260517/gcc/fortran/dump-parse-tree.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/dump-parse-tree.cc	Sun May 24 22:32:06 2026
*************** show_attr (symbol_attribute *attr, const
*** 944,949 ****
--- 944,951 ----
      fputs (" PDT-STRING", dumpfile);
    if (attr->omp_udr_artificial_var)
      fputs (" OMP-UDR-ARTIFICIAL-VAR", dumpfile);
+   if (attr->omp_udm_artificial_var)
+     fputs (" OMP-UDM-ARTIFICIAL-VAR", dumpfile);
    if (attr->omp_declare_target)
      fputs (" OMP-DECLARE-TARGET", dumpfile);
    if (attr->omp_declare_target_link)
*************** show_omp_namelist (int list_type, gfc_om
*** 1628,1633 ****
--- 1630,1636 ----
  	    fputs ("always,present,tofrom:", dumpfile); break;
  	  case OMP_MAP_DELETE: fputs ("delete:", dumpfile); break;
  	  case OMP_MAP_RELEASE: fputs ("release:", dumpfile); break;
+ 	  case OMP_MAP_UNSET: fputs ("unset:", dumpfile); break;
  	  default: break;
  	  }
        else if (list_type == OMP_LIST_LINEAR && n->u.linear.old_modifier)
*************** gfc_dump_parse_tree (gfc_namespace *ns,
*** 4120,4127 ****
    show_namespace (ns);
  }
  
! /* This part writes BIND(C) prototypes and declatations, and prototypes
!    for EXTERNAL preocedures, for use in a C programs.  */
  
  static void write_interop_decl (gfc_symbol *);
  static void write_proc (gfc_symbol *, bool);
--- 4123,4130 ----
    show_namespace (ns);
  }
  
! /* This part writes BIND(C) prototypes and declarations, and prototypes
!    for EXTERNAL procedures, for use in a C programs.  */
  
  static void write_interop_decl (gfc_symbol *);
  static void write_proc (gfc_symbol *, bool);
diff -Nrcpad gcc-17-20260517/gcc/fortran/frontend-passes.cc gcc-17-20260524/gcc/fortran/frontend-passes.cc
*** gcc-17-20260517/gcc/fortran/frontend-passes.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/frontend-passes.cc	Sun May 24 22:32:06 2026
*************** create_var (gfc_expr * e, const char *vn
*** 849,854 ****
--- 849,855 ----
    symbol->attr.referenced = 1;
    symbol->attr.dimension = e->rank > 0;
    symbol->attr.fe_temp = 1;
+   symbol->attr.automatic = 1;
    gfc_commit_symbol (symbol);
  
    result = gfc_get_expr ();
*************** create_do_loop (gfc_expr *start, gfc_exp
*** 3808,3813 ****
--- 3809,3815 ----
    symbol->attr.referenced = 1;
    symbol->attr.dimension = 0;
    symbol->attr.fe_temp = 1;
+   symbol->attr.automatic = 1;
    gfc_commit_symbol (symbol);
  
    i = gfc_get_expr ();
diff -Nrcpad gcc-17-20260517/gcc/fortran/gfortran.h gcc-17-20260524/gcc/fortran/gfortran.h
*** gcc-17-20260517/gcc/fortran/gfortran.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/gfortran.h	Sun May 24 22:32:06 2026
*************** enum gfc_statement
*** 284,291 ****
    ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
    ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
    ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
!   ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_REDUCTION,
!   ST_OMP_TARGET, ST_OMP_END_TARGET, ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
    ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET, ST_OMP_DECLARE_VARIANT,
    ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
    ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
--- 284,292 ----
    ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
    ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
    ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
!   ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_MAPPER,
!   ST_OMP_DECLARE_REDUCTION, ST_OMP_TARGET, ST_OMP_END_TARGET,
!   ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
    ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET, ST_OMP_DECLARE_VARIANT,
    ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
    ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
*************** typedef struct
*** 1041,1046 ****
--- 1042,1051 ----
       !$OMP DECLARE REDUCTION.  */
    unsigned omp_udr_artificial_var:1;
  
+   /* This is a placeholder variable used in an !$OMP DECLARE MAPPER
+      directive.  */
+   unsigned omp_udm_artificial_var:1;
+ 
    /* Mentioned in OMP DECLARE TARGET.  */
    unsigned omp_declare_target:1;
    unsigned omp_declare_target_link:1;
*************** enum gfc_omp_depend_doacross_op
*** 1347,1379 ****
  
  enum gfc_omp_map_op
  {
!   OMP_MAP_ALLOC,
!   OMP_MAP_IF_PRESENT,
!   OMP_MAP_ATTACH,
!   OMP_MAP_TO,
!   OMP_MAP_FROM,
!   OMP_MAP_TOFROM,
!   OMP_MAP_DELETE,
!   OMP_MAP_DETACH,
!   OMP_MAP_FORCE_ALLOC,
!   OMP_MAP_FORCE_TO,
!   OMP_MAP_FORCE_FROM,
!   OMP_MAP_FORCE_TOFROM,
!   OMP_MAP_FORCE_PRESENT,
!   OMP_MAP_FORCE_DEVICEPTR,
!   OMP_MAP_DEVICE_RESIDENT,
!   OMP_MAP_LINK,
!   OMP_MAP_RELEASE,
!   OMP_MAP_ALWAYS_TO,
!   OMP_MAP_ALWAYS_FROM,
!   OMP_MAP_ALWAYS_TOFROM,
!   OMP_MAP_PRESENT_ALLOC,
!   OMP_MAP_PRESENT_TO,
!   OMP_MAP_PRESENT_FROM,
!   OMP_MAP_PRESENT_TOFROM,
!   OMP_MAP_ALWAYS_PRESENT_TO,
!   OMP_MAP_ALWAYS_PRESENT_FROM,
!   OMP_MAP_ALWAYS_PRESENT_TOFROM
  };
  
  enum gfc_omp_defaultmap
--- 1352,1385 ----
  
  enum gfc_omp_map_op
  {
!   OMP_MAP_ALLOC = 0,
!   OMP_MAP_TO = 1 << 0,
!   OMP_MAP_FROM = 1 << 1,
!   OMP_MAP_TOFROM = OMP_MAP_TO | OMP_MAP_FROM,
!   OMP_MAP_IF_PRESENT = 1 << 2,
!   OMP_MAP_ATTACH = 1 << 3,
!   OMP_MAP_DELETE = 1 << 4,
!   OMP_MAP_DETACH = 1 << 5,
!   OMP_MAP_FORCE_ALLOC = 1 << 6,
!   OMP_MAP_FORCE_TO = OMP_MAP_FORCE_ALLOC | OMP_MAP_TO,
!   OMP_MAP_FORCE_FROM = OMP_MAP_FORCE_ALLOC | OMP_MAP_FROM,
!   OMP_MAP_FORCE_TOFROM = OMP_MAP_FORCE_ALLOC | OMP_MAP_TOFROM,
!   OMP_MAP_FORCE_PRESENT = 1 << 7,
!   OMP_MAP_FORCE_DEVICEPTR = 1 << 8,
!   OMP_MAP_DEVICE_RESIDENT = 1 << 9,
!   OMP_MAP_LINK = 1 << 10,
!   OMP_MAP_RELEASE = 1 << 11,
!   OMP_MAP_ALWAYS_TO = (1 << 12) | OMP_MAP_TO,
!   OMP_MAP_ALWAYS_FROM = (1 << 12) | OMP_MAP_FROM,
!   OMP_MAP_ALWAYS_TOFROM = (1 << 12) | OMP_MAP_TOFROM,
!   OMP_MAP_PRESENT_ALLOC = 1 << 13,
!   OMP_MAP_PRESENT_TO = (1 << 13) | OMP_MAP_TO,
!   OMP_MAP_PRESENT_FROM = (1 << 13) | OMP_MAP_FROM,
!   OMP_MAP_PRESENT_TOFROM = (1 << 13) | OMP_MAP_TOFROM,
!   OMP_MAP_ALWAYS_PRESENT_TO = OMP_MAP_ALWAYS_TO | OMP_MAP_PRESENT_TO,
!   OMP_MAP_ALWAYS_PRESENT_FROM = OMP_MAP_ALWAYS_FROM | OMP_MAP_PRESENT_FROM,
!   OMP_MAP_ALWAYS_PRESENT_TOFROM = OMP_MAP_ALWAYS_TOFROM | OMP_MAP_PRESENT_TOFROM,
!   OMP_MAP_UNSET = 1 << 14
  };
  
  enum gfc_omp_defaultmap
*************** enum gfc_omp_linear_op
*** 1408,1413 ****
--- 1414,1428 ----
    OMP_LINEAR_UVAL
  };
  
+ typedef struct gfc_omp_namelist_udm
+ {
+   /* When adding more struct members, change the struct use in gfc_omp_namelist
+      to a pointer and move the struct definition down, placing it after
+      '#define gfc_get_omp_udm'.  */
+   struct gfc_omp_udm *udm;
+ }
+ gfc_omp_namelist_udm;
+ 
  /* For use in OpenMP clauses in case we need extra information
     (aligned clause alignment, linear clause step, etc.).  */
  
*************** typedef struct gfc_omp_namelist
*** 1421,1427 ****
        gfc_omp_depend_doacross_op depend_doacross_op;
        struct
          {
! 	  ENUM_BITFIELD (gfc_omp_map_op) op:8;
  	  bool readonly;
          } map;
        gfc_expr *align;
--- 1436,1442 ----
        gfc_omp_depend_doacross_op depend_doacross_op;
        struct
          {
! 	  ENUM_BITFIELD (gfc_omp_map_op) op : 16;
  	  bool readonly;
          } map;
        gfc_expr *align;
*************** typedef struct gfc_omp_namelist
*** 1453,1458 ****
--- 1468,1474 ----
    union
      {
        struct gfc_omp_namelist_udr *udr;
+       struct gfc_omp_namelist_udm udm;
        gfc_namespace *ns;
        gfc_expr *allocator;
        struct gfc_symbol *traits_sym;
*************** typedef struct gfc_omp_namelist_udr
*** 1848,1853 ****
--- 1864,1891 ----
  gfc_omp_namelist_udr;
  #define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
  
+ 
+ typedef struct gfc_omp_udm
+ {
+   struct gfc_omp_udm *next;
+   locus where; /* Where the !$omp declare mapper construct occurred.  */
+ 
+   const char *mapper_id;
+   gfc_typespec ts;
+ 
+   struct gfc_symbol *var_sym;
+   struct gfc_namespace *mapper_ns;
+ 
+   /* FIXME: We don't need a whole gfc_omp_clauses here.  We only use the
+      OMP_LIST_MAP clause list; however, the used resolve_omp_clauses
+      requires the full set.  */
+   gfc_omp_clauses *clauses;
+ 
+   tree backend_decl;
+ }
+ gfc_omp_udm;
+ #define gfc_get_omp_udm() XCNEW (gfc_omp_udm)
+ 
  /* The gfc_st_label structure is a BBT attached to a namespace that
     records the usage of statement labels within that space.  */
  
*************** typedef struct gfc_symtree
*** 2216,2221 ****
--- 2254,2260 ----
      gfc_common_head *common;
      gfc_typebound_proc *tb;
      gfc_omp_udr *omp_udr;
+     gfc_omp_udm *omp_udm;
    }
    n;
    unsigned import_only:1;
*************** typedef struct gfc_namespace
*** 2271,2276 ****
--- 2310,2317 ----
    gfc_symtree *common_root;
    /* Tree containing all the OpenMP user defined reductions.  */
    gfc_symtree *omp_udr_root;
+   /* Tree containing all the OpenMP user defined mappers.  */
+   gfc_symtree *omp_udm_root;
  
    /* Tree containing type-bound procedures.  */
    gfc_symtree *tb_sym_root;
*************** typedef struct gfc_namespace
*** 2398,2403 ****
--- 2439,2447 ----
    /* Set to 1 for !$OMP DECLARE REDUCTION namespaces.  */
    unsigned omp_udr_ns:1;
  
+   /* Set to 1 for !$OMP DECLARE MAPPER namespaces.  */
+   unsigned omp_udm_ns:1;
+ 
    /* Set to 1 for !$ACC ROUTINE namespaces.  */
    unsigned oacc_routine:1;
  
*************** int gfc_find_symbol (const char *, gfc_n
*** 3808,3813 ****
--- 3852,3859 ----
  bool gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **);
  int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **,
  		    locus * = NULL);
+ bool gfc_find_symbol_by_name (const char *, gfc_namespace *,
+ 				    gfc_symbol **);
  bool gfc_verify_c_interop (gfc_typespec *);
  bool gfc_verify_c_interop_param (gfc_symbol *);
  bool verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *);
*************** void gfc_free_omp_declare_variant_list (
*** 3936,3943 ****
--- 3982,3993 ----
  void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
  void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
  void gfc_free_omp_udr (gfc_omp_udr *);
+ void gfc_free_omp_udm (gfc_omp_udm *);
  void gfc_free_omp_variants (gfc_omp_variant *);
  gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
+ gfc_omp_udm *gfc_omp_udm_find (gfc_symtree *, gfc_typespec *);
+ gfc_omp_udm *gfc_find_omp_udm (gfc_namespace *ns, const char *mapper_id,
+ 			       gfc_typespec *ts);
  void gfc_resolve_omp_allocate (gfc_namespace *, gfc_omp_namelist *);
  void gfc_resolve_omp_assumptions (gfc_omp_assumptions *);
  void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
*************** void gfc_resolve_omp_parallel_blocks (gf
*** 3947,3952 ****
--- 3997,4003 ----
  void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
  void gfc_resolve_omp_declare (gfc_namespace *);
  void gfc_resolve_omp_udrs (gfc_symtree *);
+ void gfc_resolve_omp_udms (gfc_symtree *);
  void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
  void gfc_omp_restore_state (struct gfc_omp_saved_state *);
  void gfc_free_expr_list (gfc_expr_list *);
diff -Nrcpad gcc-17-20260517/gcc/fortran/gfortran.texi gcc-17-20260524/gcc/fortran/gfortran.texi
*** gcc-17-20260517/gcc/fortran/gfortran.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/gfortran.texi	Sun May 24 22:32:06 2026
*************** variables, such as AIX, I/O is also perf
*** 1145,1151 ****
  
  On some systems, such as Darwin or Solaris, the POSIX thread library
  is always linked in, so asynchronous I/O is always performed. On other
! sytems, such as Linux, it is necessary to specify @option{-pthread},
  @option{-lpthread} or @option{-fopenmp} during the linking step.
  
  @c ---------------------------------------------------------------------
--- 1145,1151 ----
  
  On some systems, such as Darwin or Solaris, the POSIX thread library
  is always linked in, so asynchronous I/O is always performed. On other
! systems, such as Linux, it is necessary to specify @option{-pthread},
  @option{-lpthread} or @option{-fopenmp} during the linking step.
  
  @c ---------------------------------------------------------------------
*************** Tools, @url{http://chasm-interop.sourcef
*** 3308,3314 ****
  @cindex prototypes
  @cindex C prototypes
  The options @option{-fc-prototypes} can be used to write out C
! declatations and function prototypes for @code{BIND(C)} entities.
  The same can be done for writing out prototypes for external
  procedures using @option{-fc-prototypes-external},
  @pxref{Interoperability Options}.
--- 3308,3314 ----
  @cindex prototypes
  @cindex C prototypes
  The options @option{-fc-prototypes} can be used to write out C
! declarations and function prototypes for @code{BIND(C)} entities.
  The same can be done for writing out prototypes for external
  procedures using @option{-fc-prototypes-external},
  @pxref{Interoperability Options}.
*************** void (*accessor)(void **, int32_t *, voi
*** 4550,4556 ****
  size_t *))}
  
  @item @emph{Description}:
! Identification of access funtions across images is done using a unique hash.
  For each given hash an accessor has to be registered.  This routine is expected
  to register an accessor function pointer for the given hash in nearly constant
  time.  I.e. it is expected to add the hash and accessor to a buffer and return.
--- 4550,4556 ----
  size_t *))}
  
  @item @emph{Description}:
! Identification of access functions across images is done using a unique hash.
  For each given hash an accessor has to be registered.  This routine is expected
  to register an accessor function pointer for the given hash in nearly constant
  time.  I.e. it is expected to add the hash and accessor to a buffer and return.
*************** lookups.
*** 4634,4640 ****
  @end multitable
  
  @item @emph{Result}:
! The zero based index to access the accessor funtion in a lookup table.
  On error, @code{-1} can be returned.
  
  @item @emph{Notes}:
--- 4634,4640 ----
  @end multitable
  
  @item @emph{Result}:
! The zero based index to access the accessor function in a lookup table.
  On error, @code{-1} can be returned.
  
  @item @emph{Notes}:
diff -Nrcpad gcc-17-20260517/gcc/fortran/intrinsic.texi gcc-17-20260524/gcc/fortran/intrinsic.texi
*** gcc-17-20260517/gcc/fortran/intrinsic.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/intrinsic.texi	Sun May 24 22:32:06 2026
*************** parameters as @var{A}.  The function sha
*** 4127,4133 ****
  the same type and type parameters as @var{A}.  The function shall be the same on
  all images and with regards to the arguments mathematically commutative and
  associative.  Note that @var{OPERATION} may not be an elemental function, unless
! it is an intrisic function.
  @item @var{RESULT_IMAGE} @tab (optional) a scalar integer expression; if
  present, it shall have the same value on all images and refer to an
  image of the current team.
--- 4127,4133 ----
  the same type and type parameters as @var{A}.  The function shall be the same on
  all images and with regards to the arguments mathematically commutative and
  associative.  Note that @var{OPERATION} may not be an elemental function, unless
! it is an intrinsic function.
  @item @var{RESULT_IMAGE} @tab (optional) a scalar integer expression; if
  present, it shall have the same value on all images and refer to an
  image of the current team.
diff -Nrcpad gcc-17-20260517/gcc/fortran/invoke.texi gcc-17-20260524/gcc/fortran/invoke.texi
*** gcc-17-20260517/gcc/fortran/invoke.texi	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/invoke.texi	Sun May 24 22:32:06 2026
*************** and warnings}.
*** 190,196 ****
  -fbounds-check -ftail-call-workaround -ftail-call-workaround=@var{n}
  -fcheck-array-temporaries
  -fcheck=<all|array-temps|bits|bounds|do|mem|pointer|recursion>
! -fcoarray=<none|single|lib> -fexternal-blas -fexternal-blas64 -ff2c
  -ffrontend-loop-interchange -ffrontend-optimize
  -finit-character=@var{n} -finit-integer=@var{n} -finit-local-zero
  -finit-derived -finit-logical=<true|false>
--- 190,196 ----
  -fbounds-check -ftail-call-workaround -ftail-call-workaround=@var{n}
  -fcheck-array-temporaries
  -fcheck=<all|array-temps|bits|bounds|do|mem|pointer|recursion>
! -fcoarray=<none|single|shared|lib> -fexternal-blas -fexternal-blas64 -ff2c
  -ffrontend-loop-interchange -ffrontend-optimize
  -finit-character=@var{n} -finit-integer=@var{n} -finit-local-zero
  -finit-derived -finit-logical=<true|false>
*************** Warn for usage of deprecated OpenMP code
*** 1083,1089 ****
  
  @opindex Wexternal-argument-mismatch
  @cindex warnings, argument mismatch
! @cindex argment mismatch, warnings
  @item -Wexternal-argument-mismatch
  Warn about argument mismatches for dummy external procedures.  This is
  implied by @option{-fc-prototypes-external} because generation of a
--- 1083,1089 ----
  
  @opindex Wexternal-argument-mismatch
  @cindex warnings, argument mismatch
! @cindex argument mismatch, warnings
  @item -Wexternal-argument-mismatch
  Warn about argument mismatches for dummy external procedures.  This is
  implied by @option{-fc-prototypes-external} because generation of a
*************** values for conversion on most systems ar
*** 1517,1523 ****
  big-endian representation for unformatted files; @samp{little-endian}, use
  little-endian representation for unformatted files.
  
! On POWER systems that suppport @option{-mabi=ieeelongdouble},
  there are additional options, which can be combined with others with
  commas.  Those are
  @itemize @w{}
--- 1517,1523 ----
  big-endian representation for unformatted files; @samp{little-endian}, use
  little-endian representation for unformatted files.
  
! On POWER systems that support @option{-mabi=ieeelongdouble},
  there are additional options, which can be combined with others with
  commas.  Those are
  @itemize @w{}
*************** statements produces a compile-time error
*** 1793,1798 ****
--- 1793,1801 ----
  @item @samp{single}
  Single-image mode, i.e. @code{num_images()} is always one.
  
+ @item @samp{shared}
+ Use shared-memory multithreading parallelization.
+ 
  @item @samp{lib}
  Library-based coarray parallelization; a suitable GNU Fortran coarray
  library such as @url{http://opencoarrays.org} needs to be linked.
diff -Nrcpad gcc-17-20260517/gcc/fortran/io.cc gcc-17-20260524/gcc/fortran/io.cc
*** gcc-17-20260517/gcc/fortran/io.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/io.cc	Sun May 24 22:32:06 2026
*************** static gfc_dt *current_dt;
*** 118,128 ****
  enum format_token
  {
    FMT_NONE, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
!   FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_LPAREN,
!   FMT_RPAREN, FMT_X, FMT_SIGN, FMT_BLANK, FMT_CHAR, FMT_P, FMT_IBOZ, FMT_F,
!   FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END,
!   FMT_ERROR, FMT_DC, FMT_DP, FMT_T, FMT_TR, FMT_TL, FMT_STAR, FMT_RC,
!   FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ, FMT_DT
  };
  
  /* Local variables for checking format strings.  The saved_token is
--- 118,128 ----
  enum format_token
  {
    FMT_NONE, FMT_UNKNOWN, FMT_SIGNED_INT, FMT_ZERO, FMT_POSINT, FMT_PERIOD,
!   FMT_COMMA, FMT_COLON, FMT_SLASH, FMT_DOLLAR, FMT_LPAREN, FMT_RPAREN, FMT_X,
!   FMT_SIGN, FMT_BLANK, FMT_CHAR, FMT_P, FMT_IBOZ, FMT_F, FMT_E, FMT_EN, FMT_ES,
!   FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, FMT_ERROR, FMT_DC, FMT_DP, FMT_T,
!   FMT_TR, FMT_TL, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ,
!   FMT_DT, FMT_EX, FMT_LPS, FMT_LPZ, FMT_LZ
  };
  
  /* Local variables for checking format strings.  The saved_token is
*************** format_lex (void)
*** 422,427 ****
--- 422,429 ----
  	token = FMT_EN;
        else if (c == 'S')
          token = FMT_ES;
+       else if (c == 'X')
+ 	token = FMT_EX;
        else
  	{
  	  token = FMT_E;
*************** format_lex (void)
*** 439,444 ****
--- 441,477 ----
        break;
  
      case 'L':
+       c = next_char_not_space ();
+       switch (c)
+ 	{
+ 	case 'P':
+ 	  c = next_char_not_space ();
+ 	  switch (c)
+ 	  {
+ 	    case 'S':
+ 	      token = FMT_LPS;
+ 	      break;
+ 
+ 	    case 'Z':
+ 	      token = FMT_LPZ;
+ 	      break;
+ 
+ 	    default:
+ 	      token = FMT_UNKNOWN;
+ 	      unget_char ();
+ 	      break;
+ 	  }
+ 	  break;
+ 
+ 	case 'Z':
+ 	  token = FMT_LZ;
+ 	  break;
+ 
+ 	default:
+ 	  token = FMT_UNKNOWN;
+ 	  unget_char ();
+ 	  break;
+ 	}
        token = FMT_L;
        break;
  
*************** format_item_1:
*** 746,751 ****
--- 779,785 ----
      case FMT_E:
      case FMT_EN:
      case FMT_ES:
+     case FMT_EX:
      case FMT_G:
      case FMT_L:
      case FMT_A:
*************** data_desc:
*** 879,884 ****
--- 913,919 ----
  
      case FMT_D:
      case FMT_E:
+     case FMT_EX:
      case FMT_G:
      case FMT_EN:
      case FMT_ES:
diff -Nrcpad gcc-17-20260517/gcc/fortran/match.cc gcc-17-20260524/gcc/fortran/match.cc
*** gcc-17-20260517/gcc/fortran/match.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/match.cc	Sun May 24 22:32:06 2026
*************** gfc_free_omp_namelist (gfc_omp_namelist
*** 6345,6350 ****
--- 6345,6351 ----
    bool free_align_allocator = (list == OMP_LIST_ALLOCATE);
    bool free_mem_traits_space = (list == OMP_LIST_USES_ALLOCATORS);
    bool free_init = (list == OMP_LIST_INIT);
+   bool free_mapper = (list == OMP_LIST_MAP);
  
    gfc_omp_namelist *n;
    gfc_expr *last_allocator = NULL;
*************** gfc_free_omp_namelist (gfc_omp_namelist
*** 6378,6384 ****
  	      free (name->u2.init_interop);
  	    }
  	}
!       else if (name->u2.udr)
  	{
  	  if (name->u2.udr->combiner)
  	    gfc_free_statement (name->u2.udr->combiner);
--- 6379,6387 ----
  	      free (name->u2.init_interop);
  	    }
  	}
!       else if (free_mapper)
! 	{ } /* For now, u2.udm is not a pointer.  */
!       else if (!free_mapper && name->u2.udr)
  	{
  	  if (name->u2.udr->combiner)
  	    gfc_free_statement (name->u2.udr->combiner);
diff -Nrcpad gcc-17-20260517/gcc/fortran/match.h gcc-17-20260524/gcc/fortran/match.h
*** gcc-17-20260517/gcc/fortran/match.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/match.h	Sun May 24 22:32:06 2026
*************** match gfc_match_omp_begin_metadirective
*** 159,164 ****
--- 159,165 ----
  match gfc_match_omp_cancel (void);
  match gfc_match_omp_cancellation_point (void);
  match gfc_match_omp_critical (void);
+ match gfc_match_omp_declare_mapper (void);
  match gfc_match_omp_declare_reduction (void);
  match gfc_match_omp_declare_simd (void);
  match gfc_match_omp_declare_target (void);
diff -Nrcpad gcc-17-20260517/gcc/fortran/openmp.cc gcc-17-20260524/gcc/fortran/openmp.cc
*** gcc-17-20260517/gcc/fortran/openmp.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/openmp.cc	Sun May 24 22:32:06 2026
*************** static const struct gfc_omp_directive gf
*** 70,76 ****
    {"cancel", GFC_OMP_DIR_EXECUTABLE, ST_OMP_CANCEL},
    {"critical", GFC_OMP_DIR_EXECUTABLE, ST_OMP_CRITICAL},
    /* {"declare induction", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_INDUCTION}, */
!   /* {"declare mapper", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_MAPPER}, */
    {"declare reduction", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_REDUCTION},
    {"declare simd", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_SIMD},
    {"declare target", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_TARGET},
--- 70,76 ----
    {"cancel", GFC_OMP_DIR_EXECUTABLE, ST_OMP_CANCEL},
    {"critical", GFC_OMP_DIR_EXECUTABLE, ST_OMP_CRITICAL},
    /* {"declare induction", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_INDUCTION}, */
!   {"declare mapper", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_MAPPER},
    {"declare reduction", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_REDUCTION},
    {"declare simd", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_SIMD},
    {"declare target", GFC_OMP_DIR_DECLARATIVE, ST_OMP_DECLARE_TARGET},
*************** gfc_free_omp_variants (gfc_omp_variant *
*** 379,384 ****
--- 379,397 ----
      }
  }
  
+ /* Free an !$omp declare mapper.  */
+ 
+ void
+ gfc_free_omp_udm (gfc_omp_udm *omp_udm)
+ {
+   if (omp_udm)
+     {
+       gfc_free_omp_udm (omp_udm->next);
+       gfc_free_namespace (omp_udm->mapper_ns);
+       free (omp_udm);
+     }
+ }
+ 
  static gfc_omp_udr *
  gfc_find_omp_udr (gfc_namespace *ns, const char *name, gfc_typespec *ts)
  {
*************** gfc_match_dupl_atomic (bool not_dupl, co
*** 2379,2391 ****
  			       "clause at %L");
  }
  
  /* Match OpenMP and OpenACC directive clauses. MASK is a bitmask of
     clauses that are allowed for a particular directive.  */
  
  static match
  gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
  		       bool first = true, bool needs_space = true,
! 		       bool openacc = false, bool openmp_target = false)
  {
    bool error = false;
    gfc_omp_clauses *c = gfc_get_omp_clauses ();
--- 2392,2443 ----
  			       "clause at %L");
  }
  
+ 
+ /* Search upwards though namespace NS and its parents to find an
+    !$omp declare mapper named MAPPER_ID, for typespec TS.  */
+ 
+ gfc_omp_udm *
+ gfc_find_omp_udm (gfc_namespace *ns, const char *mapper_id, gfc_typespec *ts)
+ {
+   gfc_symtree *st;
+ 
+   if (ns == NULL)
+     ns = gfc_current_ns;
+ 
+   do
+     {
+       gfc_omp_udm *omp_udm;
+ 
+       st = gfc_find_symtree (ns->omp_udm_root, mapper_id);
+ 
+       if (st != NULL)
+ 	{
+ 	  for (omp_udm = st->n.omp_udm; omp_udm; omp_udm = omp_udm->next)
+ 	    if (gfc_compare_types (&omp_udm->ts, ts))
+ 	      return omp_udm;
+ 	}
+ 
+       /* Don't escape an interface block.  */
+       if (ns && !ns->has_import_set
+ 	  && ns->proc_name && ns->proc_name->attr.if_source == IFSRC_IFBODY)
+ 	break;
+ 
+       ns = ns->parent;
+     }
+   while (ns != NULL);
+ 
+   return NULL;
+ }
+ 
+ 
  /* Match OpenMP and OpenACC directive clauses. MASK is a bitmask of
     clauses that are allowed for a particular directive.  */
  
  static match
  gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
  		       bool first = true, bool needs_space = true,
! 		       bool openacc = false, bool openmp_target = false,
! 		       gfc_omp_map_op default_map_op = OMP_MAP_TOFROM)
  {
    bool error = false;
    gfc_omp_clauses *c = gfc_get_omp_clauses ();
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3682,3690 ****
--- 3734,3745 ----
  	      int always_modifier = 0;
  	      int close_modifier = 0;
  	      int present_modifier = 0;
+ 	      int mapper_modifier = 0;
  	      locus second_always_locus = old_loc2;
  	      locus second_close_locus = old_loc2;
+ 	      locus second_mapper_locus = old_loc2;
  	      locus second_present_locus = old_loc2;
+ 	      char mapper_id[GFC_MAX_SYMBOL_LEN + 1] = { '\0' };
  
  	      for (;;)
  		{
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3704,3709 ****
--- 3759,3772 ----
  		      if (present_modifier++ == 1)
  			second_present_locus = current_locus;
  		    }
+ 		  else if (gfc_match ("mapper ( ") == MATCH_YES)
+ 		    {
+ 		      if (mapper_modifier++ == 1)
+ 			second_mapper_locus = current_locus;
+ 		      m = gfc_match (" %n ) ", mapper_id);
+ 		      if (m != MATCH_YES)
+ 			goto error;
+ 		    }
  		  else
  		    break;
  		  if (gfc_match (", ") != MATCH_YES)
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3714,3720 ****
  				 "OpenMP 5.2");
  		}
  
! 	      gfc_omp_map_op map_op = OMP_MAP_TOFROM;
  	      int always_present_modifier
  		= always_modifier && present_modifier;
  
--- 3777,3783 ----
  				 "OpenMP 5.2");
  		}
  
! 	      gfc_omp_map_op map_op = default_map_op;
  	      int always_present_modifier
  		= always_modifier && present_modifier;
  
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3745,3750 ****
--- 3808,3814 ----
  		  gfc_current_locus = old_loc2;
  		  always_modifier = 0;
  		  close_modifier = 0;
+ 		  mapper_modifier = 0;
  		}
  
  	      if (always_modifier > 1)
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3765,3770 ****
--- 3829,3840 ----
  			     &second_present_locus);
  		  break;
  		}
+ 	      if (mapper_modifier > 1)
+ 		{
+ 		  gfc_error ("too many %<mapper%> modifiers at %L",
+ 			     &second_mapper_locus);
+ 		  break;
+ 		}
  
  	      head = NULL;
  	      if (gfc_match_omp_variable_list ("", &c->lists[OMP_LIST_MAP],
*************** gfc_match_omp_clauses (gfc_omp_clauses *
*** 3773,3779 ****
  		{
  		  gfc_omp_namelist *n;
  		  for (n = *head; n; n = n->next)
! 		    n->u.map.op = map_op;
  		  continue;
  		}
  	      gfc_current_locus = old_loc;
--- 3843,3864 ----
  		{
  		  gfc_omp_namelist *n;
  		  for (n = *head; n; n = n->next)
! 		    {
! 		      n->u.map.op = map_op;
! 
! 		      gfc_typespec *ts;
! 		      if (n->expr)
! 			ts = &n->expr->ts;
! 		      else
! 			ts = &n->sym->ts;
! 
! 		      gfc_omp_udm *udm
! 			= gfc_find_omp_udm (gfc_current_ns, mapper_id, ts);
! 		      if (udm)
! 			{
! 			  n->u2.udm.udm = udm;
! 			}
! 		    }
  		  continue;
  		}
  	      gfc_current_locus = old_loc;
*************** gfc_match_omp_declare_simd (void)
*** 5793,5798 ****
--- 5878,6046 ----
  }
  
  
+ /* Find a matching "!$omp declare mapper" for typespec TS in symtree ST.  */
+ 
+ gfc_omp_udm *
+ gfc_omp_udm_find (gfc_symtree *st, gfc_typespec *ts)
+ {
+   gfc_omp_udm *omp_udm;
+ 
+   if (st == NULL)
+     return NULL;
+ 
+   for (omp_udm = st->n.omp_udm; omp_udm; omp_udm = omp_udm->next)
+     if ((omp_udm->ts.type == BT_DERIVED || omp_udm->ts.type == BT_CLASS)
+ 	&& (ts->type == BT_DERIVED || ts->type == BT_CLASS)
+ 	&& strcmp (omp_udm->ts.u.derived->name, ts->u.derived->name) == 0)
+       return omp_udm;
+ 
+   return NULL;
+ }
+ 
+ 
+ /* Match !$omp declare mapper([ mapper-identifier : ] type :: var) clauses-list  */
+ 
+ match
+ gfc_match_omp_declare_mapper (void)
+ {
+   match m;
+   gfc_typespec ts;
+   char mapper_id[GFC_MAX_SYMBOL_LEN + 1];
+   char var[GFC_MAX_SYMBOL_LEN + 1];
+   gfc_namespace *mapper_ns = NULL;
+   gfc_symtree *var_st;
+   gfc_symtree *st;
+   gfc_omp_udm *omp_udm = NULL, *prev_udm = NULL;
+   locus where = gfc_current_locus;
+ 
+   if (gfc_match_char ('(') != MATCH_YES)
+     {
+       gfc_error ("Expected %<(%> at %C");
+       return MATCH_ERROR;
+     }
+ 
+   locus old_locus = gfc_current_locus;
+ 
+   m = gfc_match (" %n : ", mapper_id);
+ 
+   if (m == MATCH_ERROR)
+     return MATCH_ERROR;
+ 
+   /* As a special case, a mapper named "default" and an unnamed mapper are
+      both the default mapper for a given type.  */
+   if (strcmp (mapper_id, "default") == 0)
+     mapper_id[0] = '\0';
+ 
+   if (gfc_peek_ascii_char () == ':')
+    {
+      /* If we see '::', the user did not name the mapper, and instead we just
+ 	saw the type.  So backtrack and try parsing as a type instead.  */
+      mapper_id[0] = '\0';
+      gfc_current_locus = old_locus;
+    }
+   old_locus = gfc_current_locus;
+ 
+   m = gfc_match_type_spec (&ts);
+   if (m != MATCH_YES)
+     {
+       gfc_error ("Expected either a type name at %L or a map-type "
+ 		 "identifier, a colon, or a type name", &old_locus);
+       return MATCH_ERROR;
+     }
+ 
+   if (ts.type != BT_DERIVED)
+     {
+       gfc_error ("!$OMP DECLARE MAPPER with non-derived type at %L", &old_locus);
+       return MATCH_ERROR;
+     }
+ 
+   if (gfc_match (" :: ") != MATCH_YES)
+     {
+       gfc_error ("Expected %<::%> at %C");
+       return MATCH_ERROR;
+     }
+ 
+   if (gfc_match_name (var) != MATCH_YES)
+     {
+       gfc_error ("Expected variable name at %C");
+       return MATCH_ERROR;
+     }
+ 
+   if (gfc_match_char (')') != MATCH_YES)
+     {
+       gfc_error ("Expected %<)%> at %C");
+       return MATCH_ERROR;
+     }
+ 
+   st = gfc_find_symtree (gfc_current_ns->omp_udm_root, mapper_id);
+ 
+   /* Now we need to set up a new namespace, and create a new sym_tree for our
+      dummy variable so we can use it in the following list of mapping
+      clauses.  */
+ 
+   gfc_current_ns = mapper_ns = gfc_get_namespace (gfc_current_ns, 1);
+   mapper_ns->proc_name = mapper_ns->parent->proc_name;
+   mapper_ns->omp_udm_ns = 1;
+ 
+   gfc_get_sym_tree (var, mapper_ns, &var_st, false);
+   var_st->n.sym->ts = ts;
+   var_st->n.sym->attr.omp_udm_artificial_var = 1;
+   var_st->n.sym->attr.flavor = FL_VARIABLE;
+   gfc_commit_symbols ();
+ 
+   gfc_omp_clauses *clauses = NULL;
+ 
+   m = gfc_match_omp_clauses (&clauses, omp_mask (OMP_CLAUSE_MAP), true, true,
+ 			     false, false, OMP_MAP_UNSET);
+   if (m != MATCH_YES)
+     goto failure;
+ 
+   omp_udm = gfc_get_omp_udm ();
+   omp_udm->next = NULL;
+   omp_udm->where = where;
+   omp_udm->mapper_id = gfc_get_string ("%s", mapper_id);
+   omp_udm->ts = ts;
+   omp_udm->var_sym = var_st->n.sym;
+   omp_udm->mapper_ns = mapper_ns;
+   omp_udm->clauses = clauses;
+ 
+   gfc_current_ns = mapper_ns->parent;
+ 
+   prev_udm = gfc_omp_udm_find (st, &ts);
+   if (prev_udm)
+     {
+       if (mapper_id[0])
+ 	gfc_error ("Redefinition of !$OMP DECLARE MAPPER at %L for type %qs with id %qs",
+ 		   &where, gfc_typename (&ts), mapper_id);
+       else
+ 	gfc_error ("Redefinition of !$OMP DECLARE MAPPER at %L for type %qs",
+ 		   &where, gfc_typename (&ts));
+       inform (gfc_get_location (&prev_udm->where),
+ 	      "Previous !$OMP DECLARE MAPPER here");
+       return MATCH_ERROR;
+     }
+   else if (st)
+     {
+       omp_udm->next = st->n.omp_udm;
+       st->n.omp_udm = omp_udm;
+     }
+   else
+     {
+       st = gfc_new_symtree (&gfc_current_ns->omp_udm_root, mapper_id);
+       st->n.omp_udm = omp_udm;
+     }
+ 
+   return MATCH_YES;
+ 
+ failure:
+   if (mapper_ns)
+     gfc_current_ns = mapper_ns->parent;
+   gfc_free_omp_udm (omp_udm);
+ 
+   return MATCH_ERROR;
+ }
+ 
+ 
  static bool
  match_udr_expr (gfc_symtree *omp_sym1, gfc_symtree *omp_sym2)
  {
*************** resolve_omp_clauses (gfc_code *code, gfc
*** 9145,9153 ****
  	n->sym->reduc_mark = 0;
  	if (n->sym->attr.flavor == FL_VARIABLE
  	    || n->sym->attr.proc_pointer
! 	    || (!code && (!n->sym->attr.dummy || n->sym->ns != ns)))
  	  {
! 	    if (!code && (!n->sym->attr.dummy || n->sym->ns != ns))
  	      gfc_error ("Variable %qs is not a dummy argument at %L",
  			 n->sym->name, &n->where);
  	    continue;
--- 9393,9405 ----
  	n->sym->reduc_mark = 0;
  	if (n->sym->attr.flavor == FL_VARIABLE
  	    || n->sym->attr.proc_pointer
! 	    || (!code
! 		&& !ns->omp_udm_ns
! 		&& (!n->sym->attr.dummy || n->sym->ns != ns)))
  	  {
! 	    if (!code
! 		&& !ns->omp_udm_ns
! 		&& (!n->sym->attr.dummy || n->sym->ns != ns))
  	      gfc_error ("Variable %qs is not a dummy argument at %L",
  			 n->sym->name, &n->where);
  	    continue;
*************** resolve_omp_clauses (gfc_code *code, gfc
*** 9293,9299 ****
  		gfc_error ("Symbol %qs has mixed component and non-component "
  			   "accesses at %L", n->sym->name, &n->where);
  	    }
! 	  else if (n->sym->mark)
  	    gfc_error ("Symbol %qs present on multiple clauses at %L",
  		       n->sym->name, &n->where);
  	  else
--- 9545,9551 ----
  		gfc_error ("Symbol %qs has mixed component and non-component "
  			   "accesses at %L", n->sym->name, &n->where);
  	    }
! 	  else if ((openacc || list != OMP_LIST_MAP) && n->sym->mark)
  	    gfc_error ("Symbol %qs present on multiple clauses at %L",
  		       n->sym->name, &n->where);
  	  else
*************** resolve_omp_clauses (gfc_code *code, gfc
*** 9879,9885 ****
  			   array isn't contiguous.  An expression such as
  			   arr(-n:n,-n:n) could be contiguous even if it looks
  			   like it may not be.  */
! 			if (code->op != EXEC_OACC_UPDATE
  			    && list != OMP_LIST_CACHE
  			    && list != OMP_LIST_DEPEND
  			    && !gfc_is_simply_contiguous (n->expr, false, true)
--- 10131,10138 ----
  			   array isn't contiguous.  An expression such as
  			   arr(-n:n,-n:n) could be contiguous even if it looks
  			   like it may not be.  */
! 			if (code
! 			    && code->op != EXEC_OACC_UPDATE
  			    && list != OMP_LIST_CACHE
  			    && list != OMP_LIST_DEPEND
  			    && !gfc_is_simply_contiguous (n->expr, false, true)
*************** resolve_omp_clauses (gfc_code *code, gfc
*** 9991,9997 ****
  			 && n->sym->as->type == AS_ASSUMED_SIZE)
  		  gfc_error ("Assumed size array %qs in %s clause at %L",
  			     n->sym->name, name, &n->where);
! 		if (list == OMP_LIST_MAP && !openacc)
  		  switch (code->op)
  		    {
  		    case EXEC_OMP_TARGET:
--- 10244,10250 ----
  			 && n->sym->as->type == AS_ASSUMED_SIZE)
  		  gfc_error ("Assumed size array %qs in %s clause at %L",
  			     n->sym->name, name, &n->where);
! 		if (code && list == OMP_LIST_MAP && !openacc)
  		  switch (code->op)
  		    {
  		    case EXEC_OMP_TARGET:
*************** gfc_resolve_omp_udrs (gfc_symtree *st)
*** 13739,13741 ****
--- 13992,14024 ----
    for (omp_udr = st->n.omp_udr; omp_udr; omp_udr = omp_udr->next)
      gfc_resolve_omp_udr (omp_udr);
  }
+ 
+ /* Resolve !$omp declare mapper constructs.  */
+ 
+ static void
+ gfc_resolve_omp_udm (gfc_omp_udm *omp_udm)
+ {
+   resolve_omp_clauses (NULL, omp_udm->clauses, omp_udm->mapper_ns);
+ 
+   gfc_omp_namelist *n;
+   for (n = omp_udm->clauses->lists[OMP_LIST_MAP]; n; n = n->next)
+     if (n->sym == omp_udm->var_sym)
+       break;
+   if (!n)
+     gfc_error ("At least one %<map%> clause in !$OMP DECLARE MAPPER at %L must "
+ 	       "map %qs or an element of it",
+ 	       &omp_udm->where, omp_udm->var_sym->name);
+ }
+ 
+ void
+ gfc_resolve_omp_udms (gfc_symtree *st)
+ {
+   gfc_omp_udm *omp_udm;
+ 
+   if (st == NULL)
+     return;
+   gfc_resolve_omp_udms (st->left);
+   gfc_resolve_omp_udms (st->right);
+   for (omp_udm = st->n.omp_udm; omp_udm; omp_udm = omp_udm->next)
+     gfc_resolve_omp_udm (omp_udm);
+ }
diff -Nrcpad gcc-17-20260517/gcc/fortran/parse.cc gcc-17-20260524/gcc/fortran/parse.cc
*** gcc-17-20260517/gcc/fortran/parse.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/parse.cc	Sun May 24 22:32:06 2026
*************** decode_omp_directive (void)
*** 1014,1019 ****
--- 1014,1021 ----
        break;
  
      case 'd':
+       matchdo ("declare mapper", gfc_match_omp_declare_mapper,
+ 	       ST_OMP_DECLARE_MAPPER);
        matchds ("declare reduction", gfc_match_omp_declare_reduction,
  	       ST_OMP_DECLARE_REDUCTION);
        matchds ("declare simd", gfc_match_omp_declare_simd,
*************** next_statement (void)
*** 1993,1999 ****
  #define case_omp_decl case ST_OMP_THREADPRIVATE: case ST_OMP_DECLARE_SIMD: \
    case ST_OMP_DECLARE_TARGET: case ST_OMP_DECLARE_REDUCTION: \
    case ST_OMP_DECLARE_VARIANT: case ST_OMP_ALLOCATE: case ST_OMP_ASSUMES: \
!   case ST_OMP_REQUIRES: case ST_OMP_GROUPPRIVATE: \
    case ST_OACC_ROUTINE: case ST_OACC_DECLARE
  
  /* OpenMP statements that are followed by a structured block.  */
--- 1995,2001 ----
  #define case_omp_decl case ST_OMP_THREADPRIVATE: case ST_OMP_DECLARE_SIMD: \
    case ST_OMP_DECLARE_TARGET: case ST_OMP_DECLARE_REDUCTION: \
    case ST_OMP_DECLARE_VARIANT: case ST_OMP_ALLOCATE: case ST_OMP_ASSUMES: \
!   case ST_OMP_REQUIRES: case ST_OMP_GROUPPRIVATE: case ST_OMP_DECLARE_MAPPER: \
    case ST_OACC_ROUTINE: case ST_OACC_DECLARE
  
  /* OpenMP statements that are followed by a structured block.  */
*************** gfc_ascii_statement (gfc_statement st, b
*** 2685,2690 ****
--- 2687,2695 ----
      case ST_OMP_CRITICAL:
        p = "!$OMP CRITICAL";
        break;
+     case ST_OMP_DECLARE_MAPPER:
+       p = "!$OMP DECLARE MAPPER";
+       break;
      case ST_OMP_DECLARE_REDUCTION:
        p = "!$OMP DECLARE REDUCTION";
        break;
diff -Nrcpad gcc-17-20260517/gcc/fortran/resolve.cc gcc-17-20260524/gcc/fortran/resolve.cc
*** gcc-17-20260517/gcc/fortran/resolve.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/resolve.cc	Sun May 24 22:32:06 2026
*************** gfc_verify_binding_labels (gfc_symbol *s
*** 15084,15089 ****
--- 15084,15096 ----
  	{
  	  gfc_symbol *global_sym;
  	  gfc_find_symbol (gsym->sym_name, gsym->ns, 0, &global_sym);
+ 
+ 	  /* For when the symtree does not match the symbol name, which can happen
+ 	     in modules with PRIVATE.  */
+ 
+ 	  if (global_sym == NULL)
+ 	    gfc_find_symbol_by_name (gsym->sym_name, gsym->ns, &global_sym);
+ 
  	  gcc_assert (global_sym);
  
  	  /* If subroutines and functions are conflated, there is little point
*************** resolve_types (gfc_namespace *ns)
*** 20597,20602 ****
--- 20604,20614 ----
  
    gfc_resolve_omp_udrs (ns->omp_udr_root);
  
+   gfc_resolve_omp_udms (ns->omp_udm_root);
+   if (ns->omp_udm_root)
+     gfc_error ("Sorry, %<declare mapper%>, used at %L, is not yet implemented",
+ 	       &ns->omp_udm_root->n.omp_udm->where);
+ 
    ns->types_resolved = 1;
  
    gfc_current_ns = old_ns;
diff -Nrcpad gcc-17-20260517/gcc/fortran/symbol.cc gcc-17-20260524/gcc/fortran/symbol.cc
*** gcc-17-20260517/gcc/fortran/symbol.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/symbol.cc	Sun May 24 22:32:06 2026
*************** free_omp_udr_tree (gfc_symtree * omp_udr
*** 4189,4194 ****
--- 4189,4209 ----
    free (omp_udr_tree);
  }
  
+ /* Similar, for !$omp declare mappers.  */
+ 
+ static void
+ free_omp_udm_tree (gfc_symtree *omp_udm_tree)
+ {
+   if (omp_udm_tree == NULL)
+     return;
+ 
+   free_omp_udm_tree (omp_udm_tree->left);
+   free_omp_udm_tree (omp_udm_tree->right);
+ 
+   gfc_free_omp_udm (omp_udm_tree->n.omp_udm);
+   free (omp_udm_tree);
+ }
+ 
  
  /* Recursive function that deletes an entire tree and all the user
     operator nodes that it contains.  */
*************** gfc_free_namespace (gfc_namespace *&ns)
*** 4363,4368 ****
--- 4378,4384 ----
    free_uop_tree (ns->uop_root);
    free_common_tree (ns->common_root);
    free_omp_udr_tree (ns->omp_udr_root);
+   free_omp_udm_tree (ns->omp_udm_root);
    free_tb_tree (ns->tb_sym_root);
    free_tb_tree (ns->tb_uop_root);
    gfc_free_finalizer_list (ns->finalizers);
*************** gfc_get_spec_ns (gfc_symbol *sym)
*** 5711,5713 ****
--- 5727,5759 ----
  
    return sym->ns;
  }
+ 
+ /* This section deals with looking up a symbol when the symtree name and symbol
+    name do not agree, so gfc_find_symbol() cannot be used.  */
+ 
+ static gfc_symbol* found_sym;		/* Where to store the symbol.  */
+ static const char* sym_target_name;	/* What name to look for.  */
+ 
+ /* Helper function.  */
+ 
+ static void
+ compare_target_sym_name (gfc_symbol *sym)
+ {
+   if (strcmp(sym->name, sym_target_name) == 0)
+     found_sym = sym;
+ }
+ 
+ /* Search for a symbol when the symtree name may be different from the
+    symbol name.  Return true if found.  */
+ 
+ bool
+ gfc_find_symbol_by_name (const char *name, gfc_namespace *ns,
+ 			       gfc_symbol **result)
+ {
+   found_sym = NULL;
+   sym_target_name = name;
+ 
+   do_traverse_symtree (ns->sym_root, NULL, compare_target_sym_name);
+   *result = found_sym;
+   return result != 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/fortran/trans-expr.cc gcc-17-20260524/gcc/fortran/trans-expr.cc
*** gcc-17-20260517/gcc/fortran/trans-expr.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/trans-expr.cc	Sun May 24 22:32:06 2026
*************** gfc_conv_subref_array_arg (gfc_se *se, g
*** 5724,5730 ****
  
    gcc_assert (lse.ss == gfc_ss_terminator);
  
!   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, true);
    gfc_add_expr_to_block (&body, tmp);
  
    /* Generate the copying loops.  */
--- 5724,5732 ----
  
    gcc_assert (lse.ss == gfc_ss_terminator);
  
!   /* Do not do deallocations when we are looking at a g77-style argument.  */
! 
!   tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, false, !g77);
    gfc_add_expr_to_block (&body, tmp);
  
    /* Generate the copying loops.  */
*************** gfc_trans_assignment_1 (gfc_expr * expr1
*** 13271,13283 ****
         && !CLASS_DATA (expr2)->attr.class_pointer
         && !CLASS_DATA (expr2)->attr.allocatable);
  
    is_poly_assign
      = (use_vptr_copy
         || ((lhs_attr.pointer || lhs_attr.allocatable) && !lhs_attr.dimension))
        && (expr1->ts.type == BT_CLASS || gfc_is_class_array_ref (expr1, NULL)
  	  || gfc_is_class_scalar_expr (expr1)
  	  || gfc_is_class_array_ref (expr2, NULL)
! 	  || gfc_is_class_scalar_expr (expr2))
        && lhs_attr.flavor != FL_PROCEDURE;
  
    assoc_assign = is_assoc_assign (expr1, expr2);
--- 13273,13291 ----
         && !CLASS_DATA (expr2)->attr.class_pointer
         && !CLASS_DATA (expr2)->attr.allocatable);
  
+   /* What can be sent to trans_class_assignment includes all the obvious
+      candidates but scalar assignment of a class expression to a derived type
+      must be done using gfc_trans_scalar_assign; partly because it is simpler
+      and partly because some cases fail, eg. class assignment to derived_type
+      select type temporaries.  */
    is_poly_assign
      = (use_vptr_copy
         || ((lhs_attr.pointer || lhs_attr.allocatable) && !lhs_attr.dimension))
        && (expr1->ts.type == BT_CLASS || gfc_is_class_array_ref (expr1, NULL)
  	  || gfc_is_class_scalar_expr (expr1)
  	  || gfc_is_class_array_ref (expr2, NULL)
! 	  || (gfc_is_class_scalar_expr (expr2)
! 	      && !(expr1->ts.type == BT_DERIVED && !lhs_attr.dimension)))
        && lhs_attr.flavor != FL_PROCEDURE;
  
    assoc_assign = is_assoc_assign (expr1, expr2);
diff -Nrcpad gcc-17-20260517/gcc/fortran/trans-openmp.cc gcc-17-20260524/gcc/fortran/trans-openmp.cc
*** gcc-17-20260517/gcc/fortran/trans-openmp.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/trans-openmp.cc	Sun May 24 22:32:06 2026
*************** gfc_trans_omp_clauses (stmtblock_t *bloc
*** 4308,4313 ****
--- 4308,4342 ----
  	case OMP_LIST_MAP:
  	  for (; n != NULL; n = n->next)
  	    {
+ 	      if (!openacc)
+ 		{
+ 		  // Remove duplicates
+ 		  bool skip = false;
+ 		  for (gfc_omp_namelist *n2 = n->next; n2 != NULL;
+ 		       n2 = n2->next)
+ 		    {
+ 		      if (n2->sym == n->sym
+ 			  && gfc_dep_compare_expr (n2->expr, n->expr) == 0)
+ 			{
+ 			  if (n2->u.map.op == n->u.map.op)
+ 			    {
+ 			      skip = true;
+ 			      break;
+ 			    }
+ 			  else if ((n2->u.map.op & ~OMP_MAP_TOFROM)
+ 				   == (n->u.map.op & ~OMP_MAP_TOFROM))
+ 			    {
+ 			      n2->u.map.op = (enum gfc_omp_map_op) (
+ 				n->u.map.op | n2->u.map.op);
+ 			      skip = true;
+ 			      break;
+ 			    }
+ 			}
+ 		    }
+ 		  if (skip)
+ 		    continue;
+ 		}
+ 
  	      if (!n->sym->attr.referenced
  		  || n->sym->attr.flavor == FL_PARAMETER)
  		continue;
diff -Nrcpad gcc-17-20260517/gcc/fortran/trans.cc gcc-17-20260524/gcc/fortran/trans.cc
*** gcc-17-20260517/gcc/fortran/trans.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/fortran/trans.cc	Sun May 24 22:32:06 2026
*************** gfc_assignment_finalizer_call (gfc_se *l
*** 1570,1576 ****
  	  gfc_init_se (&se, NULL);
  	  if (expr1->rank)
  	    {
! 	      gfc_conv_expr_descriptor (&se, expr1);
  	      ptr = gfc_conv_descriptor_data_get (se.expr);
  	    }
  	  else
--- 1570,1579 ----
  	  gfc_init_se (&se, NULL);
  	  if (expr1->rank)
  	    {
! 	      /* Avoid calling trans-array.cc(set_factored_descriptor_value) by
! 		 not using gfc_conv_expr_descriptor.  */
! 	      se.descriptor_only = 1;
! 	      gfc_conv_expr (&se, expr1);
  	      ptr = gfc_conv_descriptor_data_get (se.expr);
  	    }
  	  else
diff -Nrcpad gcc-17-20260517/gcc/gimple-fold.cc gcc-17-20260524/gcc/gimple-fold.cc
*** gcc-17-20260517/gcc/gimple-fold.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/gimple-fold.cc	Sun May 24 22:32:06 2026
*************** gimple_build_round_up (gimple_stmt_itera
*** 11436,11469 ****
  }
  
  /* Return true if the result of assignment STMT is known to be non-negative.
!    If the return value is based on the assumption that signed overflow is
!    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_assign_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p,
! 				   int depth)
  {
    enum tree_code code = gimple_assign_rhs_code (stmt);
    tree type = TREE_TYPE (gimple_assign_lhs (stmt));
    switch (get_gimple_rhs_class (code))
      {
      case GIMPLE_UNARY_RHS:
!       return tree_unary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
! 					     type,
! 					     gimple_assign_rhs1 (stmt),
! 					     strict_overflow_p, depth);
      case GIMPLE_BINARY_RHS:
!       return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
! 					      type,
! 					      gimple_assign_rhs1 (stmt),
! 					      gimple_assign_rhs2 (stmt),
! 					      strict_overflow_p, depth);
      case GIMPLE_TERNARY_RHS:
        return false;
      case GIMPLE_SINGLE_RHS:
!       return tree_single_nonnegative_warnv_p (gimple_assign_rhs1 (stmt),
! 					      strict_overflow_p, depth);
      case GIMPLE_INVALID_RHS:
        break;
      }
--- 11436,11466 ----
  }
  
  /* Return true if the result of assignment STMT is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_assign_nonnegative_p (gimple *stmt, int depth)
  {
    enum tree_code code = gimple_assign_rhs_code (stmt);
    tree type = TREE_TYPE (gimple_assign_lhs (stmt));
    switch (get_gimple_rhs_class (code))
      {
      case GIMPLE_UNARY_RHS:
!       return tree_unary_nonnegative_p (gimple_assign_rhs_code (stmt),
! 				       type,
! 				       gimple_assign_rhs1 (stmt),
! 				       depth);
      case GIMPLE_BINARY_RHS:
!       return tree_binary_nonnegative_p (gimple_assign_rhs_code (stmt),
! 					type,
! 					gimple_assign_rhs1 (stmt),
! 					gimple_assign_rhs2 (stmt),
! 					depth);
      case GIMPLE_TERNARY_RHS:
        return false;
      case GIMPLE_SINGLE_RHS:
!       return tree_single_nonnegative_p (gimple_assign_rhs1 (stmt),
! 					depth);
      case GIMPLE_INVALID_RHS:
        break;
      }
*************** gimple_assign_nonnegative_warnv_p (gimpl
*** 11471,11483 ****
  }
  
  /* Return true if return value of call STMT is known to be non-negative.
!    If the return value is based on the assumption that signed overflow is
!    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_call_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p,
! 				 int depth)
  {
    tree arg0
      = gimple_call_num_args (stmt) > 0 ? gimple_call_arg (stmt, 0) : NULL_TREE;
--- 11468,11477 ----
  }
  
  /* Return true if return value of call STMT is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_call_nonnegative_p (gimple *stmt, int depth)
  {
    tree arg0
      = gimple_call_num_args (stmt) > 0 ? gimple_call_arg (stmt, 0) : NULL_TREE;
*************** gimple_call_nonnegative_warnv_p (gimple
*** 11485,11522 ****
      = gimple_call_num_args (stmt) > 1 ? gimple_call_arg (stmt, 1) : NULL_TREE;
    tree lhs = gimple_call_lhs (stmt);
    return (lhs
! 	  && tree_call_nonnegative_warnv_p (TREE_TYPE (lhs),
! 					    gimple_call_combined_fn (stmt),
! 					    arg0, arg1,
! 					    strict_overflow_p, depth));
  }
  
  /* Return true if return value of call STMT is known to be non-negative.
!    If the return value is based on the assumption that signed overflow is
!    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_phi_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p,
! 				int depth)
  {
    for (unsigned i = 0; i < gimple_phi_num_args (stmt); ++i)
      {
        tree arg = gimple_phi_arg_def (stmt, i);
!       if (!tree_single_nonnegative_warnv_p (arg, strict_overflow_p, depth + 1))
  	return false;
      }
    return true;
  }
  
  /* Return true if STMT is known to compute a non-negative value.
!    If the return value is based on the assumption that signed overflow is
!    undefined, set *STRICT_OVERFLOW_P to true; otherwise, don't change
!    *STRICT_OVERFLOW_P.  DEPTH is the current nesting depth of the query.  */
  
  bool
! gimple_stmt_nonnegative_warnv_p (gimple *stmt, bool *strict_overflow_p,
! 				 int depth)
  {
    tree type = gimple_range_type (stmt);
    if (type && frange::supports_p (type))
--- 11479,11509 ----
      = gimple_call_num_args (stmt) > 1 ? gimple_call_arg (stmt, 1) : NULL_TREE;
    tree lhs = gimple_call_lhs (stmt);
    return (lhs
! 	  && tree_call_nonnegative_p (TREE_TYPE (lhs),
! 				      gimple_call_combined_fn (stmt),
! 				      arg0, arg1, depth));
  }
  
  /* Return true if return value of call STMT is known to be non-negative.
!    DEPTH is the current nesting depth of the query.  */
  
  static bool
! gimple_phi_nonnegative_p (gimple *stmt, int depth)
  {
    for (unsigned i = 0; i < gimple_phi_num_args (stmt); ++i)
      {
        tree arg = gimple_phi_arg_def (stmt, i);
!       if (!tree_single_nonnegative_p (arg, depth + 1))
  	return false;
      }
    return true;
  }
  
  /* Return true if STMT is known to compute a non-negative value.
!    DEPTH is the current nesting depth of the query.  */
  
  bool
! gimple_stmt_nonnegative_p (gimple *stmt, int depth)
  {
    tree type = gimple_range_type (stmt);
    if (type && frange::supports_p (type))
*************** gimple_stmt_nonnegative_warnv_p (gimple
*** 11530,11543 ****
    switch (gimple_code (stmt))
      {
      case GIMPLE_ASSIGN:
!       return gimple_assign_nonnegative_warnv_p (stmt, strict_overflow_p,
! 						depth);
      case GIMPLE_CALL:
!       return gimple_call_nonnegative_warnv_p (stmt, strict_overflow_p,
! 					      depth);
      case GIMPLE_PHI:
!       return gimple_phi_nonnegative_warnv_p (stmt, strict_overflow_p,
! 					     depth);
      default:
        return false;
      }
--- 11517,11527 ----
    switch (gimple_code (stmt))
      {
      case GIMPLE_ASSIGN:
!       return gimple_assign_nonnegative_p (stmt, depth);
      case GIMPLE_CALL:
!       return gimple_call_nonnegative_p (stmt, depth);
      case GIMPLE_PHI:
!       return gimple_phi_nonnegative_p (stmt, depth);
      default:
        return false;
      }
diff -Nrcpad gcc-17-20260517/gcc/gimple-fold.h gcc-17-20260524/gcc/gimple-fold.h
*** gcc-17-20260517/gcc/gimple-fold.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/gimple-fold.h	Sun May 24 22:32:06 2026
*************** gimple_build_round_up (gimple_seq *seq,
*** 264,270 ****
  				UNKNOWN_LOCATION, type, old_size, align);
  }
  
! extern bool gimple_stmt_nonnegative_warnv_p (gimple *, bool *, int = 0);
  extern bool gimple_stmt_integer_valued_real_p (gimple *, int = 0);
  extern void mark_lhs_in_seq_for_dce (bitmap, gimple_seq);
  
--- 264,270 ----
  				UNKNOWN_LOCATION, type, old_size, align);
  }
  
! extern bool gimple_stmt_nonnegative_p (gimple *, int = 0);
  extern bool gimple_stmt_integer_valued_real_p (gimple *, int = 0);
  extern void mark_lhs_in_seq_for_dce (bitmap, gimple_seq);
  
diff -Nrcpad gcc-17-20260517/gcc/gimple-range-fold.cc gcc-17-20260524/gcc/gimple-range-fold.cc
*** gcc-17-20260517/gcc/gimple-range-fold.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/gimple-range-fold.cc	Sun May 24 22:32:06 2026
*************** fold_using_range::fold_stmt (vrange &r,
*** 687,695 ****
    // If the result is varying, check for basic nonnegativeness.
    // Specifically this helps for now with strict enum in cases like
    // g++.dg/warn/pr33738.C.
-   bool so_p;
    if (res && r.varying_p () && INTEGRAL_TYPE_P (r.type ())
!       && gimple_stmt_nonnegative_warnv_p (s, &so_p))
      r.set_nonnegative (r.type ());
  
    if (!res)
--- 687,694 ----
    // If the result is varying, check for basic nonnegativeness.
    // Specifically this helps for now with strict enum in cases like
    // g++.dg/warn/pr33738.C.
    if (res && r.varying_p () && INTEGRAL_TYPE_P (r.type ())
!       && gimple_stmt_nonnegative_p (s))
      r.set_nonnegative (r.type ());
  
    if (!res)
*************** fold_using_range::range_of_address (pran
*** 842,848 ****
    gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN);
    gcc_checking_assert (gimple_assign_rhs_code (stmt) == ADDR_EXPR);
  
-   bool strict_overflow_p;
    tree expr = gimple_assign_rhs1 (stmt);
    poly_int64 bitsize, bitpos;
    tree offset;
--- 841,846 ----
*************** fold_using_range::range_of_address (pran
*** 910,916 ****
      }
  
    // Handle "= &a".
!   if (tree_single_nonzero_warnv_p (expr, &strict_overflow_p))
      {
        r.set_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt)));
        return true;
--- 908,914 ----
      }
  
    // Handle "= &a".
!   if (tree_single_nonzero_p (expr))
      {
        r.set_nonzero (TREE_TYPE (gimple_assign_rhs1 (stmt)));
        return true;
*************** range_from_readonly_load (vrange &r, tre
*** 956,963 ****
  
        if (POINTER_TYPE_P (type))
  	{
! 	  bool strict_overflow_p;
! 	  return tree_single_nonzero_warnv_p (cst, &strict_overflow_p);
  	}
  
        if (TREE_CODE (cst) != INTEGER_CST)
--- 954,960 ----
  
        if (POINTER_TYPE_P (type))
  	{
! 	  return tree_single_nonzero_p (cst);
  	}
  
        if (TREE_CODE (cst) != INTEGER_CST)
*************** fold_using_range::range_of_call (vrange
*** 1258,1266 ****
      return false;
  
    tree lhs = gimple_call_lhs (call);
-   bool strict_overflow_p;
  
!   if (gimple_stmt_nonnegative_warnv_p (call, &strict_overflow_p))
      r.set_nonnegative (type);
    else if (gimple_call_nonnull_result_p (call)
  	   || gimple_call_nonnull_arg (call))
--- 1255,1262 ----
      return false;
  
    tree lhs = gimple_call_lhs (call);
  
!   if (gimple_stmt_nonnegative_p (call))
      r.set_nonnegative (type);
    else if (gimple_call_nonnull_result_p (call)
  	   || gimple_call_nonnull_arg (call))
diff -Nrcpad gcc-17-20260517/gcc/gimplify.cc gcc-17-20260524/gcc/gimplify.cc
*** gcc-17-20260517/gcc/gimplify.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/gimplify.cc	Sun May 24 22:32:06 2026
*************** gimple_add_tmp_var (tree tmp)
*** 896,1026 ****
      }
  }
  
- 
- 
- /* This page contains routines to unshare tree nodes, i.e. to duplicate tree
-    nodes that are referenced more than once in GENERIC functions.  This is
-    necessary because gimplification (translation into GIMPLE) is performed
-    by modifying tree nodes in-place, so gimplification of a shared node in a
-    first context could generate an invalid GIMPLE form in a second context.
- 
-    This is achieved with a simple mark/copy/unmark algorithm that walks the
-    GENERIC representation top-down, marks nodes with TREE_VISITED the first
-    time it encounters them, duplicates them if they already have TREE_VISITED
-    set, and finally removes the TREE_VISITED marks it has set.
- 
-    The algorithm works only at the function level, i.e. it generates a GENERIC
-    representation of a function with no nodes shared within the function when
-    passed a GENERIC function (except for nodes that are allowed to be shared).
- 
-    At the global level, it is also necessary to unshare tree nodes that are
-    referenced in more than one function, for the same aforementioned reason.
-    This requires some cooperation from the front-end.  There are 2 strategies:
- 
-      1. Manual unsharing.  The front-end needs to call unshare_expr on every
-         expression that might end up being shared across functions.
- 
-      2. Deep unsharing.  This is an extension of regular unsharing.  Instead
-         of calling unshare_expr on expressions that might be shared across
-         functions, the front-end pre-marks them with TREE_VISITED.  This will
-         ensure that they are unshared on the first reference within functions
-         when the regular unsharing algorithm runs.  The counterpart is that
-         this algorithm must look deeper than for manual unsharing, which is
-         specified by LANG_HOOKS_DEEP_UNSHARING.
- 
-   If there are only few specific cases of node sharing across functions, it is
-   probably easier for a front-end to unshare the expressions manually.  On the
-   contrary, if the expressions generated at the global level are as widespread
-   as expressions generated within functions, deep unsharing is very likely the
-   way to go.  */
- 
- /* Similar to copy_tree_r but do not copy SAVE_EXPR or TARGET_EXPR nodes.
-    These nodes model computations that must be done once.  If we were to
-    unshare something like SAVE_EXPR(i++), the gimplification process would
-    create wrong code.  However, if DATA is non-null, it must hold a pointer
-    set that is used to unshare the subtrees of these nodes.  */
- 
- static tree
- mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
- {
-   tree t = *tp;
-   enum tree_code code = TREE_CODE (t);
- 
-   /* Do not copy SAVE_EXPR, TARGET_EXPR or BIND_EXPR nodes themselves, but
-      copy their subtrees if we can make sure to do it only once.  */
-   if (code == SAVE_EXPR || code == TARGET_EXPR || code == BIND_EXPR)
-     {
-       if (data && !((hash_set<tree> *)data)->add (t))
- 	;
-       else
- 	*walk_subtrees = 0;
-     }
- 
-   /* Stop at types, decls, constants like copy_tree_r.  */
-   else if (TREE_CODE_CLASS (code) == tcc_type
- 	   || TREE_CODE_CLASS (code) == tcc_declaration
- 	   || TREE_CODE_CLASS (code) == tcc_constant)
-     *walk_subtrees = 0;
- 
-   /* Cope with the statement expression extension.  */
-   else if (code == STATEMENT_LIST)
-     ;
- 
-   /* Leave the bulk of the work to copy_tree_r itself.  */
-   else
-     copy_tree_r (tp, walk_subtrees, NULL);
- 
-   return NULL_TREE;
- }
- 
- /* Callback for walk_tree to unshare most of the shared trees rooted at *TP.
-    If *TP has been visited already, then *TP is deeply copied by calling
-    mostly_copy_tree_r.  DATA is passed to mostly_copy_tree_r unmodified.  */
- 
- static tree
- copy_if_shared_r (tree *tp, int *walk_subtrees, void *data)
- {
-   tree t = *tp;
-   enum tree_code code = TREE_CODE (t);
- 
-   /* Skip types, decls, and constants.  But we do want to look at their
-      types and the bounds of types.  Mark them as visited so we properly
-      unmark their subtrees on the unmark pass.  If we've already seen them,
-      don't look down further.  */
-   if (TREE_CODE_CLASS (code) == tcc_type
-       || TREE_CODE_CLASS (code) == tcc_declaration
-       || TREE_CODE_CLASS (code) == tcc_constant)
-     {
-       if (TREE_VISITED (t))
- 	*walk_subtrees = 0;
-       else
- 	TREE_VISITED (t) = 1;
-     }
- 
-   /* If this node has been visited already, unshare it and don't look
-      any deeper.  */
-   else if (TREE_VISITED (t))
-     {
-       walk_tree (tp, mostly_copy_tree_r, data, NULL);
-       *walk_subtrees = 0;
-     }
- 
-   /* Otherwise, mark the node as visited and keep looking.  */
-   else
-     TREE_VISITED (t) = 1;
- 
-   return NULL_TREE;
- }
- 
- /* Unshare most of the shared trees rooted at *TP.  DATA is passed to the
-    copy_if_shared_r callback unmodified.  */
- 
- void
- copy_if_shared (tree *tp, void *data)
- {
-   walk_tree (tp, copy_if_shared_r, data, NULL);
- }
- 
  /* Unshare all the trees in the body of FNDECL, as well as in the bodies of
     any nested functions.  */
  
--- 896,901 ----
*************** unvisit_body (tree fndecl)
*** 1089,1129 ****
        unvisit_body (cgn->decl);
  }
  
- /* Unconditionally make an unshared copy of EXPR.  This is used when using
-    stored expressions which span multiple functions, such as BINFO_VTABLE,
-    as the normal unsharing process can't tell that they're shared.  */
- 
- tree
- unshare_expr (tree expr)
- {
-   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
-   return expr;
- }
- 
- /* Worker for unshare_expr_without_location.  */
- 
- static tree
- prune_expr_location (tree *tp, int *walk_subtrees, void *)
- {
-   if (EXPR_P (*tp))
-     SET_EXPR_LOCATION (*tp, UNKNOWN_LOCATION);
-   else
-     *walk_subtrees = 0;
-   return NULL_TREE;
- }
- 
- /* Similar to unshare_expr but also prune all expression locations
-    from EXPR.  */
- 
- tree
- unshare_expr_without_location (tree expr)
- {
-   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
-   if (EXPR_P (expr))
-     walk_tree (&expr, prune_expr_location, NULL, NULL);
-   return expr;
- }
- 
  /* Return the EXPR_LOCATION of EXPR, if it (maybe recursively) has
     one, OR_ELSE otherwise.  The location of a STATEMENT_LISTs
     comprising at least one DEBUG_BEGIN_STMT followed by exactly one
--- 964,969 ----
*************** gimplify_scan_omp_clauses (tree *list_p,
*** 13836,13841 ****
--- 13676,13683 ----
        || code == OACC_UPDATE
        || code == OACC_DECLARE)
      {
+       if (!(region_type & ORT_ACC))
+ 	*list_p = omp_remove_duplicate_maps (*list_p, false);
        groups = omp_gather_mapping_groups (list_p);
  
        if (groups)
diff -Nrcpad gcc-17-20260517/gcc/gimplify.h gcc-17-20260524/gcc/gimplify.h
*** gcc-17-20260517/gcc/gimplify.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/gimplify.h	Sun May 24 22:32:06 2026
*************** extern tree get_initialized_tmp_var (tre
*** 62,70 ****
  extern void declare_vars (tree, gimple *, bool);
  extern void gimple_add_tmp_var (tree);
  extern void gimple_add_tmp_var_fn (struct function *, tree);
- extern void copy_if_shared (tree *, void * = NULL);
- extern tree unshare_expr (tree);
- extern tree unshare_expr_without_location (tree);
  extern tree voidify_wrapper_expr (tree, tree);
  extern tree build_and_jump (tree *);
  extern enum gimplify_status gimplify_self_mod_expr (tree *, gimple_seq *,
--- 62,67 ----
diff -Nrcpad gcc-17-20260517/gcc/internal-fn.cc gcc-17-20260524/gcc/internal-fn.cc
*** gcc-17-20260517/gcc/internal-fn.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/internal-fn.cc	Sun May 24 22:32:06 2026
*************** expand_crc_optab_fn (internal_fn fn, gca
*** 4216,4223 ****
        else
  	/* If it's IFN_CRC_REV generate bit-reversed CRC.  */
  	expand_reversed_crc_table_based (dest, crc, data, polynomial,
! 					 TYPE_MODE (data_type),
! 					 generate_reflecting_code_standard);
  
        /* Now get the return value where it needs to be, taking care to
  	 ensure it's promoted appropriately if the ABI demands it.
--- 4216,4222 ----
        else
  	/* If it's IFN_CRC_REV generate bit-reversed CRC.  */
  	expand_reversed_crc_table_based (dest, crc, data, polynomial,
! 					 TYPE_MODE (data_type));
  
        /* Now get the return value where it needs to be, taking care to
  	 ensure it's promoted appropriately if the ABI demands it.
diff -Nrcpad gcc-17-20260517/gcc/ipa-cp.cc gcc-17-20260524/gcc/ipa-cp.cc
*** gcc-17-20260517/gcc/ipa-cp.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/ipa-cp.cc	Sun May 24 22:32:06 2026
*************** perform_estimation_of_a_value (cgraph_no
*** 3620,3644 ****
    val->local_size_cost = size;
  }
  
! /* Get the overall limit of growth based on parameters extracted from growth,
!    and CUR_SWEEP, which is the number of the current sweep of IPA-CP over the
!    call-graph in the decision stage.  It does not really make sense to mix
!    functions with different overall growth limits or even number of sweeps but
!    it is possible and if it happens, we do not want to select one limit at
!    random, so get the limits from NODE.  */
  
  static long
! get_max_overall_size (cgraph_node *node, int cur_sweep)
  {
    long max_new_size = orig_overall_size;
    long large_unit = opt_for_fn (node->decl, param_ipa_cp_large_unit_insns);
    if (max_new_size < large_unit)
      max_new_size = large_unit;
-   int num_sweeps = opt_for_fn (node->decl, param_ipa_cp_sweeps);
-   gcc_assert (cur_sweep <= num_sweeps);
    int unit_growth = opt_for_fn (node->decl, param_ipa_cp_unit_growth);
!   max_new_size += ((max_new_size * unit_growth * cur_sweep)
! 		   / num_sweeps) / 100 + 1;
    return max_new_size;
  }
  
--- 3620,3640 ----
    val->local_size_cost = size;
  }
  
! /* Get the overall limit of growth based on parameters extracted from NODE.  It
!    does not really make sense to mix functions with different overall growth
!    limits or even number of sweeps but it is possible and if it happens, we do
!    not want to select one limit at random, so get the limits from NODE.  */
  
  static long
! get_max_overall_size (cgraph_node *node)
  {
    long max_new_size = orig_overall_size;
    long large_unit = opt_for_fn (node->decl, param_ipa_cp_large_unit_insns);
    if (max_new_size < large_unit)
      max_new_size = large_unit;
    int unit_growth = opt_for_fn (node->decl, param_ipa_cp_unit_growth);
!   max_new_size += max_new_size * unit_growth / 100 + 1;
! 
    return max_new_size;
  }
  
*************** decide_about_value (struct cgraph_node *
*** 5958,5965 ****
        perhaps_add_new_callers (node, val);
        return false;
      }
!   else if (val->local_size_cost + overall_size
! 	   > get_max_overall_size (node, cur_sweep))
      {
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "   Ignoring candidate value because "
--- 5954,5960 ----
        perhaps_add_new_callers (node, val);
        return false;
      }
!   else if (val->local_size_cost + overall_size > get_max_overall_size (node))
      {
        if (dump_file && (dump_flags & TDF_DETAILS))
  	fprintf (dump_file, "   Ignoring candidate value because "
*************** decide_whether_version_node (struct cgra
*** 6337,6343 ****
  					   stats.called_without_ipa_profile,
  					   cur_sweep))
  	{
! 	  if (size + overall_size <= get_max_overall_size (node, cur_sweep))
  	    {
  	      if (!dbg_cnt (ipa_cp_values))
  		return ret;
--- 6332,6338 ----
  					   stats.called_without_ipa_profile,
  					   cur_sweep))
  	{
! 	  if (size + overall_size <= get_max_overall_size (node))
  	    {
  	      if (!dbg_cnt (ipa_cp_values))
  		return ret;
diff -Nrcpad gcc-17-20260517/gcc/ipa-prop.cc gcc-17-20260524/gcc/ipa-prop.cc
*** gcc-17-20260517/gcc/ipa-prop.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/ipa-prop.cc	Sun May 24 22:32:06 2026
*************** ipa_compute_jump_functions_for_edge (str
*** 2543,2550 ****
  	      || vr.varying_p ()
  	      || vr.undefined_p ())
  	    {
! 	      bool strict_overflow = false;
! 	      if (tree_single_nonzero_warnv_p (arg, &strict_overflow))
  		vr.set_nonzero (TREE_TYPE (arg));
  	      else
  		vr.set_varying (TREE_TYPE (arg));
--- 2543,2549 ----
  	      || vr.varying_p ()
  	      || vr.undefined_p ())
  	    {
! 	      if (tree_single_nonzero_p (arg))
  		vr.set_nonzero (TREE_TYPE (arg));
  	      else
  		vr.set_varying (TREE_TYPE (arg));
diff -Nrcpad gcc-17-20260517/gcc/jit/ChangeLog gcc-17-20260524/gcc/jit/ChangeLog
*** gcc-17-20260517/gcc/jit/ChangeLog	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/jit/ChangeLog	Sun May 24 22:32:06 2026
***************
*** 1,3 ****
--- 1,10 ----
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* docs/topics/contexts.rst
+ 	(gcc_jit_context_add_command_line_option): Clarify that adding
+ 	multiple options requires multiple calls.
+ 	(gcc_jit_context_add_driver_option): Likewise.
+ 
  2025-12-11  Jakub Jelinek  <jakub@redhat.com>
  
  	* docs/_build/texinfo/libgccjit.texi: Fix comment typo, shold -> should.
diff -Nrcpad gcc-17-20260517/gcc/jit/docs/topics/contexts.rst gcc-17-20260524/gcc/jit/docs/topics/contexts.rst
*** gcc-17-20260517/gcc/jit/docs/topics/contexts.rst	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/jit/docs/topics/contexts.rst	Sun May 24 22:32:06 2026
*************** Additional command-line options
*** 557,566 ****
     by :func:`gcc_jit_context_compile` and
     :func:`gcc_jit_context_compile_to_file`.
  
     The parameter ``optname`` must be non-NULL.  The underlying buffer is
     copied, so that it does not need to outlive the call.
  
!    Extra options added by `gcc_jit_context_add_command_line_option` are
     applied *after* the regular options above, potentially overriding them.
     Options from parent contexts are inherited by child contexts; options
     from the parent are applied *before* those from the child.
--- 557,569 ----
     by :func:`gcc_jit_context_compile` and
     :func:`gcc_jit_context_compile_to_file`.
  
+    If you need to add more than one such option, each should be done via
+    its own call to `gcc_jit_context_add_command_line_option`.
+ 
     The parameter ``optname`` must be non-NULL.  The underlying buffer is
     copied, so that it does not need to outlive the call.
  
!    Extra options added by calls to `gcc_jit_context_add_command_line_option` are
     applied *after* the regular options above, potentially overriding them.
     Options from parent contexts are inherited by child contexts; options
     from the parent are applied *before* those from the child.
*************** Additional command-line options
*** 593,599 ****
     The parameter ``optname`` must be non-NULL.  The underlying buffer is
     copied, so that it does not need to outlive the call.
  
!    Extra options added by `gcc_jit_context_add_driver_option` are
     applied *after* all other options potentially overriding them.
     Options from parent contexts are inherited by child contexts; options
     from the parent are applied *before* those from the child.
--- 596,605 ----
     The parameter ``optname`` must be non-NULL.  The underlying buffer is
     copied, so that it does not need to outlive the call.
  
!    If you need to add more than one such option, each should be done via
!    its own call to `gcc_jit_context_add_driver_option`.
! 
!    Extra options added by calls to `gcc_jit_context_add_driver_option` are
     applied *after* all other options potentially overriding them.
     Options from parent contexts are inherited by child contexts; options
     from the parent are applied *before* those from the child.
diff -Nrcpad gcc-17-20260517/gcc/m2/ChangeLog gcc-17-20260524/gcc/m2/ChangeLog
*** gcc-17-20260517/gcc/m2/ChangeLog	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/m2/ChangeLog	Sun May 24 22:32:06 2026
***************
*** 1,3 ****
--- 1,9 ----
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR other/125348
+ 	* gm2-compiler/M2GenGCC.mod (PerformLastForIterator): Fix diagnostic
+ 	typo, intemediate -> intermediate.
+ 
  2026-04-21  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	PR modula2/120189
diff -Nrcpad gcc-17-20260517/gcc/m2/gm2-compiler/M2GenGCC.mod gcc-17-20260524/gcc/m2/gm2-compiler/M2GenGCC.mod
*** gcc-17-20260517/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/m2/gm2-compiler/M2GenGCC.mod	Sun May 24 22:32:06 2026
*************** BEGIN
*** 566,572 ****
           IF TreeOverflow (incrtree)
           THEN
              MetaErrorT0 (lastpos,
!                          'the intemediate calculation for the last iterator value in the {%kFOR} loop has caused an overflow') ;
              NoChange := FALSE ;
              SubQuad (quad) ;
              success := FALSE
--- 566,572 ----
           IF TreeOverflow (incrtree)
           THEN
              MetaErrorT0 (lastpos,
!                          'the intermediate calculation for the last iterator value in the {%kFOR} loop has caused an overflow') ;
              NoChange := FALSE ;
              SubQuad (quad) ;
              success := FALSE
*************** BEGIN
*** 585,591 ****
           IF TreeOverflow (incrtree)
           THEN
              MetaErrorT0 (lastpos,
!                          'the intemediate calculation for the last iterator value in the {%kFOR} loop has caused an overflow') ;
              NoChange := FALSE ;
              SubQuad (quad) ;
              success := FALSE
--- 585,591 ----
           IF TreeOverflow (incrtree)
           THEN
              MetaErrorT0 (lastpos,
!                          'the intermediate calculation for the last iterator value in the {%kFOR} loop has caused an overflow') ;
              NoChange := FALSE ;
              SubQuad (quad) ;
              success := FALSE
diff -Nrcpad gcc-17-20260517/gcc/match.pd gcc-17-20260524/gcc/match.pd
*** gcc-17-20260517/gcc/match.pd	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/match.pd	Sun May 24 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 55,62 ****
  (define_operator_list swapped_simple_comparison gt   ge   eq ne le   lt)
  (define_operator_list BSWAP BUILT_IN_BSWAP16 BUILT_IN_BSWAP32
  	    BUILT_IN_BSWAP64 BUILT_IN_BSWAP128)
! (define_operator_list BITREVERSE BUILT_IN_BITREVERSE16 BUILT_IN_BITREVERSE32
! 	    BUILT_IN_BITREVERSE64 BUILT_IN_BITREVERSE128)
  
  #include "cfn-operators.pd"
  
--- 55,62 ----
  (define_operator_list swapped_simple_comparison gt   ge   eq ne le   lt)
  (define_operator_list BSWAP BUILT_IN_BSWAP16 BUILT_IN_BSWAP32
  	    BUILT_IN_BSWAP64 BUILT_IN_BSWAP128)
! (define_operator_list BITREVERSE BUILT_IN_BITREVERSE8 BUILT_IN_BITREVERSE16
! 	    BUILT_IN_BITREVERSE32 BUILT_IN_BITREVERSE64 BUILT_IN_BITREVERSE128)
  
  #include "cfn-operators.pd"
  
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 2358,2371 ****
   (simplify
    (bitop:c (rbitop:c @0 @1) @0)
    @0)
-  /* (~x | y) & x -> x & y */
-  /* (~x & y) | x -> x | y */
-  (simplify
-   (bitop:c (rbitop:c @2 @1) @0)
-   (with { bool wascmp; }
-    (if (bitwise_inverted_equal_p (@0, @2, wascmp)
- 	&& (!wascmp || element_precision (type) == 1))
-     (bitop @0 @1))))
    /* (x | y) & (x & z) -> (x & z) */
    /* (x & y) | (x | z) -> (x | z) */
   (simplify
--- 2358,2363 ----
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 2384,2389 ****
--- 2376,2394 ----
     { build_zero_cst (type); }
     { build_minus_one_cst (type); })))
  
+ /* (~x | y) & x -> x & y
+    (~x & y) | x -> x | y
+    (~x & y) ^ x -> x | y */
+ (for bitop (bit_and bit_ior bit_xor)
+      rbitop (bit_ior bit_and bit_and)
+      resbitop (bit_and bit_ior bit_ior)
+  (simplify
+   (bitop:c (rbitop:c @2 @1) @0)
+   (with { bool wascmp; }
+    (if (bitwise_inverted_equal_p (@0, @2, wascmp)
+ 	&& (!wascmp || element_precision (type) == 1))
+     (resbitop @0 @1)))))
+ 
  /* ((x | y) & z) | x -> (z & y) | x
     ((x ^ y) & z) | x -> (z & y) | x  */
  (for op (bit_ior bit_xor)
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 6755,6768 ****
  )
  #endif
  
! /* X != C1 ? -X : C2 simplifies to -X when -C1 == C2.  */
  (simplify
   (cond (ne @0 INTEGER_CST@1) (negate@3 @0) INTEGER_CST@2)
   (if (!TYPE_SATURATING (type)
-       && (TYPE_OVERFLOW_WRAPS (type)
- 	  || !wi::only_sign_bit_p (wi::to_wide (@1)))
        && wi::eq_p (wi::neg (wi::to_wide (@1)), wi::to_wide (@2)))
!   @3))
  
  /* X != C1 ? ~X : C2 simplifies to ~X when ~C1 == C2.  */
  (simplify
--- 6760,6777 ----
  )
  #endif
  
! /* X != C1 ? -X : C2 simplifies to -X when -C1 == C2.  Additionally,
!    when C1 is the minimum signed value (e.g.  INT_MIN), -X would be
!    undefined for signed types, so emit (signed)(-(unsigned)X) instead.  */
  (simplify
   (cond (ne @0 INTEGER_CST@1) (negate@3 @0) INTEGER_CST@2)
   (if (!TYPE_SATURATING (type)
        && wi::eq_p (wi::neg (wi::to_wide (@1)), wi::to_wide (@2)))
!   (if (TYPE_OVERFLOW_WRAPS (type)
!        || !wi::only_sign_bit_p (wi::to_wide (@1)))
!    @3
!    (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
!     (convert (negate (convert:utype @0)))))))
  
  /* X != C1 ? ~X : C2 simplifies to ~X when ~C1 == C2.  */
  (simplify
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 7804,7810 ****
  	  (if (cmp == LT_EXPR || cmp == LE_EXPR)
  	   { constant_boolean_node (above ? true : false, type); }
  	   (if (cmp == GT_EXPR || cmp == GE_EXPR)
! 	    { constant_boolean_node (above ? false : true, type); })))))))))
     /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
     (if (FLOAT_TYPE_P (TREE_TYPE (@00))
  	&& (DECIMAL_FLOAT_TYPE_P (TREE_TYPE (@0))
--- 7813,7831 ----
  	  (if (cmp == LT_EXPR || cmp == LE_EXPR)
  	   { constant_boolean_node (above ? true : false, type); }
  	   (if (cmp == GT_EXPR || cmp == GE_EXPR)
! 	    { constant_boolean_node (above ? false : true, type); })))))))
! 
!     /* For eq/ne with narrowing conversion:
!        (T)(X) == (T)(Y) -> (T)(X ^ Y) == 0  */
!     (if (TYPE_PRECISION (TREE_TYPE (@0))
!          < TYPE_PRECISION (TREE_TYPE (@00))
!          && (cmp == EQ_EXPR || cmp == NE_EXPR)
!          && types_match (TREE_TYPE (@00),
!                          TREE_TYPE (@10)))
!      (with { tree itype = TREE_TYPE (@0); }
!       (cmp (convert:itype (bit_xor @00 @10))
!            { build_zero_cst (itype); })))))
! 
     /* Fold (double)float1 CMP (double)float2 into float1 CMP float2.  */
     (if (FLOAT_TYPE_P (TREE_TYPE (@00))
  	&& (DECIMAL_FLOAT_TYPE_P (TREE_TYPE (@0))
diff -Nrcpad gcc-17-20260517/gcc/omp-general.cc gcc-17-20260524/gcc/omp-general.cc
*** gcc-17-20260517/gcc/omp-general.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/omp-general.cc	Sun May 24 22:32:06 2026
*************** omp_merge_context_selectors (location_t
*** 5152,5154 ****
--- 5152,5249 ----
    merged_ctx = nreverse (merged_ctx);
    return omp_check_context_selector (loc, merged_ctx, directive);
  }
+ 
+ /* Remove duplicate and merge clauses mapping the same variable. This function
+    is called twice: FIRST in the C and C++ front-ends before any clause
+    expansion happens, then in the gimplifier before gathering groups. This is
+    because it is easier to process most clauses earlier but some duplicates
+    still get introduced during the early clause expansion in the front-ends. */
+ 
+ tree
+ omp_remove_duplicate_maps (tree clauses, bool first)
+ {
+   if (clauses == NULL_TREE)
+     return NULL_TREE;
+ 
+   tree outlist = NULL_TREE;
+   tree *outlist_p = &outlist;
+   bool remove = false;
+   tree c1;
+   for (c1 = clauses; OMP_CLAUSE_CHAIN (c1) != NULL_TREE;
+        c1 = OMP_CLAUSE_CHAIN (c1))
+     {
+       if (OMP_CLAUSE_CODE (c1) != OMP_CLAUSE_MAP)
+ 	{
+ 	  *outlist_p = c1;
+ 	  outlist_p = &OMP_CLAUSE_CHAIN (*outlist_p);
+ 	  continue;
+ 	}
+ 
+       for (tree c2 = OMP_CLAUSE_CHAIN (c1); c2 != NULL_TREE;
+ 	   c2 = OMP_CLAUSE_CHAIN (c2))
+ 	{
+ 	  if (OMP_CLAUSE_CODE (c2) != OMP_CLAUSE_MAP)
+ 	    continue;
+ 
+ 	  bool maybe_dup_found
+ 	    = (OMP_CLAUSE_CODE (c1) == OMP_CLAUSE_CODE (c2)
+ 	       && ((/* In the current state, a map clause decl is not supposed
+ 		       to be NULL; but let's be defensive.  */
+ 		    OMP_CLAUSE_DECL (c1) == NULL_TREE
+ 		    && OMP_CLAUSE_DECL (c2) == NULL_TREE)
+ 		   || operand_equal_p (OMP_CLAUSE_DECL (c1),
+ 				       OMP_CLAUSE_DECL (c2)))
+ 	       && ((/* The clause size is generally not known right after
+ 		       parsing.  */
+ 		    OMP_CLAUSE_SIZE (c1) == NULL_TREE
+ 		    && OMP_CLAUSE_SIZE (c2) == NULL_TREE)
+ 		   || (OMP_CLAUSE_SIZE (c1) != NULL_TREE
+ 		       && OMP_CLAUSE_SIZE (c2) != NULL_TREE
+ 		       && operand_equal_p (OMP_CLAUSE_SIZE (c1),
+ 					   OMP_CLAUSE_SIZE (c2))))
+ 	       && ((OMP_CLAUSE_ITERATORS (c1) == NULL_TREE
+ 		    && OMP_CLAUSE_ITERATORS (c2) == NULL_TREE)
+ 		   || operand_equal_p (OMP_CLAUSE_ITERATORS (c1),
+ 				       OMP_CLAUSE_ITERATORS (c2))));
+ 	  if (maybe_dup_found)
+ 	    {
+ 	      if (first)
+ 		{
+ 		  if (OMP_CLAUSE_MAP_KIND (c1) == OMP_CLAUSE_MAP_KIND (c2))
+ 		    {
+ 		      remove = true;
+ 		      break;
+ 		    }
+ 		  else if ((OMP_CLAUSE_MAP_KIND (c1) & ~GOMP_MAP_TOFROM)
+ 			   == (OMP_CLAUSE_MAP_KIND (c2) & ~GOMP_MAP_TOFROM))
+ 		    {
+ 		      OMP_CLAUSE_SET_MAP_KIND (c2,
+ 					       (OMP_CLAUSE_MAP_KIND (c1)
+ 						| OMP_CLAUSE_MAP_KIND (c2)));
+ 		      remove = true;
+ 		      break;
+ 		    }
+ 		}
+ 	      /* When called from the gimplifier, remove duplicate map clauses
+ 		 with identical kind only when the bits above
+ 		 GOMP_MAP_FLAG_SPECIAL_2 are unset - as clauses with those flags
+ 		 set may need to be present multiple times.  */
+ 	      else if (OMP_CLAUSE_MAP_KIND (c1) == OMP_CLAUSE_MAP_KIND (c2)
+ 		       && (OMP_CLAUSE_MAP_KIND (c1) & ~0b11111) == 0)
+ 		{
+ 		  remove = true;
+ 		  break;
+ 		}
+ 	    }
+ 	}
+       if (remove)
+ 	remove = false;
+       else
+ 	{
+ 	  *outlist_p = c1;
+ 	  outlist_p = &OMP_CLAUSE_CHAIN (*outlist_p);
+ 	}
+     }
+   *outlist_p = c1;
+   return outlist;
+ }
diff -Nrcpad gcc-17-20260517/gcc/omp-general.h gcc-17-20260524/gcc/omp-general.h
*** gcc-17-20260517/gcc/omp-general.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/omp-general.h	Sun May 24 22:32:06 2026
*************** extern bool omp_parse_expr (vec<omp_addr
*** 417,420 ****
--- 417,422 ----
  extern tree omp_loop_number_of_iterations (tree, int, tree * = NULL);
  extern void omp_maybe_apply_loop_xforms (tree *, tree);
  
+ extern tree omp_remove_duplicate_maps (tree, bool);
+ 
  #endif /* GCC_OMP_GENERAL_H */
diff -Nrcpad gcc-17-20260517/gcc/omp-low.cc gcc-17-20260524/gcc/omp-low.cc
*** gcc-17-20260517/gcc/omp-low.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/omp-low.cc	Sun May 24 22:32:06 2026
*************** build_sender_ref (tree var, omp_context
*** 784,807 ****
    return build_sender_ref ((splay_tree_key) var, ctx);
  }
  
! /* Add a new field for VAR inside the structure CTX->SENDER_DECL.  If
!    BASE_POINTERS_RESTRICT, declare the field with restrict.  */
  
  static void
! install_var_field (tree var, bool by_ref, int mask, omp_context *ctx)
  {
    tree field, type, sfield = NULL_TREE;
    splay_tree_key key = (splay_tree_key) var;
  
!   if ((mask & 16) != 0)
!     {
!       key = (splay_tree_key) &DECL_NAME (var);
!       gcc_checking_assert (key != (splay_tree_key) var);
!     }
!   if ((mask & 8) != 0)
      {
!       key = (splay_tree_key) &DECL_UID (var);
!       gcc_checking_assert (key != (splay_tree_key) var);
      }
    gcc_assert ((mask & 1) == 0
  	      || !splay_tree_lookup (ctx->field_map, key));
--- 784,823 ----
    return build_sender_ref ((splay_tree_key) var, ctx);
  }
  
! /* Add a new field for VAR inside the structure CTX.  If BY_REF is true,
!    use a pointer to the VAR rather than VAR itself.
!    MASK is a bit mask of other options.  Bits are interpreted as:
!       1: Install VAR in ctx->field_map.
!       2: Install VAR in ctx->sfield_map.
!       4: VAR is an array, convert it to a pointer.
!       8: Use DECL_UID (VAR) instead of VAR as key.
!      16: Use DECL_NAME (VAR) instead of VAR as key.
!      32: Don't dereference omp_is_reference types.
!    KEY_EXPR allows specifying something other than VAR as the lookup key.
!    If specified, it also overrides the 8 and 16 MASK bits.  */
  
  static void
! install_var_field (tree var, bool by_ref, int mask, omp_context *ctx,
! 		   tree key_expr = NULL_TREE)
  {
    tree field, type, sfield = NULL_TREE;
    splay_tree_key key = (splay_tree_key) var;
  
!   if (key_expr)
!     /* Allow caller to explicitly set the expression used as the key.  */
!     key = (splay_tree_key) key_expr;
!   else
      {
!       if ((mask & 16) != 0)
! 	{
! 	  key = (splay_tree_key) &DECL_NAME (var);
! 	  gcc_checking_assert (key != (splay_tree_key) var);
! 	}
!       if ((mask & 8) != 0)
! 	{
! 	  key = (splay_tree_key) &DECL_UID (var);
! 	  gcc_checking_assert (key != (splay_tree_key) var);
! 	}
      }
    gcc_assert ((mask & 1) == 0
  	      || !splay_tree_lookup (ctx->field_map, key));
*************** scan_sharing_clauses (tree clauses, omp_
*** 1389,1396 ****
  		  || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR
  		      && lang_hooks.decls.omp_array_data (decl, true)))
  		{
  		  by_ref = !omp_privatize_by_reference (decl);
! 		  install_var_field (decl, by_ref, 3, ctx);
  		}
  	      else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR)
  		{
--- 1405,1417 ----
  		  || (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR
  		      && lang_hooks.decls.omp_array_data (decl, true)))
  		{
+ 		  /* OpenACC firstprivate clauses are later processed with same
+ 		     code path as map clauses in lower_omp_target, so follow
+ 		     the same convention of using the whole clause expression
+ 		     as splay-tree key.  */
+ 		  tree k = (is_oacc_parallel_or_serial (ctx) ? c : NULL_TREE);
  		  by_ref = !omp_privatize_by_reference (decl);
! 		  install_var_field (decl, by_ref, 3, ctx, k);
  		}
  	      else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR)
  		{
*************** scan_sharing_clauses (tree clauses, omp_
*** 1683,1689 ****
  		  gcc_assert (INDIRECT_REF_P (decl2));
  		  decl2 = TREE_OPERAND (decl2, 0);
  		  gcc_assert (DECL_P (decl2));
! 		  install_var_field (decl2, true, 3, ctx);
  		  install_var_local (decl2, ctx);
  		  install_var_local (decl, ctx);
  		}
--- 1704,1710 ----
  		  gcc_assert (INDIRECT_REF_P (decl2));
  		  decl2 = TREE_OPERAND (decl2, 0);
  		  gcc_assert (DECL_P (decl2));
! 		  install_var_field (decl2, true, 3, ctx, c);
  		  install_var_local (decl2, ctx);
  		  install_var_local (decl, ctx);
  		}
*************** scan_sharing_clauses (tree clauses, omp_
*** 1693,1701 ****
  		      && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
  		      && !OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION (c)
  		      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
! 		    install_var_field (decl, true, 7, ctx);
  		  else
! 		    install_var_field (decl, true, 3, ctx);
  		  if (is_gimple_omp_offloaded (ctx->stmt)
  		      && !(is_gimple_omp_oacc (ctx->stmt)
  			   && OMP_CLAUSE_MAP_IN_REDUCTION (c)))
--- 1714,1722 ----
  		      && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
  		      && !OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION (c)
  		      && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
! 		    install_var_field (decl, true, 7, ctx, c);
  		  else
! 		    install_var_field (decl, true, 3, ctx, c);
  		  if (is_gimple_omp_offloaded (ctx->stmt)
  		      && !(is_gimple_omp_oacc (ctx->stmt)
  			   && OMP_CLAUSE_MAP_IN_REDUCTION (c)))
*************** scan_sharing_clauses (tree clauses, omp_
*** 1730,1736 ****
  				  FIELD_DECL, NULL_TREE, ptr_type_node);
  		  SET_DECL_ALIGN (field, TYPE_ALIGN (ptr_type_node));
  		  insert_field_into_struct (ctx->record_type, field);
! 		  splay_tree_insert (ctx->field_map, (splay_tree_key) decl,
  				     (splay_tree_value) field);
  		}
  	    }
--- 1751,1757 ----
  				  FIELD_DECL, NULL_TREE, ptr_type_node);
  		  SET_DECL_ALIGN (field, TYPE_ALIGN (ptr_type_node));
  		  insert_field_into_struct (ctx->record_type, field);
! 		  splay_tree_insert (ctx->field_map, (splay_tree_key) c,
  				     (splay_tree_value) field);
  		}
  	    }
*************** lower_oacc_reductions (location_t loc, t
*** 7453,7458 ****
--- 7474,7480 ----
  	gcc_checking_assert (!is_oacc_kernels_decomposed_part (ctx));
  
  	tree orig = OMP_CLAUSE_DECL (c);
+ 	tree orig_clause;
  	tree var = maybe_lookup_decl (orig, ctx);
  	tree ref_to_res = NULL_TREE;
  	tree incoming, outgoing, v1, v2, v3;
*************** lower_oacc_reductions (location_t loc, t
*** 7523,7532 ****
  	  do_lookup:
  	    /* This is the outermost construct with this reduction,
  	       see if there's a mapping for it.  */
! 	    if (gimple_code (outer->stmt) == GIMPLE_OMP_TARGET
! 		&& maybe_lookup_field (orig, outer) && !is_private)
  	      {
! 		ref_to_res = build_receiver_ref (orig, false, outer);
  		if (omp_privatize_by_reference (orig))
  		  ref_to_res = build_simple_mem_ref (ref_to_res);
  
--- 7545,7564 ----
  	  do_lookup:
  	    /* This is the outermost construct with this reduction,
  	       see if there's a mapping for it.  */
! 	    orig_clause = NULL_TREE;
! 	    if (gimple_code (outer->stmt) == GIMPLE_OMP_TARGET)
! 	      for (tree cls = gimple_omp_target_clauses (outer->stmt);
! 		   cls; cls = OMP_CLAUSE_CHAIN (cls))
! 		if (OMP_CLAUSE_CODE (cls) == OMP_CLAUSE_MAP
! 		    && orig == OMP_CLAUSE_DECL (cls)
! 		    && maybe_lookup_field (cls, outer))
! 		  {
! 		    orig_clause = cls;
! 		    break;
! 		  }
! 	    if (orig_clause != NULL_TREE && !is_private)
  	      {
! 		ref_to_res = build_receiver_ref (orig_clause, false, outer);
  		if (omp_privatize_by_reference (orig))
  		  ref_to_res = build_simple_mem_ref (ref_to_res);
  
*************** lower_omp_target (gimple_stmt_iterator *
*** 12949,12955 ****
  	    continue;
  	  }
  
! 	if (!maybe_lookup_field (var, ctx))
  	  continue;
  
  	/* Don't remap compute constructs' reduction variables, because the
--- 12981,12987 ----
  	    continue;
  	  }
  
! 	if (!maybe_lookup_field (c, ctx))
  	  continue;
  
  	/* Don't remap compute constructs' reduction variables, because the
*************** lower_omp_target (gimple_stmt_iterator *
*** 12958,12964 ****
  			   && is_gimple_omp_oacc (ctx->stmt)
  			   && OMP_CLAUSE_MAP_IN_REDUCTION (c)))
  	  {
! 	    x = build_receiver_ref (var, true, ctx);
  	    tree new_var = lookup_decl (var, ctx);
  
  	    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
--- 12990,12996 ----
  			   && is_gimple_omp_oacc (ctx->stmt)
  			   && OMP_CLAUSE_MAP_IN_REDUCTION (c)))
  	  {
! 	    x = build_receiver_ref (c, true, ctx);
  	    tree new_var = lookup_decl (var, ctx);
  
  	    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
*************** lower_omp_target (gimple_stmt_iterator *
*** 13353,13359 ****
  		  }
  		else
  		  {
! 		    tree x = build_sender_ref (ovar, ctx);
  		    tree v = ovar;
  		    if (in_reduction_clauses
  			&& OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
--- 13385,13391 ----
  		  }
  		else
  		  {
! 		    tree x = build_sender_ref (c, ctx);
  		    tree v = ovar;
  		    if (in_reduction_clauses
  			&& OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
*************** lower_omp_target (gimple_stmt_iterator *
*** 13402,13408 ****
  		    gcc_assert (DECL_P (ovar2));
  		    ovar = ovar2;
  		  }
! 		if (!maybe_lookup_field (ovar, ctx)
  		    && !(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
  			 && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
  			     || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH)))
--- 13434,13440 ----
  		    gcc_assert (DECL_P (ovar2));
  		    ovar = ovar2;
  		  }
! 		if (!maybe_lookup_field (c, ctx)
  		    && !(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
  			 && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
  			     || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH)))
*************** lower_omp_target (gimple_stmt_iterator *
*** 13452,13458 ****
  	      }
  	    else if (nc)
  	      {
! 		x = build_sender_ref (ovar, ctx);
  
  		if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
  		    && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
--- 13484,13490 ----
  	      }
  	    else if (nc)
  	      {
! 		x = build_sender_ref (nc, ctx);
  
  		if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
  		    && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
*************** lower_omp_target (gimple_stmt_iterator *
*** 14416,14422 ****
  		    type = TREE_TYPE (type);
  		    ref_to_ptr = true;
  		  }
! 		x = build_receiver_ref (OMP_CLAUSE_DECL (prev), false, ctx);
  		x = fold_convert_loc (clause_loc, type, x);
  		if (!integer_zerop (OMP_CLAUSE_SIZE (c)))
  		  {
--- 14448,14454 ----
  		    type = TREE_TYPE (type);
  		    ref_to_ptr = true;
  		  }
! 		x = build_receiver_ref (prev, false, ctx);
  		x = fold_convert_loc (clause_loc, type, x);
  		if (!integer_zerop (OMP_CLAUSE_SIZE (c)))
  		  {
diff -Nrcpad gcc-17-20260517/gcc/optabs.cc gcc-17-20260524/gcc/optabs.cc
*** gcc-17-20260517/gcc/optabs.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/optabs.cc	Sun May 24 22:32:06 2026
*************** expand_doubleword_parity (scalar_int_mod
*** 2895,2910 ****
  /* Try calculating
  	(bswap:narrow x)
     as
! 	(lshiftrt:wide (bswap:wide x) ((width wide) - (width narrow))).  */
  static rtx
! widen_bswap (scalar_int_mode mode, rtx op0, rtx target)
  {
    rtx x;
    rtx_insn *last;
    opt_scalar_int_mode wider_mode_iter;
  
    FOR_EACH_WIDER_MODE (wider_mode_iter, mode)
!     if (optab_handler (bswap_optab, wider_mode_iter.require ())
  	!= CODE_FOR_nothing)
        break;
  
--- 2895,2912 ----
  /* Try calculating
  	(bswap:narrow x)
     as
! 	(lshiftrt:wide (bswap:wide x) ((width wide) - (width narrow)))
!    or similarly for bitreverse.  */
  static rtx
! widen_bswap_or_bitreverse (scalar_int_mode mode, rtx op0, rtx target,
! 			   optab unoptab)
  {
    rtx x;
    rtx_insn *last;
    opt_scalar_int_mode wider_mode_iter;
  
    FOR_EACH_WIDER_MODE (wider_mode_iter, mode)
!     if (optab_handler (unoptab, wider_mode_iter.require ())
  	!= CODE_FOR_nothing)
        break;
  
*************** widen_bswap (scalar_int_mode mode, rtx o
*** 2915,2921 ****
    last = get_last_insn ();
  
    x = widen_operand (op0, wider_mode, mode, true, true);
!   x = expand_unop (wider_mode, bswap_optab, x, NULL_RTX, true);
  
    gcc_assert (GET_MODE_PRECISION (wider_mode) == GET_MODE_BITSIZE (wider_mode)
  	      && GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode));
--- 2917,2923 ----
    last = get_last_insn ();
  
    x = widen_operand (op0, wider_mode, mode, true, true);
!   x = expand_unop (wider_mode, unoptab, x, NULL_RTX, true);
  
    gcc_assert (GET_MODE_PRECISION (wider_mode) == GET_MODE_BITSIZE (wider_mode)
  	      && GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode));
*************** widen_bswap (scalar_int_mode mode, rtx o
*** 2937,2952 ****
    return target;
  }
  
! /* Try calculating bswap as two bswaps of two word-sized operands.  */
  
  static rtx
! expand_doubleword_bswap (machine_mode mode, rtx op, rtx target)
  {
    rtx t0, t1;
  
!   t1 = expand_unop (word_mode, bswap_optab,
  		    operand_subword_force (op, 0, mode), NULL_RTX, true);
!   t0 = expand_unop (word_mode, bswap_optab,
  		    operand_subword_force (op, 1, mode), NULL_RTX, true);
  
    if (target == 0 || !valid_multiword_target_p (target))
--- 2939,2956 ----
    return target;
  }
  
! /* Try calculating bswap as two bswaps of two word-sized operands.
!    Similarly for bitreverse.  */
  
  static rtx
! expand_doubleword_bswap_or_bitreverse (machine_mode mode, rtx op, rtx target,
! 				       optab unoptab)
  {
    rtx t0, t1;
  
!   t1 = expand_unop (word_mode, unoptab,
  		    operand_subword_force (op, 0, mode), NULL_RTX, true);
!   t0 = expand_unop (word_mode, unoptab,
  		    operand_subword_force (op, 1, mode), NULL_RTX, true);
  
    if (target == 0 || !valid_multiword_target_p (target))
*************** expand_bitreverse (scalar_int_mode mode,
*** 2972,2977 ****
--- 2976,2991 ----
    if (precision < 4)
      return NULL_RTX;
  
+   if (rtx temp = widen_bswap_or_bitreverse (mode, op0, target,
+ 					    bitreverse_optab))
+     return temp;
+ 
+   if (GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
+       && optab_handler (bitreverse_optab, word_mode) != CODE_FOR_nothing)
+     if (rtx temp = expand_doubleword_bswap_or_bitreverse (mode, op0, target,
+ 							  bitreverse_optab))
+       return temp;
+ 
    if (target == NULL_RTX
        || target == op0
        || reg_overlap_mentioned_p (target, op0))
*************** expand_unop (machine_mode mode, optab un
*** 3516,3522 ****
  
        if (is_a <scalar_int_mode> (mode, &int_mode))
  	{
! 	  temp = widen_bswap (int_mode, op0, target);
  	  if (temp)
  	    return temp;
  
--- 3530,3536 ----
  
        if (is_a <scalar_int_mode> (mode, &int_mode))
  	{
! 	  temp = widen_bswap_or_bitreverse (int_mode, op0, target, unoptab);
  	  if (temp)
  	    return temp;
  
*************** expand_unop (machine_mode mode, optab un
*** 3526,3532 ****
  	      && (UNITS_PER_WORD == 8
  		  || optab_handler (unoptab, word_mode) != CODE_FOR_nothing))
  	    {
! 	      temp = expand_doubleword_bswap (mode, op0, target);
  	      if (temp)
  		return temp;
  	    }
--- 3540,3547 ----
  	      && (UNITS_PER_WORD == 8
  		  || optab_handler (unoptab, word_mode) != CODE_FOR_nothing))
  	    {
! 	      temp = expand_doubleword_bswap_or_bitreverse (mode, op0, target,
! 							    unoptab);
  	      if (temp)
  		return temp;
  	    }
diff -Nrcpad gcc-17-20260517/gcc/optinfo-emit-json.cc gcc-17-20260524/gcc/optinfo-emit-json.cc
*** gcc-17-20260517/gcc/optinfo-emit-json.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/optinfo-emit-json.cc	Sun May 24 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 51,100 ****
     in-memory JSON representation.  */
  
  optrecord_json_writer::optrecord_json_writer ()
!   : m_root_tuple (NULL), m_scopes ()
  {
!   m_root_tuple = new json::array ();
  
    /* Populate with metadata; compare with toplev.cc: print_version.  */
!   json::object *metadata = new json::object ();
!   m_root_tuple->append (metadata);
    metadata->set_string ("format", "1");
!   json::object *generator = new json::object ();
!   metadata->set ("generator", generator);
    generator->set_string ("name", lang_hooks.name);
    generator->set_string ("pkgversion", pkgversion_string);
    generator->set_string ("version", version_string);
    /* TARGET_NAME is passed in by the Makefile.  */
    generator->set_string ("target", TARGET_NAME);
  
    /* TODO: capture command-line?
       see gen_producer_string in dwarf2out.cc (currently static).  */
  
    /* TODO: capture "any plugins?" flag (or the plugins themselves).  */
  
!   json::array *passes = new json::array ();
!   m_root_tuple->append (passes);
  
    /* Call add_pass_list for all of the pass lists.  */
    {
  #define DEF_PASS_LIST(LIST) \
!     add_pass_list (passes, g->get_passes ()->LIST);
      GCC_PASS_LISTS
  #undef DEF_PASS_LIST
    }
  
!   json::array *records = new json::array ();
!   m_root_tuple->append (records);
! 
!   m_scopes.safe_push (records);
! }
! 
! /* optrecord_json_writer's ctor.
!    Delete the in-memory JSON representation.  */
! 
! optrecord_json_writer::~optrecord_json_writer ()
! {
!   delete m_root_tuple;
  }
  
  /* Choose an appropriate filename, and write the saved records to it.  */
--- 51,91 ----
     in-memory JSON representation.  */
  
  optrecord_json_writer::optrecord_json_writer ()
! : m_root_tuple (nullptr), m_scopes ()
  {
!   m_root_tuple = std::make_unique<json::array> ();
  
    /* Populate with metadata; compare with toplev.cc: print_version.  */
!   auto metadata = std::make_unique<json::object> ();
    metadata->set_string ("format", "1");
!   auto generator = std::make_unique<json::object> ();
    generator->set_string ("name", lang_hooks.name);
    generator->set_string ("pkgversion", pkgversion_string);
    generator->set_string ("version", version_string);
    /* TARGET_NAME is passed in by the Makefile.  */
    generator->set_string ("target", TARGET_NAME);
+   metadata->set<json::object> ("generator", std::move (generator));
+   m_root_tuple->append<json::object> (std::move (metadata));
  
    /* TODO: capture command-line?
       see gen_producer_string in dwarf2out.cc (currently static).  */
  
    /* TODO: capture "any plugins?" flag (or the plugins themselves).  */
  
!   auto passes = std::make_unique<json::array> ();
  
    /* Call add_pass_list for all of the pass lists.  */
    {
  #define DEF_PASS_LIST(LIST) \
!     add_pass_list (passes.get (), g->get_passes ()->LIST);
      GCC_PASS_LISTS
  #undef DEF_PASS_LIST
    }
+   m_root_tuple->append<json::array> (std::move (passes));
  
!   auto records = std::make_unique<json::array> ();
!   m_scopes.safe_push (records.get ());
!   m_root_tuple->append (std::move (records));
  }
  
  /* Choose an appropriate filename, and write the saved records to it.  */
*************** optrecord_json_writer::write () const
*** 106,114 ****
    m_root_tuple->print (&pp, false);
  
    bool emitted_error = false;
!   char *filename = concat (dump_base_name, ".opt-record.json.gz", NULL);
    gzFile outfile = gzopen (filename, "w");
!   if (outfile == NULL)
      {
        error_at (UNKNOWN_LOCATION, "cannot open file %qs for writing optimization records",
  		filename); // FIXME: more info?
--- 97,105 ----
    m_root_tuple->print (&pp, false);
  
    bool emitted_error = false;
!   char *filename = concat (dump_base_name, ".opt-record.json.gz", nullptr);
    gzFile outfile = gzopen (filename, "w");
!   if (outfile == nullptr)
      {
        error_at (UNKNOWN_LOCATION, "cannot open file %qs for writing optimization records",
  		filename); // FIXME: more info?
*************** optrecord_json_writer::write () const
*** 136,153 ****
  /* Add a record for OPTINFO to the queue of records to be written.  */
  
  void
! optrecord_json_writer::add_record (const optinfo *optinfo)
  {
!   json::object *obj = optinfo_to_json (optinfo);
  
!   add_record (obj);
  
    /* Potentially push the scope.  */
!   if (optinfo->get_kind () == optinfo::kind::scope)
      {
!       json::array *children = new json::array ();
!       obj->set ("children", children);
!       m_scopes.safe_push (children);
      }
  }
  
--- 127,145 ----
  /* Add a record for OPTINFO to the queue of records to be written.  */
  
  void
! optrecord_json_writer::add_record (const optinfo &optinfo)
  {
!   auto obj = optinfo_to_json (optinfo);
!   auto borrowed_obj = obj.get ();
  
!   add_record (std::move (obj));
  
    /* Potentially push the scope.  */
!   if (optinfo.get_kind () == optinfo::kind::scope)
      {
!       auto children = std::make_unique<json::array> ();
!       m_scopes.safe_push (children.get ());
!       borrowed_obj->set<json::array> ("children", std::move (children));
      }
  }
  
*************** optrecord_json_writer::add_record (const
*** 156,166 ****
  /* Add record OBJ to the innermost scope.  */
  
  void
! optrecord_json_writer::add_record (json::object *obj)
  {
    /* Add to innermost scope.  */
    gcc_assert (m_scopes.length () > 0);
!   m_scopes[m_scopes.length () - 1]->append (obj);
  }
  
  /* Pop the innermost scope.  */
--- 148,158 ----
  /* Add record OBJ to the innermost scope.  */
  
  void
! optrecord_json_writer::add_record (std::unique_ptr<json::object> obj)
  {
    /* Add to innermost scope.  */
    gcc_assert (m_scopes.length () > 0);
!   m_scopes[m_scopes.length () - 1]->append<json::object> (std::move (obj));
  }
  
  /* Pop the innermost scope.  */
*************** optrecord_json_writer::pop_scope ()
*** 176,185 ****
  
  /* Create a JSON object representing LOC.  */
  
! json::object *
  optrecord_json_writer::impl_location_to_json (dump_impl_location_t loc)
  {
!   json::object *obj = new json::object ();
    obj->set_string ("file", loc.m_file);
    obj->set_integer ("line", loc.m_line);
    if (loc.m_function)
--- 168,177 ----
  
  /* Create a JSON object representing LOC.  */
  
! std::unique_ptr<json::object>
  optrecord_json_writer::impl_location_to_json (dump_impl_location_t loc)
  {
!   auto obj = std::make_unique<json::object> ();
    obj->set_string ("file", loc.m_file);
    obj->set_integer ("line", loc.m_line);
    if (loc.m_function)
*************** optrecord_json_writer::impl_location_to_
*** 189,200 ****
  
  /* Create a JSON object representing LOC.  */
  
! json::object *
  optrecord_json_writer::location_to_json (location_t loc)
  {
    gcc_assert (LOCATION_LOCUS (loc) != UNKNOWN_LOCATION);
    expanded_location exploc = expand_location (loc);
!   json::object *obj = new json::object ();
    obj->set_string ("file", exploc.file);
    obj->set_integer ("line", exploc.line);
    obj->set_integer ("column", exploc.column);
--- 181,192 ----
  
  /* Create a JSON object representing LOC.  */
  
! std::unique_ptr<json::object>
  optrecord_json_writer::location_to_json (location_t loc)
  {
    gcc_assert (LOCATION_LOCUS (loc) != UNKNOWN_LOCATION);
    expanded_location exploc = expand_location (loc);
!   auto obj = std::make_unique<json::object> ();
    obj->set_string ("file", exploc.file);
    obj->set_integer ("line", exploc.line);
    obj->set_integer ("column", exploc.column);
*************** optrecord_json_writer::location_to_json
*** 203,212 ****
  
  /* Create a JSON object representing COUNT.  */
  
! json::object *
  optrecord_json_writer::profile_count_to_json (profile_count count)
  {
!   json::object *obj = new json::object ();
    obj->set_integer ("value", count.to_gcov_type ());
    obj->set_string ("quality", profile_quality_as_string (count.quality ()));
    return obj;
--- 195,204 ----
  
  /* Create a JSON object representing COUNT.  */
  
! std::unique_ptr<json::object>
  optrecord_json_writer::profile_count_to_json (profile_count count)
  {
!   auto obj = std::make_unique<json::object> ();
    obj->set_integer ("value", count.to_gcov_type ());
    obj->set_string ("quality", profile_quality_as_string (count.quality ()));
    return obj;
*************** optrecord_json_writer::profile_count_to_
*** 215,237 ****
  /* Get a string for use when referring to PASS in the saved optimization
     records.  */
  
! json::string *
! optrecord_json_writer::get_id_value_for_pass (opt_pass *pass)
  {
    pretty_printer pp;
    /* this is host-dependent, but will be consistent for a given host.  */
!   pp_pointer (&pp, static_cast<void *> (pass));
!   return new json::string (pp_formatted_text (&pp));
  }
  
  /* Create a JSON object representing PASS.  */
  
! json::object *
! optrecord_json_writer::pass_to_json (opt_pass *pass)
  {
!   json::object *obj = new json::object ();
!   const char *type = NULL;
!   switch (pass->type)
      {
      default:
        gcc_unreachable ();
--- 207,229 ----
  /* Get a string for use when referring to PASS in the saved optimization
     records.  */
  
! std::unique_ptr<json::string>
! optrecord_json_writer::get_id_value_for_pass (const opt_pass &pass)
  {
    pretty_printer pp;
    /* this is host-dependent, but will be consistent for a given host.  */
!   pp_pointer (&pp, static_cast<const void *> (&pass));
!   return std::make_unique<json::string> (pp_formatted_text (&pp));
  }
  
  /* Create a JSON object representing PASS.  */
  
! std::unique_ptr<json::object>
! optrecord_json_writer::pass_to_json (const opt_pass &pass)
  {
!   auto obj = std::make_unique<json::object> ();
!   const char *type = nullptr;
!   switch (pass.type)
      {
      default:
        gcc_unreachable ();
*************** optrecord_json_writer::pass_to_json (opt
*** 248,267 ****
        type = "ipa";
        break;
      }
!   obj->set ("id", get_id_value_for_pass (pass));
    obj->set_string ("type", type);
!   obj->set_string ("name", pass->name);
    /* Represent the optgroup flags as an array.  */
    {
!     json::array *optgroups = new json::array ();
!     obj->set ("optgroups", optgroups);
      for (const kv_pair<optgroup_flags_t> *optgroup = optgroup_options;
! 	 optgroup->name != NULL; optgroup++)
        if (optgroup->value != OPTGROUP_ALL
! 	  && (pass->optinfo_flags & optgroup->value))
  	optgroups->append_string (optgroup->name);
    }
!   obj->set_integer ("num", pass->static_pass_number);
    return obj;
  }
  
--- 240,259 ----
        type = "ipa";
        break;
      }
!   obj->set<json::string> ("id", get_id_value_for_pass (pass));
    obj->set_string ("type", type);
!   obj->set_string ("name", pass.name);
    /* Represent the optgroup flags as an array.  */
    {
!     auto optgroups = std::make_unique<json::array> ();
      for (const kv_pair<optgroup_flags_t> *optgroup = optgroup_options;
! 	 optgroup->name != nullptr; optgroup++)
        if (optgroup->value != OPTGROUP_ALL
! 	  && (pass.optinfo_flags & optgroup->value))
  	optgroups->append_string (optgroup->name);
+     obj->set<json::array> ("optgroups", std::move (optgroups));
    }
!   obj->set_integer ("num", pass.static_pass_number);
    return obj;
  }
  
*************** optrecord_json_writer::pass_to_json (opt
*** 269,278 ****
     locations.
     Compare with lhd_print_error_function and cp_print_error_function.  */
  
! json::value *
  optrecord_json_writer::inlining_chain_to_json (location_t loc)
  {
!   json::array *array = new json::array ();
  
    tree abstract_origin = LOCATION_BLOCK (loc);
  
--- 261,270 ----
     locations.
     Compare with lhd_print_error_function and cp_print_error_function.  */
  
! std::unique_ptr<json::array>
  optrecord_json_writer::inlining_chain_to_json (location_t loc)
  {
!   auto array = std::make_unique<json::array> ();
  
    tree abstract_origin = LOCATION_BLOCK (loc);
  
*************** optrecord_json_writer::inlining_chain_to
*** 282,288 ****
        tree block = abstract_origin;
  
        locus = &BLOCK_SOURCE_LOCATION (block);
!       tree fndecl = NULL;
        block = BLOCK_SUPERCONTEXT (block);
        while (block && TREE_CODE (block) == BLOCK
  	     && BLOCK_ABSTRACT_ORIGIN (block))
--- 274,280 ----
        tree block = abstract_origin;
  
        locus = &BLOCK_SOURCE_LOCATION (block);
!       tree fndecl = nullptr;
        block = BLOCK_SUPERCONTEXT (block);
        while (block && TREE_CODE (block) == BLOCK
  	     && BLOCK_ABSTRACT_ORIGIN (block))
*************** optrecord_json_writer::inlining_chain_to
*** 307,323 ****
  
  	  if (block && TREE_CODE (block) == FUNCTION_DECL)
  	    fndecl = block;
! 	  abstract_origin = NULL;
  	}
        if (fndecl)
  	{
! 	  json::object *obj = new json::object ();
  	  const char *printable_name
  	    = lang_hooks.decl_printable_name (fndecl, 2);
  	  obj->set_string ("fndecl", printable_name);
  	  if (LOCATION_LOCUS (*locus) != UNKNOWN_LOCATION)
! 	    obj->set ("site", location_to_json (*locus));
! 	  array->append (obj);
  	}
      }
  
--- 299,315 ----
  
  	  if (block && TREE_CODE (block) == FUNCTION_DECL)
  	    fndecl = block;
! 	  abstract_origin = nullptr;
  	}
        if (fndecl)
  	{
! 	  auto obj = std::make_unique<json::object> ();
  	  const char *printable_name
  	    = lang_hooks.decl_printable_name (fndecl, 2);
  	  obj->set_string ("fndecl", printable_name);
  	  if (LOCATION_LOCUS (*locus) != UNKNOWN_LOCATION)
! 	    obj->set<json::object> ("site", location_to_json (*locus));
! 	  array->append<json::object> (std::move (obj));
  	}
      }
  
*************** optrecord_json_writer::inlining_chain_to
*** 326,346 ****
  
  /* Create a JSON object representing OPTINFO.  */
  
! json::object *
! optrecord_json_writer::optinfo_to_json (const optinfo *optinfo)
  {
!   json::object *obj = new json::object ();
  
!   obj->set ("impl_location",
! 	    impl_location_to_json (optinfo->get_impl_location ()));
  
!   const char *kind_str = optinfo::kind_to_string (optinfo->get_kind ());
    obj->set_string ("kind", kind_str);
!   json::array *message = new json::array ();
!   obj->set ("message", message);
!   for (unsigned i = 0; i < optinfo->num_items (); i++)
      {
!       const optinfo_item *item = optinfo->get_item (i);
        switch (item->get_kind ())
  	{
  	default:
--- 318,338 ----
  
  /* Create a JSON object representing OPTINFO.  */
  
! std::unique_ptr<json::object>
! optrecord_json_writer::optinfo_to_json (const optinfo &optinfo)
  {
!   auto obj = std::make_unique<json::object> ();
  
!   obj->set<json::object>
!     ("impl_location",
!      impl_location_to_json (optinfo.get_impl_location ()));
  
!   const char *kind_str = optinfo::kind_to_string (optinfo.get_kind ());
    obj->set_string ("kind", kind_str);
!   auto message = std::make_unique<json::array> ();
!   for (unsigned i = 0; i < optinfo.num_items (); i++)
      {
!       const optinfo_item *item = optinfo.get_item (i);
        switch (item->get_kind ())
  	{
  	default:
*************** optrecord_json_writer::optinfo_to_json (
*** 352,411 ****
  	  break;
  	case optinfo_item::kind::tree:
  	  {
! 	    json::object *json_item = new json::object ();
  	    json_item->set_string ("expr", item->get_text ());
  
  	    /* Capture any location for the node.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set ("location",
! 			      location_to_json (item->get_location ()));
  
! 	    message->append (json_item);
  	  }
  	  break;
  	case optinfo_item::kind::gimple:
  	  {
! 	    json::object *json_item = new json::object ();
  	    json_item->set_string ("stmt", item->get_text ());
  
  	    /* Capture any location for the stmt.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set ("location",
! 			      location_to_json (item->get_location ()));
  
! 	    message->append (json_item);
  	  }
  	  break;
  	case optinfo_item::kind::symtab_node:
  	  {
! 	    json::object *json_item = new json::object ();
  	    json_item->set_string ("symtab_node", item->get_text ());
  
  	    /* Capture any location for the node.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set ("location",
! 			      location_to_json (item->get_location ()));
! 	    message->append (json_item);
  	  }
  	  break;
  	}
     }
  
!   if (optinfo->get_pass ())
!     obj->set ("pass", get_id_value_for_pass (optinfo->get_pass ()));
  
!   profile_count count = optinfo->get_count ();
    if (count.initialized_p ())
!     obj->set ("count", profile_count_to_json (count));
  
    /* Record any location, handling the case where of an UNKNOWN_LOCATION
       within an inlined block.  */
!   location_t loc = optinfo->get_location_t ();
    if (get_pure_location (line_table, loc) != UNKNOWN_LOCATION)
      {
        // TOOD: record the location (just caret for now)
        // TODO: start/finish also?
!       obj->set ("location", location_to_json (loc));
      }
  
    if (current_function_decl)
--- 344,408 ----
  	  break;
  	case optinfo_item::kind::tree:
  	  {
! 	    auto json_item = std::make_unique<json::object> ();
  	    json_item->set_string ("expr", item->get_text ());
  
  	    /* Capture any location for the node.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set<json::object>
! 		("location",
! 		 location_to_json (item->get_location ()));
  
! 	    message->append<json::object> (std::move (json_item));
  	  }
  	  break;
  	case optinfo_item::kind::gimple:
  	  {
! 	    auto json_item = std::make_unique<json::object> ();
  	    json_item->set_string ("stmt", item->get_text ());
  
  	    /* Capture any location for the stmt.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set<json::object>
! 		("location",
! 		 location_to_json (item->get_location ()));
  
! 	    message->append<json::object> (std::move (json_item));
  	  }
  	  break;
  	case optinfo_item::kind::symtab_node:
  	  {
! 	    auto json_item = std::make_unique<json::object> ();
  	    json_item->set_string ("symtab_node", item->get_text ());
  
  	    /* Capture any location for the node.  */
  	    if (LOCATION_LOCUS (item->get_location ()) != UNKNOWN_LOCATION)
! 	      json_item->set<json::object>
! 		("location",
! 		 location_to_json (item->get_location ()));
! 	    message->append<json::object> (std::move (json_item));
  	  }
  	  break;
  	}
     }
+   obj->set<json::array> ("message", std::move (message));
  
!   if (auto pass = optinfo.get_pass ())
!     obj->set<json::string> ("pass",
! 			    get_id_value_for_pass (*pass));
  
!   profile_count count = optinfo.get_count ();
    if (count.initialized_p ())
!     obj->set<json::object> ("count", profile_count_to_json (count));
  
    /* Record any location, handling the case where of an UNKNOWN_LOCATION
       within an inlined block.  */
!   location_t loc = optinfo.get_location_t ();
    if (get_pure_location (line_table, loc) != UNKNOWN_LOCATION)
      {
        // TOOD: record the location (just caret for now)
        // TODO: start/finish also?
!       obj->set<json::object> ("location", location_to_json (loc));
      }
  
    if (current_function_decl)
*************** optrecord_json_writer::optinfo_to_json (
*** 416,422 ****
      }
  
    if (loc != UNKNOWN_LOCATION)
!     obj->set ("inlining_chain", inlining_chain_to_json (loc));
  
    return obj;
  }
--- 413,419 ----
      }
  
    if (loc != UNKNOWN_LOCATION)
!     obj->set<json::array> ("inlining_chain", inlining_chain_to_json (loc));
  
    return obj;
  }
*************** optrecord_json_writer::optinfo_to_json (
*** 425,442 ****
     child passes (adding their descriptions within a "children" array).  */
  
  void
! optrecord_json_writer::add_pass_list (json::array *arr, opt_pass *pass)
  {
    do
      {
!       json::object *pass_obj = pass_to_json (pass);
!       arr->append (pass_obj);
        if (pass->sub)
  	{
! 	  json::array *sub = new json::array ();
! 	  pass_obj->set ("children", sub);
! 	  add_pass_list (sub, pass->sub);
  	}
        pass = pass->next;
      }
    while (pass);
--- 422,441 ----
     child passes (adding their descriptions within a "children" array).  */
  
  void
! optrecord_json_writer::add_pass_list (json::array *arr,
! 				      const opt_pass *pass)
  {
+   gcc_assert (pass);
    do
      {
!       auto pass_obj = pass_to_json (*pass);
        if (pass->sub)
  	{
! 	  auto child_arr = std::make_unique<json::array> ();
! 	  add_pass_list (child_arr.get (), pass->sub);
! 	  pass_obj->set ("children", std::move (child_arr));
  	}
+       arr->append (std::move (pass_obj));
        pass = pass->next;
      }
    while (pass);
*************** test_building_json_from_dump_calls ()
*** 457,468 ****
    dump_printf_loc (MSG_NOTE, loc, "test of tree: ");
    dump_generic_expr (MSG_NOTE, TDF_SLIM, integer_zero_node);
    optinfo *info = tmp.get_pending_optinfo ();
!   ASSERT_TRUE (info != NULL);
    ASSERT_EQ (info->num_items (), 2);
  
    optrecord_json_writer writer;
!   json::object *json_obj = writer.optinfo_to_json (info);
!   ASSERT_TRUE (json_obj != NULL);
  
    /* Verify that the json is sane.  */
    pretty_printer pp;
--- 456,467 ----
    dump_printf_loc (MSG_NOTE, loc, "test of tree: ");
    dump_generic_expr (MSG_NOTE, TDF_SLIM, integer_zero_node);
    optinfo *info = tmp.get_pending_optinfo ();
!   ASSERT_TRUE (info != nullptr);
    ASSERT_EQ (info->num_items (), 2);
  
    optrecord_json_writer writer;
!   auto json_obj = writer.optinfo_to_json (*info);
!   ASSERT_TRUE (json_obj != nullptr);
  
    /* Verify that the json is sane.  */
    pretty_printer pp;
*************** test_building_json_from_dump_calls ()
*** 472,478 ****
    ASSERT_STR_CONTAINS (json_str, "\"kind\": \"note\"");
    ASSERT_STR_CONTAINS (json_str,
  		       "\"message\": [\"test of tree: \", {\"expr\": \"0\"}]");
-   delete json_obj;
  }
  
  /* Run all of the selftests within this file.  */
--- 471,476 ----
diff -Nrcpad gcc-17-20260517/gcc/optinfo-emit-json.h gcc-17-20260524/gcc/optinfo-emit-json.h
*** gcc-17-20260517/gcc/optinfo-emit-json.h	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/optinfo-emit-json.h	Sun May 24 22:32:06 2026
*************** class optrecord_json_writer
*** 31,57 ****
  {
  public:
    optrecord_json_writer ();
!   ~optrecord_json_writer ();
    void write () const;
!   void add_record (const optinfo *optinfo);
    void pop_scope ();
  
!   void add_record (json::object *obj);
!   json::object *impl_location_to_json (dump_impl_location_t loc);
!   json::object *location_to_json (location_t loc);
!   json::object *profile_count_to_json (profile_count count);
!   json::string *get_id_value_for_pass (opt_pass *pass);
!   json::object *pass_to_json (opt_pass *pass);
!   json::value *inlining_chain_to_json (location_t loc);
!   json::object *optinfo_to_json (const optinfo *optinfo);
!   void add_pass_list (json::array *arr, opt_pass *pass);
  
   private:
    /* The root value for the JSON file.
       Currently the JSON values are stored in memory, and flushed when the
       compiler exits.  It would probably be better to simply write out
       the JSON as we go.  */
!   json::array *m_root_tuple;
  
    /* The currently open scopes, for expressing nested optimization records.  */
    auto_vec<json::array *> m_scopes;
--- 31,73 ----
  {
  public:
    optrecord_json_writer ();
! 
    void write () const;
!   void add_record (const optinfo &optinfo);
    void pop_scope ();
  
!   void add_record (std::unique_ptr<json::object> obj);
! 
!   std::unique_ptr<json::object>
!   impl_location_to_json (dump_impl_location_t loc);
! 
!   std::unique_ptr<json::object>
!   location_to_json (location_t loc);
! 
!   std::unique_ptr<json::object>
!   profile_count_to_json (profile_count count);
! 
!   std::unique_ptr<json::string>
!   get_id_value_for_pass (const opt_pass &pass);
! 
!   std::unique_ptr<json::object>
!   pass_to_json (const opt_pass &pass);
! 
!   std::unique_ptr<json::array>
!   inlining_chain_to_json (location_t loc);
! 
!   std::unique_ptr<json::object>
!   optinfo_to_json (const optinfo &optinfo);
! 
!   void
!   add_pass_list (json::array *arr, const opt_pass *pass);
  
   private:
    /* The root value for the JSON file.
       Currently the JSON values are stored in memory, and flushed when the
       compiler exits.  It would probably be better to simply write out
       the JSON as we go.  */
!   std::unique_ptr<json::array> m_root_tuple;
  
    /* The currently open scopes, for expressing nested optimization records.  */
    auto_vec<json::array *> m_scopes;
diff -Nrcpad gcc-17-20260517/gcc/optinfo.cc gcc-17-20260524/gcc/optinfo.cc
*** gcc-17-20260517/gcc/optinfo.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/optinfo.cc	Sun May 24 22:32:06 2026
*************** optinfo::emit_for_opt_problem () const
*** 125,131 ****
      dump_context::get ().emit_item (*item, dump_kind);
  
    /* Re-emit to "non-immediate" destinations.  */
!   dump_context::get ().emit_optinfo (this);
  }
  
  /* Update the optinfo's kind based on DUMP_KIND.  */
--- 125,131 ----
      dump_context::get ().emit_item (*item, dump_kind);
  
    /* Re-emit to "non-immediate" destinations.  */
!   dump_context::get ().emit_optinfo (*this);
  }
  
  /* Update the optinfo's kind based on DUMP_KIND.  */
diff -Nrcpad gcc-17-20260517/gcc/params.opt gcc-17-20260524/gcc/params.opt
*** gcc-17-20260517/gcc/params.opt	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/params.opt	Sun May 24 22:32:06 2026
*************** Common Joined UInteger Var(param_integer
*** 250,256 ****
  The upper bound for sharing integer constants.
  
  -param=ipa-cp-eval-threshold=
! Common Joined UInteger Var(param_ipa_cp_eval_threshold) Init(500) Param Optimization
  Threshold ipa-cp opportunity evaluation that is still considered beneficial to clone.
  
  -param=ipa-cp-loop-hint-bonus=
--- 250,256 ----
  The upper bound for sharing integer constants.
  
  -param=ipa-cp-eval-threshold=
! Common Joined UInteger Var(param_ipa_cp_eval_threshold) Init(1100) Param Optimization
  Threshold ipa-cp opportunity evaluation that is still considered beneficial to clone.
  
  -param=ipa-cp-loop-hint-bonus=
diff -Nrcpad gcc-17-20260517/gcc/po/ChangeLog gcc-17-20260524/gcc/po/ChangeLog
*** gcc-17-20260517/gcc/po/ChangeLog	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/po/ChangeLog	Sun May 24 22:32:06 2026
***************
*** 1,3 ****
--- 1,7 ----
+ 2026-05-18  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* sv.po: Update.
+ 
  2026-05-05  Joseph Myers  <josmyers@redhat.com>
  
  	* de.po: Update.
diff -Nrcpad gcc-17-20260517/gcc/po/sv.po gcc-17-20260524/gcc/po/sv.po
*** gcc-17-20260517/gcc/po/sv.po	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/po/sv.po	Sun May 24 22:32:06 2026
***************
*** 30,39 ****
  # thunk			snutt
  msgid ""
  msgstr ""
! "Project-Id-Version: gcc 16.1-b20260329\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-04-22 17:18+0000\n"
! "PO-Revision-Date: 2026-04-24 22:05+0200\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
--- 30,39 ----
  # thunk			snutt
  msgid ""
  msgstr ""
! "Project-Id-Version: gcc 16.1.0\n"
  "Report-Msgid-Bugs-To: https://gcc.gnu.org/bugs/\n"
  "POT-Creation-Date: 2026-04-22 17:18+0000\n"
! "PO-Revision-Date: 2026-05-18 11:39+0200\n"
  "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
  "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
  "Language: sv\n"
*************** msgstr "Generera kod för PA2.0 (kräver
*** 1430,1436 ****
  #: config/pa/pa.opt:42
  #, no-c-format
  msgid "Generate libcalls for atomic loads and stores when sync libcalls are disabled."
! msgstr "Generera bibliteksanrop för atomiska läsningar och lagringar när synkrona biblioteksanrop är avaktiverade."
  
  #: config/pa/pa.opt:50
  #, no-c-format
--- 1430,1436 ----
  #: config/pa/pa.opt:42
  #, no-c-format
  msgid "Generate libcalls for atomic loads and stores when sync libcalls are disabled."
! msgstr "Generera biblioteksanrop för atomära läsningar och lagringar när synkrona biblioteksanrop är avaktiverade."
  
  #: config/pa/pa.opt:50
  #, no-c-format
*************** msgstr "Dra nytta av länkarlättnader f
*** 2663,2669 ****
  #: config/riscv/riscv.opt:163
  #, no-c-format
  msgid "Enable the CSR checking for the ISA-dependent CSR and the read-only CSR. The ISA-dependent CSR are only valid when the specific ISA is set.  The read-only CSR can not be written by the CSR instructions."
! msgstr "Aktivera CSR-kontroll för den ISA-beroende CSR:en och endast läsnings-CSR:er. De ISA-beroande CSR:erna är endast giltiga för det specifika ISA-uppsättningen. Endast läsnings-CSR:er kan inte skrivas av CSR-instruktionerna."
  
  #: config/riscv/riscv.opt:169 config/i386/i386.opt:413
  #: config/aarch64/aarch64.opt:160
--- 2663,2669 ----
  #: config/riscv/riscv.opt:163
  #, no-c-format
  msgid "Enable the CSR checking for the ISA-dependent CSR and the read-only CSR. The ISA-dependent CSR are only valid when the specific ISA is set.  The read-only CSR can not be written by the CSR instructions."
! msgstr "Aktivera CSR-kontroll för den ISA-beroende CSR:en och endast läsnings-CSR:er. De ISA-beroande CSR:erna är endast giltiga för den specifika ISA-uppsättningen. Endast läsnings-CSR:er kan inte skrivas av CSR-instruktionerna."
  
  #: config/riscv/riscv.opt:169 config/i386/i386.opt:413
  #: config/aarch64/aarch64.opt:160
*************** msgstr "Denna flagga används internt f�
*** 3325,3331 ****
  #: config/avr/avr.opt:137
  #, no-c-format
  msgid "Optimization. Split register additions from load/store instructions. Most useful on Reduced Tiny."
! msgstr "Optimering. Dela registeradditioner fån ladda-/lagrainstruktioner. Mest användbart på Reduced Tiny."
  
  #: config/avr/avr.opt:141
  #, no-c-format
--- 3325,3331 ----
  #: config/avr/avr.opt:137
  #, no-c-format
  msgid "Optimization. Split register additions from load/store instructions. Most useful on Reduced Tiny."
! msgstr "Optimering. Dela registeradditioner från ladda-/lagrainstruktioner. Mest användbart på Reduced Tiny."
  
  #: config/avr/avr.opt:141
  #, no-c-format
*************** msgstr "Sätt att gå runt ARM Cortex-A5
*** 5748,5754 ****
  #: config/aarch64/aarch64.opt:108
  #, no-c-format
  msgid "Enable narrowing of 64-bit general purpose register writes to 32-bit when upper 32 bits of the register are unused."
! msgstr ""
  
  #: config/aarch64/aarch64.opt:121
  #, no-c-format
--- 5748,5754 ----
  #: config/aarch64/aarch64.opt:108
  #, no-c-format
  msgid "Enable narrowing of 64-bit general purpose register writes to 32-bit when upper 32 bits of the register are unused."
! msgstr "Aktivera avsmalning av 64-bitars skrivningar till generella register till 32-bitars när de övre 32 bitarna av registret är oanvända."
  
  #: config/aarch64/aarch64.opt:121
  #, no-c-format
*************** msgstr "-msve-vector-bits=<antal>\tAnge
*** 5858,5864 ****
  #: config/aarch64/aarch64.opt:313
  #, no-c-format
  msgid "-mautovec-preference=[default|asimd-only|sve-only|prefer-asimd|prefer-sve] Force an ISA selection strategy for auto-vectorization.  For best performance it is highly recommended to use -mcpu or -mtune instead.  This parameter should only be used for code exploration."
! msgstr "-autovec-preference=[default|asimd-only|sve-only|prefer-asimd|prefer-sve] Framtvinga en ISA-valsstrategi för autovektorisering. För bästa prestanda rekommenderas det starkt att använda -mcpu eller -mtune istället. Denna parameter bör bara användas för kodutforskning."
  
  #: config/aarch64/aarch64.opt:324
  #, no-c-format
--- 5858,5864 ----
  #: config/aarch64/aarch64.opt:313
  #, no-c-format
  msgid "-mautovec-preference=[default|asimd-only|sve-only|prefer-asimd|prefer-sve] Force an ISA selection strategy for auto-vectorization.  For best performance it is highly recommended to use -mcpu or -mtune instead.  This parameter should only be used for code exploration."
! msgstr "-mautovec-preference=[default|asimd-only|sve-only|prefer-asimd|prefer-sve] Framtvinga en ISA-valsstrategi för autovektorisering. För bästa prestanda rekommenderas det starkt att använda -mcpu eller -mtune istället. Denna parameter bör bara användas för kodutforskning."
  
  #: config/aarch64/aarch64.opt:324
  #, no-c-format
*************** msgstr "Generera kod för att spåra nä
*** 5873,5884 ****
  #: config/aarch64/aarch64.opt:332
  #, no-c-format
  msgid "Enable the copy of the AArch64 load/store pair fusion pass that runs before register allocation."
! msgstr "Aktivera kopieringen av sammanslagningspasset av load/store-par för AArch64 som köre före registerallokering."
  
  #: config/aarch64/aarch64.opt:337
  #, no-c-format
  msgid "Enable the copy of the AArch64 load/store pair fusion pass that runs after register allocation."
! msgstr "Aktivera kopieringen av sammanslagningspasset av load/store-par för AArch64 som köre efter registerallokering."
  
  #: config/aarch64/aarch64.opt:356
  #, no-c-format
--- 5873,5884 ----
  #: config/aarch64/aarch64.opt:332
  #, no-c-format
  msgid "Enable the copy of the AArch64 load/store pair fusion pass that runs before register allocation."
! msgstr "Aktivera kopieringen av sammanslagningspasset av load/store-par för AArch64 som körs före registerallokering."
  
  #: config/aarch64/aarch64.opt:337
  #, no-c-format
  msgid "Enable the copy of the AArch64 load/store pair fusion pass that runs after register allocation."
! msgstr "Aktivera kopieringen av sammanslagningspasset av load/store-par för AArch64 som körs efter registerallokering."
  
  #: config/aarch64/aarch64.opt:356
  #, no-c-format
*************** msgstr "Konstant memset-storlek i byte �
*** 5933,5944 ****
  #: config/aarch64/aarch64.opt:430
  #, no-c-format
  msgid "--param=aarch64-ldp-policy=[default|always|never|aligned] Fine-grained policy for load pairs."
! msgstr "--param=aarch64-ldp-policy=[default|always|never|aligned] Finkorning policy för laddningspar."
  
  #: config/aarch64/aarch64.opt:434
  #, no-c-format
  msgid "--param=aarch64-stp-policy=[default|always|never|aligned] Fine-grained policy for store pairs."
! msgstr "--param=aarch64-stp-policy=[default|always|never|aligned] Finkorning policy för lagringspar."
  
  #: config/aarch64/aarch64.opt:453
  #, no-c-format
--- 5933,5944 ----
  #: config/aarch64/aarch64.opt:430
  #, no-c-format
  msgid "--param=aarch64-ldp-policy=[default|always|never|aligned] Fine-grained policy for load pairs."
! msgstr "--param=aarch64-ldp-policy=[default|always|never|aligned] Finkornig policy för laddningspar."
  
  #: config/aarch64/aarch64.opt:434
  #, no-c-format
  msgid "--param=aarch64-stp-policy=[default|always|never|aligned] Fine-grained policy for store pairs."
! msgstr "--param=aarch64-stp-policy=[default|always|never|aligned] Finkornig policy för lagringspar."
  
  #: config/aarch64/aarch64.opt:453
  #, no-c-format
*************** msgstr "Generera approximativ inversdivi
*** 6648,6654 ****
  #: config/loongarch/loongarch.opt:302
  #, no-c-format
  msgid "Avoid using the GOT to access external symbols."
! msgstr "Undvika att använda GOT för att komma åt externa symboler."
  
  #: config/loongarch/loongarch.opt:311
  #, no-c-format
--- 6648,6654 ----
  #: config/loongarch/loongarch.opt:302
  #, no-c-format
  msgid "Avoid using the GOT to access external symbols."
! msgstr "Undvik att använda GOT för att komma åt externa symboler."
  
  #: config/loongarch/loongarch.opt:311
  #, no-c-format
*************** msgstr "Använd för att generera kod f�
*** 6953,6959 ****
  #: config/darwin.opt:179
  #, no-c-format
  msgid "Ignore the normal two-level namespace; resolve symbols in command line order and do not record which library provided the resolved symbol."
! msgstr "Ignorera den normala tvånivånamnrymden; slå upp symboler i kommandoradsordning och notera inte vilket bibliotek som tillhandahöll den upplösta symbolen."
  
  #: config/darwin.opt:183
  #, no-c-format
--- 6953,6959 ----
  #: config/darwin.opt:179
  #, no-c-format
  msgid "Ignore the normal two-level namespace; resolve symbols in command line order and do not record which library provided the resolved symbol."
! msgstr "Ignorera den normala tvånivånamnrymden; slå upp symboler i kommandoradsordning och notera inte vilket bibliotek som tillhandahöll den uppslagna symbolen."
  
  #: config/darwin.opt:183
  #, no-c-format
*************** msgstr "För assemblern (och länkaren)
*** 6963,6969 ****
  #: config/darwin.opt:187
  #, no-c-format
  msgid "Set the output object such that, on loading, dyld will ignore any two-level namespace information and resolve symbols in the discovery order for loaded libs."
! msgstr "Sätt utdataobjektet så att, vid laddning, dyld kommer ignorera tvånivås namnrymdsinformation och lösa upp symboler i upptäcktsordning från de laddade biblioteken."
  
  #: config/darwin.opt:191
  #, no-c-format
--- 6963,6969 ----
  #: config/darwin.opt:187
  #, no-c-format
  msgid "Set the output object such that, on loading, dyld will ignore any two-level namespace information and resolve symbols in the discovery order for loaded libs."
! msgstr "Sätt utdataobjektet så att, vid laddning, dyld kommer ignorera tvånivås namnrymdsinformation och slå upp symboler i upptäcktsordning från de laddade biblioteken."
  
  #: config/darwin.opt:191
  #, no-c-format
*************** msgstr "Mata ut sammanslagna multiplicer
*** 7933,7939 ****
  #: config/s390/s390.opt:352
  #, no-c-format
  msgid "Store all argument registers on the stack."
! msgstr "Slagra alla argumentregister på stacken."
  
  #: config/s390/s390.opt:356
  #, no-c-format
--- 7933,7939 ----
  #: config/s390/s390.opt:352
  #, no-c-format
  msgid "Store all argument registers on the stack."
! msgstr "Lagra alla argumentregister på stacken."
  
  #: config/s390/s390.opt:356
  #, no-c-format
*************** msgstr "Preprocessa modulen med cpp."
*** 8788,8794 ****
  #: m2/lang.opt:79 m2/lang.opt:83
  #, no-c-format
  msgid "Passed to the preprocessor if -fcpp is used (internal switch)."
! msgstr "Skickas till proprocessorn om -fcpp används (intern flagga)."
  
  #: m2/lang.opt:87
  #, no-c-format
--- 8788,8794 ----
  #: m2/lang.opt:79 m2/lang.opt:83
  #, no-c-format
  msgid "Passed to the preprocessor if -fcpp is used (internal switch)."
! msgstr "Skickas till preprocessorn om -fcpp används (intern flagga)."
  
  #: m2/lang.opt:87
  #, no-c-format
*************** msgstr "Spåra procedurers radnummer (in
*** 8808,8814 ****
  #: m2/lang.opt:99
  #, no-c-format
  msgid "Recognize the specified suffix as a definition module filename."
! msgstr "Känn igen det angivna suffixet som ett definitionsmudulsfilnamn."
  
  #: m2/lang.opt:103
  #, no-c-format
--- 8808,8814 ----
  #: m2/lang.opt:99
  #, no-c-format
  msgid "Recognize the specified suffix as a definition module filename."
! msgstr "Känn igen det angivna suffixet som ett definitionsmodulsfilnamn."
  
  #: m2/lang.opt:103
  #, no-c-format
*************** msgstr "Sätt alla platsvärden till ett
*** 8855,8860 ****
--- 8855,8861 ----
  msgid "Internal debug tracing for quad,token,line,all (internal switch)."
  msgstr "Intern felsökningsspårning för quad,token,line,all (intern flagga)."
  
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125348
  #: m2/lang.opt:139
  #, no-c-format
  msgid "Dump Modula-2 internal intemediate representation specified by: all,quad,decl,gimple."
*************** msgstr "Intern information för kompilat
*** 8983,8989 ****
  #: m2/lang.opt:251
  #, no-c-format
  msgid "Runtime range checking for numerical values."
! msgstr "Körtidkontrol av intervall för numeriska värden."
  
  #: m2/lang.opt:255
  #, no-c-format
--- 8984,8990 ----
  #: m2/lang.opt:251
  #, no-c-format
  msgid "Runtime range checking for numerical values."
! msgstr "Körtidkontroll av intervall för numeriska värden."
  
  #: m2/lang.opt:255
  #, no-c-format
*************** msgstr "Generera en C-kodsställning fö
*** 9008,9014 ****
  #: m2/lang.opt:271
  #, no-c-format
  msgid "Generate a C++ source scaffold for the current module being compiled."
! msgstr "Generera en C++-kodställingsinitiering och -avslutning för varje modul inuti main."
  
  #: m2/lang.opt:275
  #, no-c-format
--- 9009,9015 ----
  #: m2/lang.opt:271
  #, no-c-format
  msgid "Generate a C++ source scaffold for the current module being compiled."
! msgstr "Generera en C++-kodsställning för den aktuella modulen som kompileras."
  
  #: m2/lang.opt:275
  #, no-c-format
*************** msgstr "Generera huvudfunktionen."
*** 9018,9024 ****
  #: m2/lang.opt:279
  #, no-c-format
  msgid "Generate static scaffold initialization and finalization for every module inside main."
! msgstr "Generera statisk ställningsinitiering och avslutning för varje modul inuti main."
  
  #: m2/lang.opt:283
  #, no-c-format
--- 9019,9025 ----
  #: m2/lang.opt:279
  #, no-c-format
  msgid "Generate static scaffold initialization and finalization for every module inside main."
! msgstr "Generera statisk ställningsinitiering och -avslutning för varje modul inuti main."
  
  #: m2/lang.opt:283
  #, no-c-format
*************** msgstr "Skapa en swig-gränssnittsfil f�
*** 9043,9049 ****
  #: m2/lang.opt:303
  #, no-c-format
  msgid "Optimize non var unbounded parameters by passing it by reference, providing it is not written to within the callee procedure."
! msgstr "Optimera icke-var obegränsade parametrar genom att skicka dem via referens, förutsatt att den inte skrivs till i den anropade proceduren.."
  
  #: m2/lang.opt:307
  #, no-c-format
--- 9044,9050 ----
  #: m2/lang.opt:303
  #, no-c-format
  msgid "Optimize non var unbounded parameters by passing it by reference, providing it is not written to within the callee procedure."
! msgstr "Optimera icke-var obegränsade parametrar genom att skicka dem via referens, förutsatt att den inte skrivs till i den anropade proceduren."
  
  #: m2/lang.opt:307
  #, no-c-format
*************** msgstr "Ange att ett externt BLAS-biblio
*** 9428,9434 ****
  #: fortran/lang.opt:575
  #, no-c-format
  msgid "Use an external BLAS library with 64-bit indexing for matmul on large-size arrays."
! msgstr "Använd ett externt BLAS-bibliotek med 64-bitars inderxering för matmul-anrop på stora vektorer."
  
  #: fortran/lang.opt:579
  #, no-c-format
--- 9429,9435 ----
  #: fortran/lang.opt:575
  #, no-c-format
  msgid "Use an external BLAS library with 64-bit indexing for matmul on large-size arrays."
! msgstr "Använd ett externt BLAS-bibliotek med 64-bitars indexering för matmul-anrop på stora vektorer."
  
  #: fortran/lang.opt:579
  #, no-c-format
*************** msgstr "Använd återanrop istället fö
*** 9868,9874 ****
  #: params.opt:55
  #, no-c-format
  msgid "Prefix calls to memcpy, memset and memmove with __asan_ or __hwasan_ for -fsanitize=kernel-address or -fsanitize=kernel-hwaddress."
! msgstr "Prefixa anrop av memcpy, memset och memmove med __asan_ ller __hwasan_ för -fsanitize=kernel-address eller -fsanitize=kernel-hwaddress."
  
  #: params.opt:59
  #, no-c-format
--- 9869,9875 ----
  #: params.opt:55
  #, no-c-format
  msgid "Prefix calls to memcpy, memset and memmove with __asan_ or __hwasan_ for -fsanitize=kernel-address or -fsanitize=kernel-hwaddress."
! msgstr "Prefixa anrop av memcpy, memset och memmove med __asan_ eller __hwasan_ för -fsanitize=kernel-address eller -fsanitize=kernel-hwaddress."
  
  #: params.opt:59
  #, no-c-format
*************** msgstr "Den maximala längden på en kon
*** 9963,9969 ****
  #: params.opt:131
  #, no-c-format
  msgid "The smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches.  If 0, use the default for the machine."
! msgstr "Det minsta antalet olika värden för vilka det är bäst att använda hopptabeller istället för ett träd med villkorliga grenar- Om 0, använd standardvärdet för maskinen."
  
  #: params.opt:135
  #, no-c-format
--- 9964,9970 ----
  #: params.opt:131
  #, no-c-format
  msgid "The smallest number of different values for which it is best to use a jump-table instead of a tree of conditional branches.  If 0, use the default for the machine."
! msgstr "Det minsta antalet olika värden för vilka det är bäst att använda hopptabeller istället för ett träd med villkorliga grenar. Om 0, använd standardvärdet för maskinen."
  
  #: params.opt:135
  #, no-c-format
*************** msgstr "Max antal rader att indexera til
*** 10003,10009 ****
  #: params.opt:163
  #, no-c-format
  msgid "Scale factor to apply to the number of statements in a threading path crossing a loop back edge when comparing to max-jump-thread-duplication-stmts."
! msgstr "Skalfaktor att använda på antalet satser i en trådningsväg som korsar en slingas bakåtbpge vid jämförelse med max-jump-thread-duplication-stmts."
  
  #: params.opt:167
  #, no-c-format
--- 10004,10010 ----
  #: params.opt:163
  #, no-c-format
  msgid "Scale factor to apply to the number of statements in a threading path crossing a loop back edge when comparing to max-jump-thread-duplication-stmts."
! msgstr "Skalfaktor att använda på antalet satser i en trådningsväg som korsar en slingas bakåtbåge vid jämförelse med max-jump-thread-duplication-stmts."
  
  #: params.opt:167
  #, no-c-format
*************** msgstr "Storleken på L2-cachen."
*** 10294,10300 ****
  #: params.opt:406
  #, no-c-format
  msgid "Maximal growth due to inlining of large function (as a percentage)."
! msgstr "Maximal på grund av inline:ing av stora funktioner (som en procentsats)."
  
  #: params.opt:410
  #, no-c-format
--- 10295,10301 ----
  #: params.opt:406
  #, no-c-format
  msgid "Maximal growth due to inlining of large function (as a percentage)."
! msgstr "Maximal ökning på grund av inline:ing av stora funktioner (som en procentsats)."
  
  #: params.opt:410
  #, no-c-format
*************** msgstr "Det maximala antalet instruktion
*** 10434,10440 ****
  #: params.opt:543
  #, no-c-format
  msgid "The maximum number of instructions that combine searches in order to find the next use of a particular register."
! msgstr "Det maximala antalet instruktioner som kombinerar sökningar för att att hitta nästa användning av ett visst register."
  
  #: params.opt:547
  #, no-c-format
--- 10435,10441 ----
  #: params.opt:543
  #, no-c-format
  msgid "The maximum number of instructions that combine searches in order to find the next use of a particular register."
! msgstr "Det maximala antalet instruktioner som kombinerar sökningar för att hitta nästa användning av ett visst register."
  
  #: params.opt:547
  #, no-c-format
*************** msgstr "--param=ranger-debug=[none|trace
*** 10920,10926 ****
  #: params.opt:1000
  #, no-c-format
  msgid "Maximum depth of logical expression evaluation ranger looks through when evaluating outgoing edge ranges."
! msgstr "Maximalt djup på beräkningsintervallare av logiska uttryck tittar igenom vid beräkning av utgående bågintervall."
  
  #: params.opt:1005
  #, no-c-format
--- 10921,10927 ----
  #: params.opt:1000
  #, no-c-format
  msgid "Maximum depth of logical expression evaluation ranger looks through when evaluating outgoing edge ranges."
! msgstr "Maximalt djup på logiska uttryck som beräkningsintervallare tittar igenom vid beräkning av utgående bågintervall."
  
  #: params.opt:1005
  #, no-c-format
*************** msgstr "Maximalt antal predikat med ”o
*** 11190,11196 ****
  #: params.opt:1228
  #, no-c-format
  msgid "Maximum amount of work done to prune paths where the variable is always initialized."
! msgstr "Maximal mäng arbete som görs för att ansa vägar där variabeln alltid är initierad."
  
  #: params.opt:1232
  #, no-c-format
--- 11191,11197 ----
  #: params.opt:1228
  #, no-c-format
  msgid "Maximum amount of work done to prune paths where the variable is always initialized."
! msgstr "Maximal mängd arbete som görs för att ansa vägar där variabeln alltid är initierad."
  
  #: params.opt:1232
  #, no-c-format
*************** msgstr "Aktivera slingvektorisering av f
*** 11280,11286 ****
  #: params.opt:1300
  #, no-c-format
  msgid "Enable vectorization of loops that may not be profitable according to the cost model but still perform costing between vector modes."
! msgstr ""
  
  #: params.opt:1304
  #, no-c-format
--- 11281,11287 ----
  #: params.opt:1300
  #, no-c-format
  msgid "Enable vectorization of loops that may not be profitable according to the cost model but still perform costing between vector modes."
! msgstr "Aktivera vektorisering av slingor som kanske inte är lönsamma enligt kostnadsmodellen men utför ändå kostnad mellan vektorlägen."
  
  #: params.opt:1304
  #, no-c-format
*************** msgstr "Antalet byte vid vilket strängl
*** 11355,11371 ****
  #: analyzer/analyzer.opt:63
  #, no-c-format
  msgid "The number of literal bytes to show at the head of a string literal in text art when ellipsizing it."
! msgstr "Antalet literala byte att visa vid huvudet av en strängliteral i textkonst när den har ellips."
  
  #: analyzer/analyzer.opt:67
  #, no-c-format
  msgid "The number of literal bytes to show at the tail of a string literal in text art when ellipsizing it."
! msgstr "Antalet literala byt att visa vid slutet av en strängliteral i textkonst när den har ellips."
  
  #: analyzer/analyzer.opt:71
  #, no-c-format
  msgid "The ideal width in characters of text art diagrams generated by the analyzer."
! msgstr "Den ideala bredden i tecken för textkonstdiagram som genereras ava analysatorn."
  
  #: analyzer/analyzer.opt:75
  #, no-c-format
--- 11356,11372 ----
  #: analyzer/analyzer.opt:63
  #, no-c-format
  msgid "The number of literal bytes to show at the head of a string literal in text art when ellipsizing it."
! msgstr "Antalet litterala byte att visa vid huvudet av en stränglitteral i textkonst när den har ellips."
  
  #: analyzer/analyzer.opt:67
  #, no-c-format
  msgid "The number of literal bytes to show at the tail of a string literal in text art when ellipsizing it."
! msgstr "Antalet litterala byt att visa vid slutet av en stränglitteral i textkonst när den har ellips."
  
  #: analyzer/analyzer.opt:71
  #, no-c-format
  msgid "The ideal width in characters of text art diagrams generated by the analyzer."
! msgstr "Den ideala bredden i tecken för textkonstdiagram som genereras av analysatorn."
  
  #: analyzer/analyzer.opt:75
  #, no-c-format
*************** msgstr "Varna för kodvägar i vilka en
*** 11415,11421 ****
  #: analyzer/analyzer.opt:111
  #, no-c-format
  msgid "Warn about code paths in which an operation is attempted in the wrong phase of a file descriptor's lifetime."
! msgstr "Varna för kodvägar i vilka en ågärd försöker göras i fel fas av en filbeskrivares livstid."
  
  #: analyzer/analyzer.opt:115
  #, no-c-format
--- 11416,11422 ----
  #: analyzer/analyzer.opt:111
  #, no-c-format
  msgid "Warn about code paths in which an operation is attempted in the wrong phase of a file descriptor's lifetime."
! msgstr "Varna för kodvägar i vilka en åtgärd försöker göras i fel fas av en filbeskrivares livstid."
  
  #: analyzer/analyzer.opt:115
  #, no-c-format
*************** msgstr "Begränsa analyseraren till att
*** 11640,11646 ****
  #: analyzer/analyzer.opt:291
  #, no-c-format
  msgid "Add extra annotations to diagrams."
! msgstr "Lägg till extra annotationer till diagram."
  
  #: analyzer/analyzer.opt:299
  #, no-c-format
--- 11641,11647 ----
  #: analyzer/analyzer.opt:291
  #, no-c-format
  msgid "Add extra annotations to diagrams."
! msgstr "Lägg till extra annoteringar till diagram."
  
  #: analyzer/analyzer.opt:299
  #, no-c-format
*************** msgstr "Slå samman tillräckligt lika t
*** 11670,11676 ****
  #: analyzer/analyzer.opt:319
  #, no-c-format
  msgid "Stop exploring an execution path after certain diagnostics."
! msgstr "Sluta att utforska en exekveringsväg efter visas felmeddelanden."
  
  #: analyzer/analyzer.opt:323
  #, no-c-format
--- 11671,11677 ----
  #: analyzer/analyzer.opt:319
  #, no-c-format
  msgid "Stop exploring an execution path after certain diagnostics."
! msgstr "Sluta att utforska en exekveringsväg efter vissa felmeddelanden."
  
  #: analyzer/analyzer.opt:323
  #, no-c-format
*************** msgstr "Varna vid försök att frigöra
*** 11957,11963 ****
  #: common.opt:654
  #, no-c-format
  msgid "Warn when -fhardened did not enable an option from its set."
! msgstr "Varna när -fardened inte aktiverade någon flagga från sin uppsättning."
  
  #: common.opt:665
  #, no-c-format
--- 11958,11964 ----
  #: common.opt:654
  #, no-c-format
  msgid "Warn when -fhardened did not enable an option from its set."
! msgstr "Varna när -fhardened inte aktiverade någon flagga från sin uppsättning."
  
  #: common.opt:665
  #, no-c-format
*************** msgstr "Denna flagga bör undvikas, anv�
*** 12347,12353 ****
  #: common.opt:1184
  #, no-c-format
  msgid "Use traps instead of diagnostics of undefined behavior sanitizers."
! msgstr "Använd trap istället för diagnostik av saniterare av odefinierat beteende."
  
  #: common.opt:1194
  #, no-c-format
--- 12348,12354 ----
  #: common.opt:1184
  #, no-c-format
  msgid "Use traps instead of diagnostics of undefined behavior sanitizers."
! msgstr "Använd trap istället för diagnostik av sanerare av odefinierat beteende."
  
  #: common.opt:1194
  #, no-c-format
*************** msgstr "Utför interna konsistenskontrol
*** 12437,12443 ****
  #: common.opt:1287
  #, no-c-format
  msgid "For -f*-prefix-map= options compare canonicalized pathnames rather than just strings."
! msgstr "För flaggor av typ -f*-prefix-map= jämför kononiserade sökvägsnamn istället för bara strängar."
  
  #: common.opt:1291
  #, no-c-format
--- 12438,12444 ----
  #: common.opt:1287
  #, no-c-format
  msgid "For -f*-prefix-map= options compare canonicalized pathnames rather than just strings."
! msgstr "För flaggor av typ -f*-prefix-map= jämför kanoniserade sökvägsnamn istället för bara strängar."
  
  #: common.opt:1291
  #, no-c-format
*************** msgstr "Härda villkorsgrenar genom att
*** 13012,13018 ****
  #: common.opt:1974
  #, no-c-format
  msgid "Harden control flow by recording and checking execution paths."
! msgstr "Härda styrflödet genom att spela in och kontroller körvägar."
  
  #: common.opt:1978
  #, no-c-format
--- 13013,13019 ----
  #: common.opt:1974
  #, no-c-format
  msgid "Harden control flow by recording and checking execution paths."
! msgstr "Härda styrflödet genom att spela in och kontrollera körvägar."
  
  #: common.opt:1978
  #, no-c-format
*************** msgstr "Låt bli att generera stackramar
*** 13452,13458 ****
  #: common.opt:2507
  #, no-c-format
  msgid "Generate SIMD clones for functions with the OpenMP declare target directive."
! msgstr "Generera SIMD-kloner för funktioner med direketivet OpenMP declare target."
  
  #: common.opt:2526
  #, no-c-format
--- 13453,13459 ----
  #: common.opt:2507
  #, no-c-format
  msgid "Generate SIMD clones for functions with the OpenMP declare target directive."
! msgstr "Generera SIMD-kloner för funktioner med direktivet OpenMP declare target."
  
  #: common.opt:2526
  #, no-c-format
*************** msgstr "Skriv en KÄLLFIL.opt-record.jso
*** 13472,13478 ****
  #: common.opt:2538
  #, no-c-format
  msgid "Detect loops calculating CRC and replace with faster implementation. If the target supports CRC instruction and the CRC loop uses the same polynomial as the one used in the CRC instruction, directly replace with the corresponding CRC instruction. Otherwise, if the target supports carry-less-multiplication instruction, generate CRC using it. If neither case applies, generate table-based CRC."
! msgstr "Upptäck slingor som beräknar CRC och ersätt dem med en snabbare implementation. Om målet stödjer en CRC-instruktion och CRC-slingan använder samma polynom smo det som används i CRC-instruktionen, ersätt då direkt med motsvarande CRC-instruktion. Annars, om målet stödjer en instruktion för minnesfri multiplikation, generera en CRC som använder det. Om inget av fallen är tillämpligt, generera tabellbaserad CRC."
  
  #: common.opt:2552
  #, no-c-format
--- 13473,13479 ----
  #: common.opt:2538
  #, no-c-format
  msgid "Detect loops calculating CRC and replace with faster implementation. If the target supports CRC instruction and the CRC loop uses the same polynomial as the one used in the CRC instruction, directly replace with the corresponding CRC instruction. Otherwise, if the target supports carry-less-multiplication instruction, generate CRC using it. If neither case applies, generate table-based CRC."
! msgstr "Upptäck slingor som beräknar CRC och ersätt dem med en snabbare implementation. Om målet stödjer en CRC-instruktion och CRC-slingan använder samma polynom som det som används i CRC-instruktionen, ersätt då direkt med motsvarande CRC-instruktion. Annars, om målet stödjer en instruktion för minnesfri multiplikation, generera en CRC som använder det. Om inget av fallen är tillämpligt, generera tabellbaserad CRC."
  
  #: common.opt:2552
  #, no-c-format
*************** msgstr "Varna för dolda deklarationer i
*** 14772,14778 ****
  #: algol68/lang.opt:69
  #, no-c-format
  msgid "-Whidden-declarations=[none|prelude|all] Warn about declarations hidden in inner scopes."
! msgstr "-Whidden-declarations=[inget|prelude|all] Varna för deklarationer som döljs i inre räckvidder."
  
  #: algol68/lang.opt:73
  #, no-c-format
--- 14773,14779 ----
  #: algol68/lang.opt:69
  #, no-c-format
  msgid "-Whidden-declarations=[none|prelude|all] Warn about declarations hidden in inner scopes."
! msgstr "-Whidden-declarations=[none|prelude|all] Varna för deklarationer som döljs i inre räckvidder."
  
  #: algol68/lang.opt:73
  #, no-c-format
*************** msgstr "-fmodules-map=<mapstring>
*** 14832,14838 ****
  #: algol68/lang.opt:141 algol68/lang.opt:145
  #, no-c-format
  msgid "-fmodules-map-file=<filename>              File containing modules map."
! msgstr "-fmodules-map-file=<filnamn>               Fil som innehåller modulermappning."
  
  #: rust/lang.opt:47 rust/lang.opt:51 c-family/c.opt:1609 c-family/c.opt:1613
  #, no-c-format
--- 14833,14839 ----
  #: algol68/lang.opt:141 algol68/lang.opt:145
  #, no-c-format
  msgid "-fmodules-map-file=<filename>              File containing modules map."
! msgstr "-fmodules-map-file=<filnamn>               Fil som innehåller modulmappning."
  
  #: rust/lang.opt:47 rust/lang.opt:51 c-family/c.opt:1609 c-family/c.opt:1613
  #, no-c-format
*************** msgstr "Använd WIP-lånekontrolleraren.
*** 14927,14933 ****
  #: rust/lang.opt:221
  #, no-c-format
  msgid "-frust-edition=[unwind|abort]             Panic strategy to compile crate with."
! msgstr "-frust-edition=[unwind|abort]             Panikstrategi att kompilera lådan med."
  
  #: rust/lang.opt:234
  #, no-c-format
--- 14928,14934 ----
  #: rust/lang.opt:221
  #, no-c-format
  msgid "-frust-edition=[unwind|abort]             Panic strategy to compile crate with."
! msgstr "-frust-edition=[unwind|abort]             Panikstrategi att kompilera låren med."
  
  #: rust/lang.opt:234
  #, no-c-format
*************** msgstr "Varna för aritmetiska konverter
*** 15514,15520 ****
  #: c-family/c.opt:684
  #, no-c-format
  msgid "Warn about deprecated space between \"\" and suffix in a user-defined literal operator."
! msgstr "Varna för föråldrade mellanrum mellan \"\" och suffix i en användardefinierad literal operator."
  
  #: c-family/c.opt:688
  #, no-c-format
--- 15515,15521 ----
  #: c-family/c.opt:684
  #, no-c-format
  msgid "Warn about deprecated space between \"\" and suffix in a user-defined literal operator."
! msgstr "Varna för föråldrade mellanrum mellan \"\" och suffix i en användardefinierad litteral operator."
  
  #: c-family/c.opt:688
  #, no-c-format
*************** msgstr "Varna när ett argument skickas
*** 16199,16205 ****
  #: c-family/c.opt:1338
  #, no-c-format
  msgid "Warn whenever void-returning functions return a non-void expressions, or a return expression is missing in a function not returning void."
! msgstr "Varna närhelst void-returnerande funktioner returnerar ett yttryck som inte äv void, eller ett returuttryck saknas i en funktion som inte returnerar void."
  
  #: c-family/c.opt:1342
  #, no-c-format
--- 16200,16206 ----
  #: c-family/c.opt:1338
  #, no-c-format
  msgid "Warn whenever void-returning functions return a non-void expressions, or a return expression is missing in a function not returning void."
! msgstr "Varna närhelst void-returnerande funktioner returnerar ett uttryck som inte är void, eller ett returuttryck saknas i en funktion som inte returnerar void."
  
  #: c-family/c.opt:1342
  #, no-c-format
*************** msgstr "Varna för flyttalskonstanter ut
*** 16464,16470 ****
  #: c-family/c.opt:1601
  #, no-c-format
  msgid "Warn about character arrays initialized as unterminated character sequences with a string literal."
! msgstr "Varna för teckenvektorer som initieras som oavslutade teckensekvenser med en strängliteral."
  
  #: c-family/c.opt:1617
  #, no-c-format
--- 16465,16471 ----
  #: c-family/c.opt:1601
  #, no-c-format
  msgid "Warn about character arrays initialized as unterminated character sequences with a string literal."
! msgstr "Varna för teckenvektorer som initieras som oavslutade teckensekvenser med en stränglitteral."
  
  #: c-family/c.opt:1617
  #, no-c-format
*************** msgstr "Varna för xor-operatorer där d
*** 16549,16555 ****
  #: c-family/c.opt:1699
  #, no-c-format
  msgid "Warn when a literal '0' is used as null pointer."
! msgstr "Varna när en ordagrann '0' används som en nollpekare."
  
  #: c-family/c.opt:1703
  #, no-c-format
--- 16550,16556 ----
  #: c-family/c.opt:1699
  #, no-c-format
  msgid "Warn when a literal '0' is used as null pointer."
! msgstr "Varna när en ordagrann ”0” används som en nollpekare."
  
  #: c-family/c.opt:1703
  #, no-c-format
*************** msgstr "-fcontracts-client-check=[none|p
*** 16705,16711 ****
  #: c-family/c.opt:1968
  #, no-c-format
  msgid "-fcontracts-definition-check=[on|off]\tEnable or disable contract checks on the definition side for all functions (default on)."
! msgstr "-fcontracts-definition-check=[on|off]\tAktivera eller avaktivera kontraktskontroller av definitionssidad för alla funktioner (standard på)."
  
  #: c-family/c.opt:1972
  #, no-c-format
--- 16706,16712 ----
  #: c-family/c.opt:1968
  #, no-c-format
  msgid "-fcontracts-definition-check=[on|off]\tEnable or disable contract checks on the definition side for all functions (default on)."
! msgstr "-fcontracts-definition-check=[on|off]\tAktivera eller avaktivera kontraktskontroller av definitionssidan för alla funktioner (standard på)."
  
  #: c-family/c.opt:1972
  #, no-c-format
*************** msgstr "Slå på stöd för C++14 storle
*** 17110,17116 ****
  #: c-family/c.opt:2408
  #, no-c-format
  msgid "-fstrict-flex-arrays=<level>    Control when to treat the trailing array of a structure as a flexible array member for the purposes of accessing the elements of such an array. The default is treating all trailing arrays of structures as flexible array members."
! msgstr "-fstrict-flex-arrays=<nivå>     Styr när den avslutande vektorn i en post skall behandlas som en flexibel vektormedlem vid åtkomst av elementen i en sådan vektor. Standard är att betrakta alla avslutende vektorer i poster som flexibla vektormedlemmar."
  
  #: c-family/c.opt:2415
  #, no-c-format
--- 17111,17117 ----
  #: c-family/c.opt:2408
  #, no-c-format
  msgid "-fstrict-flex-arrays=<level>    Control when to treat the trailing array of a structure as a flexible array member for the purposes of accessing the elements of such an array. The default is treating all trailing arrays of structures as flexible array members."
! msgstr "-fstrict-flex-arrays=<nivå>     Styr när den avslutande vektorn i en post skall behandlas som en flexibel vektormedlem vid åtkomst av elementen i en sådan vektor. Standard är att betrakta alla avslutande vektorer i poster som flexibla vektormedlemmar."
  
  #: c-family/c.opt:2415
  #, no-c-format
*************** msgstr "Varna om en numerisk sträng är
*** 17631,17637 ****
  #: cobol/lang.opt:169
  #, no-c-format
  msgid "Warn if referenced CDF PARAMETER is not defined."
! msgstr "Varna om en refererarad CDF PARAMETER inte är definierad."
  
  #: cobol/lang.opt:174
  #, no-c-format
--- 17632,17638 ----
  #: cobol/lang.opt:169
  #, no-c-format
  msgid "Warn if referenced CDF PARAMETER is not defined."
! msgstr "Varna om en refererad CDF PARAMETER inte är definierad."
  
  #: cobol/lang.opt:174
  #, no-c-format
*************** msgstr "Aktivera r-värdesargument till
*** 18086,18092 ****
  #: d/lang.opt:420
  #, no-c-format
  msgid "Disable access to variables marked `@system' from @safe code."
! msgstr "Avaktivera åtkomst till varialer markerade ”@system” från @safe kod."
  
  #: d/lang.opt:424
  #, no-c-format
--- 18087,18093 ----
  #: d/lang.opt:420
  #, no-c-format
  msgid "Disable access to variables marked `@system' from @safe code."
! msgstr "Avaktivera åtkomst till variabler markerade ”@system” från @safe kod."
  
  #: d/lang.opt:424
  #, no-c-format
*************** msgstr "anroparen och den anropade är i
*** 18265,18271 ****
  #. have failed.
  #: calls.cc:4086
  msgid "tail call production failed"
! msgstr "svansanropsprduktionen misslyckades"
  
  #: cfgrtl.cc:2830
  msgid "flow control insn inside a basic block"
--- 18266,18272 ----
  #. have failed.
  #: calls.cc:4086
  msgid "tail call production failed"
! msgstr "svansanropsproduktionen misslyckades"
  
  #: cfgrtl.cc:2830
  msgid "flow control insn inside a basic block"
*************** msgstr[1] "%d destruerare hittade\n"
*** 18307,18313 ****
  #, c-format
  msgid "%d frame table found\n"
  msgid_plural "%d frame tables found\n"
! msgstr[0] "%d ramtabeller hittad\n"
  msgstr[1] "%d ramtabeller hittade\n"
  
  #: collect2.cc:1834
--- 18308,18314 ----
  #, c-format
  msgid "%d frame table found\n"
  msgid_plural "%d frame tables found\n"
! msgstr[0] "%d ramtabell hittad\n"
  msgstr[1] "%d ramtabeller hittade\n"
  
  #: collect2.cc:1834
*************** msgid ""
*** 18866,18872 ****
  "                                        and coverage file contents\n"
  msgstr ""
  "  merge-stream [flaggor] [<fil>]        Slå samman täckningsströmsfil (eller\n"
! "                                        standard in) täckningsfilsinnehåll\n"
  
  #: gcov-tool.cc:258
  #, c-format
--- 18867,18873 ----
  "                                        and coverage file contents\n"
  msgstr ""
  "  merge-stream [flaggor] [<fil>]        Slå samman täckningsströmsfil (eller\n"
! "                                        standard in) och täckningsfilsinnehåll\n"
  
  #: gcov-tool.cc:258
  #, c-format
*************** msgstr ""
*** 19037,19043 ****
  #: gcov.cc:1104
  #, c-format
  msgid "  -e, --prime-paths               Show prime path coverage summary\n"
! msgstr "  -e, --prime-paths               Visa sammanfattning av primevägstäckning\n"
  
  #: gcov.cc:1105
  #, c-format
--- 19038,19044 ----
  #: gcov.cc:1104
  #, c-format
  msgid "  -e, --prime-paths               Show prime path coverage summary\n"
! msgstr "  -e, --prime-paths               Visa sammanfattning av primärvägstäckning\n"
  
  #: gcov.cc:1105
  #, c-format
*************** msgstr "%s:redan sedda block för ”%s�
*** 19301,19307 ****
  #: gcov.cc:2391
  #, c-format
  msgid "%s:already seen conditions for '%s'\n"
! msgstr "%s:redan seda villkor för ”%s”\n"
  
  #: gcov.cc:2449 gcov.cc:2589
  #, c-format
--- 19302,19308 ----
  #: gcov.cc:2391
  #, c-format
  msgid "%s:already seen conditions for '%s'\n"
! msgstr "%s:redan sedda villkor för ”%s”\n"
  
  #: gcov.cc:2449 gcov.cc:2589
  #, c-format
*************** msgstr "anropet kan kasta ett undantag s
*** 19968,19974 ****
  
  #: tree-tailcall.cc:977
  msgid "return value used after call"
! msgstr "returvärdets använt efter anropet"
  
  #: tree-tailcall.cc:1074 tree-tailcall.cc:1102
  msgid "call invocation refers to locals"
--- 19969,19975 ----
  
  #: tree-tailcall.cc:977
  msgid "return value used after call"
! msgstr "returvärdet använt efter anropet"
  
  #: tree-tailcall.cc:1074 tree-tailcall.cc:1102
  msgid "call invocation refers to locals"
*************** msgstr "ogiltigt adressläge"
*** 20355,20365 ****
  
  #: config/aarch64/aarch64.cc:23822
  msgid "invalid conversion from type %<mfloat8_t%>"
! msgstr "ogiltig konvertering från typen %<bfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:23824
  msgid "invalid conversion to type %<mfloat8_t%>"
! msgstr "ogiltig konvertering till typen %<bfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:31134
  msgid "preincrement operation not permitted on svbool_t"
--- 20356,20366 ----
  
  #: config/aarch64/aarch64.cc:23822
  msgid "invalid conversion from type %<mfloat8_t%>"
! msgstr "ogiltig konvertering från typen %<mfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:23824
  msgid "invalid conversion to type %<mfloat8_t%>"
! msgstr "ogiltig konvertering till typen %<mfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:31134
  msgid "preincrement operation not permitted on svbool_t"
*************** msgstr "åtgärden indexering stödjs in
*** 20411,20417 ****
  
  #: config/aarch64/aarch64.cc:31181 config/aarch64/aarch64.cc:31214
  msgid "operation not permitted on type %<mfloat8_t%>"
! msgstr "operationen är inte tillåten på typen %<bfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:31202
  msgid "cannot combine GNU and SVE vectors in a binary operation"
--- 20412,20418 ----
  
  #: config/aarch64/aarch64.cc:31181 config/aarch64/aarch64.cc:31214
  msgid "operation not permitted on type %<mfloat8_t%>"
! msgstr "operationen är inte tillåten på typen %<mfloat8_t%>"
  
  #: config/aarch64/aarch64.cc:31202
  msgid "cannot combine GNU and SVE vectors in a binary operation"
*************** msgstr "modifieraren ”N” behöver en
*** 21450,21456 ****
  #: config/riscv/riscv.cc:8230
  #, c-format
  msgid "invalid register number for 'N' modifier"
! msgstr "ogiltig registernummer för modifieraren ”N”"
  
  #: config/riscv/riscv.cc:8239
  #, c-format
--- 21451,21457 ----
  #: config/riscv/riscv.cc:8230
  #, c-format
  msgid "invalid register number for 'N' modifier"
! msgstr "ogiltigt registernummer för modifieraren ”N”"
  
  #: config/riscv/riscv.cc:8239
  #, c-format
*************** msgstr "<klamrar runt initierarlista>"
*** 22181,22187 ****
  
  #: cp/error.cc:699
  msgid "<unresolved overloaded function type>"
! msgstr "<ej upplöst överlagrad funktionstyp>"
  
  #: cp/error.cc:894
  msgid "<type error>"
--- 22182,22188 ----
  
  #: cp/error.cc:699
  msgid "<unresolved overloaded function type>"
! msgstr "<ej uppslagen överlagrad funktionstyp>"
  
  #: cp/error.cc:894
  msgid "<type error>"
*************** msgid "At global scope:"
*** 22297,22306 ****
  msgstr "I global räckvidd:"
  
  #: cp/reflect.cc:408
- #, fuzzy
- #| msgid "reflect_constant failed"
  msgid "reflect_constant_array failed"
! msgstr "reflect_constant misslyckades"
  
  #: cp/reflect.cc:424 cp/reflect.cc:659 cp/reflect.cc:4039
  msgid "reflect_constant failed"
--- 22298,22305 ----
  msgstr "I global räckvidd:"
  
  #: cp/reflect.cc:408
  msgid "reflect_constant_array failed"
! msgstr "reflect_constant_array misslyckades"
  
  #: cp/reflect.cc:424 cp/reflect.cc:659 cp/reflect.cc:4039
  msgid "reflect_constant failed"
*************** msgstr "reflektionen representerar inte
*** 22328,22334 ****
  
  #: cp/reflect.cc:2491
  msgid "operators argument is not a valid operator"
! msgstr "operatorsargument är inte en giltigt operator"
  
  #: cp/reflect.cc:2622 cp/reflect.cc:6057
  msgid "reflection does not have a type"
--- 22327,22333 ----
  
  #: cp/reflect.cc:2491
  msgid "operators argument is not a valid operator"
! msgstr "operatorsargument är inte en giltig operator"
  
  #: cp/reflect.cc:2622 cp/reflect.cc:6057
  msgid "reflection does not have a type"
*************** msgstr "reflektion inte möjlig för ali
*** 22380,22386 ****
  
  #: cp/reflect.cc:3383
  msgid "alignment_of on function type"
! msgstr "alignement_of på en funktionstyp"
  
  #: cp/reflect.cc:3392
  msgid "reflection with incomplete type in alignment_of"
--- 22379,22385 ----
  
  #: cp/reflect.cc:3383
  msgid "alignment_of on function type"
! msgstr "alignment_of på en funktionstyp"
  
  #: cp/reflect.cc:3392
  msgid "reflection with incomplete type in alignment_of"
*************** msgid "u8identifier_of not representable
*** 22407,22428 ****
  msgstr "u8identifier_of kan inte representeras i UTF-8"
  
  #: cp/reflect.cc:3777
- #, fuzzy
- #| msgid "identifier_of not representable in ordinary literal encoding"
  msgid "display_string_of not representable in ordinary literal encoding"
! msgstr "identifier_of kan inte representeras i vanlig bokstavlig kodning"
  
  #: cp/reflect.cc:3782
- #, fuzzy
- #| msgid "u8identifier_of not representable in UTF-8"
  msgid "u8display_string_of not representable in UTF-8"
! msgstr "u8identifier_of kan inte representeras i UTF-8"
  
  #: cp/reflect.cc:3922
- #, fuzzy
- #| msgid "reflection does not represent a type, type alias, variable, function, namespace, enumerator, direct base class relationship, or non-static data member"
  msgid "reflection does not represent a type, type alias, variable, function, function parameter, namespace, enumerator, direct base class relationship, or non-static data member"
! msgstr "reflektionen representerar inte en typ, typalias, en variabel, funktion, namnutrymme, uppräknare, direkt basklassrelation eller icke-statisk datamedlem"
  
  #: cp/reflect.cc:3935
  msgid "reflection does not represent a complete type or type alias"
--- 22406,22421 ----
  msgstr "u8identifier_of kan inte representeras i UTF-8"
  
  #: cp/reflect.cc:3777
  msgid "display_string_of not representable in ordinary literal encoding"
! msgstr "display_string_of kan inte representeras i vanlig bokstavlig kodning"
  
  #: cp/reflect.cc:3782
  msgid "u8display_string_of not representable in UTF-8"
! msgstr "u8display_string_of kan inte representeras i UTF-8"
  
  #: cp/reflect.cc:3922
  msgid "reflection does not represent a type, type alias, variable, function, function parameter, namespace, enumerator, direct base class relationship, or non-static data member"
! msgstr "reflektionen representerar inte en typ, typalias, en variabel, funktion, funktionsparameter, namnutrymme, uppräknare, direkt basklassrelation eller icke-statisk datamedlem"
  
  #: cp/reflect.cc:3935
  msgid "reflection does not represent a complete type or type alias"
*************** msgstr "reflektionen representerar inte
*** 22458,22464 ****
  
  #: cp/reflect.cc:5334
  msgid "reflection represents non-integral or bool type"
! msgstr "reflektionen representerar en icke-heltals eller booleansk typ"
  
  #: cp/reflect.cc:5473
  msgid "reflection does not represent a template"
--- 22451,22457 ----
  
  #: cp/reflect.cc:5334
  msgid "reflection represents non-integral or bool type"
! msgstr "reflektionen representerar en icke-heltals eller boolesk typ"
  
  #: cp/reflect.cc:5473
  msgid "reflection does not represent a template"
*************** msgstr "varken namnet eller bit_width an
*** 22502,22508 ****
  
  #: cp/reflect.cc:5997
  msgid "no name and non-empty annotations specified"
! msgstr ""
  
  #: cp/reflect.cc:6003
  msgid "bit_width specified with non-integral and non-enumeration type"
--- 22495,22501 ----
  
  #: cp/reflect.cc:5997
  msgid "no name and non-empty annotations specified"
! msgstr "inget namn och icke-tom annotering angiven"
  
  #: cp/reflect.cc:6003
  msgid "bit_width specified with non-integral and non-enumeration type"
*************** msgstr "bit_width specificerad med no_un
*** 22518,22540 ****
  
  #: cp/reflect.cc:6017
  msgid "bit_width 0 with specified name"
! msgstr "fältbreddsspecificerare<"
  
  #: cp/reflect.cc:6020
  msgid "bit_width is negative"
  msgstr "bit_width är negativt"
  
  #: cp/reflect.cc:6026
- #, fuzzy
- #| msgid "alignment specified for type name in cast"
  msgid "name unspecified and type is const"
! msgstr "minnesjustering angiven för typnamn i typkonvertering"
  
  #: cp/reflect.cc:6030
- #, fuzzy
- #| msgid "alignment specified for type name in cast"
  msgid "name unspecified and type is volatile"
! msgstr "minnesjustering angiven för typnamn i typkonvertering"
  
  #: cp/reflect.cc:6038
  msgid "alignment is not power of two"
--- 22511,22529 ----
  
  #: cp/reflect.cc:6017
  msgid "bit_width 0 with specified name"
! msgstr "bit_width 0 med angivet namn"
  
  #: cp/reflect.cc:6020
  msgid "bit_width is negative"
  msgstr "bit_width är negativt"
  
  #: cp/reflect.cc:6026
  msgid "name unspecified and type is const"
! msgstr "namnet är ospecificerat och typen är const"
  
  #: cp/reflect.cc:6030
  msgid "name unspecified and type is volatile"
! msgstr "namnet är ospecificerat och typen är volatile"
  
  #: cp/reflect.cc:6038
  msgid "alignment is not power of two"
*************** msgid "alignment is smaller than alignme
*** 22549,22570 ****
  msgstr "justering är mindre än alignment_of"
  
  #: cp/reflect.cc:6062
- #, fuzzy
- #| msgid "reflection does not have a type"
  msgid "reflection does not have non-array object type"
! msgstr "reflektionen har inte en typ"
  
  #: cp/reflect.cc:6506
- #, fuzzy
- #| msgid "reflection does not represent a type"
  msgid "current scope does not represent a function"
! msgstr "reflektionen representerar inte en typ"
  
  #: cp/reflect.cc:6526
- #, fuzzy
- #| msgid "reflection does not represent parameter of current function"
  msgid "current scope does not represent a class nor a member function"
! msgstr "reflektionen representerar inte en parameter till den aktuella funktionen"
  
  #: cp/reflect.cc:6685
  msgid "incomplete parent class"
--- 22538,22553 ----
  msgstr "justering är mindre än alignment_of"
  
  #: cp/reflect.cc:6062
  msgid "reflection does not have non-array object type"
! msgstr "reflektionen har inte en objekttyp som inte är en vektor"
  
  #: cp/reflect.cc:6506
  msgid "current scope does not represent a function"
! msgstr "aktuell räckvidd representerar inte en funktion"
  
  #: cp/reflect.cc:6526
  msgid "current scope does not represent a class nor a member function"
! msgstr "aktuell räckvidd representerar inte en klass eller en medemsfunktion"
  
  #: cp/reflect.cc:6685
  msgid "incomplete parent class"
*************** msgstr "NULL() är inte en interoperabel
*** 22710,22716 ****
  
  #: fortran/check.cc:5899
  msgid "BOZ literal constant"
! msgstr "BOZ-literalkonstant"
  
  #: fortran/check.cc:5905
  msgid "Expression is polymorphic"
--- 22693,22699 ----
  
  #: fortran/check.cc:5899
  msgid "BOZ literal constant"
! msgstr "BOZ-litteralkonstant"
  
  #: fortran/check.cc:5905
  msgid "Expression is polymorphic"
*************** msgstr "gränssnitt eller pekare till gr
*** 23554,23560 ****
  
  #: go/gofrontend/expressions.cc:18218
  msgid "may only omit types within composite literals of slice, array, or map type"
! msgstr "kan endast utelämna typer med sammanstatta litteraler av typen skiva, vektor eller avbildning"
  
  #: go/gofrontend/expressions.cc:18312 go/gofrontend/expressions.cc:18624
  msgid "map composite literal must have keys"
--- 23537,23543 ----
  
  #: go/gofrontend/expressions.cc:18218
  msgid "may only omit types within composite literals of slice, array, or map type"
! msgstr "kan endast utelämna typer med sammansatta litteraler av typen skiva, vektor eller avbildning"
  
  #: go/gofrontend/expressions.cc:18312 go/gofrontend/expressions.cc:18624
  msgid "map composite literal must have keys"
*************** msgstr "avbildning av sammansatta litter
*** 23562,23568 ****
  
  #: go/gofrontend/expressions.cc:18657
  msgid "expected struct, slice, array, or map type for composite literal"
! msgstr "en av typerna post, skiva, vektor eller avbildning förväntades för en sammanstatt litteral"
  
  #: go/gofrontend/expressions.cc:19272 go/gofrontend/statements.cc:2121
  msgid "type assertion only valid for interface types"
--- 23545,23551 ----
  
  #: go/gofrontend/expressions.cc:18657
  msgid "expected struct, slice, array, or map type for composite literal"
! msgstr "en av typerna post, skiva, vektor eller avbildning förväntades för en sammansatt litteral"
  
  #: go/gofrontend/expressions.cc:19272 go/gofrontend/statements.cc:2121
  msgid "type assertion only valid for interface types"
*************** msgstr "kan inte falla igenom sista fall
*** 23592,23598 ****
  
  #: go/gofrontend/statements.cc:1288
  msgid "cannot use %<_%> as value"
! msgstr "det går inte att %<_%> som ett värde"
  
  #: go/gofrontend/statements.cc:1300 go/gofrontend/statements.cc:2528
  msgid "invalid left hand side of assignment"
--- 23575,23581 ----
  
  #: go/gofrontend/statements.cc:1288
  msgid "cannot use %<_%> as value"
! msgstr "kan inte använda %<_%> som ett värde"
  
  #: go/gofrontend/statements.cc:1300 go/gofrontend/statements.cc:2528
  msgid "invalid left hand side of assignment"
*************** msgstr "Okänd flagga till byteordervär
*** 24267,24272 ****
--- 24250,24256 ----
  msgid "Unrecognized option to floating-point init value: %qs"
  msgstr "Okänt argument till -floating-point initieringsvärde: %qs"
  
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125348
  #: fortran/lang.opt:702
  #, gcc-internal-format
  msgid "%qs is not an inline-controlable intrinsic"
*************** msgstr "platsen för den det andra anrop
*** 24949,24955 ****
  #: auto-profile.cc:2001
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains indirect call targets not associated with an indirect call statement"
! msgstr "autoprofilen för %q+F innehåller indirekta anropmål som inte är associerade med en indirekt anropssats"
  
  #: auto-profile.cc:2006 auto-profile.cc:2053
  #, gcc-internal-format
--- 24933,24939 ----
  #: auto-profile.cc:2001
  #, gcc-internal-format
  msgid "auto-profile of %q+F contains indirect call targets not associated with an indirect call statement"
! msgstr "autoprofilen för %q+F innehåller indirekta anropsmål som inte är associerade med en indirekt anropssats"
  
  #: auto-profile.cc:2006 auto-profile.cc:2053
  #, gcc-internal-format
*************** msgstr "bågen har både callback och ha
*** 26149,26155 ****
  #: cgraph.cc:4409
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s has no callback-carrying"
! msgstr "återanopsbågen %s→%s har ingen återanropsbärare"
  
  #: cgraph.cc:4437
  #, gcc-internal-format, gfc-internal-format
--- 26133,26139 ----
  #: cgraph.cc:4409
  #, gcc-internal-format, gfc-internal-format
  msgid "callback edge %s->%s has no callback-carrying"
! msgstr "återanropsbågen %s→%s har ingen återanropsbärare"
  
  #: cgraph.cc:4437
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "%qD är definierad men inte anv�
*** 26284,26300 ****
  #: cgraphunit.cc:1508
  #, gcc-internal-format
  msgid "%<ifunc%> resolver for %qD must return %qT"
! msgstr "%<ifunc%>-upplösning för %qD måste returnera %qT"
  
  #: cgraphunit.cc:1511 cgraphunit.cc:1534
  #, gcc-internal-format
  msgid "resolver indirect function declared here"
! msgstr "upplösning av indirekt funktion deklarerad här"
  
  #: cgraphunit.cc:1531
  #, gcc-internal-format
  msgid "%<ifunc%> resolver for %qD should return %qT"
! msgstr "%<ifunc%>-upplösning för %qD skall returnera %qT"
  
  #: cgraphunit.cc:1541
  #, gcc-internal-format
--- 26268,26284 ----
  #: cgraphunit.cc:1508
  #, gcc-internal-format
  msgid "%<ifunc%> resolver for %qD must return %qT"
! msgstr "%<ifunc%>-uppslagning för %qD måste returnera %qT"
  
  #: cgraphunit.cc:1511 cgraphunit.cc:1534
  #, gcc-internal-format
  msgid "resolver indirect function declared here"
! msgstr "uppslagning av indirekt funktion deklarerad här"
  
  #: cgraphunit.cc:1531
  #, gcc-internal-format
  msgid "%<ifunc%> resolver for %qD should return %qT"
! msgstr "f%<ifunc%>-uppslagning för %qD skall returnera %qT"
  
  #: cgraphunit.cc:1541
  #, gcc-internal-format
*************** msgstr "attributet %<fallthrough%> före
*** 29180,29186 ****
  #: gimplify.cc:4024
  #, gcc-internal-format
  msgid "the %<device%> clause must be present if the %<interop%> clause has more than one list item"
! msgstr "%<device%>-klausulen måste finnas om %<interop%>-klausulen hare mer än ett listelement"
  
  #: gimplify.cc:4030
  #, gcc-internal-format
--- 29164,29170 ----
  #: gimplify.cc:4024
  #, gcc-internal-format
  msgid "the %<device%> clause must be present if the %<interop%> clause has more than one list item"
! msgstr "%<device%>-klausulen måste finnas om %<interop%>-klausulen har mer än ett listelement"
  
  #: gimplify.cc:4030
  #, gcc-internal-format
*************** msgstr "baspekarcykel detekterad"
*** 29382,29388 ****
  #: gimplify.cc:12053
  #, gcc-internal-format
  msgid "data movement for component %qE is not compatible with movement for struct %qE"
! msgstr "dataförflyttning för komponent %qE är inte kompatiblel med förflyttning för posten %qE"
  
  #: gimplify.cc:12369
  #, gcc-internal-format
--- 29366,29372 ----
  #: gimplify.cc:12053
  #, gcc-internal-format
  msgid "data movement for component %qE is not compatible with movement for struct %qE"
! msgstr "dataförflyttning för komponent %qE är inte kompatibel med förflyttning för posten %qE"
  
  #: gimplify.cc:12369
  #, gcc-internal-format
*************** msgstr[1] "Deklaration av typen %qD fina
*** 29934,29940 ****
  #, gcc-internal-format
  msgid "Declaring type %qD final would enable devirtualization of %i call executed %lli times"
  msgid_plural "Declaring type %qD final would enable devirtualization of %i calls executed %lli times"
! msgstr[0] "Deklaration av typen %qD final skulle möjliggöra avvirtualisering av %i anrop utförda %lli gånger"
  msgstr[1] "Deklaration av typen %qD final skulle möjliggöra avvirtualisering av %i anrop utförda %lli gånger"
  
  #: ipa-devirt.cc:4099
--- 29918,29924 ----
  #, gcc-internal-format
  msgid "Declaring type %qD final would enable devirtualization of %i call executed %lli times"
  msgid_plural "Declaring type %qD final would enable devirtualization of %i calls executed %lli times"
! msgstr[0] "Deklaration av typen %qD final skulle möjliggöra avvirtualisering av %i anrop utfört %lli gånger"
  msgstr[1] "Deklaration av typen %qD final skulle möjliggöra avvirtualisering av %i anrop utförda %lli gånger"
  
  #: ipa-devirt.cc:4099
*************** msgstr "%qD är inte berättigat till %<
*** 30103,30109 ****
  #: ipa-strub.cc:702
  #, gcc-internal-format
  msgid "%qD is not eligible for %<strub%> because of attribute %<noipa%>"
! msgstr "%qD är inte berättigat till %<strub%> på grund av attriutet %<noipa%>"
  
  #: ipa-strub.cc:717
  #, gcc-internal-format
--- 30087,30093 ----
  #: ipa-strub.cc:702
  #, gcc-internal-format
  msgid "%qD is not eligible for %<strub%> because of attribute %<noipa%>"
! msgstr "%qD är inte berättigat till %<strub%> på grund av attributet %<noipa%>"
  
  #: ipa-strub.cc:717
  #, gcc-internal-format
*************** msgstr "%qD är inte berättigat till in
*** 30128,30134 ****
  #: ipa-strub.cc:902
  #, gcc-internal-format
  msgid "%qD is not eligible for internal %<strub%> because the address of a local label escapes"
! msgstr "%qD är inte berättigat till internt %<strub%> på grund av att det är adressen till en lokal etikett smiter"
  
  #: ipa-strub.cc:941
  #, gcc-internal-format
--- 30112,30118 ----
  #: ipa-strub.cc:902
  #, gcc-internal-format
  msgid "%qD is not eligible for internal %<strub%> because the address of a local label escapes"
! msgstr "%qD är inte berättigat till internt %<strub%> på grund av att adressen till en lokal etikett smiter"
  
  #: ipa-strub.cc:941
  #, gcc-internal-format
*************** msgstr "ramstorlek för stor för pålit
*** 30203,30209 ****
  #: json-parsing.cc:1085
  #, gcc-internal-format, gfc-internal-format
  msgid "maximum nesting depth exceeded: %i"
! msgstr "maximalt nästningsdjup överskridet %i"
  
  #: json-parsing.cc:1145
  #, gcc-internal-format, gfc-internal-format
--- 30187,30193 ----
  #: json-parsing.cc:1085
  #, gcc-internal-format, gfc-internal-format
  msgid "maximum nesting depth exceeded: %i"
! msgstr "maximalt nästningsdjup överskridet: %i"
  
  #: json-parsing.cc:1145
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "endast %<distribute%>- %<paralle
*** 30845,30851 ****
  #: omp-low.cc:3352
  #, gcc-internal-format
  msgid "OpenMP constructs other than %<parallel%>, %<loop%> or %<simd%> may not be nested inside a %<loop%> region"
! msgstr "OpenMP-konstruktioner andra än %<parallel%>, %<loop%> eller %<simd%> får inte inneslutna i en %<loop%>-region"
  
  #: omp-low.cc:3372
  #, gcc-internal-format
--- 30829,30835 ----
  #: omp-low.cc:3352
  #, gcc-internal-format
  msgid "OpenMP constructs other than %<parallel%>, %<loop%> or %<simd%> may not be nested inside a %<loop%> region"
! msgstr "OpenMP-konstruktioner andra än %<parallel%>, %<loop%> eller %<simd%> får inte vara inneslutna i en %<loop%>-region"
  
  #: omp-low.cc:3372
  #, gcc-internal-format
*************** msgstr "ogiltig beroendesort i omp %<ord
*** 30925,30931 ****
  #: omp-low.cc:3727
  #, gcc-internal-format
  msgid "%<ordered%> construct with %<depend%> clause must be closely nested inside an %<ordered%> loop"
! msgstr "en %<ordered%> konstruktion med %<depend%>-klausul måste vara nära innesluten inuti en %<ordered%>-slinga"
  
  #: omp-low.cc:3743
  #, gcc-internal-format
--- 30909,30915 ----
  #: omp-low.cc:3727
  #, gcc-internal-format
  msgid "%<ordered%> construct with %<depend%> clause must be closely nested inside an %<ordered%> loop"
! msgstr "en %<ordered%>-konstruktion med %<depend%>-klausul måste vara nära innesluten inuti en %<ordered%>-slinga"
  
  #: omp-low.cc:3743
  #, gcc-internal-format
*************** msgstr "en %<ordered%> region får inte
*** 30940,30956 ****
  #: omp-low.cc:3769 omp-low.cc:3814
  #, gcc-internal-format
  msgid "%<ordered%> region must be closely nested inside a loop region with an %<ordered%> clause"
! msgstr "en %<ordered%> region måste vara nära innesluten inuti en slingaregion med en %<ordered%>-klausul"
  
  #: omp-low.cc:3778
  #, gcc-internal-format
  msgid "%<ordered%> construct without %<doacross%> or %<depend%> clauses must not have the same binding region as %<ordered%> construct with those clauses"
! msgstr "en %<ordered%>-konstruktion utan %<doacross%>- eller %<depend%>-klausuler får inte ha samma bindningsregion som en en %<ordered%>-konstruktion med dessa klausuler"
  
  #: omp-low.cc:3797
  #, gcc-internal-format
  msgid "%<ordered%> construct without %<doacross%> or %<depend%> clauses binds to loop where %<collapse%> argument %wd is different from %<ordered%> argument %wd"
! msgstr "en %<ordered%> konstruktion utan %<doacross%>- eller %<depend%>-klausuler binder till en sligna där %<collapse%>-argument %wd skiljer från %<ordered%>-argument %wd"
  
  #: omp-low.cc:3831
  #, gcc-internal-format
--- 30924,30940 ----
  #: omp-low.cc:3769 omp-low.cc:3814
  #, gcc-internal-format
  msgid "%<ordered%> region must be closely nested inside a loop region with an %<ordered%> clause"
! msgstr "en %<ordered%> region måste vara nära innesluten inuti en slingregion med en %<ordered%>-klausul"
  
  #: omp-low.cc:3778
  #, gcc-internal-format
  msgid "%<ordered%> construct without %<doacross%> or %<depend%> clauses must not have the same binding region as %<ordered%> construct with those clauses"
! msgstr "en %<ordered%>-konstruktion utan %<doacross%>- eller %<depend%>-klausuler får inte ha samma bindningsregion som en %<ordered%>-konstruktion med dessa klausuler"
  
  #: omp-low.cc:3797
  #, gcc-internal-format
  msgid "%<ordered%> construct without %<doacross%> or %<depend%> clauses binds to loop where %<collapse%> argument %wd is different from %<ordered%> argument %wd"
! msgstr "en %<ordered%> konstruktion utan %<doacross%>- eller %<depend%>-klausuler binder till en slinga där %<collapse%>-argument %wd skiljer från %<ordered%>-argument %wd"
  
  #: omp-low.cc:3831
  #, gcc-internal-format
*************** msgstr "flera indata till hårdregistret
*** 32304,32310 ****
  #: stmt.cc:680
  #, gcc-internal-format
  msgid "hard register constraint for input %i conflicts with %<asm%> clobber list"
! msgstr "hård registerbegränsning för indata %i står i konflikt med %<asm%> överskrivningslista"
  
  #: stmt.cc:699
  #, gcc-internal-format
--- 32288,32294 ----
  #: stmt.cc:680
  #, gcc-internal-format
  msgid "hard register constraint for input %i conflicts with %<asm%> clobber list"
! msgstr "hård registerbegränsning för indata %i står i konflikt med %<asm%>-överskrivningslista"
  
  #: stmt.cc:699
  #, gcc-internal-format
*************** msgstr "%<-fstack-clash-protection%> st�
*** 32814,32820 ****
  #: toplev.cc:1667
  #, gcc-internal-format
  msgid "%<-fstack-clash-protection%> is not enabled by %<-fhardened%> because %<-fstack-check%> was specified on the command line"
! msgstr "%<-fstack-clash-protection%> aktiveras inte av %<-fhardened%> eftersom %<-fstack-check%> specificerades på"
  
  #: toplev.cc:1677
  #, gcc-internal-format
--- 32798,32804 ----
  #: toplev.cc:1667
  #, gcc-internal-format
  msgid "%<-fstack-clash-protection%> is not enabled by %<-fhardened%> because %<-fstack-check%> was specified on the command line"
! msgstr "%<-fstack-clash-protection%> aktiveras inte av %<-fhardened%> eftersom %<-fstack-check%> specificerades på kommandoraden"
  
  #: toplev.cc:1677
  #, gcc-internal-format
*************** msgstr "%<TYPE_MODE%> av %<TYPE_CANONICA
*** 34719,34725 ****
  #: tree.cc:14495
  #, gcc-internal-format
  msgid "main variant of %<TYPE_CANONICAL%> of main variant is not its own %<TYPE_CANONICAL%>"
! msgstr "huvudvarianten av %<TYPE_CANONICAL%> av huvudvarianten är inte en sin egen %<TYPE_CANONICAL%>"
  
  #: tree.cc:14513
  #, gcc-internal-format
--- 34703,34709 ----
  #: tree.cc:14495
  #, gcc-internal-format
  msgid "main variant of %<TYPE_CANONICAL%> of main variant is not its own %<TYPE_CANONICAL%>"
! msgstr "huvudvarianten av %<TYPE_CANONICAL%> av huvudvarianten är inte sin egen %<TYPE_CANONICAL%>"
  
  #: tree.cc:14513
  #, gcc-internal-format
*************** msgstr "attributet %qE kan inte anges f�
*** 35453,35459 ****
  #: c-family/c-attribs.cc:2906
  #, gcc-internal-format
  msgid "%qE attribute may not be specified for a non-array field"
! msgstr "attributet %qE får inte anges för annat fält en vektor"
  
  #: c-family/c-attribs.cc:2913
  #, gcc-internal-format
--- 35437,35443 ----
  #: c-family/c-attribs.cc:2906
  #, gcc-internal-format
  msgid "%qE attribute may not be specified for a non-array field"
! msgstr "attributet %qE får inte anges för annat fält än en vektor"
  
  #: c-family/c-attribs.cc:2913
  #, gcc-internal-format
*************** msgstr "attributet %qE är inte tillåte
*** 35483,35489 ****
  #: c-family/c-attribs.cc:2969
  #, gcc-internal-format
  msgid "%qE attribute is not allowed for a non-flexible array member field"
! msgstr "attributet %qE är inte tillåtet för ett annat fält än en ickeflexibel vektor"
  
  #: c-family/c-attribs.cc:2981
  #, gcc-internal-format
--- 35467,35473 ----
  #: c-family/c-attribs.cc:2969
  #, gcc-internal-format
  msgid "%qE attribute is not allowed for a non-flexible array member field"
! msgstr "attributet %qE är inte tillåtet för ett annat fält än en ickeflexibel vektormedlem"
  
  #: c-family/c-attribs.cc:2981
  #, gcc-internal-format
*************** msgstr "kan inte sätta attributet %qE e
*** 35809,35815 ****
  #: c-family/c-attribs.cc:4419
  #, gcc-internal-format
  msgid "%qE attribute on function type without pointer arguments returning %<void%>"
! msgstr "attributet %qE på en funktiontyp utan pekarargument som returnerar %<void%>"
  
  #: c-family/c-attribs.cc:4482
  #, gcc-internal-format
--- 35793,35799 ----
  #: c-family/c-attribs.cc:4419
  #, gcc-internal-format
  msgid "%qE attribute on function type without pointer arguments returning %<void%>"
! msgstr "attributet %qE på en funktionstyp utan pekarargument som returnerar %<void%>"
  
  #: c-family/c-attribs.cc:4482
  #, gcc-internal-format
*************** msgstr "felformaterat %<#pragma message%
*** 38228,38234 ****
  #: c-family/c-pragma.cc:1358 cp/parser.cc:4897 cp/parser.cc:4993
  #, gcc-internal-format
  msgid "string literal with user-defined suffix is invalid in this context"
! msgstr "en strängliteral med ett användardefinierat suffix tillåtet i denna kontext"
  
  #: c-family/c-pragma.cc:1366
  #, gcc-internal-format
--- 38212,38218 ----
  #: c-family/c-pragma.cc:1358 cp/parser.cc:4897 cp/parser.cc:4993
  #, gcc-internal-format
  msgid "string literal with user-defined suffix is invalid in this context"
! msgstr "en stränglitteral med ett användardefinierat suffix tillåtet i denna kontext"
  
  #: c-family/c-pragma.cc:1366
  #, gcc-internal-format
*************** msgstr "%<-march=%s%>: utökningen %qs b
*** 39553,39559 ****
  #: common/config/riscv/riscv-common.cc:572
  #, gcc-internal-format
  msgid "%<-march=%s%>: extension %qs starts with 's' but is unsupported standard supervisor extension"
! msgstr "%<-march=%s%>: utvidgningen %qs börjar med ”s” men är en standardövervakarutvidgning som inte stöjds"
  
  #: common/config/riscv/riscv-common.cc:581
  #, gcc-internal-format
--- 39537,39543 ----
  #: common/config/riscv/riscv-common.cc:572
  #, gcc-internal-format
  msgid "%<-march=%s%>: extension %qs starts with 's' but is unsupported standard supervisor extension"
! msgstr "%<-march=%s%>: utvidgningen %qs börjar med ”s” men är en standardövervakarutvidgning som inte stödjs"
  
  #: common/config/riscv/riscv-common.cc:581
  #, gcc-internal-format
*************** msgstr "%<-march=%s%>: ISA-strängen må
*** 39583,39589 ****
  #: common/config/riscv/riscv-common.cc:985
  #, gcc-internal-format
  msgid "%<-march=%s%>: rv%de is not a valid base ISA"
! msgstr "%<-march%s%>: rv%de är inte en giltig bas-ISA"
  
  #: common/config/riscv/riscv-common.cc:998
  #, gcc-internal-format
--- 39567,39573 ----
  #: common/config/riscv/riscv-common.cc:985
  #, gcc-internal-format
  msgid "%<-march=%s%>: rv%de is not a valid base ISA"
! msgstr "%<-march=%s%>: rv%de är inte en giltig bas-ISA"
  
  #: common/config/riscv/riscv-common.cc:998
  #, gcc-internal-format
*************** msgstr "%<-march=%s%>: utökningen h kr�
*** 39653,39669 ****
  #: common/config/riscv/riscv-common.cc:1197
  #, gcc-internal-format
  msgid "%<-march=%s%>: zcd conflicts with zcmt"
! msgstr "%<-mcpu=%s%> zcd står i konflikt med zcmt"
  
  #: common/config/riscv/riscv-common.cc:1199
  #, gcc-internal-format
  msgid "%<-march=%s%>: zcd conflicts with zcmp"
! msgstr "%<-mcpu=%s%> zcd står i konflikt med zcmp"
  
  #: common/config/riscv/riscv-common.cc:1208
  #, gcc-internal-format
  msgid "%<-march=%s%>: xtheadvector conflicts with vector extension or its sub-extensions"
! msgstr "%<-march=%s%>: xtheadvector står i konflikt med en vektorutökning eller des underutökning"
  
  #: common/config/riscv/riscv-common.cc:1306
  #, gcc-internal-format
--- 39637,39653 ----
  #: common/config/riscv/riscv-common.cc:1197
  #, gcc-internal-format
  msgid "%<-march=%s%>: zcd conflicts with zcmt"
! msgstr "%<-march=%s%>: zcd står i konflikt med zcmt"
  
  #: common/config/riscv/riscv-common.cc:1199
  #, gcc-internal-format
  msgid "%<-march=%s%>: zcd conflicts with zcmp"
! msgstr "%<-march=%s%>: zcd står i konflikt med zcmp"
  
  #: common/config/riscv/riscv-common.cc:1208
  #, gcc-internal-format
  msgid "%<-march=%s%>: xtheadvector conflicts with vector extension or its sub-extensions"
! msgstr "%<-march=%s%>: xtheadvector står i konflikt med en vektorutökning eller dess underutökning"
  
  #: common/config/riscv/riscv-common.cc:1306
  #, gcc-internal-format
*************** msgstr "%<-mcpu=%s%>: okänd CPU"
*** 39688,39694 ****
  #: common/config/riscv/riscv-common.cc:1808
  #, gcc-internal-format
  msgid "Cannot find suitable multilib set for %<-march=%s%>/%<-mabi=%s%>"
! msgstr "Kan inte hitta en lämpligt multilib-mängd för %<-march=%s%>/%<-mabi=%s%>"
  
  #: common/config/rs6000/rs6000-common.cc:175 config/sparc/sparc.cc:1823
  #, gcc-internal-format
--- 39672,39678 ----
  #: common/config/riscv/riscv-common.cc:1808
  #, gcc-internal-format
  msgid "Cannot find suitable multilib set for %<-march=%s%>/%<-mabi=%s%>"
! msgstr "Kan inte hitta en lämplig multilib-mängd för %<-march=%s%>/%<-mabi=%s%>"
  
  #: common/config/rs6000/rs6000-common.cc:175 config/sparc/sparc.cc:1823
  #, gcc-internal-format
*************** msgstr "128-bitars systemregisterstöd k
*** 40076,40082 ****
  #: config/aarch64/aarch64-builtins.cc:3572
  #, gcc-internal-format
  msgid "invalid system register name provided"
! msgstr "felaktig namn på systemregister angivet"
  
  #: config/aarch64/aarch64-builtins.cc:3586
  #, gcc-internal-format
--- 40060,40066 ----
  #: config/aarch64/aarch64-builtins.cc:3572
  #, gcc-internal-format
  msgid "invalid system register name provided"
! msgstr "felaktigt namn på systemregister angivet"
  
  #: config/aarch64/aarch64-builtins.cc:3586
  #, gcc-internal-format
*************** msgstr "%s inte igenkänd, använder sta
*** 40199,40205 ****
  #: config/aarch64/aarch64-json-tunings-parser.cc:313
  #, gcc-internal-format
  msgid "key %qs is not a tuning parameter, skipping"
! msgstr "nyckeln %qs är inte ett trimningsparameter, hoppar över"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:329
  #, gcc-internal-format
--- 40183,40189 ----
  #: config/aarch64/aarch64-json-tunings-parser.cc:313
  #, gcc-internal-format
  msgid "key %qs is not a tuning parameter, skipping"
! msgstr "nyckeln %qs är inte en trimningsparameter, hoppar över"
  
  #: config/aarch64/aarch64-json-tunings-parser.cc:329
  #, gcc-internal-format
*************** msgstr "skickar %qT som argument %d till
*** 40406,40412 ****
  #: config/aarch64/aarch64-sve-builtins.cc:2069
  #, gcc-internal-format
  msgid "passing %qT to argument %d of %qE, which expects the data to be 16 bits or wider"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig att datan skall vara 16 bitar bredare"
  
  #: config/aarch64/aarch64-sve-builtins.cc:2072
  #, gcc-internal-format
--- 40390,40396 ----
  #: config/aarch64/aarch64-sve-builtins.cc:2069
  #, gcc-internal-format
  msgid "passing %qT to argument %d of %qE, which expects the data to be 16 bits or wider"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig att datan skall vara 16 bitar eller bredare"
  
  #: config/aarch64/aarch64-sve-builtins.cc:2072
  #, gcc-internal-format
*************** msgstr "kan inte skapa en ny räckvidd %
*** 40786,40792 ****
  #: config/aarch64/aarch64.cc:830
  #, gcc-internal-format
  msgid "%qE attribute applies only to function definitions"
! msgstr "attributet %qE är bara tillämpligt på funktionesdefinitioner"
  
  #: config/aarch64/aarch64.cc:876
  #, gcc-internal-format
--- 40770,40776 ----
  #: config/aarch64/aarch64.cc:830
  #, gcc-internal-format
  msgid "%qE attribute applies only to function definitions"
! msgstr "attributet %qE är bara tillämpligt på funktionsdefinitioner"
  
  #: config/aarch64/aarch64.cc:876
  #, gcc-internal-format
*************** msgstr "ogiltigt argument %qs till %qs"
*** 41649,41655 ****
  #: config/arm/aarch-common.cc:726
  #, gcc-internal-format
  msgid "argument %qs can only appear alone in %qs"
! msgstr "argumentet %qs ken endast förekomma ensamt i %qs"
  
  #: config/arm/arm-builtins.cc:2229
  #, gcc-internal-format, gfc-internal-format
--- 41633,41639 ----
  #: config/arm/aarch-common.cc:726
  #, gcc-internal-format
  msgid "argument %qs can only appear alone in %qs"
! msgstr "argumentet %qs kan endast förekomma ensamt i %qs"
  
  #: config/arm/arm-builtins.cc:2229
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "%<#pragma GCC arm%> kräver en s
*** 41714,41720 ****
  #: config/arm/arm-c.cc:156
  #, gcc-internal-format
  msgid "%<#pragma GCC arm \"arm_mve.h\"%> requires a boolean parameter"
! msgstr "%<#pragma GCC arm \"arm_mve.h\"%> kräver en strängparameter"
  
  #: config/arm/arm-c.cc:160
  #, gcc-internal-format
--- 41698,41704 ----
  #: config/arm/arm-c.cc:156
  #, gcc-internal-format
  msgid "%<#pragma GCC arm \"arm_mve.h\"%> requires a boolean parameter"
! msgstr "%<#pragma GCC arm \"arm_mve.h\"%> kräver en boolesk parameter"
  
  #: config/arm/arm-c.cc:160
  #, gcc-internal-format
*************** msgstr "skickar %qT som argument %d till
*** 41769,41775 ****
  #: config/arm/arm-mve-builtins.cc:1696
  #, gcc-internal-format
  msgid "passing %qT to argument %d of %qE, which expects a pointer to %qT"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig en pkare på %qT"
  
  #: config/arm/arm-mve-builtins.cc:2338
  #, gcc-internal-format
--- 41753,41759 ----
  #: config/arm/arm-mve-builtins.cc:1696
  #, gcc-internal-format
  msgid "passing %qT to argument %d of %qE, which expects a pointer to %qT"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig en pekare på %qT"
  
  #: config/arm/arm-mve-builtins.cc:2338
  #, gcc-internal-format
*************** msgstr "%s förväntar sig ett heltal ko
*** 42357,42363 ****
  #: config/avr/avr.cc:16362
  #, gcc-internal-format, gfc-internal-format
  msgid "%s expects a compile time integer constant of 0x01, 0x7f, 0x80 or 0xfe as first argument"
! msgstr "%s förväntar sig en kompilatorstillfälles heltalskonstant på 0x01, 0x7f, 0x80 eller 0xfe som första argument"
  
  #: config/avr/avr.cc:16377
  #, gcc-internal-format, gfc-internal-format
--- 42341,42347 ----
  #: config/avr/avr.cc:16362
  #, gcc-internal-format, gfc-internal-format
  msgid "%s expects a compile time integer constant of 0x01, 0x7f, 0x80 or 0xfe as first argument"
! msgstr "%s förväntar sig en heltalskonstant vid kompileringstillfället på 0x01, 0x7f, 0x80 eller 0xfe som första argument"
  
  #: config/avr/avr.cc:16377
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "kunde inte inline:a anropet av %
*** 42534,42540 ****
  #: config/bpf/bpf.cc:1492 config/bpf/bpf.cc:1495
  #, gcc-internal-format
  msgid "could not inline call to %<__builtin_memset%>: too many bytes, use %<-minline-memops-threshold%>"
! msgstr "kunde int inline:a anropet av %<__builtin_memset%>: för många byte, använd %<-minline-memops-threshold%>"
  
  #: config/bpf/core-builtins.cc:1796
  #, gcc-internal-format
--- 42518,42524 ----
  #: config/bpf/bpf.cc:1492 config/bpf/bpf.cc:1495
  #, gcc-internal-format
  msgid "could not inline call to %<__builtin_memset%>: too many bytes, use %<-minline-memops-threshold%>"
! msgstr "kunde inte inline:a anropet av %<__builtin_memset%>: för många byte, använd %<-minline-memops-threshold%>"
  
  #: config/bpf/core-builtins.cc:1796
  #, gcc-internal-format
*************** msgstr "ogiltigt tredje argument"
*** 43119,43124 ****
--- 43103,43109 ----
  msgid "instruction prefetch applies when in 64-bit mode with RIP-relative addressing and option %<-mprefetchi%>; they stay NOPs otherwise"
  msgstr "instruktionsförhandshämtning är aktuellt när man är i 64-bitsläge med RIP-relativ adressering och flaggat %<-mprefetchi%>; de förblir NOP:ar annars"
  
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125348
  #: config/i386/i386-expand.cc:15246
  #, gcc-internal-format
  msgid "invalid forth argument to %<__builtin_ia32_prefetch%>; using zero"
*************** msgstr "%<-mno-fentry%> är inte kompati
*** 43516,43522 ****
  #: config/i386/i386-options.cc:2879
  #, gcc-internal-format
  msgid "%<-pg%> without %<-mfentry%> may be unreliable with shrink wrapping"
! msgstr "%<-pg%> utan %<-mfentry%> kan vara opålitligt med krympinkappsling"
  
  #: config/i386/i386-options.cc:2884
  #, gcc-internal-format
--- 43501,43507 ----
  #: config/i386/i386-options.cc:2879
  #, gcc-internal-format
  msgid "%<-pg%> without %<-mfentry%> may be unreliable with shrink wrapping"
! msgstr "%<-pg%> utan %<-mfentry%> kan vara opålitligt med krympinkapsling"
  
  #: config/i386/i386-options.cc:2884
  #, gcc-internal-format
*************** msgstr "okänd nativ FPU-typ %<0x%x%>, %
*** 44052,44058 ****
  #: config/loongarch/loongarch-cpu.cc:180
  #, gcc-internal-format
  msgid "floating-point unit %qs differs from PRID preset %qs"
! msgstr "flyttalsenheten %qs skiler från PRID-förinställningen %qs"
  
  #: config/loongarch/loongarch-cpu.cc:204
  #, gcc-internal-format
--- 44037,44043 ----
  #: config/loongarch/loongarch-cpu.cc:180
  #, gcc-internal-format
  msgid "floating-point unit %qs differs from PRID preset %qs"
! msgstr "flyttalsenheten %qs skiljer från PRID-förinställningen %qs"
  
  #: config/loongarch/loongarch-cpu.cc:204
  #, gcc-internal-format
*************** msgstr "%<-falign-loops=%d%> stödjs ej"
*** 44312,44318 ****
  #: config/m68k/m68k.cc:693
  #, gcc-internal-format
  msgid "%<-fstack-limit-%> options are not supported on this cpu"
! msgstr "%<-fstack-limit-flaggor%> stödjs inte på denna målarkitektur"
  
  #: config/m68k/m68k.cc:811
  #, gcc-internal-format
--- 44297,44303 ----
  #: config/m68k/m68k.cc:693
  #, gcc-internal-format
  msgid "%<-fstack-limit-%> options are not supported on this cpu"
! msgstr "%<-fstack-limit-%>-flaggor stödjs inte på denna målarkitektur"
  
  #: config/m68k/m68k.cc:811
  #, gcc-internal-format
*************** msgstr "%<-mdata-region=upper%> föruts�
*** 44873,44879 ****
  #: config/msp430/msp430.cc:291
  #, gcc-internal-format
  msgid "%<-fuse-cxa-atexit%> is not supported for msp430-elf"
! msgstr "%<-fcall-saved-REG%> stödjs inte för msp430-elf"
  
  #: config/msp430/msp430.cc:296
  #, gcc-internal-format
--- 44858,44864 ----
  #: config/msp430/msp430.cc:291
  #, gcc-internal-format
  msgid "%<-fuse-cxa-atexit%> is not supported for msp430-elf"
! msgstr "%<-fuse-cxa-atexit%> stödjs inte för msp430-elf"
  
  #: config/msp430/msp430.cc:296
  #, gcc-internal-format
*************** msgstr "barriärvärdet måste vara inom
*** 45232,45238 ****
  #: config/nvptx/nvptx.cc:6380
  #, gcc-internal-format
  msgid "complement argument must be constant"
! msgstr "komplmentargumentet måste vara konstant"
  
  #: config/nvptx/nvptx.cc:6720
  #, gcc-internal-format
--- 45217,45223 ----
  #: config/nvptx/nvptx.cc:6380
  #, gcc-internal-format
  msgid "complement argument must be constant"
! msgstr "komplementargumentet måste vara konstant"
  
  #: config/nvptx/nvptx.cc:6720
  #, gcc-internal-format
*************** msgstr "oväntad arkitektur till attribu
*** 45412,45418 ****
  #: config/riscv/riscv-target-attr.cc:162
  #, gcc-internal-format
  msgid "unexpected arch for %<target()%> attribute: bad string found %qs"
! msgstr "oväntat arkitektur till attributet %<target()%>: felaktig sträng funnen %qs"
  
  #: config/riscv/riscv-target-attr.cc:189
  #, gcc-internal-format
--- 45397,45403 ----
  #: config/riscv/riscv-target-attr.cc:162
  #, gcc-internal-format
  msgid "unexpected arch for %<target()%> attribute: bad string found %qs"
! msgstr "oväntad arkitektur till attributet %<target()%>: felaktig sträng funnen %qs"
  
  #: config/riscv/riscv-target-attr.cc:189
  #, gcc-internal-format
*************** msgstr "läget %s förväntades för ope
*** 45486,45492 ****
  #: config/riscv/riscv-v.cc:379
  #, gcc-internal-format, gfc-internal-format
  msgid "invalid number of operands for insn %s, expected %d but got %d.\n"
! msgstr "felaktig antal operander till instruktionen %s, %d förväntades men fick %d.\n"
  
  #: config/riscv/riscv-vector-builtins.cc:5253
  #, gcc-internal-format
--- 45471,45477 ----
  #: config/riscv/riscv-v.cc:379
  #, gcc-internal-format, gfc-internal-format
  msgid "invalid number of operands for insn %s, expected %d but got %d.\n"
! msgstr "felaktigt antal operander till instruktionen %s, %d förväntades men fick %d.\n"
  
  #: config/riscv/riscv-vector-builtins.cc:5253
  #, gcc-internal-format
*************** msgstr "inbyggd %qs är endast giltigt i
*** 45964,45970 ****
  #: config/rs6000/rs6000-builtin.cc:3187
  #, gcc-internal-format
  msgid "unresolved overload for builtin %qF"
! msgstr "ej upplöst överlagrad inbyggd %qF"
  
  #: config/rs6000/rs6000-builtin.cc:3290
  #, gcc-internal-format
--- 45949,45955 ----
  #: config/rs6000/rs6000-builtin.cc:3187
  #, gcc-internal-format
  msgid "unresolved overload for builtin %qF"
! msgstr "ej uppslagen överlagrad inbyggd %qF"
  
  #: config/rs6000/rs6000-builtin.cc:3290
  #, gcc-internal-format
*************** msgstr "%<-mvsx%> och %<-msoft-float%> �
*** 46180,46186 ****
  #: config/rs6000/rs6000.cc:3845
  #, gcc-internal-format
  msgid "%<-mvsx%> and %<-mavoid-indexed-addresses%> are incompatible"
! msgstr "%<-mvsx%> och %<-mvoid-indexed-addresses%> är inkompatibla"
  
  #: config/rs6000/rs6000.cc:3856
  #, gcc-internal-format
--- 46165,46171 ----
  #: config/rs6000/rs6000.cc:3845
  #, gcc-internal-format
  msgid "%<-mvsx%> and %<-mavoid-indexed-addresses%> are incompatible"
! msgstr "%<-mvsx%> och %<-mavoid-indexed-addresses%> är inkompatibla"
  
  #: config/rs6000/rs6000.cc:3856
  #, gcc-internal-format
*************** msgstr "%<-mrop-protect%> behöver %<-mc
*** 46279,46285 ****
  #: config/rs6000/rs6000.cc:4856
  #, gcc-internal-format
  msgid "%<-mrop-protect%> requires the ELFv2 ABI"
! msgstr "%<-mprop-protect%> behöver ELFv2 ABI:et"
  
  #: config/rs6000/rs6000.cc:4874
  #, gcc-internal-format
--- 46264,46270 ----
  #: config/rs6000/rs6000.cc:4856
  #, gcc-internal-format
  msgid "%<-mrop-protect%> requires the ELFv2 ABI"
! msgstr "%<-mrop-protect%> behöver ELFv2 ABI:et"
  
  #: config/rs6000/rs6000.cc:4874
  #, gcc-internal-format
*************** msgstr "Inbyggd %qF kräver z17 eller h�
*** 46549,46555 ****
  #: config/s390/s390.cc:939
  #, gcc-internal-format
  msgid "unresolved overloaded builtin"
! msgstr "ej upplöst överlagrad inbyggd"
  
  #: config/s390/s390.cc:946
  #, gcc-internal-format
--- 46534,46540 ----
  #: config/s390/s390.cc:939
  #, gcc-internal-format
  msgid "unresolved overloaded builtin"
! msgstr "ej uppslagen överlagrad inbyggd"
  
  #: config/s390/s390.cc:946
  #, gcc-internal-format
*************** msgstr "dubblerad %<_Atomic%>"
*** 48097,48103 ****
  #: c/c-decl.cc:7086
  #, gcc-internal-format, gfc-internal-format
  msgid "conflicting named address spaces (%s vs %s)"
! msgstr "motstridande namngivna adressrymder (%s respektive %s)"
  
  #: c/c-decl.cc:7109 c/c-parser.cc:3982
  #, gcc-internal-format
--- 48082,48088 ----
  #: c/c-decl.cc:7086
  #, gcc-internal-format, gfc-internal-format
  msgid "conflicting named address spaces (%s vs %s)"
! msgstr "motstridiga namngivna adressrymder (%s respektive %s)"
  
  #: c/c-decl.cc:7109 c/c-parser.cc:3982
  #, gcc-internal-format
*************** msgstr "posten har inga medlemmar"
*** 48724,48730 ****
  #: c/c-decl.cc:9744 cp/decl.cc:16412
  #, gcc-internal-format
  msgid "flexible array member in union is a GCC extension"
! msgstr "flexibel vektormedlem i union är en GCC-utökning"
  
  #: c/c-decl.cc:9748
  #, gcc-internal-format
--- 48709,48715 ----
  #: c/c-decl.cc:9744 cp/decl.cc:16412
  #, gcc-internal-format
  msgid "flexible array member in union is a GCC extension"
! msgstr "flexibel vektormedlem i union är en GCC-utvidgning"
  
  #: c/c-decl.cc:9748
  #, gcc-internal-format
*************** msgstr "flexibel vektormedlem inte vid s
*** 48734,48740 ****
  #: c/c-decl.cc:9753
  #, gcc-internal-format
  msgid "flexible array member in a struct with no named members is a GCC extension"
! msgstr "flexibel vektormedlem i struct utan namngivna medlemmar är en GCC-utökning"
  
  #: c/c-decl.cc:9800
  #, gcc-internal-format
--- 48719,48725 ----
  #: c/c-decl.cc:9753
  #, gcc-internal-format
  msgid "flexible array member in a struct with no named members is a GCC extension"
! msgstr "flexibel vektormedlem i struct utan namngivna medlemmar är en GCC-utvidgning"
  
  #: c/c-decl.cc:9800
  #, gcc-internal-format
*************** msgstr "%qs utan motsvarande %qs"
*** 49473,49479 ****
  #: c/c-parser.cc:2126 cp/semantics.cc:4068
  #, gcc-internal-format
  msgid "%<omp begin declare variant%> without corresponding %<omp end declare variant%>"
! msgstr "%<omp start declare variant%> utan motsvarande %<omp end declare variant%>"
  
  #: c/c-parser.cc:2230 c/c-parser.cc:14910
  #, gcc-internal-format
--- 49458,49464 ----
  #: c/c-parser.cc:2126 cp/semantics.cc:4068
  #, gcc-internal-format
  msgid "%<omp begin declare variant%> without corresponding %<omp end declare variant%>"
! msgstr "%<omp begin declare variant%> utan motsvarande %<omp end declare variant%>"
  
  #: c/c-parser.cc:2230 c/c-parser.cc:14910
  #, gcc-internal-format
*************** msgstr "en %<__RTL%>-funktion kan inte v
*** 49641,49647 ****
  #: c/c-parser.cc:3372
  #, gcc-internal-format
  msgid "%<__GIMPLE%> function cannot be a nested function"
! msgstr "en %<__RTL%>-funktion kan inte vara en nästad funktion"
  
  #: c/c-parser.cc:3534 c/c-parser.cc:9832 c/c-parser.cc:16369
  #: c/c-parser.cc:21727 cp/parser.cc:46138
--- 49626,49632 ----
  #: c/c-parser.cc:3372
  #, gcc-internal-format
  msgid "%<__GIMPLE%> function cannot be a nested function"
! msgstr "en %<__GIMPLE%>-funktion kan inte vara en nästad funktion"
  
  #: c/c-parser.cc:3534 c/c-parser.cc:9832 c/c-parser.cc:16369
  #: c/c-parser.cc:21727 cp/parser.cc:46138
*************** msgstr "%<allocate%>-klausulens allokera
*** 50997,51003 ****
  #: c/c-parser.cc:19587 cp/semantics.cc:8882 cp/semantics.cc:8898
  #, gcc-internal-format
  msgid "%<allocate%> clause %<align%> modifier argument needs to be positive constant power of two integer expression"
! msgstr "argumentet till modifieraren %<align%> av klausulen %<allocate%> måste vara ett positivt konstant heltalsuttryck som är en exponent av två"
  
  #: c/c-parser.cc:19730
  #, gcc-internal-format
--- 50982,50988 ----
  #: c/c-parser.cc:19587 cp/semantics.cc:8882 cp/semantics.cc:8898
  #, gcc-internal-format
  msgid "%<allocate%> clause %<align%> modifier argument needs to be positive constant power of two integer expression"
! msgstr "argumentet till modifieraren %<align%> av klausulen %<allocate%> måste vara ett positivt konstant heltalsuttryck som är en potens av två"
  
  #: c/c-parser.cc:19730
  #, gcc-internal-format
*************** msgstr "okänd främmande körtidsidenti
*** 51213,51219 ****
  #: cp/parser.cc:46152
  #, gcc-internal-format
  msgid "expected string literal or constant integer expression"
! msgstr "en strängliteral eller ett konstant heltalsuttryck förväntades"
  
  #: c/c-parser.cc:21621 c/c-parser.cc:21750 cp/parser.cc:46013
  #: cp/parser.cc:46160 cp/semantics.cc:7768
--- 51198,51204 ----
  #: cp/parser.cc:46152
  #, gcc-internal-format
  msgid "expected string literal or constant integer expression"
! msgstr "en stränglitteral eller ett konstant heltalsuttryck förväntades"
  
  #: c/c-parser.cc:21621 c/c-parser.cc:21750 cp/parser.cc:46013
  #: cp/parser.cc:46160 cp/semantics.cc:7768
*************** msgstr "dubblerad preferensväljare %<fr
*** 51234,51240 ****
  #: c/c-parser.cc:21693 cp/parser.cc:46104
  #, gcc-internal-format
  msgid "%<attr%> string literal must start with %<ompx_%>"
! msgstr "stränglitteralen %<attr%> måste börja med med %<ompx_%>"
  
  #: c/c-parser.cc:21701 cp/parser.cc:46111
  #, gcc-internal-format
--- 51219,51225 ----
  #: c/c-parser.cc:21693 cp/parser.cc:46104
  #, gcc-internal-format
  msgid "%<attr%> string literal must start with %<ompx_%>"
! msgstr "stränglitteralen %<attr%> måste börja med %<ompx_%>"
  
  #: c/c-parser.cc:21701 cp/parser.cc:46111
  #, gcc-internal-format
*************** msgstr "modifierad här"
*** 51421,51427 ****
  #: c/c-parser.cc:23467 cp/parser.cc:47224 cp/parser.cc:47239
  #, gcc-internal-format
  msgid "%<align%> clause argument needs to be positive constant power of two integer expression"
! msgstr "klausulargumentet %<align%> måste vara ett positivt konstant heltalsuttryck som är en exponent av två"
  
  #: c/c-parser.cc:23491
  #, gcc-internal-format
--- 51406,51412 ----
  #: c/c-parser.cc:23467 cp/parser.cc:47224 cp/parser.cc:47239
  #, gcc-internal-format
  msgid "%<align%> clause argument needs to be positive constant power of two integer expression"
! msgstr "klausulargumentet %<align%> måste vara ett positivt konstant heltalsuttryck som är en potens av två"
  
  #: c/c-parser.cc:23491
  #, gcc-internal-format
*************** msgstr "klausulen %<allocator%> krävs f
*** 51451,51457 ****
  #: c/c-parser.cc:23543
  #, gcc-internal-format
  msgid "%<allocator%> clause requires a predefined allocator as %qD is static"
! msgstr "%<allocate%>-klausulen kräver en fördefinierad allokerare eftersom %qD är statisk"
  
  #: c/c-parser.cc:23694 cp/parser.cc:47404
  #, gcc-internal-format
--- 51436,51442 ----
  #: c/c-parser.cc:23543
  #, gcc-internal-format
  msgid "%<allocator%> clause requires a predefined allocator as %qD is static"
! msgstr "%<allocator%>-klausulen kräver en fördefinierad allokerare eftersom %qD är statisk"
  
  #: c/c-parser.cc:23694 cp/parser.cc:47404
  #, gcc-internal-format
*************** msgstr "%<#pragma omp scan%> förväntad
*** 51619,51625 ****
  #: c/c-parser.cc:24950 cp/parser.cc:49343
  #, gcc-internal-format
  msgid "%<#pragma omp scan%> with zero succeeding executable statements"
! msgstr "%<#pragma omp scan%> med noll flöljande körbara satser"
  
  #: c/c-parser.cc:24975 cp/parser.cc:49366
  #, gcc-internal-format
--- 51604,51610 ----
  #: c/c-parser.cc:24950 cp/parser.cc:49343
  #, gcc-internal-format
  msgid "%<#pragma omp scan%> with zero succeeding executable statements"
! msgstr "%<#pragma omp scan%> med noll följande körbara satser"
  
  #: c/c-parser.cc:24975 cp/parser.cc:49366
  #, gcc-internal-format
*************** msgstr "%<begin declare variant%> i attr
*** 52010,52016 ****
  #: c/c-parser.cc:29048 cp/parser.cc:54601
  #, gcc-internal-format
  msgid "%<begin declare variant%> in pragma syntax terminated with %<end declare variant%> in attribute syntax"
! msgstr "%<begom decöare variant%> i pragma-syntax som avslutas med %<end declare variant%> i attributsyntax"
  
  #: c/c-parser.cc:29090 cp/parser.cc:54643
  #, gcc-internal-format
--- 51995,52001 ----
  #: c/c-parser.cc:29048 cp/parser.cc:54601
  #, gcc-internal-format
  msgid "%<begin declare variant%> in pragma syntax terminated with %<end declare variant%> in attribute syntax"
! msgstr "%<begin declare variant%> i pragma-syntax som avslutas med %<end declare variant%> i attributsyntax"
  
  #: c/c-parser.cc:29090 cp/parser.cc:54643
  #, gcc-internal-format
*************** msgstr "%<pragma omp error%> påträffat
*** 52185,52191 ****
  #: c/c-parser.cc:30257 cp/parser.cc:53236
  #, gcc-internal-format
  msgid "expected at least one assumption clause"
! msgstr "åtminstone enn assumption-klausul förväntades"
  
  #: c/c-parser.cc:30350 c/c-parser.cc:30657 cp/parser.cc:53329
  #: cp/parser.cc:54872 cp/parser.cc:54899
--- 52170,52176 ----
  #: c/c-parser.cc:30257 cp/parser.cc:53236
  #, gcc-internal-format
  msgid "expected at least one assumption clause"
! msgstr "åtminstone en assumption-klausul förväntades"
  
  #: c/c-parser.cc:30350 c/c-parser.cc:30657 cp/parser.cc:53329
  #: cp/parser.cc:54872 cp/parser.cc:54899
*************** msgstr "assumption-klausul förväntades
*** 52226,52232 ****
  #: c/c-parser.cc:30553 cp/parser.cc:54765
  #, gcc-internal-format
  msgid "expected %<when%>, %<otherwise%>, or %<default%> clause"
! msgstr "en klausul %<when%>-, %<otherwise%>- eller %<default%> förväntades"
  
  #: c/c-parser.cc:30565 cp/parser.cc:54778
  #, gcc-internal-format
--- 52211,52217 ----
  #: c/c-parser.cc:30553 cp/parser.cc:54765
  #, gcc-internal-format
  msgid "expected %<when%>, %<otherwise%>, or %<default%> clause"
! msgstr "en klausul %<when%>, %<otherwise%> eller %<default%> förväntades"
  
  #: c/c-parser.cc:30565 cp/parser.cc:54778
  #, gcc-internal-format
*************** msgstr "modifieraren %<-%> använd inuti
*** 53577,53583 ****
  #: c/c-typeck.cc:13255 cp/semantics.cc:2494
  #, gcc-internal-format
  msgid "%<:%> constraint operand is not address of a function or non-automatic variable"
! msgstr "%<:%>-begränsningsoperanden är inte adressen till en funktion eller icka-automatisk variabel"
  
  #: c/c-typeck.cc:13270 cp/semantics.cc:2509
  #, gcc-internal-format
--- 53562,53568 ----
  #: c/c-typeck.cc:13255 cp/semantics.cc:2494
  #, gcc-internal-format
  msgid "%<:%> constraint operand is not address of a function or non-automatic variable"
! msgstr "%<:%>-begränsningsoperanden är inte adressen till en funktion eller icke-automatisk variabel"
  
  #: c/c-typeck.cc:13270 cp/semantics.cc:2509
  #, gcc-internal-format
*************** msgstr "funktionen returnerar adress til
*** 53627,53633 ****
  #: c/c-typeck.cc:13503
  #, gcc-internal-format
  msgid "function returns address of nested function referencing local context"
! msgstr "funktionen returnerar adress till en nästad funktion som referar en lokal kontext"
  
  #: c/c-typeck.cc:13596 cp/semantics.cc:1945
  #, gcc-internal-format
--- 53612,53618 ----
  #: c/c-typeck.cc:13503
  #, gcc-internal-format
  msgid "function returns address of nested function referencing local context"
! msgstr "funktionen returnerar adress till en nästad funktion som refererar en lokal kontext"
  
  #: c/c-typeck.cc:13596 cp/semantics.cc:1945
  #, gcc-internal-format
*************** msgstr "%qE måste vara %<threadprivate%
*** 54016,54022 ****
  #: c/c-typeck.cc:17027 cp/semantics.cc:7949
  #, gcc-internal-format
  msgid "modifier should not be specified in %<linear%> clause on %<simd%> or %<for%> constructs when not using OpenMP 5.2 modifiers"
! msgstr "modifierare skall inte anges i %<linear%>-klausul på %<simd%>- eller %<for%>-konstruktioner när man inte använder OpenMP 5.2-modiferare"
  
  #: c/c-typeck.cc:17036
  #, gcc-internal-format
--- 54001,54007 ----
  #: c/c-typeck.cc:17027 cp/semantics.cc:7949
  #, gcc-internal-format
  msgid "modifier should not be specified in %<linear%> clause on %<simd%> or %<for%> constructs when not using OpenMP 5.2 modifiers"
! msgstr "modifierare skall inte anges i %<linear%>-klausul på %<simd%>- eller %<for%>-konstruktioner när man inte använder OpenMP 5.2-modifierare"
  
  #: c/c-typeck.cc:17036
  #, gcc-internal-format
*************** msgstr "memspace-modifieraren %qE måste
*** 54145,54151 ****
  #: c/c-typeck.cc:17447 cp/semantics.cc:9059
  #, gcc-internal-format
  msgid "traits array %qE must be defined in same scope as the construct on which the clause appears"
! msgstr "egenskapsvektorn %qE måste definieras i samma omfång som konstruktionen på vilken satsen förekommer"
  
  #: c/c-typeck.cc:17472 cp/semantics.cc:9083
  #, gcc-internal-format
--- 54130,54136 ----
  #: c/c-typeck.cc:17447 cp/semantics.cc:9059
  #, gcc-internal-format
  msgid "traits array %qE must be defined in same scope as the construct on which the clause appears"
! msgstr "egenskapsvektorn %qE måste definieras i samma omfång som konstruktionen på vilken klausulen förekommer"
  
  #: c/c-typeck.cc:17472 cp/semantics.cc:9083
  #, gcc-internal-format
*************** msgstr "klausulen %<depend%> med beroend
*** 54170,54176 ****
  #: c/c-typeck.cc:17535 cp/semantics.cc:9151
  #, gcc-internal-format
  msgid "%<omp_all_memory%> used with %<depend%> kind other than %<out%> or %<inout%>"
! msgstr "%<omp_all_memory%> använt med en annan %<depend%>-sortkind än %<out%> eller %<inout%>"
  
  #: c/c-typeck.cc:17543 cp/semantics.cc:9169
  #, gcc-internal-format
--- 54155,54161 ----
  #: c/c-typeck.cc:17535 cp/semantics.cc:9151
  #, gcc-internal-format
  msgid "%<omp_all_memory%> used with %<depend%> kind other than %<out%> or %<inout%>"
! msgstr "%<omp_all_memory%> använt med en annan %<depend%>-sort än %<out%> eller %<inout%>"
  
  #: c/c-typeck.cc:17543 cp/semantics.cc:9169
  #, gcc-internal-format
*************** msgstr "I %<parser_move(%s till %s)%>, f
*** 54842,54853 ****
  #: cobol/genapi.cc:15699
  #, gcc-internal-format
  msgid "In %<mh_dest_is_float%>(%s to %s), the move of %s to %s is unimplemented"
! msgstr "I %<mh_dest_is_float(%s till %s)%>, förflyttningen av %s till %s är inte implementerat"
  
  #: cobol/genapi.cc:17553
  #, gcc-internal-format, gfc-internal-format
  msgid "LEVEL 01 (%s) OCCURS has insufficient data.memsize"
! msgstr "LEVEL 01 (%s) OCCURS har otilräcklig data.memsize"
  
  #: cobol/genapi.cc:17591
  #, gcc-internal-format
--- 54827,54838 ----
  #: cobol/genapi.cc:15699
  #, gcc-internal-format
  msgid "In %<mh_dest_is_float%>(%s to %s), the move of %s to %s is unimplemented"
! msgstr "I %<mh_dest_is_float%>(%s till %s), förflyttningen av %s till %s är inte implementerat"
  
  #: cobol/genapi.cc:17553
  #, gcc-internal-format, gfc-internal-format
  msgid "LEVEL 01 (%s) OCCURS has insufficient data.memsize"
! msgstr "LEVEL 01 (%s) OCCURS har otillräcklig data.memsize"
  
  #: cobol/genapi.cc:17591
  #, gcc-internal-format
*************** msgstr "%<parser_symbol_add()%> anropade
*** 54857,54863 ****
  #: cobol/genapi.cc:17621
  #, gcc-internal-format, gfc-internal-format
  msgid "%s: %d %s is a table, but it improperly has a capacity of zero"
! msgstr "%s: %d %s är en tabell, med den har oriktigt en kapacetet på noll"
  
  #: cobol/genapi.cc:17661
  #, gcc-internal-format, gfc-internal-format
--- 54842,54848 ----
  #: cobol/genapi.cc:17621
  #, gcc-internal-format, gfc-internal-format
  msgid "%s: %d %s is a table, but it improperly has a capacity of zero"
! msgstr "%s: %d %s är en tabell, med den har oriktigt en kapacitet på noll"
  
  #: cobol/genapi.cc:17661
  #, gcc-internal-format, gfc-internal-format
*************** msgid "Somebody asked for the field %s.%
*** 54919,54933 ****
  msgstr "Någon frågade efter fältet %s.%s, som inte finns"
  
  #: cobol/gengen.cc:1276
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "%qs is not supported with %qs"
  msgid "%s:%d: Must not call here with %s"
! msgstr "%qs stödjs inte med %qs"
  
  #: cobol/gengen.cc:1294
  #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: Must not call here with non-%s"
! msgstr ""
  
  #: cobol/gengen.cc:2017 cobol/gengen.cc:2070 cobol/gengen.cc:2897
  #: cobol/gengen.cc:2952
--- 54904,54917 ----
  msgstr "Någon frågade efter fältet %s.%s, som inte finns"
  
  #: cobol/gengen.cc:1276
! #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: Must not call here with %s"
! msgstr "%s:%d: Får inte anropa här med %s"
  
  #: cobol/gengen.cc:1294
  #, gcc-internal-format, gfc-internal-format
  msgid "%s:%d: Must not call here with non-%s"
! msgstr "%s:%d: Får inte anropa här med icke %s"
  
  #: cobol/gengen.cc:2017 cobol/gengen.cc:2070 cobol/gengen.cc:2897
  #: cobol/gengen.cc:2952
*************** msgstr "flexibel vektormedlem %qD inte v
*** 56415,56421 ****
  #: cp/class.cc:7832
  #, gcc-internal-format
  msgid "flexible array member %qD in an otherwise empty %q#T is a GCC extension"
! msgstr "flexibel vektor medlem %qD i en i övrigt tom %q#T är en GCC-utvidgning"
  
  #: cp/class.cc:7855
  #, gcc-internal-format
--- 56399,56405 ----
  #: cp/class.cc:7832
  #, gcc-internal-format
  msgid "flexible array member %qD in an otherwise empty %q#T is a GCC extension"
! msgstr "flexibel vektormedlem %qD i en i övrigt tom %q#T är en GCC-utvidgning"
  
  #: cp/class.cc:7855
  #, gcc-internal-format
*************** msgstr "språksträng %<”%E”%> känn
*** 56480,56486 ****
  #: cp/class.cc:8962
  #, gcc-internal-format
  msgid "cannot resolve overloaded function %qD based on conversion to type %qT"
! msgstr "det går inte att lösa upp överlagrad funktion %qD baserat på konvertering till typ %qT"
  
  #: cp/class.cc:9135
  #, gcc-internal-format
--- 56464,56470 ----
  #: cp/class.cc:8962
  #, gcc-internal-format
  msgid "cannot resolve overloaded function %qD based on conversion to type %qT"
! msgstr "det går inte att slå upp överlagrad funktion %qD baserat på konvertering till typ %qT"
  
  #: cp/class.cc:9135
  #, gcc-internal-format
*************** msgstr "pekaren på %qD är inte ett kon
*** 56891,56897 ****
  #: cp/constexpr.cc:4853
  #, gcc-internal-format
  msgid "address of non-static constexpr variable %qD may differ on each invocation of the enclosing function; add %<static%> to give it a constant address"
! msgstr "adressen till den icke-statiska constexpr-variabeln %qD kan skilja vid varje uppstar av den omgivande funktionen; ligg till %<static%> för att ge den en konstant adress"
  
  #: cp/constexpr.cc:4929 rust/backend/rust-constexpr.cc:6730
  #, gcc-internal-format
--- 56875,56881 ----
  #: cp/constexpr.cc:4853
  #, gcc-internal-format
  msgid "address of non-static constexpr variable %qD may differ on each invocation of the enclosing function; add %<static%> to give it a constant address"
! msgstr "adressen till den icke-statiska constexpr-variabeln %qD kan skilja vid varje uppstart av den omgivande funktionen; lägg till %<static%> för att ge den en konstant adress"
  
  #: cp/constexpr.cc:4929 rust/backend/rust-constexpr.cc:6730
  #, gcc-internal-format
*************** msgstr "använder värdet av objektet %q
*** 57062,57068 ****
  #: cp/constexpr.cc:7536
  #, gcc-internal-format
  msgid "%qT object created here"
! msgstr "en %qT-objekt skapat här"
  
  #: cp/constexpr.cc:7539 cp/parser.cc:13128 cp/parser.cc:13139
  #: cp/reflect.cc:9077 cp/semantics.cc:4714 cp/semantics.cc:4730
--- 57046,57052 ----
  #: cp/constexpr.cc:7536
  #, gcc-internal-format
  msgid "%qT object created here"
! msgstr "ett %qT-objekt skapat här"
  
  #: cp/constexpr.cc:7539 cp/parser.cc:13128 cp/parser.cc:13139
  #: cp/reflect.cc:9077 cp/semantics.cc:4714 cp/semantics.cc:4730
*************** msgstr "%q#D är inte const"
*** 57110,57116 ****
  #: cp/constexpr.cc:7636
  #, gcc-internal-format
  msgid "%q#D is volatile"
! msgstr "%q+#D är volatile"
  
  #: cp/constexpr.cc:7641 cp/constexpr.cc:7648
  #: rust/backend/rust-constexpr.cc:4248 rust/backend/rust-constexpr.cc:4256
--- 57094,57100 ----
  #: cp/constexpr.cc:7636
  #, gcc-internal-format
  msgid "%q#D is volatile"
! msgstr "%q#D är volatile"
  
  #: cp/constexpr.cc:7641 cp/constexpr.cc:7648
  #: rust/backend/rust-constexpr.cc:4248 rust/backend/rust-constexpr.cc:4256
*************** msgstr "ett undantag som inte fångades
*** 57247,57253 ****
  #: cp/constexpr.cc:9718
  #, gcc-internal-format
  msgid "destructor exited with an exception after initializing the exception object"
! msgstr "destrueraren avslutade med ett undantag efter initialisering av undantagsobjektet"
  
  #: cp/constexpr.cc:9721
  #, gcc-internal-format
--- 57231,57237 ----
  #: cp/constexpr.cc:9718
  #, gcc-internal-format
  msgid "destructor exited with an exception after initializing the exception object"
! msgstr "destrueraren avslutade med ett undantag efter initiering av undantagsobjektet"
  
  #: cp/constexpr.cc:9721
  #, gcc-internal-format
*************** msgstr "typkonvertering från %qT är in
*** 57282,57288 ****
  #: cp/constexpr.cc:10218
  #, gcc-internal-format
  msgid "%qE is not a constant expression when the class %qT is still incomplete"
! msgstr "%qE är inte ett konstant uttryck när kassen %qT fortfarande är ofullständig"
  
  #: cp/constexpr.cc:10258 rust/backend/rust-constexpr.cc:2588
  #, gcc-internal-format
--- 57266,57272 ----
  #: cp/constexpr.cc:10218
  #, gcc-internal-format
  msgid "%qE is not a constant expression when the class %qT is still incomplete"
! msgstr "%qE är inte ett konstant uttryck när klassen %qT fortfarande är ofullständig"
  
  #: cp/constexpr.cc:10258 rust/backend/rust-constexpr.cc:2588
  #, gcc-internal-format
*************** msgstr "%qT är inte layoutkompatibel me
*** 57757,57763 ****
  #: cp/constraint.cc:3256
  #, gcc-internal-format
  msgid "%qT is not a literal type"
! msgstr "%qT är inte en literal typ"
  
  #: cp/constraint.cc:3259
  #, gcc-internal-format
--- 57741,57747 ----
  #: cp/constraint.cc:3256
  #, gcc-internal-format
  msgid "%qT is not a literal type"
! msgstr "%qT är inte en litteral typ"
  
  #: cp/constraint.cc:3259
  #, gcc-internal-format
*************** msgstr "%qT är inte en referens"
*** 57842,57848 ****
  #: cp/constraint.cc:3320
  #, gcc-internal-format
  msgid "%q#T is not the same as %q#T"
! msgstr "%q#T är inte en detsamma som %q#T"
  
  #: cp/constraint.cc:3323
  #, gcc-internal-format
--- 57826,57832 ----
  #: cp/constraint.cc:3320
  #, gcc-internal-format
  msgid "%q#T is not the same as %q#T"
! msgstr "%q#T är inte detsamma som %q#T"
  
  #: cp/constraint.cc:3323
  #, gcc-internal-format
*************** msgid "%qT is not a volatile type"
*** 57905,57914 ****
  msgstr "%qT är inte en volatile-typ"
  
  #: cp/constraint.cc:3363
! #, fuzzy, gcc-internal-format
! #| msgid "%qT is not a literal type"
  msgid "%qT is not a structural type"
! msgstr "%qT är inte en literal typ"
  
  #: cp/constraint.cc:3367
  #, gcc-internal-format
--- 57889,57897 ----
  msgstr "%qT är inte en volatile-typ"
  
  #: cp/constraint.cc:3363
! #, gcc-internal-format
  msgid "%qT is not a structural type"
! msgstr "%qT är inte en strukturell typ"
  
  #: cp/constraint.cc:3367
  #, gcc-internal-format
*************** msgstr "båda grenarna av en %<if%>-sats
*** 58261,58267 ****
  #: cp/cp-gimplify.cc:577
  #, gcc-internal-format
  msgid "%qD was promoted to an immediate function because its body contains an immediate-escalating expression %qE"
! msgstr "%qD befordrades till en omedelbar funktion eftersom dess kropp innehåller ett uttryck %qE som omedelbareskalerar"
  
  #: cp/cp-gimplify.cc:580
  #, gcc-internal-format
--- 58244,58250 ----
  #: cp/cp-gimplify.cc:577
  #, gcc-internal-format
  msgid "%qD was promoted to an immediate function because its body contains an immediate-escalating expression %qE"
! msgstr "%qD befordrades till en omedelbar funktion eftersom dess kropp innehåller ett uttryck %qE som omedelbart eskalerar"
  
  #: cp/cp-gimplify.cc:580
  #, gcc-internal-format
*************** msgid "%qs used outside of constant expr
*** 58274,58283 ****
  msgstr "%qs använd utanför konstanta uttryck"
  
  #: cp/cp-gimplify.cc:999
! #, fuzzy, gcc-internal-format
! #| msgid "expected declaration"
  msgid "unexpected %<std::%s%> declaration"
! msgstr "en deklaration förväntades"
  
  #: cp/cp-gimplify.cc:1317
  #, gcc-internal-format
--- 58257,58265 ----
  msgstr "%qs använd utanför konstanta uttryck"
  
  #: cp/cp-gimplify.cc:999
! #, gcc-internal-format
  msgid "unexpected %<std::%s%> declaration"
! msgstr "en oväntad deklaration av %<std::%s%>"
  
  #: cp/cp-gimplify.cc:1317
  #, gcc-internal-format
*************** msgstr "variabeln %qE med ofullständig
*** 58592,58628 ****
  #: cp/cvt.cc:1571
  #, gcc-internal-format
  msgid "conversion to void cannot resolve address of overloaded function"
! msgstr "konvertering till void kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1575
  #, gcc-internal-format
  msgid "second operand of conditional expression cannot resolve address of overloaded function"
! msgstr "andra operanden i villkorsuttryck kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1579
  #, gcc-internal-format
  msgid "third operand of conditional expression cannot resolve address of overloaded function"
! msgstr "tredje operanden i villkorsuttryck kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1583
  #, gcc-internal-format
  msgid "right operand of comma operator cannot resolve address of overloaded function"
! msgstr "högra operanden av kommaoperator kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1587
  #, gcc-internal-format
  msgid "left operand of comma operator cannot resolve address of overloaded function"
! msgstr "vänstra operanden av kommaoperator kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1591
  #, gcc-internal-format
  msgid "statement cannot resolve address of overloaded function"
! msgstr "en sats kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1595
  #, gcc-internal-format
  msgid "for increment expression cannot resolve address of overloaded function"
! msgstr "for-ökningsuttryck kan inte lösa upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1611
  #, gcc-internal-format
--- 58574,58610 ----
  #: cp/cvt.cc:1571
  #, gcc-internal-format
  msgid "conversion to void cannot resolve address of overloaded function"
! msgstr "konvertering till void kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1575
  #, gcc-internal-format
  msgid "second operand of conditional expression cannot resolve address of overloaded function"
! msgstr "andra operanden i villkorsuttryck kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1579
  #, gcc-internal-format
  msgid "third operand of conditional expression cannot resolve address of overloaded function"
! msgstr "tredje operanden i villkorsuttryck kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1583
  #, gcc-internal-format
  msgid "right operand of comma operator cannot resolve address of overloaded function"
! msgstr "högra operanden av kommaoperator kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1587
  #, gcc-internal-format
  msgid "left operand of comma operator cannot resolve address of overloaded function"
! msgstr "vänstra operanden av kommaoperator kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1591
  #, gcc-internal-format
  msgid "statement cannot resolve address of overloaded function"
! msgstr "en sats kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1595
  #, gcc-internal-format
  msgid "for increment expression cannot resolve address of overloaded function"
! msgstr "for-ökningsuttryck kan inte slå upp adress till överlagrad funktion"
  
  #: cp/cvt.cc:1611
  #, gcc-internal-format
*************** msgstr "motstridig deklaration av mallen
*** 58882,58888 ****
  #: cp/decl.cc:2246
  #, gcc-internal-format
  msgid "conflicting declaration of C function %q#D"
! msgstr "motstridande deklaration av C-funktionen %q#D"
  
  #: cp/decl.cc:2270
  #, gcc-internal-format
--- 58864,58870 ----
  #: cp/decl.cc:2246
  #, gcc-internal-format
  msgid "conflicting declaration of C function %q#D"
! msgstr "motstridig deklaration av C-funktionen %q#D"
  
  #: cp/decl.cc:2270
  #, gcc-internal-format
*************** msgstr "ny deklaration av %q#D som skapa
*** 58892,58898 ****
  #: cp/decl.cc:2281
  #, gcc-internal-format
  msgid "conflicting declaration %q#D"
! msgstr "motstridande deklaration av %q#D"
  
  #: cp/decl.cc:2283
  #, gcc-internal-format
--- 58874,58880 ----
  #: cp/decl.cc:2281
  #, gcc-internal-format
  msgid "conflicting declaration %q#D"
! msgstr "motstridig deklaration av %q#D"
  
  #: cp/decl.cc:2283
  #, gcc-internal-format
*************** msgstr "tidigare specifikation i %q#D h�
*** 58993,58999 ****
  #: cp/decl.cc:2570 cp/decl.cc:18534
  #, gcc-internal-format
  msgid "conflicting exporting for declaration %qD"
! msgstr "motstridande exporterande för deklaration av %qD"
  
  #: cp/decl.cc:2572 cp/decl.cc:18536
  #, gcc-internal-format
--- 58975,58981 ----
  #: cp/decl.cc:2570 cp/decl.cc:18534
  #, gcc-internal-format
  msgid "conflicting exporting for declaration %qD"
! msgstr "motstridigt exporterande för deklaration av %qD"
  
  #: cp/decl.cc:2572 cp/decl.cc:18536
  #, gcc-internal-format
*************** msgstr "den icke-lokala variabeln %qD de
*** 59960,59966 ****
  #: cp/decl.cc:11698
  #, gcc-internal-format
  msgid "C++11 %<thread_local%> allows dynamic initialization and destruction"
! msgstr "C++11 %<thread_local%> tillåter dynamisk initialisering och destruktion"
  
  #: cp/decl.cc:11917
  #, gcc-internal-format
--- 59942,59948 ----
  #: cp/decl.cc:11698
  #, gcc-internal-format
  msgid "C++11 %<thread_local%> allows dynamic initialization and destruction"
! msgstr "C++11 %<thread_local%> tillåter dynamisk initiering och destruktion"
  
  #: cp/decl.cc:11917
  #, gcc-internal-format
*************** msgstr "det går inte att deklarera %<::
*** 60261,60267 ****
  #: cp/decl.cc:12952
  #, gcc-internal-format
  msgid "an entity named %<main%> cannot be declared with C language linkage"
! msgstr "en post med namnet %<main%> kan inte deklareras med länkklassen C-språket"
  
  #: cp/decl.cc:12961
  #, gcc-internal-format
--- 60243,60249 ----
  #: cp/decl.cc:12952
  #, gcc-internal-format
  msgid "an entity named %<main%> cannot be declared with C language linkage"
! msgstr "en post med namnet %<main%> kan inte deklareras med C-länkning"
  
  #: cp/decl.cc:12961
  #, gcc-internal-format
*************** msgstr "typen på en pekare till en expl
*** 60801,60807 ****
  #: cp/decl.cc:15200
  #, gcc-internal-format
  msgid "the type of an explicit object member function is a regular function type"
! msgstr "type på en explicit objektmedlemsfunktion är en normal funktionstyp"
  
  #: cp/decl.cc:15221
  #, gcc-internal-format
--- 60783,60789 ----
  #: cp/decl.cc:15200
  #, gcc-internal-format
  msgid "the type of an explicit object member function is a regular function type"
! msgstr "typen på en explicit objektmedlemsfunktion är en normal funktionstyp"
  
  #: cp/decl.cc:15221
  #, gcc-internal-format
*************** msgid "unnamed field is neither function
*** 61330,61345 ****
  msgstr "ett namnlöst fält är varken en funktion eller medlemsfunktion, kan inte deklareras som vän"
  
  #: cp/decl.cc:16674
! #, fuzzy, gcc-internal-format
! #| msgid "%qE attribute applied to extern \"C\" declaration %qD"
  msgid "annotation applied to non-defining friend declaration %qD"
! msgstr "attributet %qE tillämpat på extern \"C\"-deklaration %qD"
  
  #: cp/decl.cc:16682
! #, fuzzy, gcc-internal-format
! #| msgid "defining explicit specialization %qD in friend declaration"
  msgid "annotation applied to parameter %qD of non-defining friend declaration"
! msgstr "definierar explicit specialisering %qD i vändeklaration"
  
  #: cp/decl.cc:16694 cp/parser.cc:23742 cp/parser.cc:31131
  #, gcc-internal-format
--- 61312,61325 ----
  msgstr "ett namnlöst fält är varken en funktion eller medlemsfunktion, kan inte deklareras som vän"
  
  #: cp/decl.cc:16674
! #, gcc-internal-format
  msgid "annotation applied to non-defining friend declaration %qD"
! msgstr "annoteringen tillämpad på en icke definierande vändeklaration %qD"
  
  #: cp/decl.cc:16682
! #, gcc-internal-format
  msgid "annotation applied to parameter %qD of non-defining friend declaration"
! msgstr "annoteringen tillämpad på parametern %qD i en icke definerande vändeklaration"
  
  #: cp/decl.cc:16694 cp/parser.cc:23742 cp/parser.cc:31131
  #, gcc-internal-format
*************** msgid "using %qs"
*** 61862,61871 ****
  msgstr "använder %qs"
  
  #: cp/decl.cc:21329
! #, fuzzy, gcc-internal-format
! #| msgid "%qs used with %<auto%>"
  msgid "%qs used without %qs declaration"
! msgstr "%qs använt med %<auto%>"
  
  #: cp/decl.cc:21341
  #, gcc-internal-format
--- 61842,61850 ----
  msgstr "använder %qs"
  
  #: cp/decl.cc:21329
! #, gcc-internal-format
  msgid "%qs used without %qs declaration"
! msgstr "%qs använt utan en %qs-deklaration"
  
  #: cp/decl.cc:21341
  #, gcc-internal-format
*************** msgstr "okänd vektorstorlek i delete"
*** 63166,63172 ****
  #: cp/init.cc:5478
  #, gcc-internal-format
  msgid "operator %<delete%> used on incomplete type"
! msgstr "operatorn %<delete%> anvånd på en ofullständig typ"
  
  #: cp/init.cc:5493
  #, gcc-internal-format
--- 63145,63151 ----
  #: cp/init.cc:5478
  #, gcc-internal-format
  msgid "operator %<delete%> used on incomplete type"
! msgstr "operatorn %<delete%> använd på en ofullständig typ"
  
  #: cp/init.cc:5493
  #, gcc-internal-format
*************** msgstr "%<this%> fångades inte för den
*** 63254,63260 ****
  #: cp/lambda.cc:1641
  #, gcc-internal-format
  msgid "the mangled name of %qT changed in %<-fabi-version=20%> (GCC 15.1)"
! msgstr "det manglade namnet för %qT ändrad i %<-fabi-version=20%> (GCC 15.1)"
  
  #: cp/lambda.cc:1645
  #, gcc-internal-format
--- 63233,63239 ----
  #: cp/lambda.cc:1641
  #, gcc-internal-format
  msgid "the mangled name of %qT changed in %<-fabi-version=20%> (GCC 15.1)"
! msgstr "det manglade namnet för %qT ändrades i %<-fabi-version=20%> (GCC 15.1)"
  
  #: cp/lambda.cc:1645
  #, gcc-internal-format
*************** msgstr "%qT är en kvalificerad funktion
*** 63554,63560 ****
  #: cp/method.cc:2455
  #, gcc-internal-format
  msgid "cannot construct an array of unknown bound"
! msgstr "kan inte konstruera en med okända begränsning"
  
  #: cp/method.cc:2478
  #, gcc-internal-format
--- 63533,63539 ----
  #: cp/method.cc:2455
  #, gcc-internal-format
  msgid "cannot construct an array of unknown bound"
! msgstr "kan inte konstruera en vektor med okänd begränsning"
  
  #: cp/method.cc:2478
  #, gcc-internal-format
*************** msgstr "förväntad signatur: %qD"
*** 63649,63655 ****
  #: cp/method.cc:3747
  #, gcc-internal-format
  msgid "explicitly defaulted copy constructor is implicitly deleted because its declared type does not match the type of an implicit copy constructor"
! msgstr "explicit standarddefinierad kopieringskonstruerare raderas implicit för att dess deklarerade typ inte stämmer inte med typen på en implicita kopieringskonstruerare"
  
  #: cp/method.cc:3752
  #, gcc-internal-format
--- 63628,63634 ----
  #: cp/method.cc:3747
  #, gcc-internal-format
  msgid "explicitly defaulted copy constructor is implicitly deleted because its declared type does not match the type of an implicit copy constructor"
! msgstr "explicit standarddefinierad kopieringskonstruerare raderas implicit för att dess deklarerade typ inte stämmer med typen på en implicita kopieringskonstruerare"
  
  #: cp/method.cc:3752
  #, gcc-internal-format
*************** msgstr "en befintlig deklaration här ut
*** 63751,63792 ****
  #: cp/module.cc:12573
  #, gcc-internal-format
  msgid "conflicting language linkage for imported declaration %#qD"
! msgstr "motstridande språklänkning för den importerade deklarationen %q#D"
  
  #: cp/module.cc:12587 cp/module.cc:12721
  #, gcc-internal-format
  msgid "conflicting type for imported declaration %#qD"
! msgstr "motstridande typ för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12601
  #, gcc-internal-format
  msgid "conflicting argument list for imported declaration %#qD"
! msgstr "motstridande argumentlista för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12608
  #, gcc-internal-format
  msgid "conflicting argument types for imported declaration %#qD"
! msgstr "motstridande argumenttyper för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12648
  #, gcc-internal-format
  msgid "conflicting %<noexcept%> specifier for imported declaration %#qD"
! msgstr "motstridande specificerare %<noexcept%> för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12671
  #, gcc-internal-format
  msgid "conflicting deduced return type for imported declaration %#qD"
! msgstr "motstridande härledd returtyp för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12696
  #, gcc-internal-format
  msgid "conflicting %<constexpr%> for imported declaration %#qD"
! msgstr "motstridande %<constexpr%> för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12712
  #, gcc-internal-format
  msgid "conflicting imported declaration %q#D"
! msgstr "motstridande impotrerad deklaration %q#D"
  
  #: cp/module.cc:12738
  #, gcc-internal-format
--- 63730,63771 ----
  #: cp/module.cc:12573
  #, gcc-internal-format
  msgid "conflicting language linkage for imported declaration %#qD"
! msgstr "motstridig språklänkning för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12587 cp/module.cc:12721
  #, gcc-internal-format
  msgid "conflicting type for imported declaration %#qD"
! msgstr "motstridig typ för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12601
  #, gcc-internal-format
  msgid "conflicting argument list for imported declaration %#qD"
! msgstr "motstridig argumentlista för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12608
  #, gcc-internal-format
  msgid "conflicting argument types for imported declaration %#qD"
! msgstr "motstridiga argumenttyper för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12648
  #, gcc-internal-format
  msgid "conflicting %<noexcept%> specifier for imported declaration %#qD"
! msgstr "motstridig specificerare %<noexcept%> för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12671
  #, gcc-internal-format
  msgid "conflicting deduced return type for imported declaration %#qD"
! msgstr "motstridig härledd returtyp för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12696
  #, gcc-internal-format
  msgid "conflicting %<constexpr%> for imported declaration %#qD"
! msgstr "motstridigt %<constexpr%> för den importerade deklarationen %#qD"
  
  #: cp/module.cc:12712
  #, gcc-internal-format
  msgid "conflicting imported declaration %q#D"
! msgstr "motstridig importerad deklaration %q#D"
  
  #: cp/module.cc:12738
  #, gcc-internal-format
*************** msgstr "befintligt standardvärde är de
*** 63806,63812 ****
  #: cp/module.cc:12867
  #, gcc-internal-format
  msgid "conflicting default argument for parameter %P of %#qD"
! msgstr "standardargument står i konflikt för parameter %P till %q#D"
  
  #: cp/module.cc:13999
  #, gcc-internal-format
--- 63785,63791 ----
  #: cp/module.cc:12867
  #, gcc-internal-format
  msgid "conflicting default argument for parameter %P of %#qD"
! msgstr "standardargument står i konflikt för parameter %P till %#qD"
  
  #: cp/module.cc:13999
  #, gcc-internal-format
*************** msgstr "%qT har inget namn och kan inte
*** 63876,63882 ****
  #: cp/module.cc:14366
  #, gcc-internal-format
  msgid "%qT has no name and is not defined within a class, function, or initializer"
! msgstr "%qT har inget namn och är inte definierad inute in klass, funktion eller initierare"
  
  #: cp/module.cc:14402
  #, gcc-internal-format
--- 63855,63861 ----
  #: cp/module.cc:14366
  #, gcc-internal-format
  msgid "%qT has no name and is not defined within a class, function, or initializer"
! msgstr "%qT har inget namn och är inte definierad inuti en klass, funktion eller initierare"
  
  #: cp/module.cc:14402
  #, gcc-internal-format
*************** msgstr "%qD har ett TU-lokalt mallargume
*** 63886,63892 ****
  #: cp/module.cc:14414
  #, gcc-internal-format
  msgid "%qD has TU-local template argument %qT"
! msgstr "%qD har ett lokalt mallargument %qT"
  
  #: cp/module.cc:14466
  #, gcc-internal-format
--- 63865,63871 ----
  #: cp/module.cc:14414
  #, gcc-internal-format
  msgid "%qD has TU-local template argument %qT"
! msgstr "%qD har ett TU-lokalt mallargument %qT"
  
  #: cp/module.cc:14466
  #, gcc-internal-format
*************** msgstr "%qD är också TU-lokal men har
*** 63916,63927 ****
  #: cp/module.cc:15949
  #, gcc-internal-format
  msgid "%qD refers to TU-local entity %qD, which may cause issues when instantiating in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD, vilket kan skapa problem vid instantiering i andra TU:n"
  
  #: cp/module.cc:15959
  #, gcc-internal-format
  msgid "%qD refers to TU-local entity %qD and cannot be instantiated in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD och kan inte instantieras i andra TU:n"
  
  #: cp/module.cc:16022
  #, gcc-internal-format
--- 63895,63906 ----
  #: cp/module.cc:15949
  #, gcc-internal-format
  msgid "%qD refers to TU-local entity %qD, which may cause issues when instantiating in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD, vilket kan skapa problem vid instansiering i andra TU:n"
  
  #: cp/module.cc:15959
  #, gcc-internal-format
  msgid "%qD refers to TU-local entity %qD and cannot be instantiated in other TUs"
! msgstr "%qD refererar till en TU-lokal enhet %qD och kan inte instansieras i andra TU:n"
  
  #: cp/module.cc:16022
  #, gcc-internal-format
*************** msgstr "%q#D döljer konstruerare för %
*** 64333,64339 ****
  #: cp/name-lookup.cc:3310
  #, gcc-internal-format
  msgid "conflicting C language linkage declaration %q#D"
! msgstr "motstridande deklaration av C-länkning av %q#D"
  
  #: cp/name-lookup.cc:3315
  #, gcc-internal-format
--- 64312,64318 ----
  #: cp/name-lookup.cc:3310
  #, gcc-internal-format
  msgid "conflicting C language linkage declaration %q#D"
! msgstr "motstridig deklaration av C-länkning av %q#D"
  
  #: cp/name-lookup.cc:3315
  #, gcc-internal-format
*************** msgid "declaration of %qD shadows a memb
*** 64356,64371 ****
  msgstr "deklarationen av %qD skuggar en medlem av %qT"
  
  #: cp/name-lookup.cc:3698
! #, fuzzy, gcc-internal-format
! #| msgid "annotation applied to a label"
  msgid "annotation applied to block scope extern %qD"
! msgstr "annotation tillämpad på en etikett"
  
  #: cp/name-lookup.cc:3705
! #, fuzzy, gcc-internal-format
! #| msgid "declaration for parameter %qD but no such parameter"
  msgid "annotation applied to parameter %qD of block scope extern"
! msgstr "deklaration av parameter %qD med det finns ingen sådan parameter"
  
  #: cp/name-lookup.cc:4170
  #, gcc-internal-format
--- 64335,64348 ----
  msgstr "deklarationen av %qD skuggar en medlem av %qT"
  
  #: cp/name-lookup.cc:3698
! #, gcc-internal-format
  msgid "annotation applied to block scope extern %qD"
! msgstr "annoteringen tillämpad på extern %qD med blockräckvidd"
  
  #: cp/name-lookup.cc:3705
! #, gcc-internal-format
  msgid "annotation applied to parameter %qD of block scope extern"
! msgstr "annoteringen tillämpad på parametern %qD till en extern med blockräckvidd"
  
  #: cp/name-lookup.cc:4170
  #, gcc-internal-format
*************** msgstr "%<constexpr%> lambda är endast
*** 65596,65608 ****
  #: cp/parser.cc:13752
  #, gcc-internal-format
  msgid "%qE is not implicitly captured by a contract assertion"
! msgstr ""
  
  #: cp/parser.cc:13754
! #, fuzzy, gcc-internal-format
! #| msgid "%qE declared here"
  msgid "%q#E declared here"
! msgstr "%qE är deklarerad här"
  
  #: cp/parser.cc:14379
  #, gcc-internal-format
--- 65573,65584 ----
  #: cp/parser.cc:13752
  #, gcc-internal-format
  msgid "%qE is not implicitly captured by a contract assertion"
! msgstr "%qE fångas inte implicit av en kontraktsförsäkran"
  
  #: cp/parser.cc:13754
! #, gcc-internal-format
  msgid "%q#E declared here"
! msgstr "%q#E är deklarerad här"
  
  #: cp/parser.cc:14379
  #, gcc-internal-format
*************** msgstr "import-deklaration måste vara p
*** 65837,65843 ****
  #: cp/parser.cc:17271
  #, gcc-internal-format
  msgid "import specifying a module-partition must appear after a named module-declaration"
! msgstr "att importspecificera en mudulpartition måste förekomma efter en namngiven moduldeklaration"
  
  #: cp/parser.cc:17292
  #, gcc-internal-format
--- 65813,65819 ----
  #: cp/parser.cc:17271
  #, gcc-internal-format
  msgid "import specifying a module-partition must appear after a named module-declaration"
! msgstr "att importspecificera en modulpartition måste förekomma efter en namngiven moduldeklaration"
  
  #: cp/parser.cc:17292
  #, gcc-internal-format
*************** msgstr "for-range-deklaration får inte
*** 66008,66014 ****
  #: cp/parser.cc:18660
  #, gcc-internal-format
  msgid "%<this%> must be the first specifier in a parameter declaration"
! msgstr "%<this%> måste anges vara den första specificeraren i en parameterdeklaration"
  
  #: cp/parser.cc:18683
  #, gcc-internal-format
--- 65984,65990 ----
  #: cp/parser.cc:18660
  #, gcc-internal-format
  msgid "%<this%> must be the first specifier in a parameter declaration"
! msgstr "%<this%> måste vara den första specificeraren i en parameterdeklaration"
  
  #: cp/parser.cc:18683
  #, gcc-internal-format
*************** msgstr "typer får inte definieras i ali
*** 66599,66605 ****
  #: cp/parser.cc:25070
  #, gcc-internal-format
  msgid "expected string-literal or constexpr in parentheses"
! msgstr "en strängliteral constexpr i parenteser förväntades"
  
  #: cp/parser.cc:25131
  #, gcc-internal-format
--- 66575,66581 ----
  #: cp/parser.cc:25070
  #, gcc-internal-format
  msgid "expected string-literal or constexpr in parentheses"
! msgstr "en stränglitteral constexpr i parenteser förväntades"
  
  #: cp/parser.cc:25131
  #, gcc-internal-format
*************** msgstr "funktionsmall %qD omdeklarerad s
*** 67046,67052 ****
  #: cp/parser.cc:30589
  #, gcc-internal-format
  msgid "could not resolve typename type"
! msgstr "det gick inte att lösa upp typnamnstyp"
  
  #: cp/parser.cc:30654
  #, gcc-internal-format
--- 67022,67028 ----
  #: cp/parser.cc:30589
  #, gcc-internal-format
  msgid "could not resolve typename type"
! msgstr "det gick inte att slå upp typnamnstyp"
  
  #: cp/parser.cc:30654
  #, gcc-internal-format
*************** msgstr "i C++03 måste en klassnyckel an
*** 67084,67090 ****
  #: cp/parser.cc:31100
  #, gcc-internal-format
  msgid "variadic friends or friend type declarations with multiple types only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "deklarationer av variadiska vänner väntyp med flera typer är endast tillgängligt med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:31141
  #, gcc-internal-format
--- 67060,67066 ----
  #: cp/parser.cc:31100
  #, gcc-internal-format
  msgid "variadic friends or friend type declarations with multiple types only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "variadiska vänner eller deklarationer av väntyper med flera typer är endast tillgängligt med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:31141
  #, gcc-internal-format
*************** msgstr "attributet %qs angivet flera gå
*** 67235,67241 ****
  #: cp/parser.cc:33463 cp/parser.cc:33555
  #, gcc-internal-format
  msgid "mixing annotations and attributes in the same list"
! msgstr "blandning av annotationer och attribut i samma lista"
  
  #: cp/parser.cc:33492
  #, gcc-internal-format
--- 67211,67217 ----
  #: cp/parser.cc:33463 cp/parser.cc:33555
  #, gcc-internal-format
  msgid "mixing annotations and attributes in the same list"
! msgstr "blandning av annoteringar och attribut i samma lista"
  
  #: cp/parser.cc:33492
  #, gcc-internal-format
*************** msgstr "kontrakt är endast tillgänglig
*** 67275,67281 ****
  #: cp/parser.cc:34015
  #, gcc-internal-format
  msgid "annotations only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "annotationer är endast tillgängligaa med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:34046
  #, gcc-internal-format
--- 67251,67257 ----
  #: cp/parser.cc:34015
  #, gcc-internal-format
  msgid "annotations only available with %<-std=c++2c%> or %<-std=gnu++2c%>"
! msgstr "annoteringar är endast tillgängliga med %<-std=c++2c%> eller %<-std=gnu++2c%>"
  
  #: cp/parser.cc:34046
  #, gcc-internal-format
*************** msgstr "%<const%>-, %<volatile%>- eller
*** 67854,67860 ****
  #: cp/parser.cc:55579
  #, gcc-internal-format
  msgid "types may not be defined within %<declare mapper%>"
! msgstr "typer får inte definieras i inom %<declare mapper%>"
  
  #: cp/parser.cc:55751
  #, gcc-internal-format
--- 67830,67836 ----
  #: cp/parser.cc:55579
  #, gcc-internal-format
  msgid "types may not be defined within %<declare mapper%>"
! msgstr "typer får inte definieras inom %<declare mapper%>"
  
  #: cp/parser.cc:55751
  #, gcc-internal-format
*************** msgid "redeclaration of %qD with differe
*** 68400,68409 ****
  msgstr "omdeklaration av %qD med andra begränsningar"
  
  #: cp/pt.cc:6386
! #, fuzzy, gcc-internal-format
! #| msgid "storage class specified for template parameter %qs"
  msgid "local class in lambda in template parameter list"
! msgstr "lagringsklass angiven för mallparameter %qs"
  
  #: cp/pt.cc:6461
  #, gcc-internal-format
--- 68376,68384 ----
  msgstr "omdeklaration av %qD med andra begränsningar"
  
  #: cp/pt.cc:6386
! #, gcc-internal-format
  msgid "local class in lambda in template parameter list"
! msgstr "lokal klass i lambda i mallparameterlista"
  
  #: cp/pt.cc:6461
  #, gcc-internal-format
*************** msgstr "instansiering av felaktig mall"
*** 68851,68857 ****
  #: cp/pt.cc:12742
  #, gcc-internal-format
  msgid "first error appeared here"
! msgstr "först felet uppstod här"
  
  #: cp/pt.cc:13110
  #, gcc-internal-format
--- 68826,68832 ----
  #: cp/pt.cc:12742
  #, gcc-internal-format
  msgid "first error appeared here"
! msgstr "första felet uppstod här"
  
  #: cp/pt.cc:13110
  #, gcc-internal-format
*************** msgstr "skapar vektor av %qT"
*** 68994,69000 ****
  #: cp/pt.cc:17703
  #, gcc-internal-format
  msgid "%qD expanded to more than one element"
! msgstr "%qD expanderde till mer än ett element"
  
  #: cp/pt.cc:17710
  #, gcc-internal-format
--- 68969,68975 ----
  #: cp/pt.cc:17703
  #, gcc-internal-format
  msgid "%qD expanded to more than one element"
! msgstr "%qD expanderade till mer än ett element"
  
  #: cp/pt.cc:17710
  #, gcc-internal-format
*************** msgstr "%qT slås upp till %qT som inte
*** 69014,69020 ****
  #: cp/pt.cc:17807
  #, gcc-internal-format
  msgid "%qT resolves to %qT, which is not a non-union class type"
! msgstr "%qT löses upp till %qT, som inte är en icke-unions-klasstyp"
  
  #: cp/pt.cc:17815
  #, gcc-internal-format
--- 68989,68995 ----
  #: cp/pt.cc:17807
  #, gcc-internal-format
  msgid "%qT resolves to %qT, which is not a non-union class type"
! msgstr "%qT slås upp till %qT, som inte är en icke-unions-klasstyp"
  
  #: cp/pt.cc:17815
  #, gcc-internal-format
*************** msgid "cannot take the reflection of an
*** 69441,69450 ****
  msgstr "kan inte ta reflektionen av en överlagringsuppsättning"
  
  #: cp/reflect.cc:363 cp/reflect.cc:7729
! #, fuzzy, gcc-internal-format
! #| msgid "passing %qT to argument %d of %qE, which expects %qT"
  msgid "incorrect %qT type of argument %d, expected %qT"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig %qT"
  
  #: cp/reflect.cc:476
  #, gcc-internal-format
--- 69416,69424 ----
  msgstr "kan inte ta reflektionen av en överlagringsuppsättning"
  
  #: cp/reflect.cc:363 cp/reflect.cc:7729
! #, gcc-internal-format
  msgid "incorrect %qT type of argument %d, expected %qT"
! msgstr "felaktig typ %qT på argument %d, %qT förväntades"
  
  #: cp/reflect.cc:476
  #, gcc-internal-format
*************** msgid "%<reflect_constant_array%> argume
*** 69467,69476 ****
  msgstr "%<reflect_constant_array%> argument med %qT som inte är kopieringskonstruerbar"
  
  #: cp/reflect.cc:595
! #, fuzzy, gcc-internal-format
! #| msgid "%<reflect_constant_array%> argument with %qT which is not constructible from %qT %<std::ranges::range_reference_t%>"
  msgid "%<reflect_constant_array%> argument with %qT which is not compatible with %qT %<std::ranges::range_reference_t%>"
! msgstr "%<reflect_constant_array%> argument med %qT som inte kan konstrueras från %qT %<std::ranges::range_reference_t%>"
  
  #: cp/reflect.cc:606
  #, gcc-internal-format
--- 69441,69449 ----
  msgstr "%<reflect_constant_array%> argument med %qT som inte är kopieringskonstruerbar"
  
  #: cp/reflect.cc:595
! #, gcc-internal-format
  msgid "%<reflect_constant_array%> argument with %qT which is not compatible with %qT %<std::ranges::range_reference_t%>"
! msgstr "%<reflect_constant_array%> argument med %qT som inte är kompatibel med %qT %<std::ranges::range_reference_t%>"
  
  #: cp/reflect.cc:606
  #, gcc-internal-format
*************** msgid "%<define_aggregate%> evaluated fr
*** 69659,69668 ****
  msgstr "%<define_aggregate%> beräknas ifrån %<consteval%>-blocket som omges av %qT medan typen %qT som definieras omges av %qT"
  
  #: cp/reflect.cc:6472
! #, fuzzy, gcc-internal-format
! #| msgid "%<access_context::current%> used outside of manifestly constant-evaluation"
  msgid "%qs used outside of manifestly constant-evaluation"
! msgstr "%<access_context::current%> används utanför en uppenbar konstantberäkning"
  
  #: cp/reflect.cc:6585
  #, gcc-internal-format
--- 69632,69640 ----
  msgstr "%<define_aggregate%> beräknas ifrån %<consteval%>-blocket som omges av %qT medan typen %qT som definieras omges av %qT"
  
  #: cp/reflect.cc:6472
! #, gcc-internal-format
  msgid "%qs used outside of manifestly constant-evaluation"
! msgstr "%qs används utanför en uppenbar konstantberäkning"
  
  #: cp/reflect.cc:6585
  #, gcc-internal-format
*************** msgid "unexpected argument to %qs"
*** 69685,69706 ****
  msgstr "oväntat argument till %qs"
  
  #: cp/reflect.cc:7726
! #, fuzzy, gcc-internal-format
! #| msgid "passing %qT to argument %d of %qE, which expects %qs"
  msgid "incorrect %qT type of argument %d, expected %qs"
! msgstr "skickar %qT som argument %d till %qE, vilken förväntar sig %qs"
  
  #: cp/reflect.cc:7799
! #, fuzzy, gcc-internal-format
! #| msgid "vector type expected in %qs"
  msgid "incorrect %qT return type, expected %qs"
! msgstr "vektortyper förväntades i %qs"
  
  #: cp/reflect.cc:7802
! #, fuzzy, gcc-internal-format
! #| msgid "vector type expected in %qs"
  msgid "incorrect %qT return type, expected %qT"
! msgstr "vektortyper förväntades i %qs"
  
  #: cp/reflect.cc:7826
  #, gcc-internal-format
--- 69657,69675 ----
  msgstr "oväntat argument till %qs"
  
  #: cp/reflect.cc:7726
! #, gcc-internal-format
  msgid "incorrect %qT type of argument %d, expected %qs"
! msgstr "felaktig typ %qT på argument %d, %qs förväntades"
  
  #: cp/reflect.cc:7799
! #, gcc-internal-format
  msgid "incorrect %qT return type, expected %qs"
! msgstr "felaktig returtyp %qT, %qs förväntades"
  
  #: cp/reflect.cc:7802
! #, gcc-internal-format
  msgid "incorrect %qT return type, expected %qT"
! msgstr "felaktig returtyp %qT, %qT förväntades"
  
  #: cp/reflect.cc:7826
  #, gcc-internal-format
*************** msgid "splice argument must be an expres
*** 69713,69733 ****
  msgstr "splitsningsargument måste vara ett uttryck av typen %qs"
  
  #: cp/reflect.cc:8530
! #, fuzzy, gcc-internal-format
! #| msgid "cannot call a concept as a function"
  msgid "cannot splice a null reflection"
! msgstr "det går inte att anropa ett koncept som en funktion"
  
  #: cp/reflect.cc:8540
! #, fuzzy, gcc-internal-format
! #| msgid "cannot use a data member specification in a splice expression"
  msgid "cannot use %qD function parameter reflection in a splice expression"
! msgstr "kan inte använda en datamedlemsspecifikation i ett splitsningsuttryck"
  
  #: cp/reflect.cc:8544
  #, gcc-internal-format
  msgid "apply %<std::meta::variable_of%> on it before splicing"
! msgstr ""
  
  #: cp/reflect.cc:8803
  #, gcc-internal-format
--- 69682,69700 ----
  msgstr "splitsningsargument måste vara ett uttryck av typen %qs"
  
  #: cp/reflect.cc:8530
! #, gcc-internal-format
  msgid "cannot splice a null reflection"
! msgstr "kan inte splitsa en null-reflektion"
  
  #: cp/reflect.cc:8540
! #, gcc-internal-format
  msgid "cannot use %qD function parameter reflection in a splice expression"
! msgstr "kan inte använda funktionsparameterreflektionen %qD i ett splitsningsuttryck"
  
  #: cp/reflect.cc:8544
  #, gcc-internal-format
  msgid "apply %<std::meta::variable_of%> on it before splicing"
! msgstr "använd %<std::meta::variable_of%> på den före splitsning"
  
  #: cp/reflect.cc:8803
  #, gcc-internal-format
*************** msgid "cannot implicitly reference a cla
*** 69775,69805 ****
  msgstr "kan inte implicit referera till en klassmedlem %qD genom en splitsning"
  
  #: cp/reflect.cc:9034
! #, fuzzy, gcc-internal-format
! #| msgid "invalid cast to abstract class type %qT"
  msgid "invalid class member access of type template %qE"
! msgstr "ogiltig typkonvertering till en abstrakt klasstyp %qT"
  
  #: cp/reflect.cc:9042
! #, fuzzy, gcc-internal-format
! #| msgid "cannot use %qs as a call-used register"
  msgid "cannot use %qE to access a class member"
! msgstr "det går inte att använda %qs som ett anropsanvänt register"
  
  #: cp/reflect.cc:9056
  #, gcc-internal-format
  msgid "unary %<&%> applied to an anonymous union member %qD that is not a direct member of a named class"
! msgstr "unärt %<&%> tillämpt på en anonym unionmedlem %qD som inte är direkt medlem i en namngiven klass"
  
  #: cp/reflect.cc:9075
  #, gcc-internal-format
  msgid "use of local variable with automatic storage from containing function in a splice expression"
! msgstr "användning av lokal variabel med automatisk lagringsklass från en kringliggande funktion i ett splice-uttryck"
  
  #: cp/reflect.cc:9088
  #, gcc-internal-format
  msgid "cannot use an annotation %qE in a splice expression"
! msgstr "kan inte använda en annotatonen %qE i ett splitsningsuttryck"
  
  #: cp/reflect.cc:9097
  #, gcc-internal-format
--- 69742,69770 ----
  msgstr "kan inte implicit referera till en klassmedlem %qD genom en splitsning"
  
  #: cp/reflect.cc:9034
! #, gcc-internal-format
  msgid "invalid class member access of type template %qE"
! msgstr "ogiltig klassmedlemsåtkomst till en typmall %qE"
  
  #: cp/reflect.cc:9042
! #, gcc-internal-format
  msgid "cannot use %qE to access a class member"
! msgstr "kan inte använda %qE för att komma åt en klassmedlem"
  
  #: cp/reflect.cc:9056
  #, gcc-internal-format
  msgid "unary %<&%> applied to an anonymous union member %qD that is not a direct member of a named class"
! msgstr "unärt %<&%> tillämpat på en anonym unionmedlem %qD som inte är direkt medlem i en namngiven klass"
  
  #: cp/reflect.cc:9075
  #, gcc-internal-format
  msgid "use of local variable with automatic storage from containing function in a splice expression"
! msgstr "användning av lokal variabel med automatisk lagringsklass från en kringliggande funktion i ett splitsningsuttryck"
  
  #: cp/reflect.cc:9088
  #, gcc-internal-format
  msgid "cannot use an annotation %qE in a splice expression"
! msgstr "kan inte använda en annotering %qE i ett splitsningsuttryck"
  
  #: cp/reflect.cc:9097
  #, gcc-internal-format
*************** msgid "expected a reflection of a functi
*** 69812,69821 ****
  msgstr "en reflektion av en funktionsmall förväntades"
  
  #: cp/reflect.cc:9130
! #, fuzzy, gcc-internal-format
! #| msgid "expected a reflection of a function template"
  msgid "expected a reflection of a function or variable template"
! msgstr "en reflektion av en funktionsmall förväntades"
  
  #: cp/rtti.cc:308
  #, gcc-internal-format
--- 69777,69785 ----
  msgstr "en reflektion av en funktionsmall förväntades"
  
  #: cp/reflect.cc:9130
! #, gcc-internal-format
  msgid "expected a reflection of a function or variable template"
! msgstr "en reflektion av en funktions- eller variabelmall förväntades"
  
  #: cp/rtti.cc:308
  #, gcc-internal-format
*************** msgstr "använd en explicit objektparame
*** 70060,70066 ****
  #: cp/semantics.cc:3668
  #, gcc-internal-format
  msgid "name the explicit object parameter"
! msgstr "namnge den explicita objektdparametern"
  
  #: cp/semantics.cc:3673
  #, gcc-internal-format
--- 70024,70030 ----
  #: cp/semantics.cc:3668
  #, gcc-internal-format
  msgid "name the explicit object parameter"
! msgstr "namnge den explicita objektparametern"
  
  #: cp/semantics.cc:3673
  #, gcc-internal-format
*************** msgstr "%qD får inte finnas i ett konst
*** 70210,70216 ****
  #: cp/semantics.cc:5043 cp/semantics.cc:5074
  #, gcc-internal-format
  msgid "%qD 'this' required when accessing a member within a constructor precondition or destructor postcondition contract check"
! msgstr "%qD ”this” krävs vid åtkomst till en medlem inom en kontrakskontroll i en konstruerares förvillkor eller destruerares eftervillkor"
  
  #: cp/semantics.cc:5176
  #, gcc-internal-format
--- 70174,70180 ----
  #: cp/semantics.cc:5043 cp/semantics.cc:5074
  #, gcc-internal-format
  msgid "%qD 'this' required when accessing a member within a constructor precondition or destructor postcondition contract check"
! msgstr "%qD ”this” krävs vid åtkomst till en medlem inom en kontraktskontroll i en konstruerares förvillkor eller destruerares eftervillkor"
  
  #: cp/semantics.cc:5176
  #, gcc-internal-format
*************** msgstr "%qT får inte vara en virtuell b
*** 70316,70327 ****
  #: cp/semantics.cc:7760
  #, gcc-internal-format
  msgid "expected string literal or constant integer expression instead of %qE"
! msgstr "en strängliteral eller ett konstant heltalsuttryck förväntades istället för %qE"
  
  #: cp/semantics.cc:7957
  #, gcc-internal-format
  msgid "modifier other than %<val%> specified in %<linear%> clause on %<simd%> or %<for%> constructs when using OpenMP 5.2 modifiers"
! msgstr "en annan modifierare än %<val%> ingiven i en %<linear%>-klausul på %<simd%>- eller %<for%>-konstruktioner när OpenMP 5.2-modifierare används"
  
  #: cp/semantics.cc:7972
  #, gcc-internal-format
--- 70280,70291 ----
  #: cp/semantics.cc:7760
  #, gcc-internal-format
  msgid "expected string literal or constant integer expression instead of %qE"
! msgstr "en stränglitteral eller ett konstant heltalsuttryck förväntades istället för %qE"
  
  #: cp/semantics.cc:7957
  #, gcc-internal-format
  msgid "modifier other than %<val%> specified in %<linear%> clause on %<simd%> or %<for%> constructs when using OpenMP 5.2 modifiers"
! msgstr "en annan modifierare än %<val%> angiven i en %<linear%>-klausul på %<simd%>- eller %<for%>-konstruktioner när OpenMP 5.2-modifierare används"
  
  #: cp/semantics.cc:7972
  #, gcc-internal-format
*************** msgstr "klassmedlemmen %qE stödjs inte
*** 70487,70493 ****
  #: cp/semantics.cc:9021
  #, gcc-internal-format
  msgid "modifiers cannot be used with predefined allocators"
! msgstr "modifierare kan inte användas med fördefinierade allokatorer"
  
  #: cp/semantics.cc:9090
  #, gcc-internal-format
--- 70451,70457 ----
  #: cp/semantics.cc:9021
  #, gcc-internal-format
  msgid "modifiers cannot be used with predefined allocators"
! msgstr "modifierare kan inte användas med fördefinierade allokerare"
  
  #: cp/semantics.cc:9090
  #, gcc-internal-format
*************** msgstr "%<#pragma omp atomic update%> an
*** 70582,70588 ****
  #: cp/semantics.cc:12755
  #, gcc-internal-format
  msgid "constexpr string must be a string literal or object with %<size%> and %<data%> members"
! msgstr "constexpr-strängen måste vara en strängliteral eller ett objekt med medlemmarna %<size%> och %<data%>"
  
  #: cp/semantics.cc:12771
  #, gcc-internal-format
--- 70546,70552 ----
  #: cp/semantics.cc:12755
  #, gcc-internal-format
  msgid "constexpr string must be a string literal or object with %<size%> and %<data%> members"
! msgstr "constexpr-strängen måste vara en stränglitteral eller ett objekt med medlemmarna %<size%> och %<data%>"
  
  #: cp/semantics.cc:12771
  #, gcc-internal-format
*************** msgstr "constexpr-strängen %<data()[%d]
*** 70617,70623 ****
  #: cp/semantics.cc:12994
  #, gcc-internal-format
  msgid "constexpr string %<data()%> must be a core constant expression"
! msgstr "constexprsträngen %<data()%> måste vara ett kärnkonstant uttryck"
  
  #: cp/semantics.cc:13032
  #, gcc-internal-format
--- 70581,70587 ----
  #: cp/semantics.cc:12994
  #, gcc-internal-format
  msgid "constexpr string %<data()%> must be a core constant expression"
! msgstr "constexpr-strängen %<data()%> måste vara ett kärnkonstant uttryck"
  
  #: cp/semantics.cc:13032
  #, gcc-internal-format
*************** msgstr "argument till %<decltype%> måst
*** 70647,70653 ****
  #: cp/semantics.cc:13237
  #, gcc-internal-format
  msgid "%<decltype%> cannot resolve address of overloaded function"
! msgstr "%<decltype%> kan inte lösa upp adressen till en överlagrad funktion"
  
  #: cp/semantics.cc:13512 cp/semantics.cc:13519
  #, gcc-internal-format
--- 70611,70617 ----
  #: cp/semantics.cc:13237
  #, gcc-internal-format
  msgid "%<decltype%> cannot resolve address of overloaded function"
! msgstr "%<decltype%> kan inte slå upp adressen till en överlagrad funktion"
  
  #: cp/semantics.cc:13512 cp/semantics.cc:13519
  #, gcc-internal-format
*************** msgstr "annotering på en annan typ än
*** 71045,71051 ****
  #: cp/tree.cc:5922
  #, gcc-internal-format
  msgid "annotation applied to a label"
! msgstr "annotation tillämpad på en etikett"
  
  #: cp/tree.cc:5928
  #, gcc-internal-format
--- 71009,71015 ----
  #: cp/tree.cc:5922
  #, gcc-internal-format
  msgid "annotation applied to a label"
! msgstr "annotering tillämpad på en etikett"
  
  #: cp/tree.cc:5928
  #, gcc-internal-format
*************** msgstr "annotering på ett namnlöst bit
*** 71055,71061 ****
  #: cp/tree.cc:5934
  #, gcc-internal-format
  msgid "annotation on void parameter"
! msgstr "annotation på en void-parameter"
  
  #: cp/tree.cc:5950
  #, gcc-internal-format
--- 71019,71025 ----
  #: cp/tree.cc:5934
  #, gcc-internal-format
  msgid "annotation on void parameter"
! msgstr "annotering på en void-parameter"
  
  #: cp/tree.cc:5950
  #, gcc-internal-format
*************** msgstr "annoteringen har inte strukturty
*** 71065,71071 ****
  #: cp/tree.cc:5965
  #, gcc-internal-format
  msgid "annotation does not have copy constructible type"
! msgstr "annotationen har inte en kopieringskonstruerbar typ"
  
  #: cp/tree.cc:6938 rust/backend/rust-tree.cc:3189
  #, gcc-internal-format
--- 71029,71035 ----
  #: cp/tree.cc:5965
  #, gcc-internal-format
  msgid "annotation does not have copy constructible type"
! msgstr "annoteringenen har inte en kopieringskonstruerbar typ"
  
  #: cp/tree.cc:6938 rust/backend/rust-tree.cc:3189
  #, gcc-internal-format
*************** msgid "%<%D::%D%> is not a member of %qT
*** 71273,71282 ****
  msgstr "%<%D::%D%> är inte en medlem av %qT"
  
  #: cp/typeck.cc:3605
! #, fuzzy, gcc-internal-format
! #| msgid "%qD is not a member of %qT"
  msgid "%q#D is not a member of %qT"
! msgstr "%qD har inte en medlem av %qT"
  
  #: cp/typeck.cc:3781
  #, gcc-internal-format
--- 71237,71245 ----
  msgstr "%<%D::%D%> är inte en medlem av %qT"
  
  #: cp/typeck.cc:3605
! #, gcc-internal-format
  msgid "%q#D is not a member of %qT"
! msgstr "%q#D har inte en medlem av %qT"
  
  #: cp/typeck.cc:3781
  #, gcc-internal-format
*************** msgstr "uttryckslistan %s behandlas som
*** 71741,71747 ****
  #: cp/typeck.cc:8516
  #, gcc-internal-format
  msgid "no context to resolve type of %qE"
! msgstr "ingen kontext för att lösa upp typen på %qE"
  
  #: cp/typeck.cc:8553
  #, gcc-internal-format
--- 71704,71710 ----
  #: cp/typeck.cc:8516
  #, gcc-internal-format
  msgid "no context to resolve type of %qE"
! msgstr "ingen kontext för att slå upp typen på %qE"
  
  #: cp/typeck.cc:8553
  #, gcc-internal-format
*************** msgstr "målet för konvertering kan var
*** 71931,71937 ****
  #: cp/typeck.cc:10838
  #, gcc-internal-format
  msgid "target of initialization might be a candidate for a format attribute"
! msgstr "målet för initialisering kan vara en kandidat för ett formatattribut"
  
  #: cp/typeck.cc:10848
  #, gcc-internal-format
--- 71894,71900 ----
  #: cp/typeck.cc:10838
  #, gcc-internal-format
  msgid "target of initialization might be a candidate for a format attribute"
! msgstr "målet för initiering kan vara en kandidat för ett formatattribut"
  
  #: cp/typeck.cc:10848
  #, gcc-internal-format
*************** msgstr "pekare-till-medlemsfunktionstyp
*** 72413,72424 ****
  #: cp/typeck2.cc:2543
  #, gcc-internal-format
  msgid "pointer-to-member-function type %qT requires an lvalue"
! msgstr "pekare-till-medlemsfunktiontyp %qT kräver ett l-värde"
  
  #: cp/typeck2.cc:2551
  #, gcc-internal-format
  msgid "pointer-to-member-function type %qT requires an lvalue before C++20"
! msgstr "pekare-till-medlemsfunktiontyp %qT kräver ett l-värde före C++20"
  
  #: cp/typeck2.cc:2592
  #, gcc-internal-format
--- 72376,72387 ----
  #: cp/typeck2.cc:2543
  #, gcc-internal-format
  msgid "pointer-to-member-function type %qT requires an lvalue"
! msgstr "pekare-till-medlemsfunktionstyp %qT kräver ett l-värde"
  
  #: cp/typeck2.cc:2551
  #, gcc-internal-format
  msgid "pointer-to-member-function type %qT requires an lvalue before C++20"
! msgstr "pekare-till-medlemsfunktionstyp %qT kräver ett l-värde före C++20"
  
  #: cp/typeck2.cc:2592
  #, gcc-internal-format
*************** msgstr "det går inte att konvertera par
*** 72592,72598 ****
  #: d/d-convert.cc:753
  #, gcc-internal-format
  msgid "parameters of type %<va_list%> {aka %qs} are decayed to pointer types, and require %<va_copy%> to be converted back into a static array type"
! msgstr "parametrar av typen %<va_list%> {ävän kända som %qs} degenereras till pekartyper, och kräver %<va_copy%> för att konverteras tillbaka till en statisk vektortyp"
  
  #: d/d-lang.cc:464
  #, gcc-internal-format
--- 72555,72561 ----
  #: d/d-convert.cc:753
  #, gcc-internal-format
  msgid "parameters of type %<va_list%> {aka %qs} are decayed to pointer types, and require %<va_copy%> to be converted back into a static array type"
! msgstr "parametrar av typen %<va_list%> {även kända som %qs} degenereras till pekartyper, och kräver %<va_copy%> för att konverteras tillbaka till en statisk vektortyp"
  
  #: d/d-lang.cc:464
  #, gcc-internal-format
*************** msgstr "när utdatafil %s skrevs: %m"
*** 72627,72638 ****
  #: d/d-lang.cc:1024
  #, gcc-internal-format
  msgid "unable to open %s for reading: %m"
! msgstr "kan inte öppna %s för skrivning: %m"
  
  #: d/d-lang.cc:1049
  #, gcc-internal-format
  msgid "reading ddoc file %s: %m"
! msgstr "när ddoc-filen %s skrevs: %m"
  
  #: d/d-lang.cc:1108
  #, gcc-internal-format
--- 72590,72601 ----
  #: d/d-lang.cc:1024
  #, gcc-internal-format
  msgid "unable to open %s for reading: %m"
! msgstr "kan inte öppna %s för läsning: %m"
  
  #: d/d-lang.cc:1049
  #, gcc-internal-format
  msgid "reading ddoc file %s: %m"
! msgstr "när ddoc-filen %s lästes: %m"
  
  #: d/d-lang.cc:1108
  #, gcc-internal-format
*************** msgstr "En teckenlös konstant avhuggen
*** 72945,72951 ****
  #: fortran/arith.cc:138
  #, gcc-internal-format, gfc-internal-format
  msgid "Negation of unsigned constant at %L not permitted"
! msgstr "Negering av en teckenlös konstant vid %L är inte tillåtet"
  
  #: fortran/arith.cc:141 fortran/arith.cc:2297
  #, gcc-internal-format
--- 72908,72914 ----
  #: fortran/arith.cc:138
  #, gcc-internal-format, gfc-internal-format
  msgid "Negation of unsigned constant at %L not permitted"
! msgstr "Negation av en teckenlös konstant vid %L är inte tillåtet"
  
  #: fortran/arith.cc:141 fortran/arith.cc:2297
  #, gcc-internal-format
*************** msgstr "Uttrycket vid %L i detta sammanh
*** 73244,73250 ****
  #: fortran/array.cc:594
  #, gcc-internal-format, gfc-internal-format
  msgid "A lower bound must precede colon in assumed-size array specification at %L"
! msgstr "En undre gräns måste föregå kolonet i vektorspecifikation med antagen storlek saknas vid %L"
  
  #: fortran/array.cc:606
  #, gcc-internal-format, gfc-internal-format
--- 73207,73213 ----
  #: fortran/array.cc:594
  #, gcc-internal-format, gfc-internal-format
  msgid "A lower bound must precede colon in assumed-size array specification at %L"
! msgstr "En undre gräns måste föregå kolonet i vektorspecifikation med antagen storlek vid %L"
  
  #: fortran/array.cc:606
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Stödjs inte: argumentet %qs til
*** 73640,73646 ****
  #: fortran/check.cc:1135
  #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L must have a decimal exponent range of at least four"
! msgstr "Argumentet %qs till %qs vid %L måste ha ett decimalt exponentinterval på åtminstone fyra"
  
  #: fortran/check.cc:1154
  #, gcc-internal-format
--- 73603,73609 ----
  #: fortran/check.cc:1135
  #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L must have a decimal exponent range of at least four"
! msgstr "Argumentet %qs till inbyggd %qs vid %L måste ha ett decimalt exponentintervall på åtminstone fyra"
  
  #: fortran/check.cc:1154
  #, gcc-internal-format
*************** msgstr "Argument %qs till inbyggd %qs vi
*** 73760,73766 ****
  #: fortran/check.cc:1891
  #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L shall have a type of CHARACTER(KIND=C_CHAR)"
! msgstr "%qs-argumentet till inbyggd %qs vid %L skal ha typen CHARACTER(KIND=C_CHAR) "
  
  #: fortran/check.cc:1931
  #, gcc-internal-format
--- 73723,73729 ----
  #: fortran/check.cc:1891
  #, gcc-internal-format
  msgid "%qs argument of %qs intrinsic at %L shall have a type of CHARACTER(KIND=C_CHAR)"
! msgstr "%qs-argumentet till inbyggd %qs vid %L skall ha typen CHARACTER(KIND=C_CHAR) "
  
  #: fortran/check.cc:1931
  #, gcc-internal-format
*************** msgstr "ARRAY-argumentet vid %L till RED
*** 74213,74219 ****
  #: fortran/check.cc:5252
  #, gcc-internal-format, gfc-internal-format
  msgid "The DIM argument at %L, if present, must be an integer scalar"
! msgstr "Argumentet DIM vid %L måste, om det finns, måste vara en heltalsskalär"
  
  #: fortran/check.cc:5259
  #, gcc-internal-format, gfc-internal-format
--- 74176,74182 ----
  #: fortran/check.cc:5252
  #, gcc-internal-format, gfc-internal-format
  msgid "The DIM argument at %L, if present, must be an integer scalar"
! msgstr "Argumentet DIM vid %L måste, om det finns, vara en heltalsskalär"
  
  #: fortran/check.cc:5259
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Argumentet ORDERED vid %L måste
*** 74233,74239 ****
  #: fortran/check.cc:5283
  #, gcc-internal-format, gfc-internal-format
  msgid "The IDENTITY argument at %L, if present, must be a scalar with the same type as ARRAY"
! msgstr "Argumentet IDENTITY vid %L, om det finns, måste vara en skalär med samma ordning som ARRRAY"
  
  #: fortran/check.cc:5374
  #, gcc-internal-format
--- 74196,74202 ----
  #: fortran/check.cc:5283
  #, gcc-internal-format, gfc-internal-format
  msgid "The IDENTITY argument at %L, if present, must be a scalar with the same type as ARRAY"
! msgstr "Argumentet IDENTITY vid %L, om det finns, måste vara en skalär med samma ordning som ARRAY"
  
  #: fortran/check.cc:5374
  #, gcc-internal-format
*************** msgstr "Initiering av allokerbar kompone
*** 75299,75305 ****
  #: fortran/decl.cc:3253
  #, gcc-internal-format, gfc-internal-format
  msgid "Initialization of structure component with a HOLLERITH constant at %L is not allowed"
! msgstr "Initiering av en strukturkomponent med en HOLLERITH-konstant vid %L är inte tillåtet"
  
  #: fortran/decl.cc:3267
  #, gcc-internal-format, gfc-internal-format
--- 75262,75268 ----
  #: fortran/decl.cc:3253
  #, gcc-internal-format, gfc-internal-format
  msgid "Initialization of structure component with a HOLLERITH constant at %L is not allowed"
! msgstr "Initiering av en postkomponent med en HOLLERITH-konstant vid %L är inte tillåtet"
  
  #: fortran/decl.cc:3267
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "F2018: C898 IMPORT-satsen vid %C
*** 75572,75578 ****
  #: fortran/decl.cc:5752
  #, gcc-internal-format, gfc-internal-format
  msgid "F2018: C899 IMPORT, NONE shall not appear in the scoping unit of a submodule as at %C"
! msgstr "F2018: C899 IMPORT, NONE skall inte förekomma i räckvidsenheten för en undermodul som vid %C"
  
  #: fortran/decl.cc:5757
  #, gcc-internal-format, gfc-internal-format
--- 75535,75541 ----
  #: fortran/decl.cc:5752
  #, gcc-internal-format, gfc-internal-format
  msgid "F2018: C899 IMPORT, NONE shall not appear in the scoping unit of a submodule as at %C"
! msgstr "F2018: C899 IMPORT, NONE skall inte förekomma i räckviddsenheten för en undermodul som vid %C"
  
  #: fortran/decl.cc:5757
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Målet för översättning av or
*** 77379,77385 ****
  #: fortran/expr.cc:4713
  #, gcc-internal-format, gfc-internal-format
  msgid "The data-target at %L is an assumed rank object and so the data-pointer-object %s must have a bounds remapping list (list of lbound:ubound for each dimension)"
! msgstr "Datamålet vid %L är ett objekt med antagen ordning så datapekarobjektet %s måste en gränsomavbildningslista (lista med nedregräns:övregräns för varje dimension)"
  
  #: fortran/expr.cc:4722
  #, gcc-internal-format, gfc-internal-format
--- 77342,77348 ----
  #: fortran/expr.cc:4713
  #, gcc-internal-format, gfc-internal-format
  msgid "The data-target at %L is an assumed rank object and so the data-pointer-object %s must have a bounds remapping list (list of lbound:ubound for each dimension)"
! msgstr "Datamålet vid %L är ett objekt med antagen ordning så datapekarobjektet %s måste ha en gränsomavbildningslista (lista med nedregräns:övregräns för varje dimension)"
  
  #: fortran/expr.cc:4722
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Tilldelning till sammanhängande
*** 77449,77454 ****
--- 77412,77418 ----
  msgid "Pointer at %L in pointer assignment might outlive the pointer target"
  msgstr "Pekare vid %L i pekartilldelning kan överleva pekarmålet"
  
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125348
  #: fortran/expr.cc:4990
  #, gcc-internal-format
  msgid "The component %qs at %L of derived type %qs has paramterized type or array length parameters, which is not compatible with a default initializer"
*************** msgstr "Det stämmer inte mellan en subr
*** 77975,77981 ****
  #: fortran/interface.cc:2591
  #, gcc-internal-format
  msgid "Type mismatch at %L passing global function %qs declared at %L (%s/%s)"
! msgstr "Typen stämmer vid %L när den globala funktionen %qs skickas, som är deklarerad vid %L (%s/%s)"
  
  #: fortran/interface.cc:2644
  #, gcc-internal-format
--- 77939,77945 ----
  #: fortran/interface.cc:2591
  #, gcc-internal-format
  msgid "Type mismatch at %L passing global function %qs declared at %L (%s/%s)"
! msgstr "Typen stämmer inte vid %L när den globala funktionen %qs skickas, som är deklarerad vid %L (%s/%s)"
  
  #: fortran/interface.cc:2644
  #, gcc-internal-format
*************** msgstr "Oväntad alternativ returspecifi
*** 78120,78126 ****
  #: fortran/interface.cc:3499
  #, gcc-internal-format
  msgid "Intrinsic %<NULL()%> without %<MOLD%> argument at %L passed to assumed-rank dummy %qs"
! msgstr "Inbyggd %<NULL()%> utan argumentet %<MOLD%> vid %L skickad til attrappen %qs med antagen ordning"
  
  #: fortran/interface.cc:3512
  #, gcc-internal-format
--- 78084,78090 ----
  #: fortran/interface.cc:3499
  #, gcc-internal-format
  msgid "Intrinsic %<NULL()%> without %<MOLD%> argument at %L passed to assumed-rank dummy %qs"
! msgstr "Inbyggd %<NULL()%> utan argumentet %<MOLD%> vid %L skickad till attrappen %qs med antagen ordning"
  
  #: fortran/interface.cc:3512
  #, gcc-internal-format
*************** msgid "Pointer-array actual argument at
*** 78273,78282 ****
  msgstr "Pekarvektor som aktuellt argument vid %L kräver ett attrappargument %qs med antagen form eller pekarvektor på grund av attributet VOLATILE"
  
  #: fortran/interface.cc:4153
! #, fuzzy, gcc-internal-format
! #| msgid "Assumed-type actual argument at %L requires that dummy argument %qs is of assumed type"
  msgid "ISO_C_BINDING function actual argument at %L requires dummy argument %qs to have a matching type from ISO_C_BINDING"
! msgstr "Aktuellt argument med antagen typ vid %L kräver att attrappargumentet %qs har antagen typ"
  
  #: fortran/interface.cc:4181
  #, gcc-internal-format, gfc-internal-format
--- 78237,78245 ----
  msgstr "Pekarvektor som aktuellt argument vid %L kräver ett attrappargument %qs med antagen form eller pekarvektor på grund av attributet VOLATILE"
  
  #: fortran/interface.cc:4153
! #, gcc-internal-format
  msgid "ISO_C_BINDING function actual argument at %L requires dummy argument %qs to have a matching type from ISO_C_BINDING"
! msgstr "ISO_C_BINDING-finktionens aktuella argument vid %L kräver att attrappargumentet %qs har en matchande typ från ISO_C_BINDING"
  
  #: fortran/interface.cc:4181
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Ett associationsnamn förväntad
*** 79687,79693 ****
  #: fortran/match.cc:2006
  #, gcc-internal-format, gfc-internal-format
  msgid "Bad bounds remapping list at %C"
! msgstr "Felaktig litea på gränsavbildningar vid %C"
  
  #: fortran/match.cc:2012
  #, gcc-internal-format, gfc-internal-format
--- 79650,79656 ----
  #: fortran/match.cc:2006
  #, gcc-internal-format, gfc-internal-format
  msgid "Bad bounds remapping list at %C"
! msgstr "Felaktig lista på gränsavbildningar vid %C"
  
  #: fortran/match.cc:2012
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Associationsmålet vid %L får i
*** 79727,79733 ****
  #: fortran/match.cc:2131
  #, gcc-internal-format, gfc-internal-format
  msgid "The associate name %s with an assumed rank target at %L must have a bounds remapping list (list of lbound:ubound for each dimension)"
! msgstr "Det associerade namnet %s med ett mål med antagen ordning vid %L måste ha en lista för omavbildning av gränser (lista av nedtregräns:övregräns för varje dimension)"
  
  #: fortran/match.cc:2140
  #, gcc-internal-format, gfc-internal-format
--- 79690,79696 ----
  #: fortran/match.cc:2131
  #, gcc-internal-format, gfc-internal-format
  msgid "The associate name %s with an assumed rank target at %L must have a bounds remapping list (list of lbound:ubound for each dimension)"
! msgstr "Det associerade namnet %s med ett mål med antagen ordning vid %L måste ha en lista för omavbildning av gränser (lista av nedregräns:övregräns för varje dimension)"
  
  #: fortran/match.cc:2140
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "”,” eller ”)” förvänta
*** 79818,79824 ****
  #: fortran/match.cc:3239
  #, gcc-internal-format, gfc-internal-format
  msgid "REDUCE locality spec at %L"
! msgstr "REDUCE-likalitestsspecifikation vid %L"
  
  #: fortran/match.cc:3246
  #, gcc-internal-format, gfc-internal-format
--- 79781,79787 ----
  #: fortran/match.cc:3239
  #, gcc-internal-format, gfc-internal-format
  msgid "REDUCE locality spec at %L"
! msgstr "REDUCE-lokalitetsspecifikation vid %L"
  
  #: fortran/match.cc:3246
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "EQUIVALENCE-sats vid %C"
*** 80437,80443 ****
  #: fortran/match.cc:6795
  #, gcc-internal-format, gfc-internal-format
  msgid "Invalid use of statement function argument at %L"
! msgstr "Ogiltig användning ett satsfunktionsargument vid %L"
  
  #: fortran/match.cc:6862
  #, gcc-internal-format, gfc-internal-format
--- 80400,80406 ----
  #: fortran/match.cc:6795
  #, gcc-internal-format, gfc-internal-format
  msgid "Invalid use of statement function argument at %L"
! msgstr "Ogiltig användning av ett satsfunktionsargument vid %L"
  
  #: fortran/match.cc:6862
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "gfc_code2string(): Felaktig kod"
*** 80633,80639 ****
  #: fortran/module.cc:245
  #, gcc-internal-format
  msgid "free_pi_tree(): Unresolved fixup"
! msgstr "free_pi_tree(): Ej upplöst upprättning"
  
  #: fortran/module.cc:462
  #, gcc-internal-format
--- 80596,80602 ----
  #: fortran/module.cc:245
  #, gcc-internal-format
  msgid "free_pi_tree(): Unresolved fixup"
! msgstr "free_pi_tree(): Ej uppslagen upprättning"
  
  #: fortran/module.cc:462
  #, gcc-internal-format
*************** msgstr "%<omp_all_memory%> använt med e
*** 80978,80984 ****
  #: fortran/openmp.cc:820
  #, gcc-internal-format, gfc-internal-format
  msgid "Syntax error in OpenMP SINK dependence-type list at %C"
! msgstr "Syntaxfel i OpenMP DEPEND SINK beroendetyplista vid %C"
  
  #: fortran/openmp.cc:883
  #, gcc-internal-format, gfc-internal-format
--- 80941,80947 ----
  #: fortran/openmp.cc:820
  #, gcc-internal-format, gfc-internal-format
  msgid "Syntax error in OpenMP SINK dependence-type list at %C"
! msgstr "Syntaxfel i OpenMP SINK beroendetyplista vid %C"
  
  #: fortran/openmp.cc:883
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Komma förväntades vid %C"
*** 81038,81044 ****
  #: fortran/openmp.cc:1500
  #, gcc-internal-format
  msgid "%<-%> operator at %C for reductions deprecated in OpenMP 5.2"
! msgstr "Operatorn %<-%> vid %C för reduktioner är föråldrade i OpenMP 5.2"
  
  #: fortran/openmp.cc:1594
  #, gcc-internal-format, gfc-internal-format
--- 81001,81007 ----
  #: fortran/openmp.cc:1500
  #, gcc-internal-format
  msgid "%<-%> operator at %C for reductions deprecated in OpenMP 5.2"
! msgstr "Operatorn %<-%> vid %C för reduktioner fasas ut i OpenMP 5.2"
  
  #: fortran/openmp.cc:1594
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "%<,%> eller %<)%> förväntades
*** 81070,81076 ****
  #: fortran/openmp.cc:1722 fortran/openmp.cc:1732
  #, gcc-internal-format
  msgid "%qs directive mentioned multiple times in %s clause in %s directive at %L"
! msgstr "Direktivet %s nämnt flera gånger i en %s-klausul i ett %s-direktiv vid %L"
  
  #: fortran/openmp.cc:1740
  #, gcc-internal-format
--- 81033,81039 ----
  #: fortran/openmp.cc:1722 fortran/openmp.cc:1732
  #, gcc-internal-format
  msgid "%qs directive mentioned multiple times in %s clause in %s directive at %L"
! msgstr "Direktivet %qs nämnt flera gånger i en %s-klausul i ett %s-direktiv vid %L"
  
  #: fortran/openmp.cc:1740
  #, gcc-internal-format
*************** msgstr "%<{%> förväntades vid %C"
*** 81105,81116 ****
  #: fortran/openmp.cc:1964
  #, gcc-internal-format
  msgid "Duplicated %<fr%> preference-selector-name at %C"
! msgstr "Dubblerad %<fr%>-preferensväljarnamn vid %C"
  
  #: fortran/openmp.cc:1989 fortran/openmp.cc:2127
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected constant scalar integer expression or non-empty default-kind character literal at %L"
! msgstr "Ett konstant skalärt heltalsuttryck eller en icke-tom standardsorts teckenliteral vid %L"
  
  #: fortran/openmp.cc:2003 fortran/openmp.cc:2140
  #, gcc-internal-format
--- 81068,81079 ----
  #: fortran/openmp.cc:1964
  #, gcc-internal-format
  msgid "Duplicated %<fr%> preference-selector-name at %C"
! msgstr "Dubblerat %<fr%>-preferensväljarnamn vid %C"
  
  #: fortran/openmp.cc:1989 fortran/openmp.cc:2127
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected constant scalar integer expression or non-empty default-kind character literal at %L"
! msgstr "Ett konstant skalärt heltalsuttryck eller en icke-tom standardsorts teckenlitteral vid %L"
  
  #: fortran/openmp.cc:2003 fortran/openmp.cc:2140
  #, gcc-internal-format
*************** msgstr "Okänd främmande körtidsidenti
*** 81120,81126 ****
  #: fortran/openmp.cc:2017 fortran/openmp.cc:2152
  #, gcc-internal-format, gfc-internal-format
  msgid "Unexpected null character in character literal at %L"
! msgstr "Oväntat null-tecken i teckenliteralen vid %L"
  
  #: fortran/openmp.cc:2024 fortran/openmp.cc:2159
  #, gcc-internal-format
--- 81083,81089 ----
  #: fortran/openmp.cc:2017 fortran/openmp.cc:2152
  #, gcc-internal-format, gfc-internal-format
  msgid "Unexpected null character in character literal at %L"
! msgstr "Oväntat null-tecken i teckenlitteralen vid %L"
  
  #: fortran/openmp.cc:2024 fortran/openmp.cc:2159
  #, gcc-internal-format
*************** msgstr "%<)%> förväntades vid %C"
*** 81135,81151 ****
  #: fortran/openmp.cc:2047
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected default-kind character literal at %L"
! msgstr "En standardsorts teckenliteral förväntades vid %L"
  
  #: fortran/openmp.cc:2058
  #, gcc-internal-format
  msgid "Character literal at %L must start with %<ompx_%>"
! msgstr "Teckenliteralen vid %L måste börja med %<ompx_%>"
  
  #: fortran/openmp.cc:2066
  #, gcc-internal-format
  msgid "Unexpected null or %<,%> character in character literal at %L"
! msgstr "Oväntat null eller %<,%>-tecken i teckenliteralen vid %L"
  
  #: fortran/openmp.cc:2083
  #, gcc-internal-format
--- 81098,81114 ----
  #: fortran/openmp.cc:2047
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected default-kind character literal at %L"
! msgstr "En standardsorts teckenlitteral förväntades vid %L"
  
  #: fortran/openmp.cc:2058
  #, gcc-internal-format
  msgid "Character literal at %L must start with %<ompx_%>"
! msgstr "Teckenlitteralen vid %L måste börja med %<ompx_%>"
  
  #: fortran/openmp.cc:2066
  #, gcc-internal-format
  msgid "Unexpected null or %<,%> character in character literal at %L"
! msgstr "Oväntat null eller %<,%>-tecken i teckenlitteralen vid %L"
  
  #: fortran/openmp.cc:2083
  #, gcc-internal-format
*************** msgstr "FATAL eller WARNING förväntade
*** 81405,81411 ****
  #: fortran/openmp.cc:4387
  #, gcc-internal-format
  msgid "%<to%> clause with %<declare target%> at %L deprecated since OpenMP 5.2, use %<enter%>"
! msgstr "Klauslen %<to%> med %<declare target%> vid %L är utfasat sedan OpenMP 5.2, använd %<enter%>"
  
  #: fortran/openmp.cc:4537
  #, gcc-internal-format, gfc-internal-format
--- 81368,81374 ----
  #: fortran/openmp.cc:4387
  #, gcc-internal-format
  msgid "%<to%> clause with %<declare target%> at %L deprecated since OpenMP 5.2, use %<enter%>"
! msgstr "Klausulen %<to%> med %<declare target%> vid %L är utfasat sedan OpenMP 5.2, använd %<enter%>"
  
  #: fortran/openmp.cc:4537
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Endast formen !$ACC ROUTINE utan
*** 81460,81471 ****
  #: fortran/openmp.cc:5002
  #, gcc-internal-format
  msgid "Invalid NAME %qs in !$ACC ROUTINE ( NAME ) at %C"
! msgstr "Felaktigt NAME %qs i !ACC$ ROUTINE ( NAME ) vid %C"
  
  #: fortran/openmp.cc:5010
  #, gcc-internal-format, gfc-internal-format
  msgid "Syntax error in !$ACC ROUTINE ( NAME ) at %C"
! msgstr "Syntaxfel i !ACC$ ROUTINE ( NAME ) vid %C"
  
  #: fortran/openmp.cc:5017
  #, gcc-internal-format
--- 81423,81434 ----
  #: fortran/openmp.cc:5002
  #, gcc-internal-format
  msgid "Invalid NAME %qs in !$ACC ROUTINE ( NAME ) at %C"
! msgstr "Felaktigt NAMN %qs i !ACC$ ROUTINE ( NAMN ) vid %C"
  
  #: fortran/openmp.cc:5010
  #, gcc-internal-format, gfc-internal-format
  msgid "Syntax error in !$ACC ROUTINE ( NAME ) at %C"
! msgstr "Syntaxfel i !ACC$ ROUTINE ( NAMN ) vid %C"
  
  #: fortran/openmp.cc:5017
  #, gcc-internal-format
*************** msgstr "Listobjektet %qs vid %L satt med
*** 81670,81676 ****
  #: fortran/openmp.cc:6333
  #, gcc-internal-format
  msgid "Common block %</%s/%> at %L not appear in the %qs clause as it was previously specified in a GROUPPRIVATE directive"
! msgstr "Common-blocket %</%s/%> vid %L förekommer inte i klausulen %qs eftersom det tidigare tidigare specificerades i ett direktiv GROUPPRIVATE"
  
  #: fortran/openmp.cc:6340
  #, gcc-internal-format
--- 81633,81639 ----
  #: fortran/openmp.cc:6333
  #, gcc-internal-format
  msgid "Common block %</%s/%> at %L not appear in the %qs clause as it was previously specified in a GROUPPRIVATE directive"
! msgstr "Common-blocket %</%s/%> vid %L förekommer inte i klausulen %qs eftersom det tidigare specificerades i ett direktiv GROUPPRIVATE"
  
  #: fortran/openmp.cc:6340
  #, gcc-internal-format
*************** msgstr "Common-blocket %</%s/%> vid %L s
*** 81705,81711 ****
  #: fortran/openmp.cc:6417
  #, gcc-internal-format, gfc-internal-format
  msgid "OMP DECLARE TARGET directive at %L with only DEVICE_TYPE or INDIRECT clauses is ignored"
! msgstr "Direktivet OMP DECLARE TARGET vid %L med endast DEVICE_TYPE- eller INDIRECTklausuler ignoreras"
  
  #: fortran/openmp.cc:6428
  #, gcc-internal-format, gfc-internal-format
--- 81668,81674 ----
  #: fortran/openmp.cc:6417
  #, gcc-internal-format, gfc-internal-format
  msgid "OMP DECLARE TARGET directive at %L with only DEVICE_TYPE or INDIRECT clauses is ignored"
! msgstr "Direktivet OMP DECLARE TARGET vid %L med endast DEVICE_TYPE- eller INDIRECT-klausuler ignoreras"
  
  #: fortran/openmp.cc:6428
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "selektorn %qs tar inte några eg
*** 81742,81748 ****
  #: fortran/openmp.cc:6558
  #, gcc-internal-format
  msgid "%<score%> cannot be specified in traits in the %qs trait-selector-set at %C"
! msgstr "%<score%> kan inte anges bland egenskaper i %s trait-selector-set vid %C"
  
  #: fortran/openmp.cc:6565 fortran/openmp.cc:6697 fortran/openmp.cc:6788
  #: fortran/openmp.cc:6879 fortran/openmp.cc:7074
--- 81705,81711 ----
  #: fortran/openmp.cc:6558
  #, gcc-internal-format
  msgid "%<score%> cannot be specified in traits in the %qs trait-selector-set at %C"
! msgstr "%<score%> kan inte anges bland egenskaper i %qs trait-selector-set vid %C"
  
  #: fortran/openmp.cc:6565 fortran/openmp.cc:6697 fortran/openmp.cc:6788
  #: fortran/openmp.cc:6879 fortran/openmp.cc:7074
*************** msgstr "deklarativa direktivvarianter st
*** 81878,81884 ****
  #: fortran/openmp.cc:7228
  #, gcc-internal-format, gfc-internal-format
  msgid "variant directive used in OMP BEGIN METADIRECTIVE at %C must have a corresponding end directive"
! msgstr "variantdirektivet som används i OMP BEGIN METADIRECTIVE vid %C måste ha ett mostsvarande slutdirektiv"
  
  #: fortran/openmp.cc:7262
  #, gcc-internal-format, gfc-internal-format
--- 81841,81847 ----
  #: fortran/openmp.cc:7228
  #, gcc-internal-format, gfc-internal-format
  msgid "variant directive used in OMP BEGIN METADIRECTIVE at %C must have a corresponding end directive"
! msgstr "variantdirektivet som används i OMP BEGIN METADIRECTIVE vid %C måste ha ett motsvarande slutdirektiv"
  
  #: fortran/openmp.cc:7262
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Oväntad co-vektor %qs i %<alloc
*** 82408,82414 ****
  #: fortran/openmp.cc:9561
  #, gcc-internal-format
  msgid "%qs specified in %<allocate%> at %L but not in the associated ALLOCATE statement"
! msgstr "%qs angivet i en %<allocate%> vid %L men inte deN motsvarande ALLOCATE-satsen"
  
  #: fortran/openmp.cc:9595
  #, gcc-internal-format
--- 82371,82377 ----
  #: fortran/openmp.cc:9561
  #, gcc-internal-format
  msgid "%qs specified in %<allocate%> at %L but not in the associated ALLOCATE statement"
! msgstr "%qs angivet i en %<allocate%> vid %L men inte den motsvarande ALLOCATE-satsen"
  
  #: fortran/openmp.cc:9595
  #, gcc-internal-format
*************** msgstr "Direktivet ALLOCATORS vid %L inu
*** 82428,82434 ****
  #: fortran/openmp.cc:9635
  #, gcc-internal-format
  msgid "ALLOCATE directive at %L inside a target region must specify an ALLOCATOR clause for %qs"
! msgstr "Direktivet ALLOCATE vid %L inuti en målregion moste ange en ALLOCATOR-klausul för %qs"
  
  #: fortran/openmp.cc:9639
  #, gcc-internal-format, gfc-internal-format
--- 82391,82397 ----
  #: fortran/openmp.cc:9635
  #, gcc-internal-format
  msgid "ALLOCATE directive at %L inside a target region must specify an ALLOCATOR clause for %qs"
! msgstr "Direktivet ALLOCATE vid %L inuti en målregion måste ange en ALLOCATOR-klausul för %qs"
  
  #: fortran/openmp.cc:9639
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Nollskilt intervallsteg förvän
*** 82518,82524 ****
  #: fortran/openmp.cc:9808
  #, gcc-internal-format, gfc-internal-format
  msgid "Dependence-type SINK used together with SOURCE on the same construct at %L"
! msgstr "Beroendetypen SINK använt tillsammans med SOURCE på samma konstruktion vid %L"
  
  #: fortran/openmp.cc:9818
  #, gcc-internal-format, gfc-internal-format
--- 82481,82487 ----
  #: fortran/openmp.cc:9808
  #, gcc-internal-format, gfc-internal-format
  msgid "Dependence-type SINK used together with SOURCE on the same construct at %L"
! msgstr "Beroendetypen SINK använd tillsammans med SOURCE på samma konstruktion vid %L"
  
  #: fortran/openmp.cc:9818
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Argumentet %qs till klausulen MA
*** 82553,82559 ****
  #: fortran/openmp.cc:9910
  #, gcc-internal-format
  msgid "%qs clause argument must be ALLOCATABLE or a POINTER at %L"
! msgstr "Argumentet till klausulen %qs måster vara  ALLOCATABLE eller en POINTER vid %L"
  
  #: fortran/openmp.cc:9922
  #, gcc-internal-format, gfc-internal-format
--- 82516,82522 ----
  #: fortran/openmp.cc:9910
  #, gcc-internal-format
  msgid "%qs clause argument must be ALLOCATABLE or a POINTER at %L"
! msgstr "Argumentet till klausulen %qs måste vara  ALLOCATABLE eller en POINTER vid %L"
  
  #: fortran/openmp.cc:9922
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Ledsen, listposten %qs vid %L me
*** 82691,82697 ****
  #: fortran/openmp.cc:10338
  #, gcc-internal-format
  msgid "Polymorphic list item %qs at %L in %s clause has unspecified behavior and unsupported"
! msgstr "Det polymorfa listelementet %qs vid %L i klausulen %s har i odefinierat beteende och stödjs ej"
  
  #: fortran/openmp.cc:10370
  #, gcc-internal-format, gfc-internal-format
--- 82654,82660 ----
  #: fortran/openmp.cc:10338
  #, gcc-internal-format
  msgid "Polymorphic list item %qs at %L in %s clause has unspecified behavior and unsupported"
! msgstr "Det polymorfa listelementet %qs vid %L i klausulen %s har odefinierat beteende och stödjs ej"
  
  #: fortran/openmp.cc:10370
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "!$OMP DECLARE REDUCTION %s finns
*** 82706,82717 ****
  #: fortran/openmp.cc:10507
  #, gcc-internal-format
  msgid "Sorry, ALLOCATABLE object %qs in LINEAR clause on worksharing-loop construct at %L is not yet supported"
! msgstr ""
  
  #: fortran/openmp.cc:10512
  #, gcc-internal-format
  msgid "Sorry, array %qs in LINEAR clause on worksharing-loop construct at %L is not yet supported"
! msgstr ""
  
  #: fortran/openmp.cc:10526
  #, gcc-internal-format, gfc-internal-format
--- 82669,82680 ----
  #: fortran/openmp.cc:10507
  #, gcc-internal-format
  msgid "Sorry, ALLOCATABLE object %qs in LINEAR clause on worksharing-loop construct at %L is not yet supported"
! msgstr "Ledsen, ALLOCATABLE-objektet %qs i klausulen LINEAR i en konstruktion för arbetsdelningsslinga vid %L stödjs inte ännu"
  
  #: fortran/openmp.cc:10512
  #, gcc-internal-format
  msgid "Sorry, array %qs in LINEAR clause on worksharing-loop construct at %L is not yet supported"
! msgstr "Ledsen, vektorn %qs i klausulen LINEAR i en konstruktion för arbetsdelningsslinga vid %L stöjs inte ännu"
  
  #: fortran/openmp.cc:10526
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "!$OMP TARGET-regionen vid %L med
*** 83227,83233 ****
  #: fortran/openmp.cc:13377
  #, gcc-internal-format
  msgid "%<OMP DISPATCH%> directive at %L must be followed by a procedure call with optional assignment"
! msgstr "Direktivet %<OMP DISPATCH%> vid %L måste följas av ett proceduranrop me möjlig tilldelning"
  
  #: fortran/openmp.cc:13384
  #, gcc-internal-format
--- 83190,83196 ----
  #: fortran/openmp.cc:13377
  #, gcc-internal-format
  msgid "%<OMP DISPATCH%> directive at %L must be followed by a procedure call with optional assignment"
! msgstr "Direktivet %<OMP DISPATCH%> vid %L måste följas av ett proceduranrop med möjlig tilldelning"
  
  #: fortran/openmp.cc:13384
  #, gcc-internal-format
*************** msgstr "För intervallbaserat %<adjust_a
*** 83267,83273 ****
  #: fortran/openmp.cc:13584
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected dummy parameter name or a positive integer at %L"
! msgstr "Ett attrapparameternamn eller ettt positivt heltal förväntades vid %L"
  
  #: fortran/openmp.cc:13610
  #, gcc-internal-format, gfc-internal-format
--- 83230,83236 ----
  #: fortran/openmp.cc:13584
  #, gcc-internal-format, gfc-internal-format
  msgid "Expected dummy parameter name or a positive integer at %L"
! msgstr "Ett attrapparameternamn eller ett positivt heltal förväntades vid %L"
  
  #: fortran/openmp.cc:13610
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "direktivet %qs vid %L måste ant
*** 83442,83448 ****
  #: fortran/parse.cc:843
  #, gcc-internal-format
  msgid "Structure-component expression at %L in %qs directive not permitted in declarative directive; as directive associated with an ALLOCATE stmt it must be preceded by an executable statement or OpenMP construct"
! msgstr "Strukturkomponentuttrycket vid %L i %qs-direktivet är inte tillåtet i ett deklarativt direktiv; som ett diretiv associerat med en ALLOCATE-sats måste det föregås av en körbar sats eller OpenMP-konstruktion"
  
  #: fortran/parse.cc:869
  #, gcc-internal-format
--- 83405,83411 ----
  #: fortran/parse.cc:843
  #, gcc-internal-format
  msgid "Structure-component expression at %L in %qs directive not permitted in declarative directive; as directive associated with an ALLOCATE stmt it must be preceded by an executable statement or OpenMP construct"
! msgstr "Strukturkomponentuttrycket vid %L i %qs-direktivet är inte tillåtet i ett deklarativt direktiv; som ett direktiv associerat med en ALLOCATE-sats måste det föregås av en körbar sats eller OpenMP-konstruktion"
  
  #: fortran/parse.cc:869
  #, gcc-internal-format
*************** msgstr "direktivet %qs vid %L associerat
*** 83452,83458 ****
  #: fortran/parse.cc:1059 fortran/parse.cc:1373
  #, gcc-internal-format, gfc-internal-format
  msgid "OpenMP directive at %C is not pure and thus may not appear in a PURE procedure"
! msgstr "OpenMP-direktivet vid %C är inte rent och får därför inte förekomma i en PURE-procedurer"
  
  #: fortran/parse.cc:1340
  #, gcc-internal-format, gfc-internal-format
--- 83415,83421 ----
  #: fortran/parse.cc:1059 fortran/parse.cc:1373
  #, gcc-internal-format, gfc-internal-format
  msgid "OpenMP directive at %C is not pure and thus may not appear in a PURE procedure"
! msgstr "OpenMP-direktivet vid %C är inte rent och får därför inte förekomma i en PURE-procedur"
  
  #: fortran/parse.cc:1340
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Härledd typdefinition vid %C ut
*** 83682,83693 ****
  #: fortran/parse.cc:4024
  #, gcc-internal-format, gfc-internal-format
  msgid "PRIVATE statement at %C must precede structure components"
! msgstr "PRIVATE-sats vid %C måste föregå strukturkomponenter"
  
  #: fortran/parse.cc:4044
  #, gcc-internal-format, gfc-internal-format
  msgid "SEQUENCE statement at %C must precede structure components"
! msgstr "SEQUENCE-sats vid %C måste föregå strukturkomponenter"
  
  #: fortran/parse.cc:4050
  #, gcc-internal-format, gfc-internal-format
--- 83645,83656 ----
  #: fortran/parse.cc:4024
  #, gcc-internal-format, gfc-internal-format
  msgid "PRIVATE statement at %C must precede structure components"
! msgstr "PRIVATE-sats vid %C måste föregå postkomponenter"
  
  #: fortran/parse.cc:4044
  #, gcc-internal-format, gfc-internal-format
  msgid "SEQUENCE statement at %C must precede structure components"
! msgstr "SEQUENCE-sats vid %C måste föregå postkomponenter"
  
  #: fortran/parse.cc:4050
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Gränssnitt stämmer inte övere
*** 84987,84993 ****
  #: fortran/resolve.cc:2949
  #, gcc-internal-format
  msgid "There is no specific function for the generic %qs at %L"
! msgstr "Det finns ingen specifik funktionen för den generiska %qs vid %L"
  
  #: fortran/resolve.cc:2969
  #, gcc-internal-format
--- 84950,84956 ----
  #: fortran/resolve.cc:2949
  #, gcc-internal-format
  msgid "There is no specific function for the generic %qs at %L"
! msgstr "Det finns ingen specifik funktion för den generiska %qs vid %L"
  
  #: fortran/resolve.cc:2969
  #, gcc-internal-format
*************** msgstr "Funktionen %qs är deklarerad CH
*** 85068,85074 ****
  #: fortran/resolve.cc:3525
  #, gcc-internal-format, gfc-internal-format
  msgid "Different argument lists in external dummy function %s at %L and %L"
! msgstr "Olika argumentlistor i den externa atrappfunktionen %s vid %L och %L"
  
  #: fortran/resolve.cc:3564
  #, gcc-internal-format
--- 85031,85037 ----
  #: fortran/resolve.cc:3525
  #, gcc-internal-format, gfc-internal-format
  msgid "Different argument lists in external dummy function %s at %L and %L"
! msgstr "Olika argumentlistor i den externa attrappfunktionen %s vid %L och %L"
  
  #: fortran/resolve.cc:3564
  #, gcc-internal-format
*************** msgstr "F2018: C8102 %qs vid %L är vär
*** 85153,85159 ****
  #: fortran/resolve.cc:4020
  #, gcc-internal-format
  msgid "F2018: C8102 %qs at %L is host associated in a scope that has IMPORT, NONE"
! msgstr "F2018: C8102 %qs vid %L är värdassocierat i en räckvidd so har IMPORT, NONE"
  
  #: fortran/resolve.cc:4198
  #, gcc-internal-format
--- 85116,85122 ----
  #: fortran/resolve.cc:4020
  #, gcc-internal-format
  msgid "F2018: C8102 %qs at %L is host associated in a scope that has IMPORT, NONE"
! msgstr "F2018: C8102 %qs vid %L är värdassocierat i en räckvidd som har IMPORT, NONE"
  
  #: fortran/resolve.cc:4198
  #, gcc-internal-format
*************** msgstr "uttrycket vid %L och uttrycket v
*** 85343,85349 ****
  #: fortran/resolve.cc:5175
  #, gcc-internal-format, gfc-internal-format
  msgid "Sorry, only integer, logical, real, complex and character types are currently supported for conditional expressions at %L"
! msgstr "Ledsen, endast heltal, logiska, reella complexa och teckentyper stödjs för närvarande för villkorliga uttryck vid %L"
  
  #: fortran/resolve.cc:5184
  #, gcc-internal-format, gfc-internal-format
--- 85306,85312 ----
  #: fortran/resolve.cc:5175
  #, gcc-internal-format, gfc-internal-format
  msgid "Sorry, only integer, logical, real, complex and character types are currently supported for conditional expressions at %L"
! msgstr "Ledsen, endast heltal, logiska, reella, komplexa och teckentyper stödjs för närvarande för villkorliga uttryck vid %L"
  
  #: fortran/resolve.cc:5184
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "DO-slingan vid %L är odefiniera
*** 85727,85733 ****
  #: fortran/resolve.cc:8549
  #, gcc-internal-format
  msgid "Variable %qs referenced in concurrent-header at %L must not appear in LOCAL locality-spec at %L"
! msgstr "Variabeln %qs refererad i samtidighetshuvud (concurrent-header) vid %L får inte förekomma i en lokalitesspecifikation LOCAL vid %L"
  
  #: fortran/resolve.cc:8598
  #, gcc-internal-format
--- 85690,85696 ----
  #: fortran/resolve.cc:8549
  #, gcc-internal-format
  msgid "Variable %qs referenced in concurrent-header at %L must not appear in LOCAL locality-spec at %L"
! msgstr "Variabeln %qs refererad i samtidighetshuvud (concurrent-header) vid %L får inte förekomma i en lokalitetsspecifikation LOCAL vid %L"
  
  #: fortran/resolve.cc:8598
  #, gcc-internal-format
*************** msgstr "en finalize:bar typ är inte til
*** 85782,85788 ****
  #: fortran/resolve.cc:8723
  #, gcc-internal-format
  msgid "Type with ultimate allocatable component not permitted for %qs in %s locality-spec at %L"
! msgstr "Typen med en ytterst allokerbar komponent är inte är inte tillåten till %qs i lokalitetsspecifikationen %s vid %L"
  
  #: fortran/resolve.cc:8731
  #, gcc-internal-format
--- 85745,85751 ----
  #: fortran/resolve.cc:8723
  #, gcc-internal-format
  msgid "Type with ultimate allocatable component not permitted for %qs in %s locality-spec at %L"
! msgstr "Typen med en ytterst allokerbar komponent är inte inte tillåten till %qs i lokalitetsspecifikationen %s vid %L"
  
  #: fortran/resolve.cc:8731
  #, gcc-internal-format
*************** msgstr "En numerisk typ förväntades ti
*** 85802,85808 ****
  #: fortran/resolve.cc:8798
  #, gcc-internal-format
  msgid "Expected logical type for %qs in REDUCE at %L, got %qs"
! msgstr "En logiskt typ förväntades till %qs i REDUCE vid %L, fick %s"
  
  #: fortran/resolve.cc:8816
  #, gcc-internal-format
--- 85765,85771 ----
  #: fortran/resolve.cc:8798
  #, gcc-internal-format
  msgid "Expected logical type for %qs in REDUCE at %L, got %qs"
! msgstr "En logisk typ förväntades till %qs i REDUCE vid %L, fick %s"
  
  #: fortran/resolve.cc:8816
  #, gcc-internal-format
*************** msgstr "Allokering %s av ABSTRACT bastyp
*** 85907,85913 ****
  #: fortran/resolve.cc:9463
  #, gcc-internal-format
  msgid "The type parameter in ALLOCATE statement with type-spec shall be an asterisk as allocate object %qs at %L is a dummy argument with assumed type parameter"
! msgstr "Typparametern i satsen ALLOCATE med typspecifikationen skall vara en asterisk eftersom allokeringsobjektet %qs vid %L är ett attrappargumentparameter med antagen typ"
  
  #: fortran/resolve.cc:9483
  #, gcc-internal-format, gfc-internal-format
--- 85870,85876 ----
  #: fortran/resolve.cc:9463
  #, gcc-internal-format
  msgid "The type parameter in ALLOCATE statement with type-spec shall be an asterisk as allocate object %qs at %L is a dummy argument with assumed type parameter"
! msgstr "Typparametern i satsen ALLOCATE med typspecifikationen skall vara en asterisk eftersom allokeringsobjektet %qs vid %L är ett attrappargument med antagen typparameter"
  
  #: fortran/resolve.cc:9483
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Logiskt SELECT CASE-block vid %L
*** 86066,86072 ****
  #: fortran/resolve.cc:10538
  #, gcc-internal-format, gfc-internal-format
  msgid "%s could not be resolved to a specific function at %L"
! msgstr "%s kunde inte slås upp till en specifik funktionen vid %L"
  
  #: fortran/resolve.cc:10576
  #, gcc-internal-format, gfc-internal-format
--- 86029,86035 ----
  #: fortran/resolve.cc:10538
  #, gcc-internal-format, gfc-internal-format
  msgid "%s could not be resolved to a specific function at %L"
! msgstr "%s kunde inte slås upp till en specifik funktion vid %L"
  
  #: fortran/resolve.cc:10576
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Proceduren ”%s” vid %L är r
*** 88267,88273 ****
  #: fortran/symbol.cc:1898
  #, gcc-internal-format
  msgid "F2008: A pointer function assignment is ambiguous if it is the first executable statement after the specification block.  Please add any other kind of executable statement before it"
! msgstr "F2008: En tilldelning av funktionspekare är tvetydig om det är dn första exekverbara satsen efter specifikationsblocket.  Lägg någon annan sorts exekverbar sats före den."
  
  #: fortran/symbol.cc:1935
  #, gcc-internal-format, gfc-internal-format
--- 88230,88236 ----
  #: fortran/symbol.cc:1898
  #, gcc-internal-format
  msgid "F2008: A pointer function assignment is ambiguous if it is the first executable statement after the specification block.  Please add any other kind of executable statement before it"
! msgstr "F2008: En tilldelning av funktionspekare är tvetydig om det är den första exekverbara satsen efter specifikationsblocket.  Lägg någon annan sorts exekverbar sats före den."
  
  #: fortran/symbol.cc:1935
  #, gcc-internal-format, gfc-internal-format
*************** msgstr "Överlappande olika initierare i
*** 88500,88506 ****
  #: fortran/trans-array.cc:2452 fortran/trans-expr.cc:10704
  #, gcc-internal-format, gfc-internal-format
  msgid "The structure constructor at %L has been finalized. This feature was removed by f08/0011. Use -std=f2018 or -std=gnu to eliminate the finalization."
! msgstr "Postkonstrueraren vid %L har avslutats. Denna funktion togs bart av f08/0011. Använd -std=f2018 eller -std=gnu för att eliminera avslutningen."
  
  #: fortran/trans-array.cc:4046
  #, gcc-internal-format
--- 88463,88469 ----
  #: fortran/trans-array.cc:2452 fortran/trans-expr.cc:10704
  #, gcc-internal-format, gfc-internal-format
  msgid "The structure constructor at %L has been finalized. This feature was removed by f08/0011. Use -std=f2018 or -std=gnu to eliminate the finalization."
! msgstr "Postkonstrueraren vid %L har avslutats. Denna funktion togs bort av f08/0011. Använd -std=f2018 eller -std=gnu för att eliminera avslutningen."
  
  #: fortran/trans-array.cc:4046
  #, gcc-internal-format
*************** msgid "Bounds checking of the elemental
*** 88508,88517 ****
  msgstr "Kontroll av gränser för elementindex vid %L kommer orsaka två anrop av %qs, vilken inte är declarerad PURE och inte är implicit ren."
  
  #: fortran/trans-array.cc:7109
! #, fuzzy, gcc-internal-format, gfc-internal-format
! #| msgid "Array %qs at %L is a variable, which does not reduce to a constant expression"
  msgid "Array initializer at %L does not reduce to a constant expression"
! msgstr "Vektor %qs vid %L är en variabel, som inte reduceras till ett konstant uttryck"
  
  #. Problems occur when we get something like
  #. integer :: a(lots) = (/(i, i=1, lots)/)
--- 88471,88479 ----
  msgstr "Kontroll av gränser för elementindex vid %L kommer orsaka två anrop av %qs, vilken inte är declarerad PURE och inte är implicit ren."
  
  #: fortran/trans-array.cc:7109
! #, gcc-internal-format, gfc-internal-format
  msgid "Array initializer at %L does not reduce to a constant expression"
! msgstr "Vektorinitialiseraren vid %L reduceras inte till ett konstant uttryck"
  
  #. Problems occur when we get something like
  #. integer :: a(lots) = (/(i, i=1, lots)/)
*************** msgstr "Ledsen, specificeraren %s vid %L
*** 89023,89034 ****
  #: fortran/trans-stmt.cc:5353
  #, gcc-internal-format
  msgid "Sorry, LOCAL specifier at %L for %qs of derived type with default initializer is not yet supported"
! msgstr "Ledsen, specificeraren LOCAL vid %L för %qs av härledd typp med standardinitierare stödjs inte ännu"
  
  #: fortran/trans-types.cc:619
  #, gcc-internal-format
  msgid "%<-fconvert=r16_ieee%> or %<-fconvert=r16_ibm%> not supported on this architecture"
! msgstr "%<-fconverter=r16_ieee%> eller %<-fconvert=r16_ibm%> stödjs inte på denna arkitektur"
  
  #: fortran/trans-types.cc:632
  #, gcc-internal-format
--- 88985,88996 ----
  #: fortran/trans-stmt.cc:5353
  #, gcc-internal-format
  msgid "Sorry, LOCAL specifier at %L for %qs of derived type with default initializer is not yet supported"
! msgstr "Ledsen, specificeraren LOCAL vid %L för %qs av härledd typ med standardinitierare stödjs inte ännu"
  
  #: fortran/trans-types.cc:619
  #, gcc-internal-format
  msgid "%<-fconvert=r16_ieee%> or %<-fconvert=r16_ibm%> not supported on this architecture"
! msgstr "%<-fconvert=r16_ieee%> eller %<-fconvert=r16_ibm%> stödjs inte på denna arkitektur"
  
  #: fortran/trans-types.cc:632
  #, gcc-internal-format
*************** msgstr "spill i implicit konstantkonvert
*** 89506,89512 ****
  #: m2/gm2-gcc/m2decl.cc:122
  #, gcc-internal-format
  msgid "storage size of %qD has not been resolved"
! msgstr "lagringsstorlek på %qD har inte lösts upp"
  
  #: m2/gm2-gcc/m2decl.cc:125
  #, gcc-internal-format
--- 89468,89474 ----
  #: m2/gm2-gcc/m2decl.cc:122
  #, gcc-internal-format
  msgid "storage size of %qD has not been resolved"
! msgstr "lagringsstorlek på %qD har inte slagits upp"
  
  #: m2/gm2-gcc/m2decl.cc:125
  #, gcc-internal-format
*************** msgstr "argumentet till CAP är inte en
*** 89537,89558 ****
  #: m2/gm2-gcc/m2expr.cc:3692
  #, gcc-internal-format
  msgid "constant literal %qs exceeds internal ZTYPE range"
! msgstr "den konstanta literalen %qs överskrider det interna intervallet för ZTYPE"
  
  #: m2/gm2-gcc/m2expr.cc:3612
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected 0 or 1"
! msgstr "den konstanta literalen %qs innehåller %qc, 0 eller 1 förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3627 m2/gm2-gcc/m2expr.cc:3639
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected %qs"
! msgstr "den konstanta literalen %qs innehåller %qc, %qs förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3658
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected %qs or %qs"
! msgstr "dem konstanta literalen %qs innehåller %qc, %qs eller %qs förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3724
  #, gcc-internal-format
--- 89499,89520 ----
  #: m2/gm2-gcc/m2expr.cc:3692
  #, gcc-internal-format
  msgid "constant literal %qs exceeds internal ZTYPE range"
! msgstr "den konstanta litteralen %qs överskrider det interna intervallet för ZTYPE"
  
  #: m2/gm2-gcc/m2expr.cc:3612
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected 0 or 1"
! msgstr "den konstanta litteralen %qs innehåller %qc, 0 eller 1 förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3627 m2/gm2-gcc/m2expr.cc:3639
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected %qs"
! msgstr "den konstanta litteralen %qs innehåller %qc, %qs förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3658
  #, gcc-internal-format
  msgid "constant literal %qs contains %qc, expected %qs or %qs"
! msgstr "den konstanta litteralen %qs innehåller %qc, %qs eller %qs förväntades"
  
  #: m2/gm2-gcc/m2expr.cc:3724
  #, gcc-internal-format
*************** msgstr "omimplementation av klassen %qE"
*** 90404,90410 ****
  #: objc/objc-act.cc:7068
  #, gcc-internal-format
  msgid "conflicting super class name %qE"
! msgstr "motstridande superklassnamn %qE"
  
  #: objc/objc-act.cc:7071
  #, gcc-internal-format
--- 90366,90372 ----
  #: objc/objc-act.cc:7068
  #, gcc-internal-format
  msgid "conflicting super class name %qE"
! msgstr "motstridigt superklassnamn %qE"
  
  #: objc/objc-act.cc:7071
  #, gcc-internal-format
*************** msgstr "oanvänt namn %qE"
*** 90722,90740 ****
  #, gcc-internal-format, gfc-internal-format
  msgid "are you trying to break %s? how dare you?"
  msgstr "försöker du göra sönder %s? hur vågar du?"
- 
- #, no-c-format
- #~ msgid "The scaling multiplier as a percentage to apply to all scalar loop costing when performing vectorization profitability analysis.  The default value is 100."
- #~ msgstr "Skalningsfaktorn i procent som ska tillämpas på alla skalära slingkostnader när vektoriseringslönsamhetsanalys utförs. Standardvärdet är 100."
- 
- #, gcc-internal-format, gfc-internal-format
- #~ msgid "%s:%d: ignoring subscripts"
- #~ msgstr "%s:%d: ignorerar indexvärden"
- 
- #, gcc-internal-format
- #~ msgid "%qT is not consteval-only"
- #~ msgstr "%qT är inte consteval-only"
- 
- #, gcc-internal-format
- #~ msgid "mangling type pack index"
- #~ msgstr "manglar typpaketindex"
--- 90684,90686 ----
diff -Nrcpad gcc-17-20260517/gcc/postreload.cc gcc-17-20260524/gcc/postreload.cc
*** gcc-17-20260517/gcc/postreload.cc	Sun May 17 22:32:06 2026
--- gcc-17-20260524/gcc/postreload.cc	Sun May 24 22:32:06 2026
*************** reload_cse_simplify_set (rtx set, rtx_in
*** 387,393 ****
        rtx this_rtx = l->loc;
        int this_cost;
  
!       if (CONSTANT_P (this_rtx) && ! references_value_p (this_rtx, 0))
  	{
  	  if (extend_op != UNKNOWN)
  	    {
--- 387,393 ----
        rtx this_rtx = l->loc;
        int this_cost;
  
!       if (CONSTANT_P (this_rtx) && ! references_value_p (this_rtx))
  	{
  	  if (extend_op != UNKNOWN)
  	    {
diff -Nrcpad gcc-17-20260517/gcc/testsuite/ChangeLog gcc-17-20260524/gcc/testsuite/ChangeLog
*** gcc-17-20260517/gcc/testsuite/ChangeLog	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/ChangeLog	Sun May 24 22:32:06 2026
***************
*** 1,3 ****
--- 1,458 ----
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* gcc.dg/Wstrict-overflow-22.c: Removed, given that we do not
+ 	generated a warning for the pattern being tested.
+ 	* gcc.dg/Wstrict-overflow-5.c: Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* gcc.dg/Wstrict-overflow-24.c: Removed since the pattern
+ 	doesn't throw warnings anymore.
+ 	* gcc.dg/Wstrict-overflow-9.c: Likewise.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* gcc.dg/pr56355-1.c: Removed since it's a warning check test
+ 	and we do not emit warnings for the code being tested.
+ 
+ 2026-05-23  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* gcc.dg/Wstrict-overflow-3.c: Removed. We do not throw warnings
+ 	for extract_muldiv patterns anymore.
+ 
+ 2026-05-23  Philipp Tomsich  <philipp.tomsich@vrull.eu>
+ 
+ 	* gcc.target/riscv/and-shift-1.c: New test.
+ 
+ 2026-05-23  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/125263
+ 	* gfortran.dg/pr125263.f90: New test.
+ 
+ 2026-05-23  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/125391
+ 	* gfortran.dg/pr125391.f90: New test.
+ 
+ 2026-05-23  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/125135
+ 	* g++.dg/cpp0x/implicit18.C: New test.
+ 
+ 2026-05-22  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-c++-common/gomp/target-update-iterators-1.c: Update for
+ 	dg-error change.
+ 	* c-c++-common/gomp/declare-mapper-19.c: New test.
+ 
+ 2026-05-22  Disservin  <disservin.social@gmail.com>
+ 
+ 	PR target/50481
+ 	* gcc.target/aarch64/bitreverse.c: New test.
+ 
+ 2026-05-22  Wang Yaduo  <wangyaduo@linux.alibaba.com>
+ 
+ 	* gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c: New.
+ 	* gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c: New.
+ 	* gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c: New.
+ 	* gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c: New.
+ 	* gcc.target/riscv/rvv/autovec/cond/pr111401.c: Use
+ 	-mmax-vectorization.
+ 	* gcc.target/riscv/rvv/autovec/vls/reduc-19.c: Use
+ 	-mmax-vectorization, adjust scan counts.
+ 	* gcc.target/riscv/rvv/autovec/vls/reduc-20.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls/reduc-21.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vls/wred-3.c: Likewise.
+ 
+ 2026-05-22  Richard Sandiford  <rdsandiford@googlemail.com>
+ 
+ 	* gcc.dg/pr125375.c: New test.
+ 
+ 2026-05-22  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* gcc.target/aarch64/tbz_1.c: Update expected output.
+ 
+ 2026-05-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/125399
+ 	* gcc.dg/builtin-bitreverse-4.c (foo9): New function.
+ 	* gcc.dg/builtin-bitreverse-5.c: New test.
+ 	* gcc.dg/builtin-bitreverse-6.c: New test.
+ 	* gcc.dg/builtin-bitreverse-7.c: New test.
+ 	* gcc.dg/builtin-bitreverse-8.c: New test.
+ 
+ 2026-05-22  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/119059
+ 	* g++.dg/DRs/dr2581-1.C: Expect warning for __cpp_trivial_union.
+ 	* g++.dg/DRs/dr2581-2.C: Expect error for __cpp_trivial_union.
+ 	* g++.dg/cpp26/feat-cxx26.C: Add __cpp_trivial_union checking.
+ 	* g++.dg/cpp26/trivial-union1.C: New test.
+ 	* g++.dg/cpp26/trivial-union2.C: New test.
+ 	* g++.dg/reflect/trivial-union1.C: New test.
+ 	* g++.dg/reflect/type_trait6.C: Adjust expected result of
+ 	one is_destructible_type and two is_nothrow_destructible_type calls.
+ 	* g++.dg/reflect/is_constructible_type1.C: Adjust expected result
+ 	of one is_constructible_type call.
+ 	* g++.dg/init/pr43719.C: Don't expect one error.
+ 	* g++.dg/init/pr25811.C: Don't expect 3 diagnostic messages,
+ 	instead expect a different one for C++98 only.
+ 	* g++.dg/other/anon-union2.C: Only expect one diagnostic for
+ 	C++23 and older.
+ 	* g++.dg/cpp0x/union1.C: Only expect 6 diagnostic messages for
+ 	C++23 and older.
+ 	* g++.dg/cpp0x/union4.C: Only expect 3 diagnostic messages for
+ 	C++23 and older.
+ 	* g++.dg/cpp0x/defaulted2.C: Only expect 2 diagnostic messages for
+ 	C++23 and older.
+ 
+ 2026-05-22  Steve Markgraf  <steve@steve-m.de>
+ 
+ 	* gcc.target/powerpc/mpc860_no_lwsync.c: New test.
+ 
+ 2026-05-22  Avinal Kumar  <avinal.xlvii@gmail.com>
+ 
+ 	PR tree-optimization/125050
+ 	* gcc.dg/fold-condneg-2.c: Update expected optimization.
+ 	* gcc.dg/pr125050.c: New test.
+ 	* gcc.dg/tree-ssa/phi-opt-50.c: New test.
+ 	* gcc.dg/tree-ssa/phi-opt-51.c: New test.
+ 
+ 2026-05-21  Konstantinos Eleftheriou  <konstantinos.eleftheriou@vrull.eu>
+ 
+ 	* gcc.target/aarch64/avoid-store-forwarding-6.c: New test.
+ 
+ 2026-05-21  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125330
+ 	* g++.dg/cpp23/explicit-obj-basic8.C: New test.
+ 
+ 2026-05-21  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR c++/125384
+ 	PR c++/113563
+ 	* g++.dg/cpp0x/lambda/lambda-this23.C: New test.
+ 
+ 2026-05-21  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/123791
+ 	* gcc.target/aarch64/pr123791.c: Update test.
+ 	* gcc.target/aarch64/pr63304_1.c: Likewise.
+ 	* gcc.target/aarch64/pr78733.c: Likewise.
+ 	* gcc.target/aarch64/pr79041-2.c: Likewise.
+ 
+ 2026-05-21  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125284
+ 	PR c++/125333
+ 	* g++.dg/cpp1z/using-variadic4.C: New test.
+ 	* g++.dg/cpp1z/using-variadic5.C: New test.
+ 
+ 2026-05-21  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/125376
+ 	* g++.dg/coroutines/pr125376.C: New test.
+ 
+ 2026-05-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/125379
+ 	* gfortran.dg/binding_label_tests_38.f90: New test.
+ 
+ 2026-05-21  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/125320
+ 	* gcc.target/riscv/pr125320.c: New test.
+ 
+ 2026-05-21  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* gcc.dg/ipa/ipa-5.c: Adjust dump.
+ 	* gcc.dg/independent-cloneids-1.c: Set lower param
+ 	ipa-cp-eval-threshold.
+ 	* gcc.dg/vla-1.c: Likewise.
+ 	* g++.dg/ipa/devirt-2.C: Add an extra caller of the to-be-cloned
+ 	function.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* gcc.target/riscv/zilsd-align-default-1.c: New test.
+ 	* gcc.target/riscv/zilsd-align-df-1.c: New test.
+ 	* gcc.target/riscv/zilsd-align-rv64-1.c: New test.
+ 	* gcc.target/riscv/zilsd-align-rv64-2.c: New test.
+ 	* gcc.target/riscv/zilsd-align-rv64-3.c: New test.
+ 	* gcc.target/riscv/zilsd-align-rv64-4.c: New test.
+ 	* gcc.target/riscv/zilsd-align-word-1.c: New test.
+ 	* gcc.target/riscv/zilsd-align-word-2.c: New test.
+ 	* gcc.target/riscv/zilsd-align-word-3.c: New test.
+ 	* gcc.target/riscv/zilsd-align-word-4.c: New test.
+ 	* gcc.target/riscv/zilsd-align-word-5.c: New test.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* gcc.target/riscv/intrinsic-detection-bitmanip.c: New test.
+ 	* gcc.target/riscv/intrinsic-detection-crypto.c: New test.
+ 	* gcc.target/riscv/intrinsic-detection-scalar-reverse.c: New test.
+ 	* gcc.target/riscv/intrinsic-detection-scalar.c: New test.
+ 	* gcc.target/riscv/rvv/base/intrinsic-detection.c: New test.
+ 
+ 2026-05-21  Xi Ruoyao  <xry111@xry111.site>
+ 
+ 	PR target/50481
+ 	* gcc.target/loongarch/la64/bitreverse.c: New test.
+ 
+ 2026-05-20  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* algol68/execute/entier-1.a68: Add test for FLOOR = ENTIER.
+ 	* algol68/compile/floor-1.a68: New test.
+ 
+ 2026-05-20  Shivam Gupta  <shivam98.tkg@gmail.com>
+ 
+ 	PR tree-optimization/112533
+ 	* gcc.dg/tree-ssa/narrow-bool-eq.c: New test.
+ 	* gcc.dg/tree-ssa/narrow-integral-eq.c: New test.
+ 	* gcc.dg/tree-ssa/narrow-short-eq.c: New test.
+ 	* gcc.dg/tree-ssa/narrow-float-eq.c: New test.
+ 
+ 2026-05-20  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/106546
+ 	* gfortran.dg/inline_matmul_27.f90: New test.
+ 
+ 2026-05-20  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/125236
+ 	* g++.dg/analyzer/torture/README.txt: New.
+ 	* g++.dg/analyzer/torture/std-string-ctor-large-literal.C: New
+ 	test.
+ 	* g++.dg/analyzer/torture/std-string-ctor-small-literal.C: New
+ 	test.
+ 	* g++.dg/analyzer/torture/std-string-default-ctor.C: New test.
+ 	* g++.dg/analyzer/torture/std-unique-ptr-1.C: New test.
+ 
+ 2026-05-20  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* c-c++-common/analyzer/ptr-subtraction-2.c: New test.
+ 
+ 2026-05-20  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/125304
+ 	* g++.dg/analyzer/torture/std-string-pr125304.C: New test.
+ 
+ 2026-05-20  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* g++.dg/analyzer/torture/analyzer-torture.exp: New script.
+ 
+ 2026-05-20  Michiel Derhaeg  <michiel@synopsys.com>
+ 
+ 	PR target/115650
+ 	* gcc.target/arc/sdata-6.c: New test.
+ 
+ 2026-05-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125373
+ 	* gcc.c-torture/compile/pr125373.c: New test.
+ 
+ 2026-05-20  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125357
+ 	* gcc.target/i386/avx-pr125357-2.c: New test.
+ 	* gcc.target/i386/avx2-pr125357-2.c: New test.
+ 
+ 2026-05-20  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* gcc.dg/loop-unswitch-19.c: New test.
+ 
+ 2026-05-20  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* gcc.dg/crc-builtin-rev-target32.c: Match the new
+ 	"emitting reversed crc table" dump message.
+ 	* gcc.dg/crc-builtin-rev-target64.c: Likewise.
+ 
+ 2026-05-19  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	* gcc.target/aarch64/pr123748.c: Use "long long" instead of "long".
+ 
+ 2026-05-19  Julian Brown  <julian@codesourcery.com>
+ 	    Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* gfortran.dg/gomp/declare-mapper-1.f90: New test.
+ 	* gfortran.dg/gomp/declare-mapper-2.f90: New test.
+ 
+ 2026-05-19  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/125304
+ 	* c-c++-common/analyzer/pointer-comparison-pr125304-eq.c: New test.
+ 	* c-c++-common/analyzer/pointer-comparison-pr125304-ge.c: New test.
+ 	* c-c++-common/analyzer/pointer-comparison-pr125304-gt.c: New test.
+ 	* c-c++-common/analyzer/pointer-comparison-pr125304-le.c: New test.
+ 	* c-c++-common/analyzer/pointer-comparison-pr125304-lt.c: New test.
+ 	* g++.dg/analyzer/pointer-casts-pr125304.C: New test.
+ 
+ 2026-05-19  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/123536
+ 	* g++.dg/cpp0x/lambda/lambda-const12.C: New test.
+ 	* g++.dg/cpp0x/lambda/lambda-const13.C: New test.
+ 	* g++.dg/cpp0x/lambda/lambda-const14.C: New test.
+ 	* g++.dg/template/local11.C: New test.
+ 
+ 2026-05-19  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	PR target/123748
+ 	* gcc.target/aarch64/pr123748.c: New test.
+ 
+ 2026-05-19  Christopher Bazley  <chris.bazley@arm.com>
+ 
+ 	* gcc.target/aarch64/sve/vec_construct_1.c: New test.
+ 	* gcc.target/aarch64/sve/vec_construct_2.c: New test.
+ 	* gcc.target/aarch64/sve/vec_construct_3.c: New test.
+ 	* gcc.target/aarch64/sve/vec_construct_4.c: New test.
+ 	* gcc.target/aarch64/sve/vec_construct_5.c: New test.
+ 	* gcc.target/aarch64/vec-construct-1.c: New test.
+ 	* gcc.target/aarch64/vec-construct-10.c: New test.
+ 	* gcc.target/aarch64/vec-construct-11.c: New test.
+ 	* gcc.target/aarch64/vec-construct-12.c: New test.
+ 	* gcc.target/aarch64/vec-construct-2.c: New test.
+ 	* gcc.target/aarch64/vec-construct-3.c: New test.
+ 	* gcc.target/aarch64/vec-construct-4.c: New test.
+ 	* gcc.target/aarch64/vec-construct-5.c: New test.
+ 	* gcc.target/aarch64/vec-construct-6.c: New test.
+ 	* gcc.target/aarch64/vec-construct-7.c: New test.
+ 	* gcc.target/aarch64/vec-construct-8.c: New test.
+ 	* gcc.target/aarch64/vec-construct-9.c: New test.
+ 
+ 2026-05-19  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/125336
+ 	* g++.dg/cpp2a/no_unique_address17.C: New test.
+ 	* g++.dg/cpp2a/no_unique_address18.C: New test.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* c-c++-common/gomp/clauses-2.c: Adjust testcase.
+ 	* c-c++-common/gomp/map-6.c: Adjust testcase.
+ 	* gfortran.dg/gomp/pr107214.f90: Adjust testcase.
+ 	* c-c++-common/gomp/map-multi-1.c: New test.
+ 	* c-c++-common/gomp/map-multi-2.c: New test.
+ 	* gfortran.dg/gomp/map-multi-1.f90: New test.
+ 	* gfortran.dg/gomp/map-multi-2.f90: New test.
+ 
+ 2026-05-19  Thomas Koenig  <tkoenig@gcc.gnu.org>
+ 
+ 	PR fortran/115260
+ 	* gfortran.dg/pr115260.f90: New test.
+ 
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR other/125348
+ 	* gcc.target/i386/pr117416-2.c (prefetch_test): Adjust expected
+ 	diagnostic spelling.
+ 	* gdc.test/compilable/dtoh_TemplateDeclaration.d: Fix comment
+ 	spelling, paramter -> parameter.
+ 
+ 2026-05-19  Roger Sayle  <roger@nextmovesoftware.com>
+ 
+ 	PR target/90483
+ 	PR libstdc++/118416
+ 	* gcc.target/i386/sse4_1-ptest-8.c: New test case.
+ 	* gcc.target/i386/sse4_1-ptest-9.c: Likewise.
+ 
+ 2026-05-19  Christophe Lyon  <christophe.lyon@arm.com>
+ 
+ 	PR target/124870
+ 	* gcc.target/arm/mve/intrinsics/pr124870.c: New test.
+ 
+ 2026-05-19  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/125357
+ 	* gcc.target/i386/avx-pr125357.c: New test.
+ 	* gcc.target/i386/avx2-pr125357.c: New test.
+ 
+ 2026-05-19  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/125355
+ 	* gcc.target/i386/pr125355-2.c: New test.
+ 
+ 2026-05-19  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	* lib/scanasm.exp (configure_check-function-bodies): Check
+ 	"*-*-mingw32" instead of "aarch64*-*-mingw32".
+ 
+ 2026-05-19  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/early-break-5.c: Remove redundant
+ 	comments.
+ 
+ 2026-05-19  Peter Bergner  <bergner@linux.ibm.com>
+ 	    Jeevitha Palanisamy  <jeevitha@linux.ibm.com>
+ 
+ 	* gcc.target/powerpc/amo3.c: New test.
+ 	* gcc.target/powerpc/amo4.c: Likewise.
+ 	* gcc.target/powerpc/amo5.c: Likewise.
+ 	* gcc.target/powerpc/amo6.c: Likewise.
+ 	* gcc.target/powerpc/amo7.c: Likewise.
+ 
+ 2026-05-19  Andi Kleen  <ak@gcc.gnu.org>
+ 
+ 	PR target/125351
+ 	* gcc.target/i386/pr125351.c: New test.
+ 
+ 2026-05-18  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* gcc.dg/tree-ssa/pr112095.c: Add -Wno-psabi to the options.
+ 	Look at release_ssa instead of optimization. Match
+ 	"<retval> = a_" in addition to "return a_".
+ 
+ 2026-05-18  Xin Wang  <yw987194828@gmail.com>
+ 
+ 	* gcc.dg/tree-prof/loop-split-4.c: New test.
+ 
+ 2026-05-18  Wang Yaduo  <wangyaduo@linux.alibaba.com>
+ 
+ 	* gcc.target/riscv/mcpu-xt-c9501fdvt.c: New test.
+ 
+ 2026-05-18  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* gcc.target/riscv/slt-1.c: Skip for -Oz as well.  Set explicit branch
+ 	cost.
+ 	* gcc.target/riscv/zba-shNadd-04.c: Add Zbb to command line switches.
+ 	* gcc.target/riscv/zba-slliuw.c: Add Zbs to command line switches.
+ 	* gcc.target/riscv/zbs-zext.c: Add Zbs to command line switches.
+ 	* gcc.target/riscv/shift-shift-6.c: New test.
+ 	* gcc.target/riscv/shift-shift-7.c: New test.
+ 	* gcc.target/riscv/amo/a-rvwmo-load-relaxed.c: Accept lh or lhu.
+ 	* gcc.target/riscv/amo/a-ztso-load-relaxed.c: Accept lh or lhu.
+ 	* gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c: Accept lh or lhu.
+ 	* gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c: Accept lh or lhu.
+ 	* gcc.target/riscv/pr105314.c: Set explicitly branch cost.
+ 	* gcc.target/riscv/pr105314-rtl.c: Set explicitly branch cost.
+ 
+ 2026-05-18  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* gcc.target/riscv/ext-dce-2.c: New test.
+ 
+ 2026-05-18  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* c-c++-common/analyzer/fibonacci.c: Update for change in message
+ 	wording.
+ 	* c-c++-common/analyzer/raw-data-cst-pr117262-1.c: Update for
+ 	change in param name.
+ 	* gcc.dg/analyzer/explode-2a.c: Likewise.
+ 	* gcc.dg/analyzer/pr93032-mztools-signed-char.c: Likewise.
+ 	* gcc.dg/analyzer/pr93032-mztools-unsigned-char.c: Likewise.
+ 
+ 2026-05-18  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/50481
+ 	* gcc.target/i386/gfni-builtin-bitreverse-1.c: New test.
+ 
+ 2026-05-18  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/125355
+ 	* gcc.target/i386/pr125355.c: New test.
+ 
  2026-05-16  Jakub Jelinek  <jakub@redhat.com>
  
  	PR target/50481
diff -Nrcpad gcc-17-20260517/gcc/testsuite/algol68/compile/floor-1.a68 gcc-17-20260524/gcc/testsuite/algol68/compile/floor-1.a68
*** gcc-17-20260517/gcc/testsuite/algol68/compile/floor-1.a68	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/algol68/compile/floor-1.a68	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,4 ----
+ # { dg-options "-fstropping=upper -std=algol68" } #
+ BEGIN # FLOOR is a GNU extension #
+       FLOOR 1.2 # { dg-error "indicant FLOOR has not been declared properly" } #
+ END
diff -Nrcpad gcc-17-20260517/gcc/testsuite/algol68/execute/entier-1.a68 gcc-17-20260524/gcc/testsuite/algol68/execute/entier-1.a68
*** gcc-17-20260517/gcc/testsuite/algol68/execute/entier-1.a68	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/algol68/execute/entier-1.a68	Sun May 24 22:32:07 2026
*************** BEGIN REAL x = 3.14, y = 3.80;
*** 4,8 ****
        LONG LONG REAL xxx = LONG LONG 3.14, yyy = LONG LONG 3.80;
        ASSERT (ENTIER x = 3 AND ENTIER y = 3);
        ASSERT (ENTIER xx = LONG 3 AND ENTIER yy = LONG 3);
!       ASSERT (ENTIER xxx = LONG LONG 3 AND ENTIER yyy = LONG LONG 3)
  END
--- 4,11 ----
        LONG LONG REAL xxx = LONG LONG 3.14, yyy = LONG LONG 3.80;
        ASSERT (ENTIER x = 3 AND ENTIER y = 3);
        ASSERT (ENTIER xx = LONG 3 AND ENTIER yy = LONG 3);
!       ASSERT (ENTIER xxx = LONG LONG 3 AND ENTIER yyy = LONG LONG 3);
!       ASSERT (ENTIER x = 3 AND FLOOR y = 3);
!       ASSERT (ENTIER xx = LONG 3 AND FLOOR yy = LONG 3);
!       ASSERT (ENTIER xxx = LONG LONG 3 AND FLOOR yyy = LONG LONG 3)
  END
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/fibonacci.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/fibonacci.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/fibonacci.c	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/fibonacci.c	Sun May 24 22:32:07 2026
*************** int fib (int n)
*** 6,9 ****
      return n;
  } 
  
! /* { dg-regexp "\[^\n\r\]+: warning: analysis bailed out early \\(\[0-9\]+ enodes\\) \[^\n\r\]*" } */
--- 6,9 ----
      return n;
  } 
  
! /* { dg-regexp "\[^\n\r\]+: warning: analysis bailed out early \\(\[0-9\]+ enodes for \[0-9\]+ snodes\\) \[^\n\r\]*" } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-eq.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-eq.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-eq.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-eq.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,179 ----
+ #include "analyzer-decls.h"
+ 
+ typedef __SIZE_TYPE__ size_t;
+ 
+ void *
+ hide_from_optimizer (const void *ptr)  __attribute__((noinline));
+ 
+ void *
+ hide_from_optimizer (const void *ptr)
+ {
+   return (void *)ptr;
+ }
+ 
+ unsigned char global_buf[1024];
+ 
+ void
+ test_pointer_eq (unsigned *p, int i, int j)
+ {
+   unsigned char local_declared_before_local_buf;
+   unsigned char local_buf[16];
+   unsigned char local_declared_after_local_buf;
+ 
+   __analyzer_eval (p == hide_from_optimizer (p)); // { dg-warning "TRUE" }
+   __analyzer_eval (local_buf == &local_buf[0]); // { dg-warning "TRUE" }
+ 
+   /* Comparisons with NULL.  */
+   __analyzer_eval (hide_from_optimizer (local_buf) == NULL); // { dg-warning "FALSE" }
+   __analyzer_eval (hide_from_optimizer (NULL) == NULL); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (NULL) == p); // { dg-warning "UNKNOWN" }
+ 
+   /* Same concrete base region.  */
+   {
+     // Same concrete offsets
+     __analyzer_eval (local_buf == hide_from_optimizer (&local_buf[0])); // { dg-warning "TRUE" }
+ 
+     // Different concrete offsets
+     __analyzer_eval (local_buf == hide_from_optimizer (&local_buf[1])); // { dg-warning "FALSE" }
+ 
+     // Same symbolic offset
+     __analyzer_eval (&local_buf[i] == hide_from_optimizer (&local_buf[i])); // { dg-warning "TRUE" }
+ 
+     // Possibly different symbolic offset
+     {
+       __analyzer_eval (&local_buf[i] == hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+       if (i == j)
+ 	{
+ 	  __analyzer_eval (&local_buf[i] == hide_from_optimizer (&local_buf[j])); // { dg-warning "TRUE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+       else
+ 	{
+ 	  __analyzer_eval (&local_buf[i] == hide_from_optimizer (&local_buf[j])); // { dg-warning "FALSE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+     }
+   }
+ 
+   /* Different concrete base regions.  */
+   {
+     __analyzer_eval (local_buf == hide_from_optimizer (global_buf)); // { dg-warning "FALSE" }
+ 
+     // Within the buffer, we're definitely not pointing at other locals
+     __analyzer_eval (&local_buf[0] == hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "FALSE" }
+     __analyzer_eval (&local_buf[15] == hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "FALSE" }
+ 
+     /* Outside the valid bounds of the buffer is undefined behavior.
+        We currently happen to return FALSE for such attempts to form
+        pointers to neighboring locals.  */
+     __analyzer_eval (&local_buf[-1] == hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "FALSE" }
+     __analyzer_eval (&local_buf[16] == hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "FALSE" }
+   }
+ 
+   /* Concrete vs symbolic where we know they're different
+      (buf is local, so param p can't point to it).  */
+   __analyzer_eval (local_buf == hide_from_optimizer (p)); // { dg-warning "FALSE" }
+ 
+   /* Concrete vs symbolic where we don't know they're different
+      (glob is global, so param p could point to it).  */
+   __analyzer_eval (global_buf == hide_from_optimizer (p)); // { dg-warning "UNKNOWN" }
+ 
+   // What about symbolic, could different offsets be the same?
+   // TODO: what about overflow of locals, to try to alias (undefined behavior)
+ }
+ 
+ void
+ test_nonempty_heap_allocs (void)
+ {
+   int i;
+ 
+   // Known non-zero size
+   void *p = __builtin_malloc (1024);
+   void *q = __builtin_malloc (1024);
+ 
+   __analyzer_eval (hide_from_optimizer (p) == p); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (p) == q); // { dg-warning "FALSE" }
+ 
+   __analyzer_eval (hide_from_optimizer (p) == &i); // { dg-warning "FALSE" }
+   __analyzer_eval (hide_from_optimizer (q) == &i); // { dg-warning "FALSE" }
+ 
+   __builtin_free (p);
+   __builtin_free (q);
+ }
+ 
+ void
+ test_maybe_empty_heap_allocs (size_t sz_p, size_t sz_q)
+ {
+   int i;
+ 
+   /* These could be zero-sized buffers, which some implementations
+      return null for.  */
+   void *p = __builtin_malloc (sz_p);
+   void *q = __builtin_malloc (sz_q);
+ 
+   __analyzer_eval (hide_from_optimizer (p) == p); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (p) == q); // { dg-warning "UNKNOWN" }
+ 
+   __analyzer_eval (hide_from_optimizer (p) == &i); // { dg-warning "FALSE" }
+   __analyzer_eval (hide_from_optimizer (q) == &i); // { dg-warning "FALSE" }
+ 
+   __builtin_free (p);
+   __builtin_free (q);
+ }
+ 
+ void
+ test_one_past_end (void)
+ {
+   int arr[10];
+   int *end = &arr[10];
+   __analyzer_eval (hide_from_optimizer (end) == &arr[10]); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (end) == &arr[9]); // { dg-warning "FALSE" }
+ }
+ 
+ void
+ test_string_literals (void)
+ {
+   const char *abc = "abc";
+   const char *def = "def";
+  
+   __analyzer_eval (hide_from_optimizer (abc) == &abc[0]); // { dg-warning "TRUE" }
+ 
+   __analyzer_eval (hide_from_optimizer (abc) == &abc[1]); // { dg-warning "FALSE" "ideal" { xfail *-*-* } }
+   // { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 }
+   
+   __analyzer_eval (hide_from_optimizer (abc) == &def[0]); // { dg-warning "FALSE" "ideal" { xfail *-*-* } }
+   // { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 }
+ 
+   __analyzer_eval (hide_from_optimizer (abc) == &def[1]); // { dg-warning "FALSE" "ideal" { xfail *-*-* } }
+   // { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 }
+ }
+ 
+ struct coord {int x; int y; };
+ 
+ void
+ test_struct_pointers (void)
+ {
+   struct coord c1;
+   struct coord c2;
+ 
+   __analyzer_eval (hide_from_optimizer (&c1) == &c1.x); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (&c1) == &c1.y); // { dg-warning "FALSE" }
+ 
+   __analyzer_eval (hide_from_optimizer (&c1) == &c2.x); // { dg-warning "FALSE" }
+   __analyzer_eval (hide_from_optimizer (&c1) == &c2.y); // { dg-warning "FALSE" }  
+ }
+ 
+ union u {int x; char y; };
+ 
+ void
+ test_union_pointers (void)
+ {
+   union u u1;
+   union u u2;
+ 
+   __analyzer_eval (hide_from_optimizer (&u1) == &u1.x); // { dg-warning "TRUE" }
+   __analyzer_eval (hide_from_optimizer (&u1) == &u1.y); // { dg-warning "TRUE" }
+ 
+   __analyzer_eval (hide_from_optimizer (&u1) == &u2.x); // { dg-warning "FALSE" }
+   __analyzer_eval (hide_from_optimizer (&u1) == &u2.y); // { dg-warning "FALSE" }  
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-ge.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-ge.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-ge.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-ge.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,73 ----
+ /* { dg-additional-options "-Wno-compare-distinct-pointer-types" { target c } } */
+ 
+ #include "analyzer-decls.h"
+ 
+ const void *
+ hide_from_optimizer (void *ptr)  __attribute__((noinline));
+ 
+ const void *
+ hide_from_optimizer (void *ptr)
+ {
+   return ptr;
+ }
+ 
+ unsigned char global_buf[1024];
+ 
+ void
+ test_pointer_ge (unsigned *p, int i, int j)
+ {
+   unsigned char local_declared_before_local_buf;
+   unsigned char local_buf[16];
+   unsigned char local_declared_after_local_buf;
+ 
+   __analyzer_eval (p >= hide_from_optimizer (p)); // { dg-warning "TRUE" }
+   __analyzer_eval (local_buf >= &local_buf[0]); // { dg-warning "TRUE" }
+ 
+   /* Same concrete base region.  */
+   {
+     // Same concrete offsets
+     __analyzer_eval (local_buf >= hide_from_optimizer (&local_buf[0])); // { dg-warning "TRUE" }
+     
+     // Different concrete offsets
+     __analyzer_eval (&local_buf[0] >= hide_from_optimizer (&local_buf[1])); // { dg-warning "FALSE" }
+     __analyzer_eval (&local_buf[1] >= hide_from_optimizer (&local_buf[0])); // { dg-warning "TRUE" }
+ 
+     // Same symbolic offset
+     __analyzer_eval (&local_buf[i] >= hide_from_optimizer (&local_buf[i])); // { dg-warning "TRUE" }
+ 
+     // Possibly different symbolic offset
+     {
+       __analyzer_eval (&local_buf[i] >= hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+       if (i == j)
+ 	{
+ 	  __analyzer_eval (&local_buf[i] >= hide_from_optimizer (&local_buf[j])); // { dg-warning "TRUE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+       else
+ 	{
+ 	  __analyzer_eval (&local_buf[i] >= hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+ 	}
+     }
+   }
+ 
+   /* Different concrete base regions.  */
+   {
+     __analyzer_eval (local_buf >= hide_from_optimizer (global_buf)); // { dg-warning "UNKNOWN" }
+ 
+     // We can't compare the addresses of locals
+     __analyzer_eval (&local_buf[0] >= hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "UNKNOWN" }
+     __analyzer_eval (&local_buf[15] >= hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "UNKNOWN" }
+   }
+ 
+   /* Concrete vs symbolic where we know they're different
+      (buf is local, so param p can't point to it).  */
+   __analyzer_eval (local_buf >= hide_from_optimizer (p)); // { dg-warning "UNKNOWN" "ideal behavior" { xfail *-*-* } }
+   // { dg-message "FALSE" "current behavior" { target *-*-* } .-1 }
+ 
+   /* Concrete vs symbolic where we don't know they're different
+      (glob is global, so param p could point to it).  */
+   __analyzer_eval (global_buf >= hide_from_optimizer (p)); // { dg-warning "UNKNOWN" }
+ 
+   // What about symbolic, could different offsets be the same?
+   // TODO: what about overflow of locals, to try to alias (undefined behavior)
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-gt.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-gt.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-gt.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-gt.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,74 ----
+ /* { dg-additional-options "-Wno-compare-distinct-pointer-types" { target c } } */
+ 
+ #include "analyzer-decls.h"
+ 
+ const void *
+ hide_from_optimizer (void *ptr)  __attribute__((noinline));
+ 
+ const void *
+ hide_from_optimizer (void *ptr)
+ {
+   return ptr;
+ }
+ 
+ unsigned char global_buf[1024];
+ 
+ void
+ test_pointer_gt (unsigned *p, int i, int j)
+ {
+   unsigned char local_declared_before_local_buf;
+   unsigned char local_buf[16];
+   unsigned char local_declared_after_local_buf;
+ 
+   __analyzer_eval (p > hide_from_optimizer (p)); // { dg-warning "FALSE" }
+   __analyzer_eval (local_buf > &local_buf[0]); // { dg-warning "FALSE" }
+ 
+   /* Same concrete base region.  */
+   {
+     // Same concrete offsets
+     __analyzer_eval (local_buf > hide_from_optimizer (&local_buf[0])); // { dg-warning "FALSE" }
+     
+     // Different concrete offsets
+     __analyzer_eval (&local_buf[0] > hide_from_optimizer (&local_buf[1])); // { dg-warning "FALSE" }
+     __analyzer_eval (&local_buf[1] > hide_from_optimizer (&local_buf[0])); // { dg-warning "TRUE" }
+ 
+     // Same symbolic offset
+     __analyzer_eval (&local_buf[i] > hide_from_optimizer (&local_buf[i])); // { dg-warning "FALSE" }
+ 
+     // Possibly different symbolic offset
+     {
+       __analyzer_eval (&local_buf[i] > hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+       if (i == j)
+ 	{
+ 	  __analyzer_eval (&local_buf[i] > hide_from_optimizer (&local_buf[j])); // { dg-warning "FALSE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+       else
+ 	{
+ 	  __analyzer_eval (&local_buf[i] > hide_from_optimizer (&local_buf[j])); // { dg-warning "TRUE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+     }
+   }
+ 
+   /* Different concrete base regions.  */
+   {
+     __analyzer_eval (local_buf > hide_from_optimizer (global_buf)); // { dg-warning "UNKNOWN" }
+ 
+     // We can't compare the addresses of locals
+     __analyzer_eval (&local_buf[0] > hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "UNKNOWN" }
+     __analyzer_eval (&local_buf[15] > hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "UNKNOWN" }
+   }
+ 
+   /* Concrete vs symbolic where we know they're different
+      (buf is local, so param p can't point to it).  */
+   __analyzer_eval (local_buf > hide_from_optimizer (p)); // { dg-warning "UNKNOWN" "ideal behavior" { xfail *-*-* } }
+   // { dg-message "FALSE" "current behavior" { target *-*-* } .-1 }
+ 
+   /* Concrete vs symbolic where we don't know they're different
+      (glob is global, so param p could point to it).  */
+   __analyzer_eval (global_buf > hide_from_optimizer (p)); // { dg-warning "UNKNOWN" }
+ 
+   // What about symbolic, could different offsets be the same?
+   // TODO: what about overflow of locals, to try to alias (undefined behavior)
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-le.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-le.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-le.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-le.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,73 ----
+ /* { dg-additional-options "-Wno-compare-distinct-pointer-types" { target c } } */
+ 
+ #include "analyzer-decls.h"
+ 
+ const void *
+ hide_from_optimizer (void *ptr)  __attribute__((noinline));
+ 
+ const void *
+ hide_from_optimizer (void *ptr)
+ {
+   return ptr;
+ }
+ 
+ unsigned char global_buf[1024];
+ 
+ void
+ test_pointer_le (unsigned *p, int i, int j)
+ {
+   unsigned char local_declared_before_local_buf;
+   unsigned char local_buf[16];
+   unsigned char local_declared_after_local_buf;
+ 
+   __analyzer_eval (p <= hide_from_optimizer (p)); // { dg-warning "TRUE" }
+   __analyzer_eval (local_buf <= &local_buf[0]); // { dg-warning "TRUE" }
+ 
+   /* Same concrete base region.  */
+   {
+     // Same concrete offsets
+     __analyzer_eval (local_buf <= hide_from_optimizer (&local_buf[0])); // { dg-warning "TRUE" }
+     
+     // Different concrete offsets
+     __analyzer_eval (&local_buf[0] <= hide_from_optimizer (&local_buf[1])); // { dg-warning "TRUE" }
+     __analyzer_eval (&local_buf[1] <= hide_from_optimizer (&local_buf[0])); // { dg-warning "FALSE" }
+ 
+     // Same symbolic offset
+     __analyzer_eval (&local_buf[i] <= hide_from_optimizer (&local_buf[i])); // { dg-warning "TRUE" }
+ 
+     // Possibly different symbolic offset
+     {
+       __analyzer_eval (&local_buf[i] <= hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+       if (i == j)
+ 	{
+ 	  __analyzer_eval (&local_buf[i] <= hide_from_optimizer (&local_buf[j])); // { dg-warning "TRUE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+       else
+ 	{
+ 	  __analyzer_eval (&local_buf[i] <= hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+ 	}
+     }
+   }
+ 
+   /* Different concrete base regions.  */
+   {
+     __analyzer_eval (local_buf <= hide_from_optimizer (global_buf)); // { dg-warning "UNKNOWN" }
+ 
+     // We can't compare the addresses of locals
+     __analyzer_eval (&local_buf[0] <= hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "UNKNOWN" }
+     __analyzer_eval (&local_buf[15] <= hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "UNKNOWN" }
+   }
+ 
+   /* Concrete vs symbolic where we know they're different
+      (buf is local, so param p can't point to it).  */
+   __analyzer_eval (local_buf <= hide_from_optimizer (p)); // { dg-warning "UNKNOWN" "ideal behavior" { xfail *-*-* } }
+   // { dg-message "FALSE" "current behavior" { target *-*-* } .-1 }
+ 
+   /* Concrete vs symbolic where we don't know they're different
+      (glob is global, so param p could point to it).  */
+   __analyzer_eval (global_buf <= hide_from_optimizer (p)); // { dg-warning "UNKNOWN" }
+ 
+   // What about symbolic, could different offsets be the same?
+   // TODO: what about overflow of locals, to try to alias (undefined behavior)
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-lt.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-lt.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-lt.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/pointer-comparison-pr125304-lt.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,74 ----
+ /* { dg-additional-options "-Wno-compare-distinct-pointer-types" { target c } } */
+ 
+ #include "analyzer-decls.h"
+ 
+ const void *
+ hide_from_optimizer (void *ptr)  __attribute__((noinline));
+ 
+ const void *
+ hide_from_optimizer (void *ptr)
+ {
+   return ptr;
+ }
+ 
+ unsigned char global_buf[1024];
+ 
+ void
+ test_pointer_lt (unsigned *p, int i, int j)
+ {
+   unsigned char local_declared_before_local_buf;
+   unsigned char local_buf[16];
+   unsigned char local_declared_after_local_buf;
+ 
+   __analyzer_eval (p < hide_from_optimizer (p)); // { dg-warning "FALSE" }
+   __analyzer_eval (local_buf < &local_buf[0]); // { dg-warning "FALSE" }
+ 
+   /* Same concrete base region.  */
+   {
+     // Same concrete offsets
+     __analyzer_eval (local_buf < hide_from_optimizer (&local_buf[0])); // { dg-warning "FALSE" }
+     
+     // Different concrete offsets
+     __analyzer_eval (&local_buf[0] < hide_from_optimizer (&local_buf[1])); // { dg-warning "TRUE" }
+     __analyzer_eval (&local_buf[1] < hide_from_optimizer (&local_buf[0])); // { dg-warning "FALSE" }
+ 
+     // Same symbolic offset
+     __analyzer_eval (&local_buf[i] < hide_from_optimizer (&local_buf[i])); // { dg-warning "FALSE" }
+ 
+     // Possibly different symbolic offset
+     {
+       __analyzer_eval (&local_buf[i] < hide_from_optimizer (&local_buf[j])); // { dg-warning "UNKNOWN" }
+       if (i == j)
+ 	{
+ 	  __analyzer_eval (&local_buf[i] < hide_from_optimizer (&local_buf[j])); // { dg-warning "FALSE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+       else
+ 	{
+ 	  __analyzer_eval (&local_buf[i] < hide_from_optimizer (&local_buf[j])); // { dg-warning "TRUE" "ideal behavior" { xfail *-*-* } }
+ 	  // { dg-message "UNKNOWN" "current behavior" { target *-*-* } .-1 }
+ 	}
+     }
+   }
+ 
+   /* Different concrete base regions.  */
+   {
+     __analyzer_eval (local_buf < hide_from_optimizer (global_buf)); // { dg-warning "UNKNOWN" }
+ 
+     // We can't compare the addresses of locals
+     __analyzer_eval (&local_buf[0] < hide_from_optimizer (&local_declared_before_local_buf)); // { dg-warning "UNKNOWN" }
+     __analyzer_eval (&local_buf[15] < hide_from_optimizer (&local_declared_after_local_buf)); // { dg-warning "UNKNOWN" }
+   }
+ 
+   /* Concrete vs symbolic where we know they're different
+      (buf is local, so param p can't point to it).  */
+   __analyzer_eval (local_buf < hide_from_optimizer (p)); // { dg-warning "UNKNOWN" "ideal behavior" { xfail *-*-* } }
+   // { dg-message "FALSE" "current behavior" { target *-*-* } .-1 }
+ 
+   /* Concrete vs symbolic where we don't know they're different
+      (glob is global, so param p could point to it).  */
+   __analyzer_eval (global_buf < hide_from_optimizer (p)); // { dg-warning "UNKNOWN" }
+ 
+   // What about symbolic, could different offsets be the same?
+   // TODO: what about overflow of locals, to try to alias (undefined behavior)
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-2.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-2.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/ptr-subtraction-2.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,28 ----
+ #include "analyzer-decls.h"
+ 
+ typedef __PTRDIFF_TYPE__ ptrdiff_t;
+ typedef __SIZE_TYPE__ size_t;
+ 
+ ptrdiff_t
+ ptrdiff_hidden_from_optimizer (const char *, const char *)
+   __attribute__((noinline));
+ 
+ ptrdiff_t
+ ptrdiff_hidden_from_optimizer (const char *p, const char *q)
+ {
+   return p - q;
+ }
+ 
+ void
+ test_concrete (void)
+ {
+   const char *abc = "abc";
+   __analyzer_eval (ptrdiff_hidden_from_optimizer (abc + 3, abc) == 3); // { dg-warning "TRUE" }
+ }
+ 
+ void
+ test_symbolic (size_t sz)
+ {
+   const char *abc = "abc";
+   __analyzer_eval (ptrdiff_hidden_from_optimizer (abc + sz, abc) == sz); // { dg-warning "TRUE" }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/c-c++-common/analyzer/raw-data-cst-pr117262-1.c	Sun May 24 22:32:07 2026
***************
*** 1,4 ****
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=50 --param analyzer-bb-explosion-factor=50" } */
  
  int
  main ()
--- 1,4 ----
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=50 --param analyzer-supernode-explosion-factor=50" } */
  
  int
  main ()
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/clauses-2.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/clauses-2.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/clauses-2.c	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/clauses-2.c	Sun May 24 22:32:07 2026
*************** foo (int *p, int q, struct S t, int i, i
*** 15,23 ****
      bar (p);
    #pragma omp target map (p) , map (p[0])
      bar (p);
!   #pragma omp target map (q) map (q) /* { dg-error "appears more than once in map clauses" } */
      bar (&q);
!   #pragma omp target map (p[0]) map (p[0]) /* { dg-error "appears more than once in data clauses" } */
      bar (p);
    #pragma omp target map (t) map (t.r)
      bar (&t.r);
--- 15,23 ----
      bar (p);
    #pragma omp target map (p) , map (p[0])
      bar (p);
!   #pragma omp target map(q) map(q)
      bar (&q);
!   #pragma omp target map(p[0]) map(p[0])
      bar (p);
    #pragma omp target map (t) map (t.r)
      bar (&t.r);
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/declare-mapper-19.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/declare-mapper-19.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/declare-mapper-19.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/declare-mapper-19.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile { target { c || c++11 } } } */
+ /* { dg-additional-options "-fdump-tree-original" } */
+ 
+ typedef struct {
+   int a, b, c, d;
+ } S;
+ 
+ #pragma omp declare mapper (S s) map(alloc: s.a) map(to: s.b) map(from: s.c) \
+ 				 map(tofrom: s.d)
+ #pragma omp declare mapper (update: S s) map(s.a, s.b, s.c, s.d)
+ 
+ int main()
+ {
+   S v;
+ #pragma omp target update to(v)
+ /* { dg-warning {dropping .from. clause during mapper expansion in .#pragma omp target update.} "" { target *-*-* } .-1 } */
+ /* { dg-warning {dropping .alloc. clause during mapper expansion in .#pragma omp target update.} "" { target *-*-* } .-2 } */
+ /* { dg-final { scan-tree-dump-times {(?n)update to\(v\.d\) to\(v\.b\)$} 1 "original" } } */
+ #pragma omp target update from(v)
+ /* { dg-warning {dropping .to. clause during mapper expansion in .#pragma omp target update.} "" { target *-*-* } .-1 } */
+ /* { dg-warning {dropping .alloc. clause during mapper expansion in .#pragma omp target update.} "" { target *-*-* } .-2 } */
+ /* { dg-final { scan-tree-dump-times {(?n)update from\(v\.d\) from\(v\.c\)$} 1 "original" } } */
+ 
+ #pragma omp target update to(mapper(update): v)
+ /* { dg-final { scan-tree-dump-times {(?n)update to\(v\.d\) to\(v\.c\) to\(v\.b\) to\(v\.a\)$} 1 "original" } } */
+ #pragma omp target update from(mapper(update): v)
+ /* { dg-final { scan-tree-dump-times {(?n)update from\(v\.d\) from\(v\.c\) from\(v\.b\) from\(v\.a\)$} 1 "original" } } */
+ 
+ #pragma omp target update to(present, mapper(update): v)
+ /* { dg-final { scan-tree-dump-times {(?n)update to\(present:v\.d\) to\(present:v\.c\) to\(present:v\.b\) to\(present:v\.a\)$} 2 "original" } } */
+ #pragma omp target update from(present, mapper(update): v)
+ /* { dg-final { scan-tree-dump-times {(?n)update from\(present:v\.d\) from\(present:v\.c\) from\(present:v\.b\) from\(present:v\.a\)$} 2 "original" } } */
+ 
+ #pragma omp target update to(present: v.a, v.b, v.c, v.d)
+ #pragma omp target update from(present: v.a, v.b, v.c, v.d)
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-6.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-6.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-6.c	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-6.c	Sun May 24 22:32:07 2026
*************** foo (void)
*** 157,166 ****
    #pragma omp target map (always, close)
    ;
  
!   #pragma omp target map (always, always)  /* { dg-error "'always' appears more than once in map clauses" } */
    ;
  
!   #pragma omp target map (always, always, close)  /* { dg-error "'always' appears more than once in map clauses" } */
    ;
  
    #pragma omp target map (always, close, to: always, close, b7)
--- 157,166 ----
    #pragma omp target map (always, close)
    ;
  
!   #pragma omp target map (always, always)
    ;
  
!   #pragma omp target map (always, always, close)
    ;
  
    #pragma omp target map (always, close, to: always, close, b7)
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-multi-1.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-multi-1.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-multi-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-multi-1.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,36 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-fdump-tree-original" } */
+ 
+ /* Check that extraneous clauses mapping the same variable multiple times are
+    either removed or merged.  */
+ 
+ #define DIM 17
+ 
+ void f (int *x)
+ {
+   #pragma omp target map(alloc: x) map(to: x) map(alloc: x) map(from: x) map(alloc: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(alloc: x) map(alloc: x) map(alloc: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(alloc: x) map(to: x) map(alloc: x) map(to: x) map(alloc: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(alloc: x) map(from: x) map(alloc: x) map(from: x) map(alloc: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+ }
+ 
+ /* { dg-final { scan-tree-dump-times {map\(tofrom:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(alloc:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(to:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(from:x\)} 1 "original" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-multi-2.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-multi-2.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/map-multi-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/map-multi-2.c	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-fdump-tree-original" } */
+ 
+ /* Check that map clauses are only merged if they have the same modifiers.  */
+ 
+ #define DIM 17
+ 
+ void f (int *x)
+ {
+   #pragma omp target map(always, to: x) map(tofrom: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(tofrom: x) map(always, from: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(to: x) map(present, alloc: x) map(from: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(close,always,from: x) map(close,present,alloc: x) map(present,to: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+   #pragma omp target map(always,to: x) map(always,present,alloc: x) map(present,from: x)
+     {
+       for (int i = 0; i < DIM; i++)
+         x[i] += i;
+     }
+ }
+ 
+ /* { dg-final { scan-tree-dump-times {map\(tofrom:x\) map\(always,to:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(always,from:x\) map\(tofrom:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(present,alloc:x\) map\(tofrom:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(present,to:x\) map\(always,from:x\)} 1 "original" } } */
+ /* { dg-final { scan-tree-dump-times {map\(present,from:x\) map\(always,to:x\)} 1 "original" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c
*** gcc-17-20260517/gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/c-c++-common/gomp/target-update-iterators-1.c	Sun May 24 22:32:07 2026
*************** void f (int **x, float **y)
*** 15,21 ****
    #pragma omp target update to (iterator(i=0:DIM1), iterator(j=0:DIM2): x[i][j]) /* { dg-error "too many 'iterator' modifiers" } */
    /* { dg-error "'#pragma omp target update' must contain at least one 'from' or 'to' clauses" "" { target *-*-* } .-1 } */
  
!   #pragma omp target update from (iterator(i=0:DIM1), something: x[i][j]) /* { dg-error "'from' clause with modifier other than 'iterator' or 'present'" } */
    /* { dg-error "expected '\\)' before 'something'" "" { target c } .-1 } */
    /* { dg-error "'#pragma omp target update' must contain at least one 'from' or 'to' clauses" "" { target *-*-* } .-2 } */
  }
--- 15,21 ----
    #pragma omp target update to (iterator(i=0:DIM1), iterator(j=0:DIM2): x[i][j]) /* { dg-error "too many 'iterator' modifiers" } */
    /* { dg-error "'#pragma omp target update' must contain at least one 'from' or 'to' clauses" "" { target *-*-* } .-1 } */
  
!   #pragma omp target update from (iterator(i=0:DIM1), something: x[i][j]) /* { dg-error "'from' clause with modifier other than 'iterator', 'mapper', or 'present'" } */
    /* { dg-error "expected '\\)' before 'something'" "" { target c } .-1 } */
    /* { dg-error "'#pragma omp target update' must contain at least one 'from' or 'to' clauses" "" { target *-*-* } .-2 } */
  }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/DRs/dr2581-1.C gcc-17-20260524/gcc/testsuite/g++.dg/DRs/dr2581-1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/DRs/dr2581-1.C	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/DRs/dr2581-1.C	Sun May 24 22:32:07 2026
***************
*** 94,100 ****
  #undef __cpp_template_parameters
  #undef __cpp_template_template_args	// { dg-warning "undefining '__cpp_template_template_args'" "" { target c++20 } }
  #undef __cpp_threadsafe_static_init	// { dg-warning "undefining '__cpp_threadsafe_static_init'" "" { target c++20 } }
! #undef __cpp_trivial_union
  #undef __cpp_unicode_characters		// { dg-warning "undefining '__cpp_unicode_characters'" "" { target c++20 } }
  #undef __cpp_unicode_literals		// { dg-warning "undefining '__cpp_unicode_literals'" "" { target c++20 } }
  #undef __cpp_user_defined_literals	// { dg-warning "undefining '__cpp_user_defined_literals'" "" { target c++20 } }
--- 94,100 ----
  #undef __cpp_template_parameters
  #undef __cpp_template_template_args	// { dg-warning "undefining '__cpp_template_template_args'" "" { target c++20 } }
  #undef __cpp_threadsafe_static_init	// { dg-warning "undefining '__cpp_threadsafe_static_init'" "" { target c++20 } }
! #undef __cpp_trivial_union		// { dg-warning "undefining '__cpp_trivial_union'" "" { target c++26 } }
  #undef __cpp_unicode_characters		// { dg-warning "undefining '__cpp_unicode_characters'" "" { target c++20 } }
  #undef __cpp_unicode_literals		// { dg-warning "undefining '__cpp_unicode_literals'" "" { target c++20 } }
  #undef __cpp_user_defined_literals	// { dg-warning "undefining '__cpp_user_defined_literals'" "" { target c++20 } }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/DRs/dr2581-2.C gcc-17-20260524/gcc/testsuite/g++.dg/DRs/dr2581-2.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/DRs/dr2581-2.C	Sun May 17 22:32:07 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/DRs/dr2581-2.C	Sun May 24 22:32:07 2026
***************
*** 95,101 ****
  #define __cpp_template_parameters 202502L
  #define __cpp_template_template_args 201611L	// { dg-error "'__cpp_template_template_args' redefined" "" { target c++20 } }
  #define __cpp_threadsafe_static_init 200806L	// { dg-error "'__cpp_threadsafe_static_init' redefined" "" { target c++20 } }
! #define __cpp_trivial_union 202502L
  #define __cpp_unicode_characters 200704L	// { dg-error "'__cpp_unicode_characters' redefined" "" { target c++17 } }
  #define __cpp_unicode_literals 200710L		// { dg-error "'__cpp_unicode_literals' redefined" "" { target c++20 } }
  #define __cpp_user_defined_literals 200809L	// { dg-error "'__cpp_user_defined_literals' redefined" "" { target c++20 } }
--- 95,101 ----
  #define __cpp_template_parameters 202502L
  #define __cpp_template_template_args 201611L	// { dg-error "'__cpp_template_template_args' redefined" "" { target c++20 } }
  #define __cpp_threadsafe_static_init 200806L	// { dg-error "'__cpp_threadsafe_static_init' redefined" "" { target c++20 } }
! #define __cpp_trivial_union 202502L		// { dg-error "'__cpp_trivial_union' redefined" "" { target c++26 } }
  #define __cpp_unicode_characters 200704L	// { dg-error "'__cpp_unicode_characters' redefined" "" { target c++17 } }
  #define __cpp_unicode_literals 200710L		// { dg-error "'__cpp_unicode_literals' redefined" "" { target c++20 } }
  #define __cpp_user_defined_literals 200809L	// { dg-error "'__cpp_user_defined_literals' redefined" "" { target c++20 } }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/pointer-casts-pr125304.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/pointer-casts-pr125304.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/pointer-casts-pr125304.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/pointer-casts-pr125304.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,22 ----
+ #include "../../gcc.dg/analyzer/analyzer-decls.h"
+ 
+ template <typename Src, typename Dst>
+ Dst *
+ ptr_cast (Src *ptr)  __attribute__((noinline));
+ 
+ template <typename Src, typename Dst>
+ Dst *
+ ptr_cast (Src *ptr)
+ {
+   return (Dst *)ptr;
+ }
+ 
+ void test_equality (unsigned *p)
+ {
+   __analyzer_eval (p == (unsigned *)ptr_cast<unsigned, signed> (p)); // { dg-warning "TRUE" }
+ 
+   unsigned char buf[16];
+   __analyzer_eval (buf == &buf[0]); // { dg-warning "TRUE" }
+ 
+   __analyzer_eval (buf == (unsigned char*)ptr_cast<unsigned char, signed char> (&buf[0])); // { dg-warning "TRUE" }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/README.txt gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/README.txt
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/README.txt	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/README.txt	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,16 ----
+ Various tests in this directory directly use the libstdc++ headers,
+ providing an end-to-end test of the interaction of -fanalyzer and
+ libstdc++ at various optimization levels.
+ 
+ libstdc++-v3/doc/xml/manual/using.xml
+ (https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html)
+ notes that by default, glibcxx assertions are enabled at -O0, and
+ disabled at -O1 and above.
+ 
+ We will explicitly disable them in some tests via:
+   // { dg-additional-options "-D_GLIBCXX_NO_ASSERTIONS" }
+ 
+ With optimizations, many tests simplify to be within the analyzer's
+ normal limits, however at -O0 we may need to turn up
+   --param=analyzer-supernode-explosion-factor=
+ for the analyzer to fully explore the code.
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/analyzer-torture.exp gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/analyzer-torture.exp
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/analyzer-torture.exp	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/analyzer-torture.exp	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,44 ----
+ #   Copyright (C) 2020-2026 Free Software Foundation, Inc.
+ 
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ # 
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ # 
+ # You should have received a copy of the GNU General Public License
+ # along with GCC; see the file COPYING3.  If not see
+ # <http://www.gnu.org/licenses/>.
+ 
+ # This harness is for tests that should be run at all optimisation levels.
+ 
+ load_lib g++-dg.exp
+ 
+ # If the analyzer has not been enabled, bail.
+ if { ![check_effective_target_analyzer] } {
+     return
+ }
+ 
+ dg-init
+ 
+ global DEFAULT_CXXFLAGS
+ if [info exists DEFAULT_CXXFLAGS] then {
+   set save_default_cxxflags $DEFAULT_CXXFLAGS
+ }
+ 
+ # If a testcase doesn't have special options, use these.
+ set DEFAULT_CXXFLAGS " -fanalyzer -Wanalyzer-too-complex"
+ 
+ gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" $DEFAULT_CXXFLAGS
+ 
+ dg-finish
+ 
+ if [info exists save_default_cxxflags] {
+   set DEFAULT_CXXFLAGS $save_default_cxxflags
+ } else {
+   unset DEFAULT_CXXFLAGS
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-large-literal.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-large-literal.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-large-literal.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-large-literal.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,23 ----
+ /* Verify that the analyzer is silent on correct usage of std::string,
+    using <string>.  */
+ 
+ // { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } }
+ 
+ /* Leaving assertions at default: we seem to need assertions at -O0
+    for the test to pass.  */
+ 
+ // { dg-additional-options "--param=analyzer-supernode-explosion-factor=10" }
+ 
+ #include "../../../gcc.dg/analyzer/analyzer-decls.h"
+ #include <string>
+ 
+ void
+ test_ctor_large ()
+ {
+   std::string s {"0123456789012345678901234567890123456789"
+ 		 "0123456789012345678901234567890123456789"};
+   __analyzer_eval (s.length () == 80); // { dg-warning "TRUE" }
+   __analyzer_eval (s.size () == 80); // { dg-warning "TRUE" }
+   __analyzer_eval (__builtin_strlen (s.c_str ()) == 80); // { dg-warning "TRUE" "ideal" { xfail *-*-* } }
+   // { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-small-literal.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-small-literal.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-small-literal.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-ctor-small-literal.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,22 ----
+ /* Verify that the analyzer is silent on correct usage of std::string,
+    using <string>.  */
+ 
+ // { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } }
+ 
+ /* Leaving assertions at default: we seem to need assertions at -O0
+    for the test to pass.  */
+ 
+ // { dg-additional-options "--param=analyzer-supernode-explosion-factor=10" }
+ 
+ #include "../../../gcc.dg/analyzer/analyzer-decls.h"
+ #include <string>
+ 
+ void
+ test_ctor_small ()
+ {
+   std::string s {"abc"};
+   __analyzer_eval (s.length () == 3); // { dg-warning "TRUE" }
+   __analyzer_eval (s.size () == 3); // { dg-warning "TRUE" }
+   __analyzer_eval (__builtin_strlen (s.c_str ()) == 3); // { dg-warning "TRUE" "ideal" { xfail *-*-* } }
+   // { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-default-ctor.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-default-ctor.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-default-ctor.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-default-ctor.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,19 ----
+ /* Verify that the analyzer is silent on correct usage of std::string,
+    using <string>.  */
+ 
+ // { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } }
+ 
+ /* Leaving assertions at default: we seem to need assertions at -O0
+    for the test to pass.  */
+ 
+ #include "../../../gcc.dg/analyzer/analyzer-decls.h"
+ #include <string>
+ 
+ void
+ test_ctor_empty ()
+ {
+   std::string s;
+   __analyzer_eval (s.length () == 0); // { dg-warning "TRUE" }
+   __analyzer_eval (s.size () == 0); // { dg-warning "TRUE" }
+   __analyzer_eval (__builtin_strlen (s.c_str()) == 0); // { dg-warning "TRUE" }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-pr125304.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-pr125304.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-string-pr125304.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-string-pr125304.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,122 ----
+ /* Reproduced from libstdc++ at r17-368-gb1cd9bd9908b0f
+    with assertions disabled.  */
+ 
+ /* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
+ 
+ void __analyzer_eval(int);
+ namespace std {
+ template <class> struct char_traits;
+ template <typename _Tp> struct remove_reference {
+   using type = _Tp;
+ };
+ bool is_constant_evaluated() { return 0; }
+ 
+ template <typename _Tp> remove_reference<_Tp>::type move(_Tp);
+ template <typename _Tp> _Tp *addressof(_Tp &__r) {
+   return __builtin_addressof(__r);
+ }
+ template <typename _Tp> struct __ptr_traits_ptr_to {
+   static _Tp *pointer_to(_Tp &__r) { return addressof(__r); }
+ };
+ template <typename> struct pointer_traits;
+ template <typename _Tp>
+ struct pointer_traits<_Tp *> : __ptr_traits_ptr_to<_Tp> {};
+ static void assign(char &__c1, const char &__c2) { __c1 = __c2; }
+ template <> struct char_traits<char> {};
+ template <typename> struct allocator {
+   void deallocate(char *__p, long) { __builtin_operator_delete(__p); }
+ };
+ template <typename> struct allocator_traits;
+ using size_type = __SIZE_TYPE__;
+ template <typename _Tp> struct allocator_traits<allocator<_Tp>> {
+   using pointer = _Tp *;
+   using const_pointer = const _Tp *;
+   static void deallocate(allocator<_Tp> __a, pointer __p, size_type __n) {
+     __a.deallocate(__p, __n);
+   }
+ };
+ } // namespace std
+ struct __alloc_traits : std::allocator_traits<std::allocator<char>> {};
+ namespace std {
+ template <typename _CharT, typename, typename _Alloc> struct basic_string {
+   typedef __alloc_traits _Alloc_traits;
+   typedef char_traits<char> traits_type;
+   typedef _Alloc allocator_type;
+   typedef _Alloc_traits::pointer pointer;
+   typedef _Alloc_traits::const_pointer const_pointer;
+   // Keep everything from here onwards
+   struct _Alloc_hider : allocator_type {
+     _Alloc_hider(pointer __dat, _Alloc &&__a = _Alloc())
+         : allocator_type(std::move(__a)), _M_p(__dat) {}
+     pointer _M_p;
+   };
+   _Alloc_hider _M_dataplus;
+   size_type _M_string_length;
+   enum { _S_local_capacity = 15 / sizeof(_CharT) };
+   union {
+     _CharT _M_local_buf[_S_local_capacity + 1];
+     size_type _M_allocated_capacity;
+   };
+   void _M_length(size_type __length) { _M_string_length = __length; }
+   pointer _M_data() const { return _M_dataplus._M_p; }
+   pointer _M_local_data() {
+     return std::pointer_traits<pointer>::pointer_to(*_M_local_buf);
+   }
+   const_pointer _M_local_data() const {
+     return std::pointer_traits<const_pointer>::pointer_to(*_M_local_buf);
+   }
+   void _M_set_length(size_type __n) {
+     assign(_M_data()[__n], _CharT());
+     _M_length(__n);
+   }
+ 
+ public:
+   bool _M_is_local() const {
+     if (_M_data() == _M_local_data()) {
+       if (_M_string_length > _S_local_capacity)
+         __builtin_unreachable();
+       return true;
+     }
+     return false;
+   }
+ 
+ private:
+   void _M_dispose() {
+     if (!_M_is_local())
+       _M_destroy(_M_allocated_capacity);
+   }
+   void _M_destroy(size_type __size) throw() {
+     _Alloc_traits::deallocate(_M_get_allocator(), _M_data(), __size + 1);
+   };
+   ;
+   ;
+   allocator_type &_M_get_allocator();
+   __attribute__((__always_inline__)) void _M_init_local_buf() noexcept {
+     if (std::is_constant_evaluated())
+       for (size_type __i = 0; __i <= _S_local_capacity; ++__i)
+         _M_local_buf[__i] = _CharT();
+   }
+ 
+ public:
+   basic_string() : _M_dataplus(_M_local_data()) {
+     _M_init_local_buf();
+     _M_set_length(0);
+   };
+   ~basic_string() { _M_dispose(); }
+   size_type size() const noexcept {
+     size_type __sz = _M_string_length;
+     return __sz;
+   }
+   size_type length() const noexcept { return size(); }
+ };
+ 
+ typedef basic_string<char, char_traits<char>, allocator<char>> string;
+ 
+ } // namespace std
+ 
+ void test_ctor_empty() {
+   std::string s;
+   __analyzer_eval(s.length() == 0); // { dg-warning "TRUE" }
+   __analyzer_eval(s.size() == 0);   // { dg-warning "TRUE" }
+   __analyzer_eval(s._M_is_local()); // { dg-warning "TRUE" }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-unique-ptr-1.C gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-unique-ptr-1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/analyzer/torture/std-unique-ptr-1.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/analyzer/torture/std-unique-ptr-1.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-skip-if "" { *-*-* } { "-fno-fat-lto-objects" } { "" } } */
+ 
+ // { dg-additional-options "-D_GLIBCXX_NO_ASSERTIONS" }
+ // { dg-additional-options "--param=analyzer-supernode-explosion-factor=10" }
+ 
+ #include "../../../gcc.dg/analyzer/analyzer-decls.h"
+ #include <memory>
+ 
+ void
+ test_null_deref_1 ()
+ {
+   std::unique_ptr<int> p;
+   __analyzer_eval (*p == 42); // { dg-warning "null-dereference" }
+ }
+ 
+ void
+ test_null_deref_2 ()
+ {
+   auto p = std::make_unique<int> (42);
+   __analyzer_eval (*p == 42); // { dg-warning "TRUE" }
+   p = nullptr;
+   __analyzer_eval (*p); // { dg-warning "null-dereference" }
+ }
+ 
+ void
+ test_use_after_free ()
+ {
+   auto p = std::make_unique<int> (42);
+   __analyzer_eval (*p == 42); // { dg-warning "TRUE" }
+   int *ptr = p.get ();
+   p = nullptr;
+   __analyzer_eval (*ptr); // { dg-warning "use after 'delete'" }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/coroutines/pr125376.C gcc-17-20260524/gcc/testsuite/g++.dg/coroutines/pr125376.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/coroutines/pr125376.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/coroutines/pr125376.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,40 ----
+ // PR c++/125376
+ // { dg-do run { target c++26 } }
+ 
+ #include <coroutine>
+ 
+ struct task {
+   struct promise_type {
+     task get_return_object () noexcept { return {}; }
+     std::suspend_never initial_suspend () noexcept { return {}; }
+     std::suspend_never final_suspend ()   noexcept { return {}; }
+     void return_void () noexcept {}
+     void unhandled_exception () {}
+   };
+ };
+ 
+ struct A {
+   unsigned value = 42;
+   A () {}
+   ~A () { if (value != 42) __builtin_abort (); }
+ };
+ 
+ struct B {
+   unsigned value = 43;
+   B () {}
+   ~B () { if (value != 43) __builtin_abort (); }
+ };
+ 
+ task
+ foo ()
+ {
+   auto _ = A {};
+   auto _ = B {};
+   co_return;
+ }
+ 
+ int
+ main ()
+ {
+   foo ();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/defaulted2.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/defaulted2.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/defaulted2.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/defaulted2.C	Sun May 24 22:32:07 2026
*************** G::G() = default;
*** 55,61 ****
  
  union U
  {
!   G g;				// { dg-error "union member.*non-trivial" }
  };
  
  int main()
--- 55,61 ----
  
  union U
  {
!   G g;				// { dg-error "union member.*non-trivial" "" { target c++23_down } }
  };
  
  int main()
*************** int main()
*** 63,69 ****
    F f;
    F f2(f);			// { dg-error "use" }
    const B* b = new const B;		// { dg-error "uninitialized const" }
!   U u;				// { dg-error "deleted" }
  }
  
  // { dg-prune-output "implicitly deleted because" }
--- 63,69 ----
    F f;
    F f2(f);			// { dg-error "use" }
    const B* b = new const B;		// { dg-error "uninitialized const" }
!   U u;				// { dg-error "deleted" "" { target c++23_down } }
  }
  
  // { dg-prune-output "implicitly deleted because" }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/implicit18.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/implicit18.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/implicit18.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/implicit18.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,20 ----
+ // PR c++/125135
+ // { dg-do compile { target c++11 } }
+ 
+ template <typename T>
+ struct A
+ {
+   template <typename... Ts> // variadic causea ICE.
+   A(T&, const Ts&...){} // T& arg causes ICE.
+ 
+   A(const A&) = delete; // causes ICE.
+ };
+ 
+ struct RE
+ {
+   RE(): a(*this) {}
+ 
+   A<RE> a;
+ };
+ 
+ RE re;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const12.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const12.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const12.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const12.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,74 ----
+ // PR c++/123536
+ // { dg-do compile { target c++11 } }
+ 
+ int g;
+ 
+ struct S {
+   static int static_data_member;
+ };
+ 
+ template<int = 1>
+ void
+ fn1 ()
+ {
+   int &c = g;
+   auto l = [] { c++; };
+   l();
+ }
+ 
+ template<int N = 1>
+ void
+ fn2 ()
+ {
+   const int &c = N;
+   // TODO This will be valid once we implement P2686.
+   auto l = [] { int i = c; (void) i; }; // { dg-error ".c. is not captured" }
+   l();
+ }
+ 
+ void
+ fn3 ()
+ {
+   int &c = g;
+   auto l = [] { c++; };
+   l();
+ }
+ 
+ void
+ fn4 ()
+ {
+   int n = 42;
+   const int &c = n;
+   auto l = [] { int i = c; (void) i; }; // { dg-error ".c. is not captured" }
+   l();
+ }
+ 
+ template<class T>
+ void
+ fn5 ()
+ {
+   int& c = T::static_data_member;
+   auto l = [] { c++; };
+   l();
+ }
+ 
+ template<class T>
+ void
+ fn6 ()
+ {
+   int& c = T::static_data_member;
+   [&c] {
+     [] { c++; }();
+   };
+ }
+ 
+ void
+ bar ()
+ {
+   fn1 ();
+   fn2 ();
+   fn3 ();
+   fn4 ();
+   fn5<S>();
+   fn6<S>();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const13.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const13.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const13.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const13.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/123536
+ // { dg-do compile { target c++11 } }
+ 
+ int g;
+ 
+ template<class T>
+ void
+ fn1 ()
+ {
+   T c = g;
+   auto l = [] { c++; };
+   l();
+ }
+ 
+ void
+ bar ()
+ {
+   fn1<int&> ();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const14.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const14.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const14.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const14.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,16 ----
+ // PR c++/123536
+ // { dg-do compile { target c++11 } }
+ 
+ template<class T>
+ void
+ f ()
+ {
+   int& c = T::x;	// { dg-error ".x. is not a member of .int." }
+   auto l = [] { c++; };	// { dg-error ".c. is not captured" }
+ }
+ 
+ void
+ g ()
+ {
+   f<int>();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this23.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this23.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this23.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this23.C	Sun May 24 22:32:07 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/125384
+ // { dg-do compile { target c++11 } }
+ 
+ template <class,class> struct assert_same;
+ template <class T> struct assert_same<T,T> {};
+ 
+ template<typename C>
+ struct At {
+   void b() {
+     [this](){
+       assert_same <decltype (this), At*> as2;
+     }();
+   }
+ };
+ 
+ int main()
+ {
+   At<int>{}.b();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/union1.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/union1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/union1.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/union1.C	Sun May 24 22:32:07 2026
*************** union B
*** 14,20 ****
    A a;				// { dg-error "union member" }
  };
  
! B b;				// { dg-error "B::B\\(\\)" "B::B" }
  B b2(b);			// { dg-error "B::B\\(const B&\\)" "B::B" }
  
  struct C
--- 14,20 ----
    A a;				// { dg-error "union member" }
  };
  
! B b;				// { dg-error "B::B\\(\\)" "B::B" { target c++23_down } }
  B b2(b);			// { dg-error "B::B\\(const B&\\)" "B::B" }
  
  struct C
*************** struct C
*** 25,34 ****
    };
  };
  
! C c;				// { dg-error "C::C\\(\\)" "C::C" }
  C c2(c);			// { dg-error "C::C\\(const C&\\)" "C::C" }
  
! // { dg-error "B::~B" "B::~B" { target *-*-* } 17 }
! // { dg-error "B::~B" "B::~B" { target *-*-* } 18 }
! // { dg-error "C::~C" "C::~C" { target *-*-* } 28 }
! // { dg-error "C::~C" "C::~C" { target *-*-* } 29 }
--- 25,34 ----
    };
  };
  
! C c;				// { dg-error "C::C\\(\\)" "C::C" { target c++23_down } }
  C c2(c);			// { dg-error "C::C\\(const C&\\)" "C::C" }
  
! // { dg-error "B::~B" "B::~B" { target c++23_down } 17 }
! // { dg-error "B::~B" "B::~B" { target c++23_down } 18 }
! // { dg-error "C::~C" "C::~C" { target c++23_down } 28 }
! // { dg-error "C::~C" "C::~C" { target c++23_down } 29 }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/union4.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/union4.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp0x/union4.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp0x/union4.C	Sun May 24 22:32:07 2026
***************
*** 3,17 ****
  
  struct SFoo
  {
!   SFoo() =delete;		// { dg-message "declared" }
  };
  
! union UFoo			// { dg-error "deleted" }
  {
    SFoo foo;
  };
  
  int main()
  {
!   UFoo();			// { dg-error "deleted" }
  }
--- 3,17 ----
  
  struct SFoo
  {
!   SFoo() =delete;		// { dg-message "declared" "" { target c++23_down } }
  };
  
! union UFoo			// { dg-error "deleted" "" { target c++23_down } }
  {
    SFoo foo;
  };
  
  int main()
  {
!   UFoo();			// { dg-error "deleted" "" { target c++23_down } }
  }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp1z/using-variadic4.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp1z/using-variadic4.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp1z/using-variadic4.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp1z/using-variadic4.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,16 ----
+ // PR c++/125284
+ // { dg-do compile { target c++17 } }
+ 
+ template<typename T>
+ struct foo {
+     operator T();
+     operator T*();
+ };
+ 
+ template<typename... T>
+ struct bar : foo<T>... {
+     using foo<T>::operator T...;
+     using foo<T>::operator T*...;
+ };
+ 
+ bar<int> z;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp1z/using-variadic5.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp1z/using-variadic5.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp1z/using-variadic5.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp1z/using-variadic5.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/125333
+ // { dg-do compile { target c++17 } }
+ 
+ template<typename... T>
+ struct X {};
+ 
+ template <typename U>
+ struct Y {
+     operator U();
+ };
+ 
+ template <typename... V>
+ struct Z : Y<V>... {
+     using Y<V>::operator V...;
+ 
+     X<V...> x;
+ };
+ 
+ Z<int, double> z;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp23/explicit-obj-basic8.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/125330
+ // { dg-do compile { target c++23 } }
+ 
+ struct T {
+   template<typename Self>
+   void foo(this Self const &x) requires requires { x.bar(); }
+     { x.bar(); }
+ };
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C	Sun May 24 22:32:08 2026
***************
*** 652,654 ****
--- 652,660 ----
  #elif __cpp_expansion_statements != 202506
  #  error "__cpp_expansion_statements != 202506"
  #endif
+ 
+ #ifndef __cpp_trivial_union
+ #  error "__cpp_trivial_union"
+ #elif __cpp_trivial_union != 202502
+ #  error "__cpp_trivial_union != 202502"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/trivial-union1.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/trivial-union1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/trivial-union1.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/trivial-union1.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,133 ----
+ // P3074R7 - trivial unions (was std::uninitialized<T>)
+ // { dg-do compile { target c++11 } }
+ 
+ #include <type_traits>
+ 
+ // These two were incorrectly deleted.
+ union A { int a; const int b; };
+ static_assert (std::is_default_constructible <A>::value, "");
+ static_assert (std::is_trivially_default_constructible <A>::value, "");
+ static_assert (std::is_destructible <A>::value, "");
+ static_assert (std::is_trivially_destructible <A>::value, "");
+ struct B { int a; union { int b; const int c; }; };
+ static_assert (std::is_default_constructible <B>::value, "");
+ static_assert (std::is_trivially_default_constructible <B>::value, "");
+ static_assert (std::is_destructible <B>::value, "");
+ static_assert (std::is_trivially_destructible <B>::value, "");
+ // C::C() is incorrectly not deleted in C++11 to 23, but in C++26 it should
+ // not be deleted.
+ union C { const int a = 42; const long b; ~C (); };
+ #if __cpp_trivial_union >= 202502L
+ static_assert (std::is_default_constructible <C>::value, "");
+ static_assert (!std::is_trivially_default_constructible <C>::value, "");
+ static_assert (std::is_destructible <C>::value, "");
+ static_assert (!std::is_trivially_destructible <C>::value, "");
+ #endif
+ struct D { D () = delete; D (int); ~D () = default; };
+ union E { D a = 42; D b; ~E (); };
+ static_assert (std::is_default_constructible <E>::value, "");
+ static_assert (std::is_destructible <E>::value, "");
+ struct F { int a; union { D b = 42; D c; }; };
+ static_assert (std::is_default_constructible <F>::value, "");
+ static_assert (std::is_destructible <F>::value, "");
+ struct G { G (); ~G (); };
+ union I { int a; const int b; ~I (); };
+ static_assert (std::is_default_constructible <I>::value, "");
+ static_assert (!std::is_trivially_default_constructible <I>::value, "");
+ static_assert (std::is_destructible <I>::value, "");
+ static_assert (!std::is_trivially_destructible <I>::value, "");
+ union J { D a; int b; };
+ #if __cpp_trivial_union >= 202502L
+ static_assert (std::is_default_constructible <J>::value, "");
+ static_assert (std::is_trivially_default_constructible <J>::value, "");
+ #else
+ static_assert (!std::is_default_constructible <J>::value, "");
+ static_assert (!std::is_trivially_default_constructible <J>::value, "");
+ #endif
+ static_assert (std::is_destructible <J>::value, "");
+ static_assert (std::is_trivially_destructible <J>::value, "");
+ union K { G a; int b; };
+ #if __cpp_trivial_union >= 202502L
+ static_assert (std::is_default_constructible <K>::value, "");
+ static_assert (std::is_trivially_default_constructible <K>::value, "");
+ static_assert (std::is_destructible <K>::value, "");
+ static_assert (std::is_trivially_destructible <K>::value, "");
+ #else
+ static_assert (!std::is_default_constructible <K>::value, "");
+ static_assert (!std::is_trivially_default_constructible <K>::value, "");
+ static_assert (!std::is_destructible <K>::value, "");
+ static_assert (!std::is_trivially_destructible <K>::value, "");
+ #endif
+ struct L { int a; union { G b; int c; }; };
+ #if __cpp_trivial_union >= 202502L
+ static_assert (std::is_default_constructible <L>::value, "");
+ static_assert (std::is_trivially_default_constructible <L>::value, "");
+ static_assert (std::is_destructible <L>::value, "");
+ static_assert (std::is_trivially_destructible <L>::value, "");
+ #else
+ static_assert (!std::is_default_constructible <L>::value, "");
+ static_assert (!std::is_trivially_default_constructible <L>::value, "");
+ static_assert (!std::is_destructible <L>::value, "");
+ static_assert (!std::is_trivially_destructible <L>::value, "");
+ #endif
+ union M { M (); int a; int b; };
+ static_assert (std::is_default_constructible <M>::value, "");
+ static_assert (!std::is_trivially_default_constructible <M>::value, "");
+ static_assert (std::is_destructible <M>::value, "");
+ static_assert (std::is_trivially_destructible <M>::value, "");
+ union N { N (); int a; G b; };
+ static_assert (!std::is_default_constructible <N>::value, "");
+ static_assert (!std::is_trivially_default_constructible <N>::value, "");
+ static_assert (!std::is_destructible <N>::value, "");
+ static_assert (!std::is_trivially_destructible <N>::value, "");
+ struct O { O (); union { int a; int b; }; };
+ static_assert (std::is_default_constructible <O>::value, "");
+ static_assert (!std::is_trivially_default_constructible <O>::value, "");
+ static_assert (std::is_destructible <O>::value, "");
+ static_assert (std::is_trivially_destructible <O>::value, "");
+ struct P { P (); union { int a; G b; }; };
+ static_assert (!std::is_default_constructible <P>::value, "");
+ static_assert (!std::is_trivially_default_constructible <P>::value, "");
+ static_assert (!std::is_destructible <P>::value, "");
+ static_assert (!std::is_trivially_destructible <P>::value, "");
+ struct Q { Q (int); union { int a; G b; }; };
+ static_assert (!std::is_default_constructible <Q>::value, "");
+ static_assert (!std::is_trivially_default_constructible <Q>::value, "");
+ static_assert (!std::is_destructible <Q>::value, "");
+ static_assert (!std::is_trivially_destructible <Q>::value, "");
+ struct R { R () = default; R (int); union { int a; G b; }; };
+ static_assert (!std::is_default_constructible <R>::value, "");
+ static_assert (!std::is_trivially_default_constructible <R>::value, "");
+ static_assert (!std::is_destructible <R>::value, "");
+ static_assert (!std::is_trivially_destructible <R>::value, "");
+ struct S { S (int); ~S (); };
+ union T { T (); int a; int b = 42; };
+ static_assert (std::is_default_constructible <T>::value, "");
+ static_assert (!std::is_trivially_default_constructible <T>::value, "");
+ static_assert (std::is_destructible <T>::value, "");
+ static_assert (std::is_trivially_destructible <T>::value, "");
+ union U { U (); int a; S b = 42; };
+ static_assert (!std::is_default_constructible <U>::value, "");
+ static_assert (!std::is_trivially_default_constructible <U>::value, "");
+ static_assert (!std::is_destructible <U>::value, "");
+ static_assert (!std::is_trivially_destructible <U>::value, "");
+ struct V { V (); union { int a; int b = 42; }; };
+ static_assert (std::is_default_constructible <V>::value, "");
+ static_assert (!std::is_trivially_default_constructible <V>::value, "");
+ static_assert (std::is_destructible <V>::value, "");
+ static_assert (std::is_trivially_destructible <V>::value, "");
+ struct W { W (); union { int a; S b = 42; }; };
+ static_assert (!std::is_default_constructible <W>::value, "");
+ static_assert (!std::is_trivially_default_constructible <W>::value, "");
+ static_assert (!std::is_destructible <W>::value, "");
+ static_assert (!std::is_trivially_destructible <W>::value, "");
+ struct X { X (int); union { int a; S b = 42; }; };
+ static_assert (!std::is_default_constructible <X>::value, "");
+ static_assert (!std::is_trivially_default_constructible <X>::value, "");
+ static_assert (!std::is_destructible <X>::value, "");
+ static_assert (!std::is_trivially_destructible <X>::value, "");
+ struct Y { Y () = default; Y (int); union { int a; S b = 42; }; };
+ static_assert (!std::is_default_constructible <Y>::value, "");
+ static_assert (!std::is_trivially_default_constructible <Y>::value, "");
+ static_assert (!std::is_destructible <Y>::value, "");
+ static_assert (!std::is_trivially_destructible <Y>::value, "");
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/trivial-union2.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/trivial-union2.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp26/trivial-union2.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp26/trivial-union2.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,7 ----
+ // P3074R7 - trivial unions (was std::uninitialized<T>)
+ // { dg-do compile { target c++20 } }
+ 
+ union U { int a, b; };
+ template<U u> class X {};
+ constexpr U make() { U u; return u; }
+ void f(X<make()>) {}
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp2a/no_unique_address17.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp2a/no_unique_address17.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp2a/no_unique_address17.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp2a/no_unique_address17.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/125336
+ // { dg-do compile { target c++20 } }
+ // { dg-prune-output "used but never defined" }
+ 
+ struct S{ };
+ constexpr S& f (S&);
+ union W {
+   [[no_unique_address]] S v;
+ };
+ struct R { W w; };
+ S s;
+ auto x = R{{ f(s) }};
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/cpp2a/no_unique_address18.C gcc-17-20260524/gcc/testsuite/g++.dg/cpp2a/no_unique_address18.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/cpp2a/no_unique_address18.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/cpp2a/no_unique_address18.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/125336
+ // { dg-do compile { target c++20 } }
+ // { dg-prune-output "used but never defined" }
+ 
+ struct S { int i; };
+ constexpr S& f (S&);
+ union W {
+   [[no_unique_address]] S v;
+ };
+ struct R { W w; };
+ S s;
+ auto x = R{{ f(s) }};
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/init/pr25811.C gcc-17-20260524/gcc/testsuite/g++.dg/init/pr25811.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/init/pr25811.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/init/pr25811.C	Sun May 24 22:32:08 2026
*************** struct Z // { dg-error "deleted" "" { ta
*** 124,133 ****
    Z5 z5;
  };
  
! union U // { dg-message "implicitly deleted" "" { target c++11 } }
! 	// { dg-error "uninitialized" "" { target c++11 } .-1 }
  {
!   int const i; // { dg-message "should be initialized" }
  };
  
  void f1 ()
--- 124,132 ----
    Z5 z5;
  };
  
! union U
  {
!   int const i;
  };
  
  void f1 ()
*************** void f15 ()
*** 207,211 ****
  
  void f16 ()
  {
!   new U; // { dg-error "deleted|uninitialized const member" }
  }
--- 206,210 ----
  
  void f16 ()
  {
!   new U; // { dg-error "uninitialized const member in 'union U' using 'new' without new-initializer" "" { target c++98_only } }
  }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/init/pr43719.C gcc-17-20260524/gcc/testsuite/g++.dg/init/pr43719.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/init/pr43719.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/init/pr43719.C	Sun May 24 22:32:08 2026
*************** struct Z		// { dg-error "deleted" "" { t
*** 109,115 ****
    Z5 z5;
  };
  
! union U // { dg-error "uninitialized" "" { target c++11 } }
  {
    int const i; // { dg-message "should be initialized" }
  };
--- 109,115 ----
    Z5 z5;
  };
  
! union U
  {
    int const i; // { dg-message "should be initialized" }
  };
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/ipa/devirt-2.C gcc-17-20260524/gcc/testsuite/g++.dg/ipa/devirt-2.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/ipa/devirt-2.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/ipa/devirt-2.C	Sun May 24 22:32:08 2026
*************** int __attribute__ ((noinline,noclone,noi
*** 48,53 ****
--- 48,63 ----
    return 1;
  }
  
+ int extra (int init)
+ {
+   class B b;
+   int i;
+   for (i = init; i < get_input(); i++)
+     if (b.middleman (get_input ()) != 3)
+       abort ();
+   return 0;
+ }
+ 
  int main (int argc, char *argv[])
  {
    class B b;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/other/anon-union2.C gcc-17-20260524/gcc/testsuite/g++.dg/other/anon-union2.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/other/anon-union2.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/other/anon-union2.C	Sun May 24 22:32:08 2026
*************** struct S {
*** 6,10 ****
  };
  
  void f() {
!   union { S a; };		// { dg-error "constructor|no match" }
  }
--- 6,10 ----
  };
  
  void f() {
!   union { S a; };		// { dg-error "constructor|no match" "" { target c++23_down } }
  }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C gcc-17-20260524/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C	Sun May 24 22:32:08 2026
*************** static_assert (!is_constructible_type (^
*** 603,609 ****
  static_assert (!is_constructible_type (^^const DelnAny, { ^^int, ^^void * }));
  static_assert (!is_constructible_type (^^DelnAny, { ^^Empty, ^^B, ^^D }));
  static_assert (!is_constructible_type (^^const DelnAny, { ^^Empty, ^^B, ^^D }));
! static_assert (!is_constructible_type (^^NontrivialUnion, {}));
  static_assert (!is_constructible_type (^^NontrivialUnion, { ^^const NontrivialUnion & }));
  static_assert (!is_constructible_type (^^UnusualCopy, {}));
  static_assert (!is_constructible_type (^^UnusualCopy, { ^^UnusualCopy }));
--- 603,609 ----
  static_assert (!is_constructible_type (^^const DelnAny, { ^^int, ^^void * }));
  static_assert (!is_constructible_type (^^DelnAny, { ^^Empty, ^^B, ^^D }));
  static_assert (!is_constructible_type (^^const DelnAny, { ^^Empty, ^^B, ^^D }));
! static_assert (is_constructible_type (^^NontrivialUnion, {}));
  static_assert (!is_constructible_type (^^NontrivialUnion, { ^^const NontrivialUnion & }));
  static_assert (!is_constructible_type (^^UnusualCopy, {}));
  static_assert (!is_constructible_type (^^UnusualCopy, { ^^UnusualCopy }));
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/reflect/trivial-union1.C gcc-17-20260524/gcc/testsuite/g++.dg/reflect/trivial-union1.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/reflect/trivial-union1.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/reflect/trivial-union1.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,214 ----
+ // P3074R7 - trivial unions (was std::uninitialized<T>)
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ constexpr auto ctx = std::meta::access_context::unchecked ();
+ union A { int a; const int b; };
+ static_assert (is_default_constructible_type (^^A));
+ static_assert (is_trivially_default_constructible_type (^^A));
+ static_assert (is_destructible_type (^^A));
+ static_assert (is_trivially_destructible_type (^^A));
+ constexpr auto Actor = (members_of (^^A, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Adtor = (members_of (^^A, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Actor) && !is_deleted (Actor));
+ static_assert (is_defaulted (Adtor) && !is_deleted (Adtor));
+ struct B { int a; union { int b; const int c; }; };
+ static_assert (is_default_constructible_type (^^B));
+ static_assert (is_trivially_default_constructible_type (^^B));
+ static_assert (is_destructible_type (^^B));
+ static_assert (is_trivially_destructible_type (^^B));
+ constexpr auto Bctor = (members_of (^^B, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Bdtor = (members_of (^^B, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Bctor) && !is_deleted (Bctor));
+ static_assert (is_defaulted (Bdtor) && !is_deleted (Bdtor));
+ union C { const int a = 42; const long b; ~C (); };
+ static_assert (is_default_constructible_type (^^C));
+ static_assert (!is_trivially_default_constructible_type (^^C));
+ static_assert (is_destructible_type (^^C));
+ static_assert (!is_trivially_destructible_type (^^C));
+ constexpr auto Cctor = (members_of (^^C, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Cdtor = (members_of (^^C, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Cctor) && !is_deleted (Cctor));
+ static_assert (!is_defaulted (Cdtor) && !is_deleted (Cdtor));
+ struct D { D () = delete; D (int); ~D () = default; };
+ union E { D a = 42; D b; ~E (); };
+ static_assert (is_default_constructible_type (^^E));
+ static_assert (is_destructible_type (^^E));
+ constexpr auto Ector = (members_of (^^E, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Edtor = (members_of (^^E, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Ector) && !is_deleted (Ector));
+ static_assert (!is_defaulted (Edtor) && !is_deleted (Edtor));
+ struct F { int a; union { D b = 42; D c; }; };
+ static_assert (is_default_constructible_type (^^F));
+ static_assert (is_destructible_type (^^F));
+ constexpr auto Fctor = (members_of (^^F, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Fdtor = (members_of (^^F, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Fctor) && !is_deleted (Fctor));
+ static_assert (is_defaulted (Fdtor) && !is_deleted (Fdtor));
+ struct G { G (); ~G (); };
+ union I { int a; const int b; ~I (); };
+ static_assert (is_default_constructible_type (^^I));
+ static_assert (!is_trivially_default_constructible_type (^^I));
+ static_assert (is_destructible_type (^^I));
+ static_assert (!is_trivially_destructible_type (^^I));
+ constexpr auto Ictor = (members_of (^^I, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Idtor = (members_of (^^I, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Ictor) && !is_deleted (Ictor));
+ static_assert (!is_defaulted (Idtor) && !is_deleted (Idtor));
+ union J { D a; int b; };
+ static_assert (is_default_constructible_type (^^J));
+ static_assert (is_trivially_default_constructible_type (^^J));
+ static_assert (is_destructible_type (^^J));
+ static_assert (is_trivially_destructible_type (^^J));
+ constexpr auto Jctor = (members_of (^^J, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Jdtor = (members_of (^^J, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Jctor) && !is_deleted (Jctor));
+ static_assert (is_defaulted (Jdtor) && !is_deleted (Jdtor));
+ union K { G a; int b; };
+ static_assert (is_default_constructible_type (^^K));
+ static_assert (is_trivially_default_constructible_type (^^K));
+ static_assert (is_destructible_type (^^K));
+ static_assert (is_trivially_destructible_type (^^K));
+ constexpr auto Kctor = (members_of (^^K, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Kdtor = (members_of (^^K, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Kctor) && !is_deleted (Kctor));
+ static_assert (is_defaulted (Kdtor) && !is_deleted (Kdtor));
+ struct L { int a; union { G b; int c; }; };
+ static_assert (is_default_constructible_type (^^L));
+ static_assert (is_trivially_default_constructible_type (^^L));
+ static_assert (is_destructible_type (^^L));
+ static_assert (is_trivially_destructible_type (^^L));
+ constexpr auto Lctor = (members_of (^^L, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Ldtor = (members_of (^^L, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Lctor) && !is_deleted (Lctor));
+ static_assert (is_defaulted (Ldtor) && !is_deleted (Ldtor));
+ union M { M (); int a; int b; };
+ static_assert (is_default_constructible_type (^^M));
+ static_assert (!is_trivially_default_constructible_type (^^M));
+ static_assert (is_destructible_type (^^M));
+ static_assert (is_trivially_destructible_type (^^M));
+ constexpr auto Mctor = (members_of (^^M, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Mdtor = (members_of (^^M, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Mctor) && !is_deleted (Mctor));
+ static_assert (is_defaulted (Mdtor) && !is_deleted (Mdtor));
+ union N { N (); int a; G b; };
+ static_assert (!is_default_constructible_type (^^N));
+ static_assert (!is_trivially_default_constructible_type (^^N));
+ static_assert (!is_destructible_type (^^N));
+ static_assert (!is_trivially_destructible_type (^^N));
+ constexpr auto Nctor = (members_of (^^N, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Ndtor = (members_of (^^N, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Nctor) && !is_deleted (Nctor));
+ static_assert (is_defaulted (Ndtor) && is_deleted (Ndtor));
+ struct O { O (); union { int a; int b; }; };
+ static_assert (is_default_constructible_type (^^O));
+ static_assert (!is_trivially_default_constructible_type (^^O));
+ static_assert (is_destructible_type (^^O));
+ static_assert (is_trivially_destructible_type (^^O));
+ constexpr auto Octor = (members_of (^^O, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Odtor = (members_of (^^O, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Octor) && !is_deleted (Octor));
+ static_assert (is_defaulted (Odtor) && !is_deleted (Odtor));
+ struct P { P (); union { int a; G b; }; };
+ static_assert (!is_default_constructible_type (^^P));
+ static_assert (!is_trivially_default_constructible_type (^^P));
+ static_assert (!is_destructible_type (^^P));
+ static_assert (!is_trivially_destructible_type (^^P));
+ constexpr auto Pctor = (members_of (^^P, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Pdtor = (members_of (^^P, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Pctor) && !is_deleted (Pctor));
+ static_assert (is_defaulted (Pdtor) && is_deleted (Pdtor));
+ struct Q { Q (int); union { int a; G b; }; };
+ static_assert (!is_default_constructible_type (^^Q));
+ static_assert (!is_trivially_default_constructible_type (^^Q));
+ static_assert (!is_destructible_type (^^Q));
+ static_assert (!is_trivially_destructible_type (^^Q));
+ static_assert ((members_of (^^Q, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ()).size () == 0);
+ constexpr auto Qdtor = (members_of (^^Q, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Qdtor) && is_deleted (Qdtor));
+ struct R { R () = default; R (int); union { int a; G b; }; };
+ static_assert (!is_default_constructible_type (^^R));
+ static_assert (!is_trivially_default_constructible_type (^^R));
+ static_assert (!is_destructible_type (^^R));
+ static_assert (!is_trivially_destructible_type (^^R));
+ constexpr auto Rctor = (members_of (^^R, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Rdtor = (members_of (^^R, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Rctor) && !is_deleted (Rctor));
+ static_assert (is_defaulted (Rdtor) && is_deleted (Rdtor));
+ struct S { S (int); ~S (); };
+ union T { T (); int a; int b = 42; };
+ static_assert (is_default_constructible_type (^^T));
+ static_assert (!is_trivially_default_constructible_type (^^T));
+ static_assert (is_destructible_type (^^T));
+ static_assert (is_trivially_destructible_type (^^T));
+ constexpr auto Tctor = (members_of (^^T, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Tdtor = (members_of (^^T, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Tctor) && !is_deleted (Tctor));
+ static_assert (is_defaulted (Tdtor) && !is_deleted (Tdtor));
+ union U { U (); int a; S b = 42; };
+ static_assert (!is_default_constructible_type (^^U));
+ static_assert (!is_trivially_default_constructible_type (^^U));
+ static_assert (!is_destructible_type (^^U));
+ static_assert (!is_trivially_destructible_type (^^U));
+ constexpr auto Uctor = (members_of (^^U, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Udtor = (members_of (^^U, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Uctor) && !is_deleted (Uctor));
+ static_assert (is_defaulted (Udtor) && is_deleted (Udtor));
+ struct V { V (); union { int a; int b = 42; }; };
+ static_assert (is_default_constructible_type (^^V));
+ static_assert (!is_trivially_default_constructible_type (^^V));
+ static_assert (is_destructible_type (^^V));
+ static_assert (is_trivially_destructible_type (^^V));
+ constexpr auto Vctor = (members_of (^^V, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Vdtor = (members_of (^^V, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Vctor) && !is_deleted (Vctor));
+ static_assert (is_defaulted (Vdtor) && !is_deleted (Vdtor));
+ struct W { W (); union { int a; S b = 42; }; };
+ static_assert (!is_default_constructible_type (^^W));
+ static_assert (!is_trivially_default_constructible_type (^^W));
+ static_assert (!is_destructible_type (^^W));
+ static_assert (!is_trivially_destructible_type (^^W));
+ constexpr auto Wctor = (members_of (^^W, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Wdtor = (members_of (^^W, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (Wctor) && !is_deleted (Wctor));
+ static_assert (is_defaulted (Wdtor) && is_deleted (Wdtor));
+ struct X { X (int); union { int a; S b = 42; }; };
+ static_assert (!is_default_constructible_type (^^X));
+ static_assert (!is_trivially_default_constructible_type (^^X));
+ static_assert (!is_destructible_type (^^X));
+ static_assert (!is_trivially_destructible_type (^^X));
+ static_assert ((members_of (^^X, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ()).size () == 0);
+ constexpr auto Xdtor = (members_of (^^X, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Xdtor) && is_deleted (Xdtor));
+ struct Y { Y () = default; Y (int); union { int a; S b = 42; }; };
+ static_assert (!is_default_constructible_type (^^Y));
+ static_assert (!is_trivially_default_constructible_type (^^Y));
+ static_assert (!is_destructible_type (^^Y));
+ static_assert (!is_trivially_destructible_type (^^Y));
+ constexpr auto Yctor = (members_of (^^Y, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto Ydtor = (members_of (^^Y, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (is_defaulted (Yctor) && !is_deleted (Yctor));
+ static_assert (is_defaulted (Ydtor) && is_deleted (Ydtor));
+ union AA { AA (); int a; long b; };
+ static_assert (is_default_constructible_type (^^AA));
+ static_assert (!is_trivially_default_constructible_type (^^AA));
+ static_assert (is_destructible_type (^^AA));
+ static_assert (is_trivially_destructible_type (^^AA));
+ constexpr auto AActor = (members_of (^^AA, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto AAdtor = (members_of (^^AA, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (AActor) && !is_deleted (AActor));
+ static_assert (is_defaulted (AAdtor) && !is_deleted (AAdtor));
+ struct AB { AB () = default; AB (const AB &) = default; int a; ~AB (); };
+ union AC { AC (); int a; AB b; };
+ static_assert (!is_default_constructible_type (^^AC));
+ static_assert (!is_trivially_default_constructible_type (^^AC));
+ static_assert (!is_destructible_type (^^AC));
+ static_assert (!is_trivially_destructible_type (^^AC));
+ constexpr auto ACctor = (members_of (^^AC, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0];
+ constexpr auto ACdtor = (members_of (^^AC, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0];
+ static_assert (!is_defaulted (ACctor) && !is_deleted (ACctor));
+ static_assert (is_defaulted (ACdtor) && is_deleted (ACdtor));
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/reflect/type_trait6.C gcc-17-20260524/gcc/testsuite/g++.dg/reflect/type_trait6.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/reflect/type_trait6.C	Sun May 17 22:32:08 2026
--- gcc-17-20260524/gcc/testsuite/g++.dg/reflect/type_trait6.C	Sun May 24 22:32:08 2026
*************** static_assert (!is_destructible_type (^^
*** 985,991 ****
  static_assert (!is_destructible_type (^^const N2::Del [1]));
  static_assert (!is_destructible_type (^^N2::Del []));
  static_assert (!is_destructible_type (^^const N2::Del []));
! static_assert (!is_destructible_type (^^N2::NontrivialUnion));
  static_assert (is_destructible_type (^^N2::UnusualCopy));
  
  static_assert (is_trivially_default_constructible_type (^^int));
--- 985,991 ----
  static_assert (!is_destructible_type (^^const N2::Del [1]));
  static_assert (!is_destructible_type (^^N2::Del []));
  static_assert (!is_destructible_type (^^const N2::Del []));
! static_assert (is_destructible_type (^^N2::NontrivialUnion));
  static_assert (is_destructible_type (^^N2::UnusualCopy));
  
  static_assert (is_trivially_default_constructible_type (^^int));
*************** static_assert (!is_nothrow_destructible_
*** 1367,1374 ****
  static_assert (!is_nothrow_destructible_type (^^N2::Aggr2));
  static_assert (!is_nothrow_destructible_type (^^N2::Aggr2 [1]));
  static_assert (!is_nothrow_destructible_type (^^N2::TD1 [1][2]));
! static_assert (!is_nothrow_destructible_type (^^N2::Ut));
! static_assert (!is_nothrow_destructible_type (^^N2::Ut [3]));
  static_assert (!is_nothrow_destructible_type (^^N2::AbstractDelDtor));
  static_assert (!is_nothrow_destructible_type (^^N2::Abstract2));
  static_assert (!is_nothrow_destructible_type (^^N2::Abstract3));
--- 1367,1374 ----
  static_assert (!is_nothrow_destructible_type (^^N2::Aggr2));
  static_assert (!is_nothrow_destructible_type (^^N2::Aggr2 [1]));
  static_assert (!is_nothrow_destructible_type (^^N2::TD1 [1][2]));
! static_assert (is_nothrow_destructible_type (^^N2::Ut));
! static_assert (is_nothrow_destructible_type (^^N2::Ut [3]));
  static_assert (!is_nothrow_destructible_type (^^N2::AbstractDelDtor));
  static_assert (!is_nothrow_destructible_type (^^N2::Abstract2));
  static_assert (!is_nothrow_destructible_type (^^N2::Abstract3));
diff -Nrcpad gcc-17-20260517/gcc/testsuite/g++.dg/template/local11.C gcc-17-20260524/gcc/testsuite/g++.dg/template/local11.C
*** gcc-17-20260517/gcc/testsuite/g++.dg/template/local11.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/g++.dg/template/local11.C	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,18 ----
+ // PR c++/123536
+ 
+ int g;
+ 
+ template<class T>
+ void
+ fn1 ()
+ {
+   T c = g;
+   struct A { static void f() { c++; } };
+   A::f();
+ }
+ 
+ void
+ bar ()
+ {
+   fn1<int&> ();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.c-torture/compile/pr125373.c gcc-17-20260524/gcc/testsuite/gcc.c-torture/compile/pr125373.c
*** gcc-17-20260517/gcc/testsuite/gcc.c-torture/compile/pr125373.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.c-torture/compile/pr125373.c	Sun May 24 22:32:08 2026
***************
*** 0 ****
--- 1,20 ----
+ /* PR target/125373 */
+ 
+ int foo (int);
+ 
+ void
+ bar (int *v, int w)
+ {
+   for (int i = 0; i < (__INTPTR_TYPE__) (v - 1); i++)
+     if (v)
+       v[i] = v[w];
+ }
+ 
+ int
+ main ()
+ {
+   int a[] = { 0, 0, 0, 0 };
+   bar (a, 4);
+   for (int i = 0; i < 4; i++)
+     foo (a[i]);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-22.c gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-22.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-22.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-22.c	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2 -Wstrict-overflow=3" } */
- 
- /* Source: Ian Lance Taylor.  Based on strict-overflow-6.c.  */
- 
- /* We can only simplify the conditional when using strict overflow
-    semantics.  */
- 
- int
- foo (char* p)
- {
-   return p + 1000 < p; /* { dg-warning "assuming pointer wraparound does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-24.c	Thu Jan  1 00:00:00 1970
***************
*** 1,10 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2" } */
- /* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */
- #pragma GCC diagnostic error "-Wstrict-overflow"
- 
- int
- foo (int i)
- {
-   return __builtin_abs (i) >= 0; /* { dg-error "assuming signed overflow does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-3.c gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-3.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-3.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-3.c	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2 -Wstrict-overflow=4" } */
- 
- /* Source: Ian Lance Taylor.  Based on strict-overflow-2.c.  */
- 
- /* We can only simplify the division when using strict overflow
-    semantics.  */
- 
- int
- foo (int i)
- {
-   return (i * 100) / 10; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-5.c gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-5.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-5.c	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2 -Wstrict-overflow=3" } */
- 
- /* Source: Ian Lance Taylor.  Based on strict-overflow-3.c.  */
- 
- /* We can only simplify the conditional when using strict overflow
-    semantics.  */
- 
- int
- foo (int i, int j)
- {
-   return i + 100 < j + 1000; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-9.c gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-9.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/Wstrict-overflow-9.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/Wstrict-overflow-9.c	Thu Jan  1 00:00:00 1970
***************
*** 1,10 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2 -Wstrict-overflow=2" } */
- 
- /* Source: Ian Lance Taylor.  */
- 
- int
- foo (int i)
- {
-   return __builtin_abs (i) >= 0; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/explode-2a.c gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/explode-2a.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/explode-2a.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/explode-2a.c	Sun May 24 22:32:09 2026
***************
*** 1,6 ****
  /* PR analyzer/101068.  */
  
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-bb-explosion-factor=50" } */
  
  #include <stdlib.h>
  
--- 1,6 ----
  /* PR analyzer/101068.  */
  
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-supernode-explosion-factor=50" } */
  
  #include <stdlib.h>
  
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-signed-char.c	Sun May 24 22:32:09 2026
***************
*** 8,14 ****
  /* { dg-require-effective-target int32plus } */
  
  /* TODO (PR analyzer/112528): remove need for this.  */
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-bb-explosion-factor=50" } */
  
  /* Minimal replacement of system headers.  */
  
--- 8,14 ----
  /* { dg-require-effective-target int32plus } */
  
  /* TODO (PR analyzer/112528): remove need for this.  */
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-supernode-explosion-factor=50" } */
  
  /* Minimal replacement of system headers.  */
  
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/analyzer/pr93032-mztools-unsigned-char.c	Sun May 24 22:32:09 2026
***************
*** 8,14 ****
  /* { dg-require-effective-target int32plus } */
  
  /* TODO (PR analyzer/112528): remove need for this.  */
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-bb-explosion-factor=50" } */
  
  /* Minimal replacement of system headers.  */
  
--- 8,14 ----
  /* { dg-require-effective-target int32plus } */
  
  /* TODO (PR analyzer/112528): remove need for this.  */
! /* { dg-additional-options "--param analyzer-max-enodes-per-program-point=200 --param analyzer-supernode-explosion-factor=50" } */
  
  /* Minimal replacement of system headers.  */
  
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-4.c	Sun May 24 22:32:09 2026
*************** foo8 (unsigned a)
*** 51,54 ****
--- 51,60 ----
    return BS (BS (BS (BS (a))));
  }
  
+ bool
+ foo9 (unsigned a)
+ {
+   return BS (a) == 0;
+ }
+ 
  /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-5.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ #define BS(X) __builtin_bitreverse64 (X)
+ 
+ unsigned long long
+ foo1 (unsigned long long a)
+ {
+   return BS (~ BS (a));
+ }
+ 
+ unsigned long long
+ foo2 (unsigned long long a)
+ {
+   return BS (BS (a) & 0xA0000);
+ }
+ 
+ unsigned long long
+ foo3 (unsigned long long a)
+ {
+   return BS (BS (a) | 0xA0000);
+ }
+ 
+ unsigned long long
+ foo4 (unsigned long long a)
+ {
+   return BS (BS (a) ^ 0xA0000);
+ }
+ 
+ unsigned long long
+ foo5 (unsigned long long a, unsigned long long b)
+ {
+   return BS (BS (a) & BS (b));
+ }
+ 
+ unsigned long long
+ foo6 (unsigned long long a, unsigned long long b)
+ {
+   return BS (BS (a) | BS (b));
+ }
+ 
+ unsigned long long
+ foo7 (unsigned long long a, unsigned long long b)
+ {
+   return BS (BS (a) ^ BS (b));
+ }
+ 
+ unsigned long long
+ foo8 (unsigned long long a)
+ {
+   return BS (BS (BS (BS (a))));
+ }
+ 
+ bool
+ foo9 (unsigned long long a)
+ {
+   return BS (a) == 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-6.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ #define BS(X) __builtin_bitreverse16 (X)
+ 
+ unsigned short
+ foo1 (unsigned short a)
+ {
+   return BS (~ BS (a));
+ }
+ 
+ unsigned short
+ foo2 (unsigned short a)
+ {
+   return BS (BS (a) & 0xA00);
+ }
+ 
+ unsigned short
+ foo3 (unsigned short a)
+ {
+   return BS (BS (a) | 0xA00);
+ }
+ 
+ unsigned short
+ foo4 (unsigned short a)
+ {
+   return BS (BS (a) ^ 0xA00);
+ }
+ 
+ unsigned short
+ foo5 (unsigned short a, unsigned short b)
+ {
+   return BS (BS (a) & BS (b));
+ }
+ 
+ unsigned short
+ foo6 (unsigned short a, unsigned short b)
+ {
+   return BS (BS (a) | BS (b));
+ }
+ 
+ unsigned short
+ foo7 (unsigned short a, unsigned short b)
+ {
+   return BS (BS (a) ^ BS (b));
+ }
+ 
+ unsigned short
+ foo8 (unsigned short a)
+ {
+   return BS (BS (BS (BS (a))));
+ }
+ 
+ bool
+ foo9 (unsigned short a)
+ {
+   return BS (a) == 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-7.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ #define BS(X) __builtin_bitreverse8 (X)
+ 
+ unsigned char
+ foo1 (unsigned char a)
+ {
+   return BS (~ BS (a));
+ }
+ 
+ unsigned char
+ foo2 (unsigned char a)
+ {
+   return BS (BS (a) & 0x0A);
+ }
+ 
+ unsigned char
+ foo3 (unsigned char a)
+ {
+   return BS (BS (a) | 0x0A);
+ }
+ 
+ unsigned char
+ foo4 (unsigned char a)
+ {
+   return BS (BS (a) ^ 0x0A);
+ }
+ 
+ unsigned char
+ foo5 (unsigned char a, unsigned char b)
+ {
+   return BS (BS (a) & BS (b));
+ }
+ 
+ unsigned char
+ foo6 (unsigned char a, unsigned char b)
+ {
+   return BS (BS (a) | BS (b));
+ }
+ 
+ unsigned char
+ foo7 (unsigned char a, unsigned char b)
+ {
+   return BS (BS (a) ^ BS (b));
+ }
+ 
+ unsigned char
+ foo8 (unsigned char a)
+ {
+   return BS (BS (BS (BS (a))));
+ }
+ 
+ bool
+ foo9 (unsigned char a)
+ {
+   return BS (a) == 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/builtin-bitreverse-8.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ /* { dg-do compile { target int128 } } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ #define BS(X) __builtin_bitreverse128 (X)
+ 
+ unsigned __int128
+ foo1 (unsigned __int128 a)
+ {
+   return BS (~ BS (a));
+ }
+ 
+ unsigned __int128
+ foo2 (unsigned __int128 a)
+ {
+   return BS (BS (a) & 0xA0000A0000ULL);
+ }
+ 
+ unsigned __int128
+ foo3 (unsigned __int128 a)
+ {
+   return BS (BS (a) | 0xA0000A0000ULL);
+ }
+ 
+ unsigned __int128
+ foo4 (unsigned __int128 a)
+ {
+   return BS (BS (a) ^ 0xA0000A0000ULL);
+ }
+ 
+ unsigned __int128
+ foo5 (unsigned __int128 a, unsigned __int128 b)
+ {
+   return BS (BS (a) & BS (b));
+ }
+ 
+ unsigned __int128
+ foo6 (unsigned __int128 a, unsigned __int128 b)
+ {
+   return BS (BS (a) | BS (b));
+ }
+ 
+ unsigned __int128
+ foo7 (unsigned __int128 a, unsigned __int128 b)
+ {
+   return BS (BS (a) ^ BS (b));
+ }
+ 
+ unsigned __int128
+ foo8 (unsigned __int128 a)
+ {
+   return BS (BS (BS (BS (a))));
+ }
+ 
+ bool
+ foo9 (unsigned __int128 a)
+ {
+   return BS (a) == 0;
+ }
+ 
+ /* { dg-final { scan-tree-dump-not "__builtin_bitreverse" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c gcc-17-20260524/gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/crc-builtin-rev-target32.c	Sun May 24 22:32:09 2026
*************** int32_t rev_crc32_data32 ()
*** 34,39 ****
    return __builtin_rev_crc32_data32 (0xffffffff, 0x123546ff, 0x4002123);
  }
  
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_8_polynomial_0x12" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_16_polynomial_0x1021" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_32_polynomial_0x4002123" "expand" } } */
--- 34,39 ----
    return __builtin_rev_crc32_data32 (0xffffffff, 0x123546ff, 0x4002123);
  }
  
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_8_polynomial_0x12" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_16_polynomial_0x1021" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_32_polynomial_0x4002123" "expand" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c gcc-17-20260524/gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/crc-builtin-rev-target64.c	Sun May 24 22:32:09 2026
*************** int64_t rev_crc64_data64 ()
*** 58,63 ****
  				     0x40021234002123);
  }
  
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_8_polynomial_0x12" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_16_polynomial_0x1021" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting crc table) crc_32_polynomial_0x4002123" "expand" } } */
--- 58,63 ----
  				     0x40021234002123);
  }
  
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_8_polynomial_0x12" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_16_polynomial_0x1021" "expand" } } */
! /* { dg-final { scan-rtl-dump ";; (?:using optab for|emitting reversed crc table) crc_32_polynomial_0x4002123" "expand" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/fold-condneg-2.c gcc-17-20260524/gcc/testsuite/gcc.dg/fold-condneg-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/fold-condneg-2.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/fold-condneg-2.c	Sun May 24 22:32:09 2026
*************** int test(int x)
*** 8,11 ****
    return x != INT_MIN ? -x : INT_MIN;
  }
  
! /* { dg-final { scan-tree-dump "goto" "optimized" } } */
--- 8,13 ----
    return x != INT_MIN ? -x : INT_MIN;
  }
  
! /* The branch should now be eliminated since we emit
!    (signed)(-(unsigned)x) which is well-defined.  */
! /* { dg-final { scan-tree-dump-not "goto" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/independent-cloneids-1.c gcc-17-20260524/gcc/testsuite/gcc.dg/independent-cloneids-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/independent-cloneids-1.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/independent-cloneids-1.c	Sun May 24 22:32:09 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O3 -fipa-cp -fipa-cp-clone -fdump-rtl-final"  } */
  /* { dg-skip-if "Odd label definition syntax" { mmix-*-* } } */
  
  extern int printf (const char *, ...);
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O3 -fipa-cp -fipa-cp-clone -fdump-rtl-final --param ipa-cp-eval-threshold=500"  } */
  /* { dg-skip-if "Odd label definition syntax" { mmix-*-* } } */
  
  extern int printf (const char *, ...);
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/ipa/ipa-5.c gcc-17-20260524/gcc/testsuite/gcc.dg/ipa/ipa-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/ipa/ipa-5.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/ipa/ipa-5.c	Sun May 24 22:32:09 2026
*************** int main ()
*** 27,32 ****
    return 0;
  }
  
! /* { dg-final { scan-ipa-dump-times "Creating a specialized node" 3 "cp"  } } */
  /* { dg-final { scan-ipa-dump "replacing param .1 c with const 3" "cp"  } } */
  /* { dg-final { scan-ipa-dump "replacing param .0 a with const 7" "cp"  } } */
--- 27,32 ----
    return 0;
  }
  
! /* { dg-final { scan-ipa-dump-times "Creating a specialized node" 2 "cp"  } } */
  /* { dg-final { scan-ipa-dump "replacing param .1 c with const 3" "cp"  } } */
  /* { dg-final { scan-ipa-dump "replacing param .0 a with const 7" "cp"  } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/loop-unswitch-19.c gcc-17-20260524/gcc/testsuite/gcc.dg/loop-unswitch-19.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/loop-unswitch-19.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/loop-unswitch-19.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,43 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fdump-tree-unswitch-optimized" } */
+ 
+ extern volatile int sink;
+ 
+ void
+ foo (int flag, int n, int m)
+ {
+   for (int i = 0; i < n; ++i)
+     {
+       /* Pad the outer loop to make it noticeably larger than the inner.  */
+       sink += i;
+       sink += 2;
+       sink += 3;
+       sink += 4;
+       sink += 5;
+       sink += 6;
+       sink += 7;
+       sink += 8;
+       sink += 9;
+       sink += 10;
+       sink += 11;
+       sink += 12;
+       sink += 13;
+       sink += 14;
+       sink += 15;
+       sink += 16;
+       sink += 17;
+       sink += 18;
+       sink += 19;
+       sink += 20;
+ 
+       for (int j = 0; j < m; ++j)
+         if (flag)
+           sink += j;
+     }
+ }
+ 
+ /* We should still unswitch, but stay on the inner loop because the
+    outer-only body (the part that would be duplicated by hoisting the
+    unswitching) exceeds param_max_unswitch_insns.  */
+ /* { dg-final { scan-tree-dump "unswitching loop" "unswitch" } } */
+ /* { dg-final { scan-tree-dump-not "unswitching outer loop" "unswitch" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/pr125050.c gcc-17-20260524/gcc/testsuite/gcc.dg/pr125050.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/pr125050.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/pr125050.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ /* PR tree-optimization/125050 */
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-phiopt2" } */
+ 
+ int f(int a)
+ {
+   if (a == -__INT_MAX__ - 1)
+     return -__INT_MAX__ - 1;
+   return -a;
+ }
+ 
+ /* This should be converted to (int)(-(unsigned)a).  */
+ /* { dg-final { scan-tree-dump-not "if " "phiopt2" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/pr125375.c gcc-17-20260524/gcc/testsuite/gcc.dg/pr125375.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/pr125375.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/pr125375.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do run } */
+ /* { dg-options "-O2 -fno-inline -fno-compare-elim" } */
+ 
+ int a, c = 1;
+ short b = 1, e;
+ volatile unsigned short d;
+ static int f() {
+   unsigned g = 2;
+   if (c >= a)
+     if ((c || b) && b) {
+       unsigned h = c && d;
+       int i = e = d;
+       if (d)
+         i = d = 0;
+       g = c ^ g * i;
+       c = ~c;
+       b = b * (g | 9) & ((1 && a) - i);
+       h && i && d;
+       a = c ^ e ^ (g && a) * h;
+       d = e;
+       if (a)
+         return g;
+     }
+ }
+ int main() {
+   if (f() != 1)
+     __builtin_abort();
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/pr56355-1.c gcc-17-20260524/gcc/testsuite/gcc.dg/pr56355-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/pr56355-1.c	Sun May 17 22:32:09 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/pr56355-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,8 ****
- /* { dg-do compile } */
- /* { dg-options "-O2 -Wstrict-overflow=4" } */
- 
- int
- f (int i)
- {
-   return __builtin_abs (i * i); /* { dg-warning "assuming signed overflow" } */
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/stack-usage-1.c gcc-17-20260524/gcc/testsuite/gcc.dg/stack-usage-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/stack-usage-1.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/stack-usage-1.c	Sun May 24 22:32:09 2026
*************** int foo (void)
*** 116,120 ****
    return 0;
  }
  
! /* { dg-final { scan-stack-usage "foo\t\(256|264\)\tstatic" } } */
  /* { dg-final { cleanup-stack-usage } } */
--- 116,120 ----
    return 0;
  }
  
! /* { dg-final { scan-stack-usage "foo `foo`\t\(256|264\)\tstatic" } } */
  /* { dg-final { cleanup-stack-usage } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/torture/pr125419-1.c gcc-17-20260524/gcc/testsuite/gcc.dg/torture/pr125419-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/torture/pr125419-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/torture/pr125419-1.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* PR tree-optimization/125419 */
+ 
+ signed  g13, g29, g27, g26, g17;
+ void f2(void)__attribute__((returns_twice));
+ void f1(bool c14)
+ {
+   int sj15;
+   if (c14) sj15 = sj15;
+   f2();
+   c14 = 0;
+   do {
+     int c11 = g27;
+     if (c11) goto lbl_br22;
+     goto lbl_br24;
+ lbl_br22:
+     c14 = sj15;
+     c11 = g29 = g13;
+     if (c11) goto lbl_br22;
+ lbl_br24:
+     g26 = g17;
+   } while (c14);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-prof/loop-split-4.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-prof/loop-split-4.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-prof/loop-split-4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-prof/loop-split-4.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ /* PR tree-optimization/XXXXX */
+ /* { dg-options "-O2 -fdump-tree-lsplit-details" } */
+ 
+ volatile int sink;
+ 
+ __attribute__((noinline)) int
+ helper (int a, int b)
+ {
+   return a + b;
+ }
+ 
+ int
+ main (void)
+ {
+   int n = 100, t = 3, total = 0;
+   /* With t=3, n=100 the guard "t < i" is false for i=0..3 (4 iterations,
+      empty else) and true for i=4..99 (96 iterations, calls helper).
+      split_at_bb_p swaps "t < i" to "i > t" (GT_EXPR), giving
+      initial_true = false.  Loop1 (cold, 4 iterations) handles the false
+      case, loop2 (hot, 96 iterations) handles the true case.
+      Without the fix loop1 was scaled by true_edge->probability (96%),
+      inverting the counts.  */
+   for (int i = 0; i < n; i++)
+     if (t < i)
+       total += helper (i, t);
+   sink = total;
+   return 0;
+ }
+ /* { dg-final-use-not-autofdo { scan-tree-dump-times "Loop split" 1 "lsplit" } } */
+ /* { dg-final-use-not-autofdo { scan-tree-dump-times "Invalid sum" 0 "lsplit" } } */
+ /* { dg-final-use-not-autofdo { scan-tree-dump "Split loop: initial_true false" "lsplit" } } */
+ /* With the fix loop1 (cold, 4 iterations) count ~4, loop2 (hot, 96
+    iterations) count ~96.  Without the fix the counts are inverted.
+    Check loop1 is a single-digit and loop2 is 90+.  */
+ /* { dg-final-use-not-autofdo { scan-tree-dump "loop1 count \[0-9\], loop2 count 9\[0-9\]" "lsplit" } } */
+ /* The skip edge from loop1 to loop2 should use loop1_prob.invert (),
+    where loop1_prob corresponds to the false edge when initial_true is false.  */
+ /* { dg-final-use-not-autofdo { scan-tree-dump "goto <bb \[0-9\]+>; .99\\." "lsplit" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-bool-eq.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-bool-eq.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-bool-eq.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-bool-eq.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ /* Verify the fix for PR112533 at -O2.
+    (~a & 1) == (~b & 1) is lowered via inlining to
+    (bool)(~a) == (bool)(~b), then existing forwprop rules cancel
+    the NOTs giving (bool)(a) == (bool)(b), which this rule
+    simplifies to (bool)(a ^ b) == 0.  */
+ 
+ typedef unsigned int u32;
+ 
+ static _Bool
+ is_even (u32 a)
+ {
+   return a % 2 == 0;
+ }
+ 
+ _Bool
+ same_evenness (u32 a, u32 b)
+ {
+   return is_even (a) == is_even (b);
+ }
+ 
+ _Bool
+ diff_evenness (u32 a, u32 b)
+ {
+   return is_even (a) != is_even (b);
+ }
+ 
+ /* Verify XOR form is produced.  */
+ /* { dg-final { scan-tree-dump-times "\\^" 2 "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-float-eq.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-float-eq.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-float-eq.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-float-eq.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ int
+ eq_float_no_xor (double a, double b)
+ {
+   float fa = a;
+   float fb = b;
+   return fa == fb;
+ }
+ 
+ /* Floating-point narrowing should not use XOR form.  */
+ /* { dg-final { scan-tree-dump-not "\\^" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-integral-eq.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-integral-eq.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-integral-eq.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-integral-eq.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ unsigned char
+ eq_uchar (unsigned int a, unsigned int b)
+ {
+   unsigned char ua = a;
+   unsigned char ub = b;
+   return ua == ub;
+ }
+ 
+ signed char
+ ne_schar (int a, int b)
+ {
+   signed char ca = a;
+   signed char cb = b;
+   return ca != cb;
+ }
+ 
+ int
+ eq_int_from_ll (long long a, long long b)
+ {
+   int ia = a;
+   int ib = b;
+   return ia == ib;
+ }
+ 
+ int
+ eq_int_no_narrow (int a, int b)
+ {
+   int ia = a;
+   int ib = b;
+   return ia == ib;
+ }
+ 
+ long long
+ eq_widen (int a, int b)
+ {
+   long long la = a;
+   long long lb = b;
+   return la == lb;
+ }
+ 
+ /* Only narrowing integral cases should produce XOR form.
+    eq_int_no_narrow and eq_widen should not match.  */
+ /* { dg-final { scan-tree-dump-times "\\^" 3 "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-short-eq.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-short-eq.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/narrow-short-eq.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/narrow-short-eq.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile { target { ! int16 } } } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ /* Requires sizeof(int) > sizeof(short).  */
+ 
+ short
+ eq_short_not (int a, int b)
+ {
+   short sa = ~a;
+   short sb = ~b;
+   return sa == sb;
+ }
+ 
+ short
+ ne_short_not (int a, int b)
+ {
+   short sa = ~a;
+   short sb = ~b;
+   return sa != sb;
+ }
+ 
+ /* Verify XOR form is produced for narrowing short comparisons.  */
+ /* { dg-final { scan-tree-dump-times "\\^" 2 "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-50.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-50.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-50.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-50.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-phiopt2-raw" } */
+ 
+ /* a == INT_MIN ? INT_MIN : -a  ->  (int)(-(unsigned)a) */
+ int f1(int a)
+ {
+   if (a == -__INT_MAX__ - 1)
+     return -__INT_MAX__ - 1;
+   return -a;
+ }
+ 
+ /* a != INT_MIN ? -a : INT_MIN  ->  (int)(-(unsigned)a) */
+ int f2(int a)
+ {
+   if (a != -__INT_MAX__ - 1)
+     return -a;
+   return -__INT_MAX__ - 1;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "negate_expr" 2 "phiopt2" } } */
+ /* { dg-final { scan-tree-dump-not "gimple_cond <" "phiopt2" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-51.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-51.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-51.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-51.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-phiopt2-raw" } */
+ 
+ /* Try the same pattern with different integer types.  */
+ 
+ long f_long(long a)
+ {
+   if (a == -__LONG_MAX__ - 1)
+     return -__LONG_MAX__ - 1;
+   return -a;
+ }
+ 
+ long long f_ll(long long a)
+ {
+   if (a == -__LONG_LONG_MAX__ - 1)
+     return -__LONG_LONG_MAX__ - 1;
+   return -a;
+ }
+ 
+ /* { dg-final { scan-tree-dump-times "negate_expr" 2 "phiopt2" } } */
+ /* { dg-final { scan-tree-dump-not "gimple_cond <" "phiopt2" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/pr112095.c	Sun May 24 22:32:09 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fdump-tree-optimized" } */
  
  typedef signed int s32;
  typedef unsigned char u8;
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fdump-tree-release_ssa -Wno-psabi" } */
  
  typedef signed int s32;
  typedef unsigned char u8;
*************** vg (v4ui a, v4ui b)
*** 121,127 ****
  }
  
  /* f* and vf should simplify to return a.  */
! /* { dg-final { scan-tree-dump-times "return a_" 6 "optimized" } } */
  
  /* g* and vg should simplify to ~a directly.  */
! /* { dg-final { scan-tree-dump-times "= ~a" 6 "optimized" } } */
--- 121,127 ----
  }
  
  /* f* and vf should simplify to return a.  */
! /* { dg-final { scan-tree-dump-times "return a_|<retval> = a_" 6 "release_ssa" } } */
  
  /* g* and vg should simplify to ~a directly.  */
! /* { dg-final { scan-tree-dump-times "= ~a" 6 "release_ssa" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/pr125104.c gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/pr125104.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/tree-ssa/pr125104.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/tree-ssa/pr125104.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-gimple-raw -fdump-tree-forwprop1-raw" } */
+ /* PR tree-optimization/125104 */
+ 
+ int f(int a, int b)
+ {
+   a &= ~1;
+   a ^= 1;
+   return a; // a | 1
+ }
+ 
+ /* { dg-final { scan-tree-dump "bit_xor_expr" "gimple" } } */
+ /* { dg-final { scan-tree-dump "bit_ior_expr" "forwprop1" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_ordered.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O3 -mrvv-vector-bits=scalable -fdump-tree-vect-details" } */
+ 
+ #include <stdint-gcc.h>
+ 
+ #define DEF_REDUC_PLUS(TYPE)				\
+   TYPE __attribute__ ((noinline, noclone))		\
+   reduc_plus_##TYPE (TYPE *restrict a, int n)		\
+   {							\
+     TYPE r = 0;						\
+     for (int i = 0; i < n; ++i)				\
+       r += a[i];					\
+     return r;						\
+   }
+ 
+ DEF_REDUC_PLUS (_Float16)
+ DEF_REDUC_PLUS (float)
+ DEF_REDUC_PLUS (double)
+ 
+ /* Ordered reduction cost: reduc_f*_ordered_cost + vr2fr.  */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 22" "vect" } } */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 12" "vect" } } */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 7" "vect" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vla_unordered.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O3 -mrvv-vector-bits=scalable -ffast-math -fdump-tree-vect-details" } */
+ 
+ #include <stdint-gcc.h>
+ 
+ #define DEF_REDUC_PLUS(TYPE)			\
+ TYPE __attribute__ ((noinline, noclone))	\
+ reduc_plus_##TYPE (TYPE *restrict a, int n)	\
+ {						\
+   TYPE r = 0;					\
+   for (int i = 0; i < n; ++i)			\
+     r += a[i];					\
+   return r;					\
+ }
+ 
+ DEF_REDUC_PLUS (int8_t)
+ DEF_REDUC_PLUS (int16_t)
+ DEF_REDUC_PLUS (int32_t)
+ DEF_REDUC_PLUS (int64_t)
+ DEF_REDUC_PLUS (_Float16)
+ DEF_REDUC_PLUS (float)
+ DEF_REDUC_PLUS (double)
+ 
+ /* { dg-final { scan-tree-dump-times "optimized: loop vectorized" 7 "vect" } } */
+ /* { dg-final { scan-assembler-times {vredsum\.vs\s+v[0-9]+,\s*v[0-9]+,\s*v[0-9]+} 4 } } */
+ /* { dg-final { scan-assembler-times {vfredusum\.vs\s+v[0-9]+,\s*v[0-9]+,\s*v[0-9]+} 3 } } */
+ 
+ /* Unordered reduction cost: reduc_*_cost + vr2gr/vr2fr.  */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 4" "vect" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_ordered.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ /* Ordered FP reduction costs in VLS mode.  */
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -fdump-tree-vect-details" } */
+ 
+ #include <stdint-gcc.h>
+ 
+ #define DEF_REDUC_PLUS(TYPE, NUM)			\
+   TYPE __attribute__ ((noinline, noclone))		\
+   reduc_plus_##TYPE##_##NUM (TYPE *restrict a)		\
+   {							\
+     TYPE r = 0;						\
+     for (int i = 0; i < NUM; ++i)			\
+       r += a[i];					\
+     return r;						\
+   }
+ 
+ DEF_REDUC_PLUS (_Float16, 8)
+ DEF_REDUC_PLUS (float, 8)
+ DEF_REDUC_PLUS (double, 8)
+ 
+ /* { dg-final { scan-assembler-not {csrr} } } */
+ 
+ /* f16: 20+2=22, f32: 10+2=12, f64: 5+2=7.  */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 22" "vect" } } */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 12" "vect" } } */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 7" "vect" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/reduc_vls_unordered.c	Sun May 24 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -ffast-math -fdump-tree-vect-details" } */
+ 
+ #include <stdint-gcc.h>
+ 
+ #define DEF_REDUC_PLUS(TYPE, NUM)			\
+   TYPE __attribute__ ((noinline, noclone))		\
+   reduc_plus_##TYPE##_##NUM (TYPE *restrict a)		\
+   {							\
+     TYPE r = 0;						\
+     for (int i = 0; i < NUM; ++i)			\
+       r += a[i];					\
+     return r;						\
+   }
+ 
+ DEF_REDUC_PLUS (int8_t, 8)
+ DEF_REDUC_PLUS (int16_t, 8)
+ DEF_REDUC_PLUS (int32_t, 8)
+ DEF_REDUC_PLUS (int64_t, 8)
+ DEF_REDUC_PLUS (_Float16, 8)
+ DEF_REDUC_PLUS (float, 8)
+ DEF_REDUC_PLUS (double, 8)
+ 
+ /* { dg-final { scan-assembler-times {vredsum\.vs} 4 } } */
+ /* { dg-final { scan-assembler-times {vfredusum\.vs} 3 } } */
+ /* { dg-final { scan-assembler-not {csrr} } } */
+ 
+ /* Unordered reduction cost: reduc_*_cost (2) + vr2gr/vr2fr (2) = 4.  */
+ /* { dg-final { scan-tree-dump "vec_to_scalar costs 4" "vect" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.dg/vla-1.c gcc-17-20260524/gcc/testsuite/gcc.dg/vla-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.dg/vla-1.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.dg/vla-1.c	Sun May 24 22:32:09 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-g -O3 -fdump-tree-optimized -fvar-tracking-assignments -fno-selective-scheduling -fno-selective-scheduling2 -fno-ipa-vrp" } */
  
  int __attribute__((noinline))
  f1 (int i)
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-g -O3 -fdump-tree-optimized -fvar-tracking-assignments -fno-selective-scheduling -fno-selective-scheduling2 -fno-ipa-vrp --param ipa-cp-eval-threshold=1" } */
  
  int __attribute__((noinline))
  f1 (int i)
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-6.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,18 ----
+ /* Check that the pass continues after a complex memory op (volatile load).  */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -favoid-store-forwarding -fdump-rtl-avoid_store_forwarding" } */
+ 
+ typedef union {
+   char arr_8[8];
+   long long_value;
+ } DataUnion;
+ 
+ long ssll_complex_mem (DataUnion *data, char x, volatile int *v)
+ {
+   (void)*v;
+   data->arr_8[4] = x;
+   return data->long_value;
+ }
+ 
+ /* { dg-final { scan-rtl-dump-times "Store forwarding detected" 1 "avoid_store_forwarding" } } */
+ /* { dg-final { scan-rtl-dump-times "Store forwarding avoided" 1 "avoid_store_forwarding" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/bitreverse.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/bitreverse.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/bitreverse.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/bitreverse.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ /*
+ ** br8:
+ **	and	w0, w0, 255
+ **	rbit	w0, w0
+ **	lsr	w0, w0, 24
+ **	ret
+ */
+ [[gnu::noipa]] unsigned char
+ br8 (unsigned char x)
+ {
+   return __builtin_bitreverse8 (x);
+ }
+ 
+ /*
+ ** br16:
+ **	and	w0, w0, 65535
+ **	rbit	w0, w0
+ **	lsr	w0, w0, 16
+ **	ret
+ */
+ [[gnu::noipa]] unsigned short
+ br16 (unsigned short x)
+ {
+   return __builtin_bitreverse16 (x);
+ }
+ 
+ /*
+ ** br32:
+ **	rbit	w0, w0
+ **	ret
+ */
+ [[gnu::noipa]] unsigned int
+ br32 (unsigned int x)
+ {
+   return __builtin_bitreverse32 (x);
+ }
+ 
+ /*
+ ** br64:
+ **	rbit	x0, x0
+ **	ret
+ */
+ [[gnu::noipa]] unsigned long long
+ br64 (unsigned long long x)
+ {
+   return __builtin_bitreverse64 (x);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr123748.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr123748.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr123748.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr123748.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Ofast" } */
+ 
+ void
+ f (float *__restrict f, long long *__restrict l)
+ {
+   for (int i = 0; i < 128; i++)
+     f[i] = l[i];
+ }
+ 
+ /* { dg-final { scan-assembler-times {scvtf\t} 2 } } */
+ /* { dg-final { scan-assembler-times {fcvtn\t} 2 } } */
+ /* { dg-final { scan-assembler-times {zip1\t} 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr123791.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr123791.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr123791.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr123791.c	Sun May 24 22:32:10 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mpc-relative-literal-loads -Wno-deprecated" } */
  
  char *
  foo ()
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2" } */
  
  char *
  foo ()
*************** foo ()
*** 7,10 ****
    return (char *) (__UINTPTR_TYPE__) foo + 7483647;
  }
  
! /* { dg-final { scan-assembler-not "\\.(word|xword)\tfoo" { xfail aarch64_large } } } */
--- 7,10 ----
    return (char *) (__UINTPTR_TYPE__) foo + 7483647;
  }
  
! /* { dg-final { scan-assembler-not "\\.(word|xword)\tfoo" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr63304_1.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr63304_1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr63304_1.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr63304_1.c	Sun May 24 22:32:10 2026
***************
*** 1,6 ****
  /* { dg-do assemble } */
  /* { dg-require-effective-target lp64 } */
! /* { dg-options "-O1 --save-temps -fno-pie" } */
  #pragma GCC push_options
  #pragma GCC target ("+nothing+simd,cmodel=small")
  
--- 1,6 ----
  /* { dg-do assemble } */
  /* { dg-require-effective-target lp64 } */
! /* { dg-options "-O1 --save-temps" } */
  #pragma GCC push_options
  #pragma GCC target ("+nothing+simd,cmodel=small")
  
*************** cal3 (double a)
*** 45,48 ****
      return 1;
  }
  
! /* { dg-final { scan-assembler-times "adrp" 4 } } */
--- 45,48 ----
      return 1;
  }
  
! /* { dg-final { scan-assembler-times "adrp" 3 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr78733.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr78733.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr78733.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr78733.c	Sun May 24 22:32:10 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mcmodel=large -mpc-relative-literal-loads -fno-pie -Wno-deprecated" } */
  /* { dg-require-effective-target lp64 } */
- /* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* }  { "-fpic" } { "" } } */
  
  __int128
  t (void)
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -mcmodel=large" } */
  /* { dg-require-effective-target lp64 } */
  
  __int128
  t (void)
*************** t (void)
*** 9,13 ****
    return ((__int128)0x123456789abcdef << 64) | 0xfedcba987654321;
  }
  
! /* { dg-final { scan-assembler "adr" } } */
! /* { dg-final { scan-assembler-not "adrp" } } */
--- 8,11 ----
    return ((__int128)0x123456789abcdef << 64) | 0xfedcba987654321;
  }
  
! /* { dg-final { scan-assembler "adrp" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr79041-2.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr79041-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/pr79041-2.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/pr79041-2.c	Sun May 24 22:32:10 2026
***************
*** 1,7 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mcmodel=large -mpc-relative-literal-loads -fno-pie -Wno-deprecated" } */
  /* { dg-require-effective-target lp64 } */
- /* { dg-skip-if "-mcmodel=large, no support for -fpic" { aarch64-*-* }  { "-fpic" } { "" } } */
  
  __int128
  t (void)
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -mcmodel=large" } */
  /* { dg-require-effective-target lp64 } */
  
  __int128
  t (void)
*************** t (void)
*** 9,13 ****
    return ((__int128)0x123456789abcdef << 64) | 0xfedcba987654321;
  }
  
! /* { dg-final { scan-assembler "adr" } } */
! /* { dg-final { scan-assembler-not "adrp" } } */
--- 8,11 ----
    return ((__int128)0x123456789abcdef << 64) | 0xfedcba987654321;
  }
  
! /* { dg-final { scan-assembler "adrp" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_1.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_1.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is vectorized by constructing a vector and storing it.
+    Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  Only one STR (Store
+    vector reg, unsigned immed, B/H/S/D-form) instruction is required
+    instead of 8.
+  */
+ #include <arm_sve.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (svint8_t src0, svint8_t src1, svint8_t src2, svint8_t src3, svint8_t src4,
+      svint8_t src5, svint8_t src6, svint8_t src7)
+ {
+   svbool_t all = svptrue_b8 ();
+   s.a = svmaxv_s8 (all, src0);
+   s.b = svminv_s8 (all, src1);
+   s.c = svlastb_s8 (svptrue_pat_b8 (SV_VL1), src2);
+   s.d = svaddv_s8 (all, src3);
+   s.e = svmaxv_s8 (all, src4);
+   s.f = svminv_s8 (all, src5);
+   s.g = svlastb_s8 (svptrue_pat_b8 (SV_VL1), src6);
+   s.h = svaddv_s8 (all, src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.b\[[0-9]+\], v[0-9]+\.b\[[0-9]+\]\n} 7 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\tb[0-9]+, } } } */
+ /* { dg-final { scan-assembler-not {\tstrb\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_2.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_2.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,42 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from the results of calls
+    to a function that has only vector parameters and returns a scalar result is
+    not vectorized by constructing a vector and storing it, given that the
+    GPR-to-SIMD version of INS (which would have had to be used to vectorize this
+    code) typically has higher latency and lower throughput than the SIMD-to-SIMD
+    version of INS.  This is a test for misidentification of builtin reductions.
+  */
+ 
+ #include <arm_sve.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ int8_t __attribute__ ((noinline, const))
+ bar (svint8_t v)
+ {
+   return v[0];
+ }
+ 
+ void
+ foo (svint8_t src0, svint8_t src1, svint8_t src2, svint8_t src3, svint8_t src4,
+      svint8_t src5, svint8_t src6, svint8_t src7)
+ {
+   s.a = bar (src0);
+   s.b = bar (src1);
+   s.c = bar (src2);
+   s.d = bar (src3);
+   s.e = bar (src4);
+   s.f = bar (src5);
+   s.g = bar (src6);
+   s.h = bar (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstrb\tw[0-9]+, } 8 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.b\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_3.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_3.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,39 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is vectorized by constructing a vector and storing it
+    even if the results of the reductions are narrowed.
+    Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  Only one STR (Store
+    vector reg, unsigned immed, B/H/S/D-form) instruction is required
+    instead of 8.
+  */
+ #include <arm_sve.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (svint16_t src0, svint32_t src1, svint16_t src2, svint32_t src3,
+      svint32_t src4, svint16_t src5, svint32_t src6, svint16_t src7)
+ {
+   svbool_t all16 = svptrue_b16 ();
+   svbool_t all32 = svptrue_b32 ();
+   s.a = svmaxv_s16 (all16, src0);
+   s.b = svminv_s32 (all32, src1);
+   s.c = svlastb_s16 (svptrue_pat_b16 (SV_VL1), src2);
+   s.d = svaddv_s32 (all32, src3);
+   s.e = svmaxv_s32 (all32, src4);
+   s.f = svminv_s16 (all16, src5);
+   s.g = svlastb_s32 (svptrue_pat_b32 (SV_VL1), src6);
+   s.h = svaddv_s16 (all16, src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.b\[[0-9]+\], v[0-9]+\.b\[[0-9]+\]\n} 7 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\tb[0-9]+, } } } */
+ /* { dg-final { scan-assembler-not {\tstrb\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_4.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_4.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_4.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is not vectorized by constructing a vector and storing it
+    if the results of the reductions are widened.  Widening typically
+    causes the result of a reduction to be transferred to a GPR, therefore
+    vectorization would require GPR-to-SIMD-register transfers.
+  */
+ #include <arm_sve.h>
+ 
+ struct S
+ {
+   int32_t a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (svint16_t src0, svint8_t src1, svint16_t src2, svint8_t src3,
+      svint8_t src4, svint16_t src5, svint8_t src6, svint16_t src7)
+ {
+   svbool_t all16 = svptrue_b16 ();
+   svbool_t all8 = svptrue_b8 ();
+   s.a = svmaxv_s16 (all16, src0);
+   s.b = svminv_s8 (all8, src1);
+   s.c = svlastb_s16 (svptrue_pat_b16 (SV_VL1), src2);
+   s.d = svaddv_s8 (all8, src3);
+   s.e = svmaxv_s8 (all8, src4);
+   s.f = svminv_s16 (all16, src5);
+   s.g = svlastb_s8 (svptrue_pat_b8 (SV_VL1), src6);
+   s.h = svaddv_s16 (all16, src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstp\tw[0-9]+, w[0-9]+,} 4 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.s\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tfmov\ts[0-9]+, w[0-9]+\n} } }
+ /* { dg-final { scan-assembler-not {\tstp\tq[0-9]+, q[0-9]+,} } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_5.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_5.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_5.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/sve/vec_construct_5.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from lane extractions is
+    vectorized by constructing a vector and storing it.  Since there are no
+    GPR-to-SIMD register transfers, there is no need to charge additional costs
+    for them.  Only one STR (Store vector reg, unsigned immed, B/H/S/D-form)
+    instruction is required instead of 8.  This is a test for over-restriction
+    of an exemption from usual GPR-to-SIMD costs to reductions (in case lane
+    extraction is not treated as a reduction).
+  */
+ #include <arm_sve.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (svint8_t src0, svint8_t src1, svint8_t src2, svint8_t src3, svint8_t src4,
+      svint8_t src5, svint8_t src6, svint8_t src7, svbool_t p)
+ {
+   s.a = svlastb_s8 (p, src0);
+   s.b = svlastb_s8 (p, src1);
+   s.c = svlastb_s8 (p, src2);
+   s.d = svlastb_s8 (p, src3);
+   s.e = svlastb_s8 (p, src4);
+   s.f = svlastb_s8 (p, src5);
+   s.g = svlastb_s8 (p, src6);
+   s.h = svlastb_s8 (p, src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.b\[[0-9]+\], v[0-9]+\.b\[[0-9]+\]\n} 7 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\tb[0-9]+, } } } */
+ /* { dg-final { scan-assembler-not {\tstrb\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/tbz_1.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/tbz_1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/tbz_1.c	Sun May 17 22:32:10 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/tbz_1.c	Sun May 24 22:32:10 2026
*************** void h(void);
*** 8,14 ****
  
  /*
  ** g1:
! ** 	tbnz	w[0-9]+, #?0, .L([0-9]+)
  ** 	ret
  **	...
  */
--- 8,14 ----
  
  /*
  ** g1:
! ** 	tbnz	[wx][0-9]+, #?0, .L([0-9]+)
  ** 	ret
  **	...
  */
*************** void g1(bool x)
*** 20,26 ****
  
  /*
  ** g2:
! ** 	tbz	w[0-9]+, #?0, .L([0-9]+)
  ** 	b	h
  **	...
  */
--- 20,26 ----
  
  /*
  ** g2:
! ** 	tbz	[wx][0-9]+, #?0, .L([0-9]+)
  ** 	b	h
  **	...
  */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-1.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-1.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,28 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 4 elements held in SIMD registers is
+    vectorized by constructing a vector and storing it, given that the
+    SIMD-to-SIMD version of INS (used here) typically has lower latency
+    and higher throughput than the GPR-to-SIMD version of INS.  Despite
+    that, any benefit of vectorization is expected to be marginal
+    (including very little reduction in code size). */
+ 
+ struct S
+ {
+   __fp16 a, b, c, d;
+ } s;
+ 
+ void
+ foo (__fp16 a, __fp16 b, __fp16 c, __fp16 d)
+ {
+   s.a = a;
+   s.b = b;
+   s.c = c;
+   s.d = d;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.h\[[0-9]+\], v[0-9]+\.h\[[0-9]+\]\n} 3 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, \[x[0-9]+.*\]\n} 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\th[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-10.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-10.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-10.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-10.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,42 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from the results of calls
+    to a function that has only vector parameters and returns a scalar result is
+    not vectorized by constructing a vector and storing it, given that the
+    GPR-to-SIMD version of INS (which would have had to be used to vectorize this
+    code) typically has higher latency and lower throughput than the SIMD-to-SIMD
+    version of INS.  This is a test for misidentification of builtin reductions.
+  */
+ 
+ #include <arm_neon.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ int8_t __attribute__ ((noinline, const))
+ bar (int8x8_t v)
+ {
+         return v[0];
+ }
+ 
+ void
+ foo (int8x8_t src0, int8x8_t src1, int8x8_t src2, int8x8_t src3, int8x8_t src4,
+      int8x8_t src5, int8x8_t src6, int8x8_t src7)
+ {
+   s.a = bar (src0);
+   s.b = bar (src1);
+   s.c = bar (src2);
+   s.d = bar (src3);
+   s.e = bar (src4);
+   s.f = bar (src5);
+   s.g = bar (src6);
+   s.h = bar (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstrb\tw[0-9]+, } 8 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.b\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-11.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-11.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-11.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-11.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is vectorized by constructing a vector and storing it
+    even if the results of the reductions are narrowed.
+    Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  Only one STR (Store
+    vector reg, unsigned immed, B/H/S/D-form) instruction is required
+    instead of 8.
+  */
+ #include <arm_neon.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (int16x4_t src0, int32x2_t src1, int16x4_t src2, int32x2_t src3,
+      int32x2_t src4, int16x4_t src5, int32x2_t src6, int16x4_t src7)
+ {
+   s.a = vmaxv_s16 (src0);
+   s.b = vminv_s32 (src1);
+   s.c = vduph_lane_s16 (src2, 2);
+   s.d = vaddv_s32 (src3);
+   s.e = vmaxv_s32 (src4);
+   s.f = vminv_s16 (src5);
+   s.g = vdups_lane_s32 (src6, 1);
+   s.h = vaddv_s16 (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.b\[[0-9]+\], v[0-9]+\.b\[[0-9]+\]\n} 7 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\tb[0-9]+, } } } */
+ /* { dg-final { scan-assembler-not {\tstrb\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-12.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-12.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-12.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-12.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is not vectorized by constructing a vector and storing it
+    if the results of the reductions are widened.  Widening typically
+    causes the result of a reduction to be transferred to a GPR, therefore
+    vectorization would require GPR-to-SIMD-register transfers.
+  */
+ #include <arm_neon.h>
+ 
+ struct S
+ {
+   int32_t a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (int16x4_t src0, int8x8_t src1, int16x4_t src2, int8x8_t src3,
+      int8x8_t src4, int16x4_t src5, int8x8_t src6, int16x4_t src7)
+ {
+   s.a = vmaxv_s16 (src0);
+   s.b = vminv_s8 (src1);
+   s.c = vduph_lane_s16 (src2, 2);
+   s.d = vaddv_s8 (src3);
+   s.e = vmaxv_s8 (src4);
+   s.f = vminv_s16 (src5);
+   s.g = vdupb_lane_s8 (src6, 1);
+   s.h = vaddv_s16 (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstp\tw[0-9]+, w[0-9]+,} 4 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.s\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tfmov\ts[0-9]+, w[0-9]+\n} } }
+ /* { dg-final { scan-assembler-not {\tstp\tq[0-9]+, q[0-9]+,} } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-2.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-2.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 4 elements loaded from memory is vectorized by
+    constructing a vector and storing it, given that the LD1 (ASIMD load, 1
+    element, one lane, B/H/S) instruction typically has similar throughput to the
+    LDR (Load vector reg, unscaled immed) instruction that would be used by the
+    scalar version of the same code.  Any additional latency of LD1 is assumed to
+    be represented by the basic cost of vector construction that is applied
+    uniformly.  Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  Only one STR (Store vector reg,
+    unsigned immed, B/H/S/D-form) instruction is required by the vectorized code
+    but the overall benefit of vectorization is expected to be marginal (except
+    on code size) because scalar loads are easier to parallelize, albeit at the
+    cost of using more SIMD registers.  */
+ 
+ struct S { __fp16 a, b, c, d; } s;
+ 
+ void
+ foo (__fp16 *a, __fp16 *b, __fp16 *c, __fp16 *d)
+ {
+   __fp16 a_ = *a, b_ = *b, c_ = *c, d_ = *d;
+   s.a = a_;
+   s.b = b_;
+   s.c = c_;
+   s.d = d_;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tld1\t{v[0-9]+\.h}\[[0-9]+\], \[x[0-9]+\]\n} 3 } } */
+ /* (The fourth load is usually ldr hN, ... but don't require that.) */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, \[x[0-9]+.*\]\n} 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\th[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-3.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-3.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 4 elements held in scalar registers is
+    not vectorized by constructing a vector and storing it, given that the
+    GPR-to-SIMD version of INS (which would have had to be used to vectorize
+    this code) typically has higher latency and lower throughput than the
+    SIMD-to-SIMD version of INS (with which such a transformation might
+    have been profitable).  No increase in code size is expected as a
+    consequence of forgoing vectorization, either.  */
+ 
+ struct S
+ {
+   short a, b, c, d;
+ } s;
+ 
+ void
+ foo (short a, short b, short c, short d)
+ {
+   s.a = a;
+   s.b = b;
+   s.c = c;
+   s.d = d;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstrh\tw[0-9]+, } 4 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tfmov\ts[0-9]+, w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.h\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-4.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-4.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-4.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 4 elements loaded from memory is vectorized by
+    constructing a vector and storing it, given that the LD1 (ASIMD load, 1
+    element, one lane, B/H/S) instruction typically  has similar throughput to
+    the LDRSH (Load, immed offset) instruction that would be used by the scalar
+    version of the same code.  Any additional latency of LD1 is assumed to be
+    represented by the basic cost of vector construction that is applied
+    uniformly.  Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  The STR (Store vector reg,
+    unsigned immed, B/H/S/D-form) instruction typically has higher latency than
+    STRH (Store register, unsigned immed), but only one is required.  Despite
+    that, the overall benefit of vectorization is expected to be marginal (except
+    on code size) because scalar loads are easier to parallelize, albeit at the
+    cost of using more general purpose registers. */
+ 
+ struct S
+ {
+   short a, b, c, d;
+ } s;
+ 
+ void
+ foo (short *a, short *b, short *c, short *d)
+ {
+   short a_ = *a, b_ = *b, c_ = *c, d_ = *d;
+   s.a = a_;
+   s.b = b_;
+   s.c = c_;
+   s.d = d_;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tld1\t{v[0-9]+\.h}\[[0-9]+\], \[x[0-9]+\]\n} 3 } } */
+ /* (The fourth load is usually ldr hN, ... but don't require that.) */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tldrsh\tw[0-9]+, \[x[0-9]+\]\n} } } */
+ /* { dg-final { scan-assembler-not {\tstrh\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-5.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-5.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-5.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,34 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements held in scalar registers is
+    not vectorized by constructing a vector and storing it, given that the
+    GPR-to-SIMD version of INS (which would have had to be used to vectorize
+    this code) typically has higher latency and lower throughput than the
+    SIMD-to-SIMD version of INS (with which such a transformation might
+    have been profitable).  No increase in code size is expected as a
+    consequence of forgoing vectorization, either.  */
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (char a, char b, char c, char d, char e, char f, char g, char h)
+ {
+   s.a = a;
+   s.b = b;
+   s.c = c;
+   s.d = d;
+   s.e = e;
+   s.f = f;
+   s.g = g;
+   s.h = h;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstrb\tw[0-9]+, } 8 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tfmov\ts[0-9]+, w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.b\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-6.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-6.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-6.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,42 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements loaded from memory is
+    vectorized by constructing a vector and storing it, given that the
+    LD1 (ASIMD load, 1 element, one lane, B/H/S) instruction typically
+    has similar throughput to the LDRB (Load, immed offset) instruction
+    that would be used by the scalar code.  Any additional latency of LD1 is
+    assumed to be represented by the basic cost of vector construction that is
+    applied uniformly.  Since there are no GPR-to-SIMD register transfers, there
+    is no need to charge additional costs for them.  The STR (Store vector reg,
+    unsigned immed, B/H/S/D-form) instruction typically has higher latency than
+    STRB (Store register, unsigned immed), but only one is required.  Despite
+    that, the overall benefit of vectorization is expected to be marginal (except
+    on code size) because scalar loads are easier to parallelize, albeit at the
+    cost of using more general purpose registers. */
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (char *a, char *b, char *c, char *d, char *e, char *f, char *g, char *h)
+ {
+   char a_ = *a, b_ = *b, c_ = *c, d_ = *d, e_ = *e, f_ = *f, g_ = *g, h_ = *h;
+   s.a = a_;
+   s.b = b_;
+   s.c = c_;
+   s.d = d_;
+   s.e = e_;
+   s.f = f_;
+   s.g = g_;
+   s.h = h_;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tld1\t{v[0-9]+\.b}\[[0-9]+\], \[x[0-9]+\]\n} 7 } } */
+ /* (The eighth load is usually ldr bN, ... but don't require that.) */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tldrb\tw[0-9]+, \[x[0-9]+\]\n} } } */
+ /* { dg-final { scan-assembler-not {\tstrb\tw[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-7.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-7.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-7.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-7.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of byte-reversed stores of 8 elements derived from
+    scalar registers is not vectorized by constructing a vector and
+    storing it, given that the GPR-to-SIMD version of INS (which would
+    have had to be used to vectorize this code) typically has higher
+    latency and lower throughput than the SIMD-to-SIMD version of INS.
+    Actually, vectorization would not be profitable in either case because
+    it would have the unfortunate side-effect of preventing store-merging
+    that would otherwise happen in a later pass, which would prevent the
+    byte-reversing pattern from being recognised and lowered using scalar
+    instructions.  */
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (unsigned int b, unsigned int c)
+ {
+   s.a = b >> 24;
+   s.b = b >> 16;
+   s.c = b >> 8;
+   s.d = b >> 0;
+   s.e = c >> 24;
+   s.f = c >> 16;
+   s.g = c >> 8;
+   s.h = c >> 0;
+ }
+ 
+ /* { dg-final { scan-assembler-times {\trev\t(w[0-9]+), \1\n} 2 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tfmov\ts[0-9]+, w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.b\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-8.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-8.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-8.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-8.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from the results of calls
+    to a function that has only floating point parameters and returns a scalar
+    result is not vectorized by constructing a vector and storing it, given that
+    the GPR-to-SIMD version of INS (which would have had to be used to vectorize
+    this code) typically has higher latency and lower throughput than the
+    SIMD-to-SIMD version of INS.  This is a test for misidentification of builtin
+    reductions.  */
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ char __attribute__ ((noinline, const))
+ bar (double x)
+ {
+         return x;
+ }
+ 
+ void
+ foo (double src0, double src1, double src2, double src3, double src4,
+      double src5, double src6, double src7)
+ {
+   s.a = bar (src0);
+   s.b = bar (src1);
+   s.c = bar (src2);
+   s.d = bar (src3);
+   s.e = bar (src4);
+   s.f = bar (src5);
+   s.g = bar (src6);
+   s.h = bar (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tstrb\tw[0-9]+, } 8 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tdup\tv[0-9]+.8b, w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tins\tv[0-9]+\.b\[[0-9]+\], w[0-9]+\n} } } */
+ /* { dg-final { scan-assembler-not {\tstr\td[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-9.c gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-9.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/aarch64/vec-construct-9.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/aarch64/vec-construct-9.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -ftree-slp-vectorize" } */
+ 
+ /* Test that a group of stores of 8 elements derived from a horizontal
+    reduction is vectorized by constructing a vector and storing it.
+    Since there are no GPR-to-SIMD register transfers, there is no
+    need to charge additional costs for them.  Only one STR (Store
+    vector reg, unsigned immed, B/H/S/D-form) instruction is required
+    instead of 8.
+  */
+ #include <arm_neon.h>
+ 
+ struct S
+ {
+   char a, b, c, d, e, f, g, h;
+ } s;
+ 
+ void
+ foo (int8x8_t src0, int8x8_t src1, int8x8_t src2, int8x8_t src3, int8x8_t src4,
+      int8x8_t src5, int8x8_t src6, int8x8_t src7)
+ {
+   s.a = vmaxv_s8 (src0);
+   s.b = vminv_s8 (src1);
+   s.c = vdupb_lane_s8 (src2, 2);
+   s.d = vaddv_s8 (src3);
+   s.e = vmaxv_s8 (src4);
+   s.f = vminv_s8 (src5);
+   s.g = vdupb_lane_s8 (src6, 1);
+   s.h = vaddv_s8 (src7);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\tins\tv[0-9]+\.b\[[0-9]+\], v[0-9]+\.b\[[0-9]+\]\n} 7 } } */
+ /* { dg-final { scan-assembler-times {\tstr\td[0-9]+, } 1 } } */
+ 
+ /* { dg-final { scan-assembler-not {\tstr\tb[0-9]+, } } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/arc/sdata-6.c gcc-17-20260524/gcc/testsuite/gcc.target/arc/sdata-6.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/arc/sdata-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/arc/sdata-6.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,49 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -msdata" } */
+ 
+ #include <stdint.h>
+ 
+ __attribute__((section(".sdata"))) int a[300];
+ 
+ #define TEST(optype, threshold)                                                \
+   void consume##optype (int, int, int, int, optype);                           \
+   optype test_r0_fit_##optype (void) {                                         \
+     return ((optype *)a)[threshold];                                           \
+   }                                                                            \
+   optype test_r0_no_fit_##optype (void)                                        \
+   {                                                                            \
+     return ((optype *)a)[threshold + 1];                                       \
+   }                                                                            \
+   void test_r4_fit_##optype (void)                                             \
+   {                                                                            \
+     return consume##optype (0, 0, 0, 0, ((optype *)a)[threshold]);             \
+   }                                                                            \
+   void test_r4_no_fit_##optype (void)                                          \
+   {                                                                            \
+     return consume##optype (0, 0, 0, 0, ((optype *)a)[threshold + 1]);         \
+   }
+ 
+ TEST (char,    255)
+ TEST (short,   255)
+ TEST (int,     255)
+ TEST (int64_t, 127)
+ 
+ /* { dg-final { scan-assembler "ldb_s\\s+r0,\\\[gp,@a@sda\\+255\\\]" } } */
+ /* { dg-final { scan-assembler "ldb\\s+r0,\\\[@a\\+256\\\]" } } */
+ /* { dg-final { scan-assembler "ldb\\s+r4,\\\[gp,@a@sda\\+255\\\]" } } */
+ /* { dg-final { scan-assembler "ldb\\s+r4,\\\[@a\\+256\\\]" } } */
+ 
+ /* { dg-final { scan-assembler "ld\[hw\].x.as\\s+r0,\\\[gp,@a@sda\\+510\\\]" } } */
+ /* { dg-final { scan-assembler "ld\[hw\].x\\s+r0,\\\[@a\\+512\\\]" } } */
+ /* { dg-final { scan-assembler "ld\[hw\].x.as\\s+r4,\\\[gp,@a@sda\\+510\\\]" } } */
+ /* { dg-final { scan-assembler "ld\[hw\].x\\s+r4,\\\[@a\\+512\\\]" } } */
+ 
+ /* { dg-final { scan-assembler "ld_s\\s+r0,\\\[gp,@a@sda\\+1020\\\]" } } */
+ /* { dg-final { scan-assembler "ld\\s+r0,\\\[@a\\+1024\\\]" } } */
+ /* { dg-final { scan-assembler "ld.as\\s+r4,\\\[gp,@a@sda\\+1020\\\]" } } */
+ /* { dg-final { scan-assembler "ld\\s+r4,\\\[@a\\+1024\\\]" } } */
+ 
+ /* { dg-final { scan-assembler "ldd.as\\s+r0,\\\[gp,@a@sda\\+1016\\\]" { target ll64} } } */
+ /* { dg-final { scan-assembler "ldd\\s+r0,\\\[@a\\+1024\\\]" { target ll64} } } */
+ /* { dg-final { scan-assembler "ldd.as\\s+r4,\\\[gp,@a@sda\\+1016\\\]" { target ll64} } } */
+ /* { dg-final { scan-assembler "ldd\\s+r4,\\\[@a\\+1024\\\]" { target ll64} } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c gcc-17-20260524/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */
+ /* { dg-add-options arm_v8_1m_mve_fp } */
+ /* { dg-additional-options "-O2" } */
+ 
+ /* PR target/124870.  */
+ 
+ #include <arm_mve.h>
+ 
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+ void fn (int n, uint32_t *strides, float32_t *f)
+ {
+     uint32x4_t vecScGathAddr = vld1q_u32(strides);
+     float32x4_t vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
+     float32x4_t vecB = vecA;
+     int i;
+     for (i = 0; i < n; ++i)
+     {
+         vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64);
+         vecB = vaddq_f32 (vecB, vecA);
+     }
+     vstrwq_f32 (f, vecB);
+ }
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ /* { dg-final { scan-assembler-times "vadd.f32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]+" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx-pr125357-2.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx-pr125357-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx-pr125357-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx-pr125357-2.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,20 ----
+ /* PR target/125357 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx -mno-avx2 -mno-xop" } */
+ /* { dg-final { scan-assembler-times "\tvpaddq\t" 2 } } */
+ /* { dg-final { scan-assembler-times "\tvpermilpd\t" 2 } } */
+ 
+ typedef long long v2di __attribute__((vector_size (16)));
+ typedef double v2df __attribute__((vector_size (16)));
+ 
+ v2di
+ foo (v2di x, v2di y)
+ {
+   return __builtin_shuffle (x, y);
+ }
+ 
+ v2df
+ bar (v2df x, v2di y)
+ {
+   return __builtin_shuffle (x, y);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx-pr125357.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx-pr125357.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx-pr125357.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx-pr125357.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ /* PR target/125357 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx -mno-avx2 -mno-xop" } */
+ /* { dg-final { scan-assembler-times "\tvpermilps\t" 2 } } */
+ 
+ typedef int v4si __attribute__((vector_size (16)));
+ typedef float v4sf __attribute__((vector_size (16)));
+ 
+ v4si
+ foo (v4si x, v4si y)
+ {
+   return __builtin_shuffle (x, y);
+ }
+ 
+ v4sf
+ bar (v4sf x, v4si y)
+ {
+   return __builtin_shuffle (x, y);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx2-pr125357-2.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx2-pr125357-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx2-pr125357-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx2-pr125357-2.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,20 ----
+ /* PR target/125357 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx2 -mno-avx512f -mno-xop" } */
+ /* { dg-final { scan-assembler-times "\tvpaddq\t" 2 } } */
+ /* { dg-final { scan-assembler-times "\tvpermilpd\t" 2 } } */
+ 
+ typedef long long v2di __attribute__((vector_size (16)));
+ typedef double v2df __attribute__((vector_size (16)));
+ 
+ v2di
+ foo (v2di x, v2di y)
+ {
+   return __builtin_shuffle (x, y);
+ }
+ 
+ v2df
+ bar (v2df x, v2di y)
+ {
+   return __builtin_shuffle (x, y);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx2-pr125357.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx2-pr125357.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/avx2-pr125357.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/avx2-pr125357.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ /* PR target/125357 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx2 -mno-avx512f -mno-xop" } */
+ /* { dg-final { scan-assembler-times "\tvpermilps\t" 2 } } */
+ 
+ typedef int v4si __attribute__((vector_size (16)));
+ typedef float v4sf __attribute__((vector_size (16)));
+ 
+ v4si
+ foo (v4si x, v4si y)
+ {
+   return __builtin_shuffle (x, y);
+ }
+ 
+ v4sf
+ bar (v4sf x, v4si y)
+ {
+   return __builtin_shuffle (x, y);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/gfni-builtin-bitreverse-1.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/gfni-builtin-bitreverse-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/gfni-builtin-bitreverse-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/gfni-builtin-bitreverse-1.c	Sun May 24 22:32:10 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do run { target gfni } } */
+ /* { dg-options "-mgfni -O2" } */
+ 
+ #define main do_test
+ #include "../../gcc.dg/builtin-bitreverse-1.c"
+ #undef main
+ 
+ int
+ main ()
+ {
+   if (__builtin_cpu_supports ("gfni"))
+     do_test ();
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr117416-2.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr117416-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr117416-2.c	Sun May 17 22:32:11 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr117416-2.c	Sun May 24 22:32:11 2026
*************** void* p;
*** 9,13 ****
  void extern
  prefetch_test (void)
  {
!   __builtin_ia32_prefetch (p, 0, 0, 2); /* { dg-warning "invalid forth argument to '__builtin_ia32_prefetch'; using zero" } */
  }
--- 9,13 ----
  void extern
  prefetch_test (void)
  {
!   __builtin_ia32_prefetch (p, 0, 0, 2); /* { dg-warning "invalid fourth argument to '__builtin_ia32_prefetch'; using zero" } */
  }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125351.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125351.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125351.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125351.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,3 ----
+ /* { dg-do compile } */
+ /* { dg-options "-mptwrite -masm=intel" } */
+ void foo() { __builtin_ia32_ptwrite32(0); }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125355-2.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125355-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125355-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125355-2.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,27 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic" } */
+ /* { dg-add-options check_function_bodies } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+ 
+ /*
+ **foo.cold:
+ **...
+ **	call	memmove
+ **	call	abort
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include <stddef.h>
+ #include <string.h>
+ 
+ void
+ foo (char *d, char *s, size_t n)
+ {
+   if (n < 80)
+     {
+       memmove (d, s, n);
+       __builtin_abort ();
+     }
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125355.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125355.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/pr125355.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/pr125355.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,23 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Os -mtune=generic" } */
+ /* { dg-add-options check_function_bodies } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB0:
+ **	.cfi_startproc
+ **	jmp	memmove
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include <stddef.h>
+ #include <string.h>
+ 
+ void
+ foo (char *d, char *s, size_t n)
+ {
+   memmove(d, s, n);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/sse4_1-ptest-8.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/sse4_1-ptest-8.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/sse4_1-ptest-8.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/sse4_1-ptest-8.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,21 ----
+ /* PR target/90483 */
+ /* PR libstdc++/118416 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -msse4.1" } */
+ 
+ typedef long long v2di __attribute__ ((__vector_size__ (16)));
+ 
+ v2di x;
+ 
+ int test1 ()
+ {
+   return __builtin_ia32_ptestz128((v2di){-1,-1}, x == 0);
+ }
+ 
+ int test2 ()
+ {
+   return __builtin_ia32_ptestz128(x == 0, (v2di){-1,-1});
+ }
+ 
+ /* { dg-final { scan-assembler-times "ptest\[ \\t\]+%" 2 } } */
+ /* { dg-final { scan-assembler-not "pcmpeqd" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/i386/sse4_1-ptest-9.c gcc-17-20260524/gcc/testsuite/gcc.target/i386/sse4_1-ptest-9.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/i386/sse4_1-ptest-9.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/i386/sse4_1-ptest-9.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,21 ----
+ /* PR target/90483 */
+ /* PR libstdc++/118416 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -msse4.1" } */
+ 
+ typedef long long v2di __attribute__ ((__vector_size__ (16)));
+ 
+ v2di x;
+ 
+ int test1 ()
+ {
+   return __builtin_ia32_ptestz128((v2di){0,0}, x == 0);
+ }
+ 
+ int test2 ()
+ {
+   return __builtin_ia32_ptestz128(x == 0, (v2di){0,0});
+ }
+ 
+ /* { dg-final { scan-assembler-not "ptest\[ \\t\]+%" } } */
+ /* { dg-final { scan-assembler-not "pcmpeq" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/loongarch/la64/bitreverse.c gcc-17-20260524/gcc/testsuite/gcc.target/loongarch/la64/bitreverse.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/loongarch/la64/bitreverse.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/loongarch/la64/bitreverse.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,73 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ /* { dg-final { check-function-bodies "**" "" "" } } */
+ 
+ /*
+ ** t1:
+ **	bitrev\.d	\$r4,\$r4
+ **	jr	\$r1
+ */
+ long
+ t1 (long x)
+ {
+   return __builtin_bitreverse64 (x);
+ }
+ 
+ /*
+ ** t2:
+ **	bitrev\.w	\$r4,\$r4
+ **	jr	\$r1
+ */
+ int
+ t2 (int x)
+ {
+   return __builtin_bitreverse32 (x);
+ }
+ 
+ /*
+ ** t3:
+ **	bitrev\.d	(\$r[0-9]+),\$r4
+ **	srai\.d	\$r4,\1,48
+ **	jr	\$r1
+ */
+ short
+ t3 (short x)
+ {
+   return __builtin_bitreverse16 (x);
+ }
+ 
+ /*
+ ** t4:
+ **	bitrev\.4b	(\$r[0-9]+),\$r4
+ **	ext\.w\.b	\$r4,\1
+ **	jr	\$r1
+ */
+ char
+ t4 (char x)
+ {
+   return __builtin_bitreverse8 (x);
+ }
+ 
+ /*
+ ** t5:
+ **	bitrev\.d	(\$r[0-9]+),\$r4
+ **	srli\.d	\$r4,\1,48
+ **	jr	\$r1
+ */
+ unsigned short
+ t5 (short x)
+ {
+   return __builtin_bitreverse16 (x);
+ }
+ 
+ /*
+ ** t6:
+ **	bitrev\.4b	(\$r[0-9]+),\$r4
+ **	bstrpick\.w	\$r4,\1,7,0
+ **	jr	\$r1
+ */
+ unsigned char
+ t6 (char x)
+ {
+   return __builtin_bitreverse8 (x);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo3.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo3.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,133 ----
+ /* { dg-do compile { target { lp64 } } } */
+ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+ 
+ /* Verify whether the compiler generates expected code for the ISA 3.0 amo
+    (atomic memory operations) functions  */
+ 
+ #include <amo.h>
+ #include <stdint.h>
+ 
+ uint32_t
+ do_lw_cs_ne (uint32_t *mem, uint32_t cond, uint32_t value)
+ {
+   return amo_lwat_cas_neq (mem, cond, value);
+ }
+ 
+ int32_t
+ do_lw_scs_ne (int32_t *mem, int32_t cond, int32_t value)
+ {
+   return amo_lwat_scas_neq (mem, cond, value);
+ }
+ 
+ uint32_t
+ do_lw_inc_equal (uint32_t *mem)
+ {
+   return amo_lwat_inc_eq (mem);
+ }
+ 
+ int32_t
+ do_lw_sinc_equal (int32_t *mem)
+ {
+   return amo_lwat_sinc_eq (mem);
+ }
+ 
+ uint32_t
+ do_lw_inc_bounded (uint32_t *mem)
+ {
+   return amo_lwat_inc_bounded (mem);
+ }
+ 
+ int32_t
+ do_lw_sinc_bounded (int32_t *mem)
+ {
+   return amo_lwat_sinc_bounded (mem);
+ }
+ 
+ uint32_t
+ do_lw_dec_bounded (uint32_t *mem)
+ {
+   return amo_lwat_dec_bounded (mem);
+ }
+ 
+ int32_t
+ do_lw_sdec_bounded (int32_t *mem)
+ {
+   return amo_lwat_sdec_bounded (mem);
+ }
+ 
+ uint64_t
+ do_ld_cs_ne (uint64_t *mem, uint64_t cond, uint64_t value)
+ {
+   return amo_ldat_cas_neq (mem, cond, value);
+ }
+ 
+ int64_t
+ do_ld_scs_ne (int64_t *mem, int64_t cond, int64_t value)
+ {
+   return amo_ldat_scas_neq (mem, cond, value);
+ }
+ 
+ uint64_t
+ do_ld_inc_equal (uint64_t *mem)
+ {
+   return amo_ldat_inc_eq (mem);
+ }
+ 
+ int64_t
+ do_ld_sinc_equal (int64_t *mem)
+ {
+   return amo_ldat_sinc_eq (mem);
+ }
+ 
+ uint64_t
+ do_ld_inc_bounded (uint64_t *mem)
+ {
+   return amo_ldat_inc_bounded (mem);
+ }
+ 
+ int64_t
+ do_ld_sinc_bounded (int64_t *mem)
+ {
+   return amo_ldat_sinc_bounded (mem);
+ }
+ 
+ uint64_t
+ do_ld_dec_bounded (uint64_t *mem)
+ {
+   return amo_ldat_dec_bounded (mem);
+ }
+ 
+ int64_t
+ do_ld_sdec_bounded (int64_t *mem)
+ {
+   return amo_ldat_sdec_bounded (mem);
+ }
+ 
+ void
+ do_sw_twin (uint32_t *mem, uint32_t value)
+ {
+   amo_stwat_twin (mem, value);
+ }
+ 
+ void
+ do_sw_stwin (int32_t *mem, int32_t value)
+ {
+   amo_stwat_stwin (mem, value);
+ }
+ 
+ void
+ do_sd_twin (uint64_t *mem, uint64_t value)
+ {
+   amo_stdat_twin (mem, value);
+ }
+ 
+ void
+ do_sd_stwin (int64_t *mem, int64_t value)
+ {
+   amo_stdat_stwin (mem, value);
+ }
+ 
+ /* { dg-final { scan-assembler-times {\mldat\M}  8 } } */
+ /* { dg-final { scan-assembler-times {\mlwat\M}  8 } } */
+ /* { dg-final { scan-assembler-times {\mstdat\M}  2 } } */
+ /* { dg-final { scan-assembler-times {\mstwat\M}  2 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo4.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo4.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo4.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,94 ----
+ /* { dg-do run { target { lp64 && p9vector_hw } } } */
+ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+ 
+ /* This test uses uint64_t types. lp64 is added to avoid running it on 32-bit
+     target. The test is skipped on 32-bit systems. */
+ 
+ #include <amo.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <limits.h>
+ 
+ /* Test whether the compiler generates expected code for the ISA 3.0 amo
+    (atomic memory operations) functions  */
+ 
+ /* 32-bit tests.  */
+ static uint32_t u32_ld[4][2] = {
+   { 10, 15 },			/* Increment Bounded */
+   { 10, 10 },			/* Increment Bounded */
+   { 10, 10 },			/* Increment Equal */
+   { 10, 15 }			/* Increment Equal */
+ };
+ 
+ static uint32_t u32_actual_result[4];
+ 
+ static uint32_t u32_update[4] = {
+   10 + 1,			/* Increment Bounded */
+   10,				/* Increment Bounded */
+   10 + 1,			/* Increment Equal */
+   10				/* Increment Equal */
+ };
+ 
+ static uint32_t u32_expected_result[4] = {
+   10,				/* Increment Bounded */
+   INT_MIN,			/* Increment Bounded */
+   10,				/* Increment Equal */
+   INT_MIN			/* Increment Equal */
+ };
+ 
+ /* 64-bit tests.  */
+ static uint64_t u64_ld[4][2] = {
+   { 10, 15 },			/* Increment Bounded */
+   { 10, 10 },			/* Increment Bounded */
+   { 10, 10 },			/* Increment Equal */
+   { 10, 15 }			/* Increment Equal */
+ };
+ 
+ static uint64_t u64_actual_result[4];
+ 
+ static uint64_t u64_update[4] = {
+   10 + 1,			/* Increment Bounded */
+   10,				/* Increment Bounded */
+   10 + 1,			/* Increment Equal */
+   10				/* Increment Equal */
+ };
+ 
+ static uint64_t u64_expected_result[4] = {
+   10,				/* Increment Bounded */
+   INT64_MIN,			/* Increment Bounded */
+   10,				/* Increment Equal */
+   INT64_MIN			/* Increment Equal */
+ };
+ 
+ int
+ main (void)
+ {
+   size_t i;
+ 
+   u32_actual_result[0] = amo_lwat_inc_bounded (&u32_ld[0][0]);
+   u32_actual_result[1] = amo_lwat_inc_bounded (&u32_ld[1][0]);
+   u32_actual_result[2] = amo_lwat_inc_eq (&u32_ld[2][0]);
+   u32_actual_result[3] = amo_lwat_inc_eq (&u32_ld[3][0]);
+ 
+   u64_actual_result[0] = amo_ldat_inc_bounded (&u64_ld[0][0]);
+   u64_actual_result[1] = amo_ldat_inc_bounded (&u64_ld[1][0]);
+   u64_actual_result[2] = amo_ldat_inc_eq (&u64_ld[2][0]);
+   u64_actual_result[3] = amo_ldat_inc_eq (&u64_ld[3][0]);
+ 
+   for (i = 0; i < 4; i++)
+     {
+       if (u32_actual_result[i] != u32_expected_result[i])
+ 	abort ();
+ 
+       if (u32_ld[i][0] != u32_update[i])
+ 	abort ();
+ 
+       if (u64_actual_result[i] != u64_expected_result[i])
+ 	abort ();
+ 
+       if (u64_ld[i][0] != u64_update[i])
+ 	abort ();
+     }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo5.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo5.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo5.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo5.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,61 ----
+ /* { dg-do run { target { lp64 && p9vector_hw } } } */
+ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+ 
+ /* This test uses uint64_t types. lp64 is added to avoid running it on 32-bit
+     target. The test is skipped on 32-bit systems. */
+ 
+ #include <amo.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <limits.h>
+ 
+ /* Test whether the compiler generates expected code for the ISA 3.0 amo
+    (atomic memory operations) functions  */
+ 
+ int
+ main (void)
+ {
+   static uint32_t u32_test1_mem = 100;
+   static uint32_t u32_test1_cond = 200;
+   static uint32_t u32_test1_value = 250;
+   static uint32_t u32_test1_expected_result = 100;
+   static uint32_t u32_test1_actual_result;
+ 
+   static uint32_t u32_test2_mem = 100;
+   static uint32_t u32_test2_cond = 100;
+   static uint32_t u32_test2_value = 250;
+   static uint32_t u32_test2_expected_result = 100;
+   static uint32_t u32_test2_actual_result;
+ 
+   static uint64_t u64_mem = 200;
+   static uint64_t u64_cond = 300;
+   static uint64_t u64_value = 250;
+   static uint64_t u64_expected_result = 200;
+   static uint64_t u64_actual_result;
+ 
+   u32_test1_actual_result = amo_lwat_cas_neq (&u32_test1_mem,
+ 					       u32_test1_cond, u32_test1_value);
+   u32_test2_actual_result = amo_lwat_cas_neq (&u32_test2_mem,
+ 					       u32_test2_cond, u32_test2_value);
+   u64_actual_result = amo_ldat_cas_neq (&u64_mem, u64_cond, u64_value);
+ 
+   if (u32_test1_mem != u32_test1_value)
+     abort ();
+ 
+   if (u32_test1_actual_result != u32_test1_expected_result)
+     abort ();
+ 
+   if (u32_test2_mem != u32_test2_expected_result)
+     abort ();
+ 
+   if (u32_test2_actual_result != u32_test2_expected_result)
+     abort ();
+ 
+   if (u64_mem != u64_value)
+     abort ();
+ 
+   if (u64_actual_result != u64_expected_result)
+     abort ();
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo6.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo6.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo6.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,47 ----
+ /* { dg-do run { target { lp64 && p9vector_hw } } } */
+ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+ 
+ /* This test uses uint64_t types. lp64 is added to avoid running it on 32-bit
+     target. The test is skipped on 32-bit systems. */
+ 
+ #include <amo.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <limits.h>
+ 
+ /* Test whether the compiler generates expected code for the ISA 3.0 amo
+    (atomic memory operations) functions  */
+ 
+ int
+ main (void)
+ {
+   size_t i;
+   static uint32_t u32_test1_expected_result[2] = { 5, 5 };
+   static uint32_t u32_test1_mem[2] = { 3, 3 };
+   static uint32_t u32_value_to_store = 5;
+ 
+   static uint32_t u32_test2_mem[2] = { 3, 4 };
+   static uint32_t u32_test2_expected_result[2] = { 3, 4 };
+ 
+   static uint64_t u64_test_expected_result[2] = { 9, 9 };
+   static uint64_t u64_test_mem[2]  = { 7, 7 };
+   static uint64_t u64_value_to_store = 9;
+ 
+   amo_stwat_twin (u32_test1_mem, u32_value_to_store);
+   amo_stwat_twin (u32_test2_mem, u32_value_to_store);
+   amo_stdat_twin (u64_test_mem, u64_value_to_store);
+ 
+   for (i = 0; i < 2; i++)
+     {
+       if (u32_test1_mem[i] != u32_test1_expected_result[i])
+ 	abort ();
+ 
+       if (u32_test2_mem[i] != u32_test2_expected_result[i])
+ 	abort ();
+ 
+       if (u64_test_mem[i] != u64_test_expected_result[i])
+ 	abort ();
+     }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo7.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo7.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/amo7.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/amo7.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,78 ----
+ /* { dg-do run { target { lp64 && p9vector_hw } } } */
+ /* { dg-options "-mdejagnu-cpu=power9 -O2" } */
+ 
+ /* This test uses uint64_t types. lp64 is added to avoid running it on 32-bit
+     target. The test is skipped on 32-bit systems. */
+ 
+ #include <amo.h>
+ #include <stdint.h>
+ #include <stdlib.h>
+ #include <limits.h>
+ 
+ /* Test whether the compiler generates expected code for the ISA 3.0 amo
+    (atomic memory operations) functions  */
+ 
+ /* 32-bit tests.  */
+ static uint32_t u32_ld[2][2] = {
+   { 10, 15 },			/* Decrement Bounded */
+   { 10, 10 },			/* Decrement Bounded */
+ };
+ 
+ static uint32_t u32_actual_result[2];
+ 
+ static uint32_t u32_update[2] = {
+   15 - 1,			/* Decrement Bounded */
+   10,				/* Decrement Bounded */
+ };
+ 
+ static uint32_t u32_expected_result[2] = {
+   15,				/* Decrement Bounded */
+   INT_MIN,			/* Decrement Bounded */
+ };
+ 
+ /* 64-bit tests.  */
+ static uint64_t u64_ld[2][2] = {
+   { 10, 15 },                   /* Decrement Bounded */
+   { 10, 10 },                   /* Decrement Bounded */
+ };
+ 
+ static uint64_t u64_actual_result[2];
+ 
+ static uint64_t u64_update[2] = {
+   15 - 1,                       /* Decrement Bounded */
+   10,                           /* Decrement Bounded */
+ };
+ 
+ static uint64_t u64_expected_result[2] = {
+   15,                           /* Decrement Bounded */
+   INT64_MIN,                    /* Decrement Bounded */
+ };
+ 
+ int
+ main (void)
+ {
+   size_t i;
+ 
+   u32_actual_result[0] = amo_lwat_dec_bounded (&u32_ld[0][0]);
+   u32_actual_result[1] = amo_lwat_dec_bounded (&u32_ld[1][0]);
+ 
+   u64_actual_result[0] = amo_ldat_dec_bounded (&u64_ld[0][0]);
+   u64_actual_result[1] = amo_ldat_dec_bounded (&u64_ld[1][0]);
+  
+   for (i = 0; i < 2; i++)
+     {
+       if (u32_actual_result[i] != u32_expected_result[i])
+ 	abort ();
+ 
+       if (u32_ld[i][1] != u32_update[i])
+ 	abort ();
+ 
+       if (u64_actual_result[i] != u64_expected_result[i])
+ 	abort ();
+ 
+       if (u64_ld[i][1] != u64_update[i])
+ 	abort ();
+     }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/mpc860_no_lwsync.c gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/mpc860_no_lwsync.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/powerpc/mpc860_no_lwsync.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/powerpc/mpc860_no_lwsync.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile { target powerpc*-*-* } } */
+ /* { dg-options "-mcpu=860 -O2" } */
+ 
+ /* Check that we do not emit lwsync when targeting MPC8xx (MPCCORE),
+    since the MPC8xx core does not support and faults on this instruction.  */
+ 
+ void
+ store_release (int *ptr, int val)
+ {
+   __atomic_store_n (ptr, val, __ATOMIC_RELEASE);
+ }
+ 
+ /* { dg-final { scan-assembler-not "\mlwsync\M" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/a-rvwmo-load-relaxed.c	Sun May 24 22:32:11 2026
*************** void atomic_load_int_relaxed (int* bar,
*** 30,36 ****
  
  /*
  ** atomic_load_short_relaxed:
! **	lh\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
--- 30,36 ----
  
  /*
  ** atomic_load_short_relaxed:
! **	(lh|lhu)\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/a-ztso-load-relaxed.c	Sun May 24 22:32:11 2026
*************** void atomic_load_int_relaxed (int* bar,
*** 30,36 ****
  
  /*
  ** atomic_load_short_relaxed:
! **	lh\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
--- 30,36 ----
  
  /*
  ** atomic_load_short_relaxed:
! **	(lh|lhu)\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/zalasr-rvwmo-load-relaxed.c	Sun May 24 22:32:11 2026
*************** void atomic_load_int_relaxed (int* bar,
*** 30,36 ****
  
  /*
  ** atomic_load_short_relaxed:
! **	lh\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
--- 30,36 ----
  
  /*
  ** atomic_load_short_relaxed:
! **	(lh|lhu)\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/amo/zalasr-ztso-load-relaxed.c	Sun May 24 22:32:11 2026
*************** void atomic_load_int_relaxed (int* bar,
*** 30,36 ****
  
  /*
  ** atomic_load_short_relaxed:
! **	lh\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
--- 30,36 ----
  
  /*
  ** atomic_load_short_relaxed:
! **	(lh|lhu)\t[atx][0-9]+,0\(a0\)
  **	sh\t[atx][0-9]+,0\(a1\)
  **	ret
  */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/and-shift-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/and-shift-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/and-shift-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/and-shift-1.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-DT=int -march=rv64gc_zba -mabi=lp64d -mbranch-cost=4" { target rv64 } } */
+ /* { dg-additional-options "-DT=short -march=rv32gc_zba -mabi=ilp32 -mbranch-cost=4" { target rv32 } } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" } } */
+ 
+ typedef long unsigned int size_t;
+ extern void *xcalloc (size_t, size_t) ;
+ typedef struct sparseset_def
+ {
+   unsigned T *dense;
+   unsigned T *sparse;
+   unsigned T members;
+   unsigned T size;
+   unsigned T iter;
+   unsigned char iter_inc;
+   unsigned char iterating;
+   unsigned T elms[2];
+ } *sparseset;
+ sparseset
+ sparseset_alloc (unsigned T n_elms)
+ {
+   unsigned T n_bytes = sizeof (struct sparseset_def)
+     + ((n_elms - 1) * 2 * sizeof (unsigned T));
+   sparseset set = (sparseset) xcalloc (1, n_bytes);
+   return set;
+ }
+ 
+ 
+ 
+ 
+ /* { dg-final { scan-assembler "slli\t" } } */
+ /* { dg-final { scan-assembler "srli\t" } } */
+ /* { dg-final { scan-assembler-not "zext.w\t" } } */
+ /* { dg-final { scan-assembler-not "andi\t" } } */
+ 
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/ext-dce-2.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/ext-dce-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/ext-dce-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/ext-dce-2.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile { target rv64 } } */
+ /* { dg-options "-O2 -fdump-rtl-ext_dce" } */
+ typedef long unsigned int size_t;
+ struct function
+ {
+   unsigned int curr_properties;
+   unsigned int last_verified;
+ };
+ extern struct function *cfun;
+ 
+ void
+ execute_function_todo (void *data)
+ {
+   unsigned int flags = (size_t) data;
+   if (flags & (1 << 5))
+     flags |= (1 << 15);
+   (cfun + 0)->last_verified = flags & ((1 << 2) | (1 << 3) | (1 << 4));
+ }
+ 
+ /* { dg-final { scan-rtl-dump "Successfully transformed to:" "ext_dce" } } */
+ 
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-bitmanip.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-bitmanip.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-bitmanip.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-bitmanip.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do preprocess } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ 
+ #include <riscv_bitmanip.h>
+ 
+ #if defined (__riscv_zbb) || defined (__riscv_zbc) \
+     || defined (__riscv_zbkb) || defined (__riscv_zbkc) \
+     || defined (__riscv_zbkx)
+ #error "unexpected scalar bitmanip ISA extension macro"
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_zbb) \
+     || !defined (__riscv_intrinsic_zbc) \
+     || !defined (__riscv_intrinsic_zbkb) \
+     || !defined (__riscv_intrinsic_zbkc) \
+     || !defined (__riscv_intrinsic_zbkx)
+ #error "missing scalar bitmanip intrinsic detection macro"
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zkn) || defined (__riscv_intrinsic_zks)
+ #error "unexpected scalar crypto composite intrinsic detection macro"
+ #endif
+ 
+ #if __riscv_intrinsic_zbb != 1 \
+     || __riscv_intrinsic_zbc != 1 \
+     || __riscv_intrinsic_zbkb != 1 \
+     || __riscv_intrinsic_zbkc != 1 \
+     || __riscv_intrinsic_zbkx != 1
+ #error "bad scalar bitmanip intrinsic detection macro value"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-crypto.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-crypto.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-crypto.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-crypto.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do preprocess } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ 
+ #include <riscv_crypto.h>
+ 
+ #if defined (__riscv_zkne) || defined (__riscv_zknd) \
+     || defined (__riscv_zknh) || defined (__riscv_zksed) \
+     || defined (__riscv_zksh)
+ #error "unexpected scalar crypto ISA extension macro"
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_zknd) \
+     || !defined (__riscv_intrinsic_zkne) \
+     || !defined (__riscv_intrinsic_zknh) \
+     || !defined (__riscv_intrinsic_zksed) \
+     || !defined (__riscv_intrinsic_zksh)
+ #error "missing scalar crypto intrinsic detection macro"
+ #endif
+ 
+ #if defined (__riscv_intrinsic_zkn) || defined (__riscv_intrinsic_zks)
+ #error "unexpected scalar crypto composite intrinsic detection macro"
+ #endif
+ 
+ #if __riscv_intrinsic_zknd != 1 \
+     || __riscv_intrinsic_zkne != 1 \
+     || __riscv_intrinsic_zknh != 1 \
+     || __riscv_intrinsic_zksed != 1 \
+     || __riscv_intrinsic_zksh != 1
+ #error "bad scalar crypto intrinsic detection macro value"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar-reverse.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar-reverse.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar-reverse.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar-reverse.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do preprocess } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ 
+ #include <riscv_crypto.h>
+ #include <riscv_bitmanip.h>
+ 
+ #if !defined (__riscv_intrinsic_zkn) || !defined (__riscv_intrinsic_zks)
+ #error "missing scalar composite intrinsic detection macro"
+ #endif
+ 
+ #if __riscv_intrinsic_zkn != 1 || __riscv_intrinsic_zks != 1
+ #error "bad scalar composite intrinsic detection macro value"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/intrinsic-detection-scalar.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,44 ----
+ /* { dg-do preprocess } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ 
+ #include <riscv_bitmanip.h>
+ #include <riscv_crypto.h>
+ 
+ #if defined (__riscv_zbb) || defined (__riscv_zbc) \
+     || defined (__riscv_zbkb) || defined (__riscv_zbkc) \
+     || defined (__riscv_zbkx) || defined (__riscv_zkne) \
+     || defined (__riscv_zknd) || defined (__riscv_zknh) \
+     || defined (__riscv_zkn) || defined (__riscv_zks) \
+     || defined (__riscv_zksed) || defined (__riscv_zksh)
+ #error "unexpected scalar ISA extension macro"
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_zbb) \
+     || !defined (__riscv_intrinsic_zbc) \
+     || !defined (__riscv_intrinsic_zbkb) \
+     || !defined (__riscv_intrinsic_zbkc) \
+     || !defined (__riscv_intrinsic_zbkx) \
+     || !defined (__riscv_intrinsic_zkn) \
+     || !defined (__riscv_intrinsic_zknd) \
+     || !defined (__riscv_intrinsic_zkne) \
+     || !defined (__riscv_intrinsic_zknh) \
+     || !defined (__riscv_intrinsic_zks) \
+     || !defined (__riscv_intrinsic_zksed) \
+     || !defined (__riscv_intrinsic_zksh)
+ #error "missing scalar intrinsic detection macro"
+ #endif
+ 
+ #if __riscv_intrinsic_zbb != 1 \
+     || __riscv_intrinsic_zbc != 1 \
+     || __riscv_intrinsic_zbkb != 1 \
+     || __riscv_intrinsic_zbkc != 1 \
+     || __riscv_intrinsic_zbkx != 1 \
+     || __riscv_intrinsic_zkn != 1 \
+     || __riscv_intrinsic_zknd != 1 \
+     || __riscv_intrinsic_zkne != 1 \
+     || __riscv_intrinsic_zknh != 1 \
+     || __riscv_intrinsic_zks != 1 \
+     || __riscv_intrinsic_zksed != 1 \
+     || __riscv_intrinsic_zksh != 1
+ #error "bad scalar intrinsic detection macro value"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/mcpu-xt-c9501fdvt.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/mcpu-xt-c9501fdvt.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/mcpu-xt-c9501fdvt.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/mcpu-xt-c9501fdvt.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,125 ----
+ /* { dg-do compile { target { ! riscv_abi_e } } } */
+ /* { dg-skip-if "-march given" { *-*-* } { "-march=*" } } */
+ /* { dg-options "-mcpu=xt-c9501fdvt" { target { rv64 } } } */
+ /* XuanTie C950 => rv64imafdcv_zic64b_zicbom_zicbop_zicboz_ziccamoa_ziccif
+                _zicclsm_ziccrse_zicfilp_zicfiss_zicntr_zicond_zicsr_zifencei
+ 	       _zihintntl_zihintpause_zihpm_zimop_za64rs_zabha_zacas_zama16b
+ 	       _zawrs_zfa_zfbfmin_zfh_zfhmin_zca_zcb_zcd_zcmop_zba_zbb_zbc_zbs
+ 	       _zkr_zkt_zmmul_zvbb_zvbc_zvfbfmin_zvfbfwma_zvfh_zvfhmin_zvkb
+ 	       _zvkg_zvkn_zvknc_zvkned_zvkng_zvknha_zvknhb_zvksc_zvksed_zvksg
+ 	       _zvksh_zvkt_zvl256b_shcounterenw_shgatpa_shtvala_shvsatpa
+ 	       _shvstvala_shvstvecd_smaia_smcntrpmf_smcsrind_smepmp_smmpm_smnpm
+ 	       _smrnmi_ssaia_ssccptr_sscofpmf_sscounterenw_sscsrind_ssnpm_sspm
+ 	       _ssstateen_ssstrict_sstc_sstvala_sstvecd_ssu64xl_supm_svade
+ 	       _svadu_svbare_svinval_svnapot_svpbmt_svvptc */
+ 
+ #if !((__riscv_xlen == 64)		\
+       && !defined(__riscv_32e)		\
+       && (__riscv_flen == 64)		\
+       && defined(__riscv_i)		\
+       && defined(__riscv_m)		\
+       && defined(__riscv_a)		\
+       && defined(__riscv_f)		\
+       && defined(__riscv_d)		\
+       && defined(__riscv_c)		\
+       && defined(__riscv_b)		\
+       && defined(__riscv_v)		\
+       && defined(__riscv_zic64b)	\
+       && defined(__riscv_zicbom)	\
+       && defined(__riscv_zicbop)	\
+       && defined(__riscv_zicboz)	\
+       && defined(__riscv_ziccamoa)	\
+       && defined(__riscv_ziccif)	\
+       && defined(__riscv_zicclsm)	\
+       && defined(__riscv_ziccrse)	\
+       && defined(__riscv_zicfilp)	\
+       && defined(__riscv_zicfiss)	\
+       && defined(__riscv_zicntr)	\
+       && defined(__riscv_zicond)	\
+       && defined(__riscv_zicsr)		\
+       && defined(__riscv_zifencei)	\
+       && defined(__riscv_zihintntl)	\
+       && defined(__riscv_zihintpause)	\
+       && defined(__riscv_zihpm)		\
+       && defined(__riscv_zimop)		\
+       && defined(__riscv_za64rs)	\
+       && defined(__riscv_zabha)		\
+       && defined(__riscv_zacas)		\
+       && defined(__riscv_zama16b)	\
+       && defined(__riscv_zawrs)		\
+       && defined(__riscv_zfa)		\
+       && defined(__riscv_zfbfmin)	\
+       && defined(__riscv_zfh)		\
+       && defined(__riscv_zfhmin)	\
+       && defined(__riscv_zca)		\
+       && defined(__riscv_zcb)		\
+       && defined(__riscv_zcd)		\
+       && defined(__riscv_zcmop)		\
+       && defined(__riscv_zba)		\
+       && defined(__riscv_zbb)		\
+       && defined(__riscv_zbc)		\
+       && defined(__riscv_zbs)		\
+       && defined(__riscv_zkr)		\
+       && defined(__riscv_zkt)		\
+       && defined(__riscv_zmmul)		\
+       && defined(__riscv_zvbb)		\
+       && defined(__riscv_zvbc)		\
+       && defined(__riscv_zvfbfmin)	\
+       && defined(__riscv_zvfbfwma)	\
+       && defined(__riscv_zvfh)		\
+       && defined(__riscv_zvfhmin)	\
+       && defined(__riscv_zvkb)		\
+       && defined(__riscv_zvkg)		\
+       && defined(__riscv_zvkn)		\
+       && defined(__riscv_zvknc)		\
+       && defined(__riscv_zvkned)	\
+       && defined(__riscv_zvkng)		\
+       && defined(__riscv_zvknha)	\
+       && defined(__riscv_zvknhb)	\
+       && defined(__riscv_zvksc)		\
+       && defined(__riscv_zvksed)	\
+       && defined(__riscv_zvksg)		\
+       && defined(__riscv_zvksh)		\
+       && defined(__riscv_zvkt)		\
+       && defined(__riscv_zvl256b)	\
+       && defined(__riscv_shcounterenw)	\
+       && defined(__riscv_shgatpa)	\
+       && defined(__riscv_shtvala)	\
+       && defined(__riscv_shvsatpa)	\
+       && defined(__riscv_shvstvala)	\
+       && defined(__riscv_shvstvecd)	\
+       && defined(__riscv_smaia)		\
+       && defined(__riscv_smcntrpmf)	\
+       && defined(__riscv_smcsrind)	\
+       && defined(__riscv_smepmp)	\
+       && defined(__riscv_smmpm)		\
+       && defined(__riscv_smnpm)		\
+       && defined(__riscv_smrnmi)	\
+       && defined(__riscv_ssaia)		\
+       && defined(__riscv_ssccptr)	\
+       && defined(__riscv_sscofpmf)	\
+       && defined(__riscv_sscounterenw)	\
+       && defined(__riscv_sscsrind)	\
+       && defined(__riscv_ssnpm)		\
+       && defined(__riscv_sspm)		\
+       && defined(__riscv_ssstateen)	\
+       && defined(__riscv_ssstrict)	\
+       && defined(__riscv_sstc)		\
+       && defined(__riscv_sstvala)	\
+       && defined(__riscv_sstvecd)	\
+       && defined(__riscv_ssu64xl)	\
+       && defined(__riscv_supm)		\
+       && defined(__riscv_svade)		\
+       && defined(__riscv_svadu)		\
+       && defined(__riscv_svbare)	\
+       && defined(__riscv_svinval)	\
+       && defined(__riscv_svnapot)	\
+       && defined(__riscv_svpbmt)	\
+       && defined(__riscv_svvptc))
+ #error "unexpected arch"
+ #endif
+ 
+ int main()
+ {
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr105314-rtl.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr105314-rtl.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr105314-rtl.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr105314-rtl.c	Sun May 24 22:32:11 2026
***************
*** 2,8 ****
  /* { dg-do compile } */
  /* { dg-require-effective-target rv64 } */
  /* { dg-skip-if "" { *-*-* } { "-march=*zicond*" "-O0" "-Og" "-Os" "-Oz" "-flto" } } */
! /* { dg-options "-fdump-rtl-ce1" } */
  
  long __RTL (startwith ("ce1"))
  foo (long a, long b, long c)
--- 2,8 ----
  /* { dg-do compile } */
  /* { dg-require-effective-target rv64 } */
  /* { dg-skip-if "" { *-*-* } { "-march=*zicond*" "-O0" "-Og" "-Os" "-Oz" "-flto" } } */
! /* { dg-options "-fdump-rtl-ce1 -mbranch-cost=4" } */
  
  long __RTL (startwith ("ce1"))
  foo (long a, long b, long c)
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr105314.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr105314.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr105314.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr105314.c	Sun May 24 22:32:11 2026
***************
*** 1,7 ****
  /* PR rtl-optimization/105314 */
  /* { dg-do compile } */
  /* { dg-skip-if "" { *-*-* } { "-march=*zicond*" "-O0" "-Og" "-Os" "-Oz" } } */
! /* { dg-options "-fdump-rtl-ce1" } */
  
  long
  foo (long a, long b, long c)
--- 1,7 ----
  /* PR rtl-optimization/105314 */
  /* { dg-do compile } */
  /* { dg-skip-if "" { *-*-* } { "-march=*zicond*" "-O0" "-Og" "-Os" "-Oz" } } */
! /* { dg-options "-fdump-rtl-ce1 -mbranch-cost=4" } */
  
  long
  foo (long a, long b, long c)
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr125320.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr125320.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/pr125320.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/pr125320.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do assemble } */
+ /* { dg-options "-O2 -mabi=lp64d -march=rv64gc_xtheadmemidx -fstack-protector-strong" } */
+ 
+ void __gen_tempname (char *, int, int, int);
+ void
+ tempnam ()
+ {
+   char buf[4096];
+   __gen_tempname (buf, 0, 0, 2);
+ }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/cond/pr111401.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do run { target { riscv_v } } } */
! /* { dg-additional-options "-mrvv-vector-bits=scalable -fdump-tree-vect-details" } */
  
  double
  __attribute__ ((noipa))
--- 1,5 ----
  /* { dg-do run { target { riscv_v } } } */
! /* { dg-additional-options "-mrvv-vector-bits=scalable -mmax-vectorization -fdump-tree-vect-details" } */
  
  double
  __attribute__ ((noipa))
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/early-break-5.c	Sun May 24 22:32:11 2026
*************** DEFINE_TEST_FUNC(f4, !=)
*** 31,37 ****
  DEFINE_TEST_FUNC(f5, <)
  DEFINE_TEST_FUNC(f6, <=)
  
- /* Array setup macro.  */
  #define RESET_ARRAYS(_aval, _idx, _force, _bval)         \
    do {                                                   \
      _Pragma("GCC novector")				 \
--- 31,36 ----
*************** DEFINE_TEST_FUNC(f6, <=)
*** 43,49 ****
        a[_idx] = _force;                                  \
    } while (0)
  
- /* Value check macros.  */
  #define CHECK_EQ(_i, _val)                        \
    do {                                            \
      if (b[_i] != _val)                            \
--- 42,47 ----
*************** DEFINE_TEST_FUNC(f6, <=)
*** 68,74 ****
    } while (0)
  
  int main(void) {
-   /* Break on random intervals.  */
    TEST_FUNC (f1, 1, 0, 1, 10, CHECK_EQ (0, 11); CHECK_EQ (1, 10));
    TEST_FUNC (f2, -1, 5, 0, 10, CHECK_EQ (0, 9); CHECK_EQ (5, 10));
    TEST_FUNC (f3, 3, 3, 0, 0, CHECK_EQ (0, 3); CHECK_EQ (3, 0));
--- 66,71 ----
*************** int main(void) {
*** 76,82 ****
    TEST_FUNC (f5, 1, 6, -1, 5, CHECK_EQ (6, 4); CHECK_EQ (7, 5));
    TEST_FUNC (f6, 2, 10, 0, 7, CHECK_EQ (10, 7); CHECK_EQ (11, 7));
  
-   /* Break on last iteration.  */
    TEST_FUNC (f1, 0, N-1, 1, 1,
      CHECK_RANGE_EQ (0, N-1, 1); CHECK_EQ (N-1, 2));
  
--- 73,78 ----
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-19.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -mmax-vectorization -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
*************** DEF_REDUC_PLUS (_Float16, 512)
*** 14,20 ****
  DEF_REDUC_PLUS (_Float16, 1024)
  DEF_REDUC_PLUS (_Float16, 2048)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 14,20 ----
  DEF_REDUC_PLUS (_Float16, 1024)
  DEF_REDUC_PLUS (_Float16, 2048)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 11 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-20.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -mmax-vectorization -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
*************** DEF_REDUC_PLUS (float, 256)
*** 13,19 ****
  DEF_REDUC_PLUS (float, 512)
  DEF_REDUC_PLUS (float, 1024)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 8 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 13,19 ----
  DEF_REDUC_PLUS (float, 512)
  DEF_REDUC_PLUS (float, 1024)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 10 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/reduc-21.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -mmax-vectorization -fdump-tree-optimized-details" } */
  
  #include "def.h"
  
*************** DEF_REDUC_PLUS (float, 128)
*** 12,18 ****
  DEF_REDUC_PLUS (float, 256)
  DEF_REDUC_PLUS (float, 512)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 7 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 12,18 ----
  DEF_REDUC_PLUS (float, 256)
  DEF_REDUC_PLUS (float, 512)
  
! /* { dg-final { scan-assembler-times {vfredosum\.vs} 9 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/wred-3.c	Sun May 24 22:32:11 2026
***************
*** 1,9 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -fdump-tree-optimized" } */
  
  #include "wred-2.c"
  
! /* { dg-final { scan-assembler-times {vfwredosum\.vs} 17 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
--- 1,9 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mabi=lp64d -O3 -mrvv-max-lmul=m8 -mmax-vectorization -fdump-tree-optimized" } */
  
  #include "wred-2.c"
  
! /* { dg-final { scan-assembler-times {vfwredosum\.vs} 19 } } */
  /* { dg-final { scan-assembler-not {csrr} } } */
  /* { dg-final { scan-tree-dump-not "1,1" "optimized" } } */
  /* { dg-final { scan-tree-dump-not "2,2" "optimized" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic-detection.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic-detection.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic-detection.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/rvv/base/intrinsic-detection.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,91 ----
+ /* { dg-do preprocess } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ 
+ #include <riscv_vector.h>
+ #include <sifive_vector.h>
+ #include <andes_vector.h>
+ 
+ #if defined (__riscv_vector) || defined (__riscv_zvbb) \
+     || defined (__riscv_zve32f) || defined (__riscv_zve32x) \
+     || defined (__riscv_zve64d) || defined (__riscv_zve64f) \
+     || defined (__riscv_zve64x) \
+     || defined (__riscv_zvbc) || defined (__riscv_zvfbfmin) \
+     || defined (__riscv_zvfbfwma) || defined (__riscv_zvfh) \
+     || defined (__riscv_zvfhmin) || defined (__riscv_zvkb) \
+     || defined (__riscv_zvkg) || defined (__riscv_zvkned) \
+     || defined (__riscv_zvknha) || defined (__riscv_zvknhb) \
+     || defined (__riscv_zvksed) || defined (__riscv_zvksh)
+ #error "unexpected vector ISA extension macro"
+ #endif
+ 
+ #if !defined (__riscv_intrinsic_v) \
+     || !defined (__riscv_intrinsic_zve32f) \
+     || !defined (__riscv_intrinsic_zve32x) \
+     || !defined (__riscv_intrinsic_zve64d) \
+     || !defined (__riscv_intrinsic_zve64f) \
+     || !defined (__riscv_intrinsic_zve64x) \
+     || !defined (__riscv_intrinsic_zvbb) \
+     || !defined (__riscv_intrinsic_zvbc) \
+     || !defined (__riscv_intrinsic_zvfbfmin) \
+     || !defined (__riscv_intrinsic_zvfbfwma) \
+     || !defined (__riscv_intrinsic_zvfh) \
+     || !defined (__riscv_intrinsic_zvfhmin) \
+     || !defined (__riscv_intrinsic_zvkb) \
+     || !defined (__riscv_intrinsic_zvkg) \
+     || !defined (__riscv_intrinsic_zvkn) \
+     || !defined (__riscv_intrinsic_zvknc) \
+     || !defined (__riscv_intrinsic_zvkned) \
+     || !defined (__riscv_intrinsic_zvkng) \
+     || !defined (__riscv_intrinsic_zvknha) \
+     || !defined (__riscv_intrinsic_zvknhb) \
+     || !defined (__riscv_intrinsic_zvks) \
+     || !defined (__riscv_intrinsic_zvksc) \
+     || !defined (__riscv_intrinsic_zvksed) \
+     || !defined (__riscv_intrinsic_zvksg) \
+     || !defined (__riscv_intrinsic_zvksh) \
+     || !defined (__riscv_intrinsic_xsfvcp) \
+     || !defined (__riscv_intrinsic_xsfvfnrclipxfqf) \
+     || !defined (__riscv_intrinsic_xsfvqmaccdod) \
+     || !defined (__riscv_intrinsic_xsfvqmaccqoq) \
+     || !defined (__riscv_intrinsic_xandesvbfhcvt) \
+     || !defined (__riscv_intrinsic_xandesvdot) \
+     || !defined (__riscv_intrinsic_xandesvpackfph) \
+     || !defined (__riscv_intrinsic_xandesvsintload)
+ #error "missing vector intrinsic detection macro"
+ #endif
+ 
+ #if __riscv_intrinsic_v != 1 \
+     || __riscv_intrinsic_zve32f != 1 \
+     || __riscv_intrinsic_zve32x != 1 \
+     || __riscv_intrinsic_zve64d != 1 \
+     || __riscv_intrinsic_zve64f != 1 \
+     || __riscv_intrinsic_zve64x != 1 \
+     || __riscv_intrinsic_zvbb != 1 \
+     || __riscv_intrinsic_zvbc != 1 \
+     || __riscv_intrinsic_zvfbfmin != 1 \
+     || __riscv_intrinsic_zvfbfwma != 1 \
+     || __riscv_intrinsic_zvfh != 1 \
+     || __riscv_intrinsic_zvfhmin != 1 \
+     || __riscv_intrinsic_zvkb != 1 \
+     || __riscv_intrinsic_zvkg != 1 \
+     || __riscv_intrinsic_zvkn != 1 \
+     || __riscv_intrinsic_zvknc != 1 \
+     || __riscv_intrinsic_zvkned != 1 \
+     || __riscv_intrinsic_zvkng != 1 \
+     || __riscv_intrinsic_zvknha != 1 \
+     || __riscv_intrinsic_zvknhb != 1 \
+     || __riscv_intrinsic_zvks != 1 \
+     || __riscv_intrinsic_zvksc != 1 \
+     || __riscv_intrinsic_zvksed != 1 \
+     || __riscv_intrinsic_zvksg != 1 \
+     || __riscv_intrinsic_zvksh != 1 \
+     || __riscv_intrinsic_xsfvcp != 1 \
+     || __riscv_intrinsic_xsfvfnrclipxfqf != 1 \
+     || __riscv_intrinsic_xsfvqmaccdod != 1 \
+     || __riscv_intrinsic_xsfvqmaccqoq != 1 \
+     || __riscv_intrinsic_xandesvbfhcvt != 1 \
+     || __riscv_intrinsic_xandesvdot != 1 \
+     || __riscv_intrinsic_xandesvpackfph != 1 \
+     || __riscv_intrinsic_xandesvsintload != 1
+ #error "bad vector intrinsic detection macro value"
+ #endif
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/shift-shift-6.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/shift-shift-6.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/shift-shift-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/shift-shift-6.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64" } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" } } */
+ 
+ /* Test for zero_extendsidi2_shifted handling arbitrary mask widths
+    (not just 32 bits). */
+ unsigned sub1(unsigned a, unsigned b)
+ {
+   b = (b << 2) >> 2;
+   return a + (b << 1);
+ }
+ 
+ /* { dg-final { scan-assembler-times "slli" 1 } } */
+ /* { dg-final { scan-assembler-times "srli" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/shift-shift-7.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/shift-shift-7.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/shift-shift-7.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/shift-shift-7.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64" } */
+ /* { dg-skip-if "" { *-*-* } { "-O0" } } */
+ 
+ /* Test for zero_extendsidi2_shifted handling arbitrary mask widths
+    (not just 32 bits). */
+ unsigned long f(unsigned int a, unsigned long b)
+ {
+   a = a << 1;
+   unsigned long c = (unsigned long) a;
+   c = b + (c<<4);
+   return c;
+ }
+ 
+ /* { dg-final { scan-assembler-times "slli" 1 } } */
+ /* { dg-final { scan-assembler-times "srli" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/slt-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/slt-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/slt-1.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/slt-1.c	Sun May 24 22:32:11 2026
***************
*** 1,6 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc -mabi=lp64d" } */
! /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
  
  #include <stdint.h>
  
--- 1,6 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc -mabi=lp64d -mbranch-cost=4" } */
! /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */
  
  #include <stdint.h>
  
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zba-shNadd-04.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zba -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
  
  long long sub1(unsigned long long a, unsigned long long b)
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zba_zbb -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
  
  long long sub1(unsigned long long a, unsigned long long b)
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zba-slliuw.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zba-slliuw.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zba-slliuw.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zba-slliuw.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zba_zbs -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" } } */
  
  long
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zba_zbb_zbs -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" } } */
  
  long
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zbs-zext.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zbs-zext.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zbs-zext.c	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zbs-zext.c	Sun May 24 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zbs -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-O1" } } */
  typedef unsigned long uint64_t;
  typedef unsigned int uint32_t;
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-march=rv64gc_zba_zbs -mabi=lp64" } */
  /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-O1" } } */
  typedef unsigned long uint64_t;
  typedef unsigned int uint32_t;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-default-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-default-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-default-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-default-1.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ 
+ long long
+ load_ll (long long *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll (long long *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-times "ld\t" 1 } } */
+ /* { dg-final { scan-assembler-times "sd\t" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-df-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-df-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-df-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-df-1.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32 -mzilsd-strict-align" } */
+ 
+ typedef double df4 __attribute__((aligned(4)));
+ 
+ double
+ load_df4 (df4 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_df4 (df4 *p, double x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-not "ld\t" } } */
+ /* { dg-final { scan-assembler-not "sd\t" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-1.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -mzilsd-word-align" } */
+ 
+ int i;
+ 
+ /* { dg-error "only supported for RV32" "" { target *-*-* } 0 } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-2.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-2.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d -mzilsd-strict-align" } */
+ 
+ int i;
+ 
+ /* { dg-error "only supported for RV32" "" { target *-*-* } 0 } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-3.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-3.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,5 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ /* { dg-additional-options "-mzilsd-word-align -mstrict-align" } */
+ 
+ int i;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-4.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-4.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-rv64-4.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,5 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rv64gc -mabi=lp64d" } */
+ /* { dg-additional-options "-mzilsd-strict-align -mno-strict-align" } */
+ 
+ int i;
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-1.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-1.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-1.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ /* { dg-additional-options "-mstrict-align -mzilsd-word-align" } */
+ 
+ typedef long long ll4 __attribute__((aligned(4)));
+ 
+ long long
+ load_ll4 (ll4 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll4 (ll4 *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-times "ld\t" 1 } } */
+ /* { dg-final { scan-assembler-times "sd\t" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-2.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-2.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-2.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ /* { dg-additional-options "-mzilsd-word-align -mstrict-align" } */
+ 
+ typedef long long ll4 __attribute__((aligned(4)));
+ 
+ long long
+ load_ll4 (ll4 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll4 (ll4 *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-not "ld\t" } } */
+ /* { dg-final { scan-assembler-not "sd\t" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-3.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-3.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-3.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ /* { dg-additional-options "-mstrict-align -mzilsd-word-align" } */
+ 
+ typedef long long ll1 __attribute__((aligned(1)));
+ 
+ long long
+ load_ll1 (ll1 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll1 (ll1 *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-not "ld\t" } } */
+ /* { dg-final { scan-assembler-not "sd\t" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-4.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-4.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-4.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ /* { dg-additional-options "-mzilsd-strict-align -mno-strict-align" } */
+ 
+ typedef long long ll1 __attribute__((aligned(1)));
+ 
+ long long
+ load_ll1 (ll1 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll1 (ll1 *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-times "ld\t" 1 } } */
+ /* { dg-final { scan-assembler-times "sd\t" 1 } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-5.c gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-5.c
*** gcc-17-20260517/gcc/testsuite/gcc.target/riscv/zilsd-align-word-5.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gcc.target/riscv/zilsd-align-word-5.c	Sun May 24 22:32:11 2026
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv32i_zilsd -mabi=ilp32" } */
+ /* { dg-additional-options "-mno-strict-align -mzilsd-strict-align" } */
+ 
+ typedef long long ll4 __attribute__((aligned(4)));
+ 
+ long long
+ load_ll4 (ll4 *p)
+ {
+   return *p;
+ }
+ 
+ void
+ store_ll4 (ll4 *p, long long x)
+ {
+   *p = x;
+ }
+ 
+ /* { dg-final { scan-assembler-not "ld\t" } } */
+ /* { dg-final { scan-assembler-not "sd\t" } } */
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d gcc-17-20260524/gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d
*** gcc-17-20260517/gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d	Sun May 17 22:32:12 2026
--- gcc-17-20260524/gcc/testsuite/gdc.test/compilable/dtoh_TemplateDeclaration.d	Sun May 24 22:32:11 2026
*************** struct NotAA(T)
*** 336,342 ****
      T[foo(1)] calcBuffer;
  }
  
! // Same name but hidden by the template paramter
  extern (D) struct Buffer {}
  extern (D) struct ActualBuffer {}
  
--- 336,342 ----
      T[foo(1)] calcBuffer;
  }
  
! // Same name but hidden by the template parameter
  extern (D) struct Buffer {}
  extern (D) struct ActualBuffer {}
  
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/EXformat_1.F90 gcc-17-20260524/gcc/testsuite/gfortran.dg/EXformat_1.F90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/EXformat_1.F90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/EXformat_1.F90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,58 ----
+ ! { dg-do run }
+ ! pr93727 EX Format Specifiers, testing various kinds, default field widths
+ program main
+   implicit none
+   character(kind=1, len=48) :: s1
+ 
+    call test04
+    call test08
+    call test10
+    call test16
+ 
+ contains
+ 
+ subroutine test04
+   real(4) :: r4
+   r4 = -huge(1.0_4)
+   write(s1,"(EX0.0,'<')") r4
+   if (s1.ne."-0XF.FFFFFP+124<") stop 1
+   write(s1,"(EX0.0,'<')") 1.0_4/r4
+   if (s1.ne."-0X8.P-131<") stop 2
+ end subroutine test04
+ 
+ subroutine test08
+   real(8) :: r8
+   r8 = -huge( 1.0_8)
+   write(s1,"(EX0.0,'<')") r8
+   if (s1.ne."-0XF.FFFFFFFFFFFF8P+1020<") stop 3
+   write(s1,"(EX0.0,'<')") 1.0_8/r8
+   if (s1.ne."-0X8.P-1027<") stop 4
+ end subroutine test08
+ 
+ #ifdef __GFC_REAL_10__
+ subroutine test10
+   real(10) :: r10
+   r10 = -huge(1.0_10)
+   write(s1,"(EX0.0,'<')") r10
+   if (s1.ne."-0XF.FFFFFFFFFFFFFFFP+16380<") stop 5
+   write(s1,"(EX0.0,'<')") 1.0_10/r10
+   if (s1.ne."-0X8.P-16387<") stop 6
+ end subroutine test10
+ #else
+ subroutine test10
+ end subroutine test10
+ #endif
+ 
+ #ifdef __GFC_REAL_16__
+ subroutine test16
+   real(16) :: r16
+   r16 = 1.0_16/3.0_16
+   write(s1,"(EX0.0,'<')") r16
+   if (s1.ne."0XA.AAAAAAAAAAAAAAAAAAAAAAAAAAA8P-5<") stop 7
+ end subroutine test16
+ #else
+ subroutine test16
+ end subroutine test16
+ #endif
+ 
+ end program main
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/EXformat_2.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/EXformat_2.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/EXformat_2.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/EXformat_2.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,24 ----
+ ! { dg-do run }
+ ! PR93727 Test writing EX as character(kind=1) output
+ program kind1
+   implicit none
+   integer, parameter :: wp = 8
+   real(kind=wp) :: num
+   character(kind=1,len=45) :: str1
+   
+   num = -3.14159682678_wp * 25._wp
+   write(str1, '(">",EX30.0,"<")') num
+   if (str1.ne.">          -0X9.D14707B63DFBP+3<") stop 1
+   write(str1, '(">",EX30.1,"<")') num
+   if (str1.ne.">                     -0X9.DP+3<") stop 2
+   write(str1, '(">",EX30.2,"<")') num
+   if (str1.ne.">                    -0X9.D1P+3<") stop 3
+   write(str1, '(">",EX30.3,"<")') num
+   if (str1.ne.">                   -0X9.D14P+3<") stop 4
+   write(str1, '(">",EX30.4,"<")') num
+   if (str1.ne.">                  -0X9.D147P+3<") stop 5
+   write(str1, '(">",EX30.15e8,"<")') num
+   if (str1.ne.">-0X9.D14707B63DFB000P+00000003<") stop 6
+   write(str1, '(">",EX8.5,"<")') num
+   if (str1.ne.">********<") stop 7
+ end program kind1
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/binding_label_tests_38.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/binding_label_tests_38.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/binding_label_tests_38.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/binding_label_tests_38.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,56 ----
+ ! { dg-do compile }
+ ! PR fortran/125379 - this gave an ICE due to C binding private
+ ! globals.
+ ! Test case by Juergen Reuter.
+ 
+ module blha_olp_interfaces
+   use, intrinsic :: iso_c_binding !NODEP!                                                                                                                                                                     
+   use, intrinsic :: iso_fortran_env
+   implicit none
+   private
+   public :: olp_polvec
+   type :: blha_driver_t
+     procedure(olp_polvec), nopass, pointer :: blha_olp_polvec => null ()
+   end type blha_driver_t
+ 
+   interface
+     subroutine olp_polvec (eps) bind(C)
+       import
+       real(kind = c_double), dimension(0:7), intent(out) :: eps
+     end subroutine
+   end interface
+ end module blha_olp_interfaces
+ 
+ 
+ module pcm_base
+   use blha_olp_interfaces
+   implicit none
+   private
+ end module pcm_base
+ 
+ 
+ module api
+   use pcm_base
+   implicit none
+   private
+   public :: whizard_api_t
+ 
+   type :: whizard_api_t
+      private
+      character(:), allocatable :: logfile
+   end type whizard_api_t
+ 
+ end module api
+ 
+ function whizard_get_char (whizard_handle) result (stat) bind (C)
+   use iso_c_binding, only: c_ptr  !NODEP!                                                                                                                                                                     
+   use iso_c_binding, only: c_f_pointer  !NODEP!                                                                                                                                                               
+   use api, only: whizard_api_t
+   implicit none
+   integer :: stat
+   type(c_ptr), intent(in) :: whizard_handle
+   type(whizard_api_t), pointer :: whizard
+ 
+   call c_f_pointer (whizard_handle, whizard)
+ 
+ end function whizard_get_char
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/declare-mapper-1.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/declare-mapper-1.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/declare-mapper-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/declare-mapper-1.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,55 ----
+ ! Check that other variables are fine to be mapped - but only if the var itself is mapped
+ 
+ subroutine one
+ implicit none
+ type t
+   integer :: x(5)
+ end type
+ 
+ integer :: q, z
+ 
+ !$omp declare mapper(t :: v) map(v%x(1:5)) ! { dg-error "Sorry, 'declare mapper', used at .1., is not yet implemented" }
+ !$omp declare mapper(my_name : t :: v2) map(q) map(v2) map(z)
+ 
+ type(t) :: var(4)
+ type(t) :: var2(4)
+ 
+   !$omp target enter data map(var)
+   !$omp target enter data map(mapper(my_name), to : var2)
+ 
+ !$omp assume contains(declare mapper) ! { dg-error "Invalid 'DECLARE MAPPER' directive at .1. in CONTAINS clause: declarative, informational, and meta directives not permitted" }
+ block
+ end block
+ end
+ 
+ 
+ subroutine two
+ implicit none
+ type t
+ end type t
+ integer :: y
+ !$omp declare mapper( t :: var) map(to: y) ! { dg-error "At least one 'map' clause in !.OMP DECLARE MAPPER at .1. must map 'var' or an element of it" }
+ ! { dg-error "Sorry, 'declare mapper', used at .1., is not yet implemented" "" { target *-*-* } .-1 }
+ end
+ 
+ 
+ subroutine three
+ implicit none
+ type t
+ end type t
+ integer :: y
+ !$omp declare mapper( t :: var) ! { dg-error "At least one 'map' clause in !.OMP DECLARE MAPPER at .1. must map 'var' or an element of it" }
+ ! { dg-error "Sorry, 'declare mapper', used at .1., is not yet implemented" "" { target *-*-* } .-1 }
+ end
+ 
+ subroutine four
+   type t
+   end type t
+   !$omp declare mapper(my_id : t :: v2) map(v2)  ! { dg-note "Previous !.OMP DECLARE MAPPER here" }
+ 
+   !$omp declare mapper(my_id : t :: v3) map(v3)  ! { dg-error "Redefinition of !.OMP DECLARE MAPPER at .1. for type 'TYPE\\(t\\)' with id 'my_id'" }
+ 
+   !$omp declare mapper(t :: v4) map(v4)  ! { dg-note "Previous !.OMP DECLARE MAPPER here" }
+ ! { dg-error "Sorry, 'declare mapper', used at .1., is not yet implemented" "" { target *-*-* } .-1 }
+   !$omp declare mapper(t :: v5) map(v5)  ! { dg-error "Redefinition of !.OMP DECLARE MAPPER at .1. for type 'TYPE\\(t\\)'" }
+ end
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/declare-mapper-2.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/declare-mapper-2.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/declare-mapper-2.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/declare-mapper-2.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,22 ----
+ implicit none
+ type t
+ end type t
+ integer :: a,b,c
+ 
+ !$omp declare mapper           ! { dg-error "Expected '\\('" }
+ !$omp declare mapper(          ! { dg-error "Expected either a type name at .1. or a map-type identifier, a colon, or a type name" }
+ !$omp declare mapper(a : b     ! { dg-error "Expected either a type name at .1. or a map-type identifier, a colon, or a type name" }
+ 
+ !$omp declare mapper(t : a     ! { dg-error "Expected either a type name at .1. or a map-type identifier, a colon, or a type name" }
+ !$omp declare mapper(t :: a    ! { dg-error "Expected '\\)'" }
+ 
+ !$omp declare mapper( name : t ::            ! { dg-error "Expected variable name" }
+ 
+ !$omp declare mapper( name : t :: var        ! { dg-error "Expected '\\)'" }
+ 
+ !$omp declare mapper( name : t :: var) foo   ! { dg-error "Failed to match clause" }
+ 
+ 
+ !$omp declare mapper( name : t2 :: var)      ! { dg-error "Expected either a type name at .1. or a map-type identifier, a colon, or a type name" }
+ !$omp declare mapper( name : integer :: var) ! { dg-error "!.OMP DECLARE MAPPER with non-derived type" }
+ end
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/map-multi-1.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/map-multi-1.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/map-multi-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/map-multi-1.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,50 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ 
+ ! Check that extraneous clauses mapping the same variable multiple times are
+ ! either removed or merged.
+ 
+ subroutine f
+   implicit none
+   integer :: x, i
+ 
+   !$omp target map(alloc: x) map(to: x) map(alloc: x) map(from: x) map(alloc: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(alloc: x) map(alloc: x) map(alloc: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(alloc: x) map(to: x) map(alloc: x) map(to: x) map(alloc: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(alloc: x) map(from: x) map(alloc: x) map(from: x) map(alloc: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+ end subroutine f
+ 
+ ! { dg-final { scan-tree-dump-times {map\(tofrom:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(alloc:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(to:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(from:x\)} 1 "original" } }
+ 
+ subroutine g (a)
+   integer, intent(inout) :: a(:)
+ 
+   !$omp target map(to: a) map(alloc: a) map(from: a)
+     a = a * 4
+   !$omp end target
+   !$omp target map(alloc: a) map(tofrom: a) map(alloc: a)
+     a = a * 8
+   !$omp end target
+ 
+ end subroutine
+ 
+ ! { dg-final { scan-tree-dump-times {map\(tofrom:\*a\.0\) map\(alloc:a\.0 \[pointer assign, bias: 0\]\)} 2 "original" } }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/map-multi-2.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/map-multi-2.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/map-multi-2.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/map-multi-2.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,60 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original -fdump-tree-gimple" }
+ 
+ ! Check that map clauses are only merged if they have the same modifiers.
+ ! Also check that the GIMPLE pass removes duplicates resulting from early clause
+ ! expansion in the front-end.
+ 
+ subroutine f
+   implicit none
+   integer :: x, i
+ 
+   !$omp target map(always,to: x) map(tofrom: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(tofrom: x) map(always,from: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(to: x) map(present,alloc: x) map(from: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(close,always,from: x) map(close,present,alloc: x) map(present,to: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+   !$omp target map(always,to: x) map(always,present,alloc: x) map(present,from: x)
+     do i = 1, 17
+       x = x + i
+     end do
+   !$omp end target
+ end subroutine f
+ 
+ ! { dg-final { scan-tree-dump-times {map\(always,to:x\) map\(tofrom:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(tofrom:x\) map\(always,from:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(present,alloc:x\) map\(tofrom:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(always,from:x\) map\(present,to:x\)} 1 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(always,to:x\) map\(present,from:x\)} 1 "original" } }
+ 
+ subroutine g (a)
+   integer, intent(inout) :: a(:)
+ 
+   !$omp target map(always, to: a) map(tofrom: a)
+     a = a * 4
+   !$omp end target
+   !$omp target map(close, present, tofrom: a) map(always, from: a)
+     a = a * 8
+   !$omp end target
+ 
+ end subroutine
+ 
+ ! { dg-final { scan-tree-dump-times {map\(alloc:a\.0 \[pointer assign, bias: 0\]\)} 4 "original" } }
+ ! { dg-final { scan-tree-dump-times {map\(alloc:a\.0 \[pointer assign, bias: 0\]\)} 2 "gimple" } }
+ 
+ 
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/pr107214.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/pr107214.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/gomp/pr107214.f90	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/gomp/pr107214.f90	Sun May 24 22:32:12 2026
***************
*** 1,7 ****
  ! { dg-do compile }
  
  program p
     integer, allocatable :: a
!    !$omp target map(tofrom: a, a) ! { dg-error "Symbol 'a' present on multiple clauses" }
     !$omp end target
  end
--- 1,10 ----
  ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
  
  program p
     integer, allocatable :: a
!    !$omp target map(tofrom: a, a)
     !$omp end target
  end
+ 
+ ! { dg-final { scan-tree-dump-times {map\(tofrom:\*a\)} 1 "original" } }
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/inline_matmul_27.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/inline_matmul_27.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/inline_matmul_27.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/inline_matmul_27.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,63 ----
+ ! { dg-do run }
+ ! { dg-options "-O2 -fcheck=bounds -fno-automatic" }
+ ! PR fortran/106546 - FE temporaries have to be automatic
+ ! Original test case by Solomon Gibbs
+ 
+ subroutine do_multiply()
+   implicit none
+   
+   integer :: rank
+   real(8) :: draw
+ 
+   real(8) :: x1(6), x2(6)
+   real(8), allocatable :: K(:,:), J(:,:), z(:)
+ 
+   character(len=300) :: out
+   ! Randomly select rank of operation 0 ... 6
+   call random_number(draw)
+   if (draw .lt. 1/7.0d0) then
+      rank = 0
+   elseif (draw .lt. 2/7.0d0) then
+      rank = 1
+   elseif (draw .lt. 3/7.0d0) then
+      rank = 2
+   elseif (draw .lt. 4/7.0d0) then
+      rank = 3
+   elseif (draw .lt. 5/7.0d0) then
+      rank = 4
+   elseif (draw .lt. 6/7.0d0) then
+      rank = 5
+   else
+      rank = 6
+   endif
+ 
+   allocate(K(rank, 6))
+   allocate(J(rank, rank))
+   allocate(z(rank))
+ 
+   call random_number(x1)
+   call random_number(x2)
+   call random_number(K)
+   call random_number(J)
+   call random_number(z)
+ 
+   ! multiply allocatables using array temporaries
+   ! Problem occurs here
+   z = matmul(J, matmul(K, x2 - x1))
+ 
+   ! Output z to prevent optimizer elimination
+   write (out,*) rank," ",z
+ 
+   deallocate(z, J, K)
+   
+ end subroutine do_multiply
+   
+ program bogus
+   implicit none
+ 
+   integer :: i
+   do i=1,100
+      call do_multiply()
+   end do
+   
+ end program bogus
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/pr115260.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/pr115260.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/pr115260.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/pr115260.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,35 ----
+ ! { dg-do run }
+ ! PR 115260 - this got corrupted output.
+ ! Original test case by Steve Mullerworth
+ 
+ program usegnufields
+   implicit none
+   type :: field_type
+     real,    allocatable :: data(:)
+     integer, allocatable :: idata(:)
+   end type field_type
+   type :: fieldholder
+     type(field_type) :: fieldset(2,4)
+   end type fieldholder
+   type(fieldholder) :: myfields
+ 
+   allocate(myfields%fieldset(2,1)%data(3))
+   allocate(myfields%fieldset(2,1)%idata(3))
+   myfields%fieldset(2,1)%data =1.0
+   myfields%fieldset(2,1)%idata=2
+ 
+   call setfields (myfields%fieldset(2,1:4))
+ !  print *,'After calling setfields with fieldset(2,1:4)'
+ !  print *,myfields%fieldset(2,1)%data
+ !  print *,myfields%fieldset(2,1)%idata
+   if (any (myfields%fieldset(2,1)%data  /= 1.0)) stop 1
+   if (any (myfields%fieldset(2,1)%idata /= 2  )) stop 2
+ 
+ contains
+   subroutine setfields (fieldset)
+     type(field_type), intent(inout) :: fieldset(1:4) ! corruption with -O
+ !    print *,'In setfields:'
+ !    print *,fieldset(1)%data
+ !    print *,fieldset(1)%idata
+   end subroutine setfields
+ end
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/pr125263.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/pr125263.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/pr125263.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/pr125263.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,71 ----
+ ! { dg-do run }
+ !
+ ! Test the fix for pr125263, in which the selector expressions were not
+ ! correctly set after the first two ASSOCIATE constructs below.
+ !
+ ! Conributed by Bastiaan Braams  <b.j.braams@cwi.nl>
+ !
+ program Main
+   implicit none (type, external)
+   type :: Foo_Type
+      integer, allocatable :: x(:)
+   end type Foo_Type
+   class (Foo_Type), allocatable :: fv(:), f, g
+   integer :: nx = 2, nf = 3, i
+ 
+   ! Create fv(:) with all component vectors initialized to 0.
+   allocate (Foo_Type::fv(0:nf-1))
+   do i = 0, nf-1
+      allocate (fv(i)%x(0:nx-1))
+      fv(i)%x(:) = 0
+   end do
+ 
+   ! Create f with f%x(:) equal to 1 and g with g%x(:) equal to 2.
+   allocate (Foo_Type::f, g)
+   allocate (f%x(0:nx-1),g%x(0:nx-1))
+   f%x(:) = 1
+   g%x(:) = 2
+ 
+   ! Use intrinsic assignment to copy f to fv(0).
+   associate (ft => fv(0))
+     select type (ft => fv(0))
+     type is (Foo_Type)
+        ft = f
+        ft%x = [2,3,4]
+     class default
+        error stop 'select type (ft): type error'
+     end select
+   end associate
+ 
+   ! Verify the copy on the element x(0) and that f is not overwritten.
+   if (any (fv(0)%x /= [2,3,4])) stop 1
+   if (any (f%x /= [1,1])) stop 2
+ 
+   ! All scalar selector-exprs have the same problem, not just array elements.
+   f%x(:) = 1
+   associate (ft => g)
+     select type (ft)
+     type is (Foo_Type)
+        ft = f
+        ft%x = [4,5,6]
+     class default
+        error stop 'select type (ft): type error'
+     end select
+   end associate
+   ! Verify the copy on g and that f is not overwritten.
+   if (any (g%x /= [4,5,6])) stop 3
+   if (any (f%x /= [1,1])) stop 4
+ 
+   ! Assignment to an element of an array associate name was OK.
+   fv(0)%x(:) = [0,0,0]
+   select type (ft => fv)
+   type is (Foo_Type)
+     ft = f
+     ft(0)%x = [2,3,4]
+   class default
+     error stop 'select type (ft): type error'
+   end select
+   if (any (fv(0)%x /= [2,3,4])) stop 5
+   if (any (f%x /= [1,1])) stop 6
+ 
+ end program Main
diff -Nrcpad gcc-17-20260517/gcc/testsuite/gfortran.dg/pr125391.f90 gcc-17-20260524/gcc/testsuite/gfortran.dg/pr125391.f90
*** gcc-17-20260517/gcc/testsuite/gfortran.dg/pr125391.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/gcc/testsuite/gfortran.dg/pr125391.f90	Sun May 24 22:32:12 2026
***************
*** 0 ****
--- 1,83 ----
+ ! { dg-do run }
+ !
+ ! Fix for PR125391 due to :
+ ! gfortran ICE: in gimplify_var_or_parm_decl, at gimplify.cc:3416 (26.2) 
+ !               in gimplify_var_or_parm_decl, at gimplify.cc:3166 (trunk, 16/5/10) 
+ !
+ !
+ ! Contributed by Federico Perini  <federico.perini@gmail.com>
+ !
+ module m
+   implicit none
+   type :: inner
+     integer :: x = 0
+   contains
+     final :: inner_final
+   end type
+ 
+   type :: outer2
+     type(inner) :: items(1)
+   end type
+ 
+   type :: outer1
+     type(inner), allocatable :: items(:)
+   end type
+ 
+   integer :: ctr = 0
+ 
+ contains
+   impure elemental subroutine inner_final(this)
+     type(inner), intent(inout) :: this
+     ctr = ctr + 1
+   end subroutine
+ 
+ 
+   ! Variant A: whole-array component assignment.
+   subroutine copy_whole1(lhs, rhs)
+     class(outer1), intent(inout) :: lhs
+     type(outer1),  intent(in)    :: rhs
+     lhs%items = rhs%items   ! ICE!
+   end subroutine
+ 
+   ! Variant B: assignment from an array constructor.
+   subroutine make_singleton1(lhs, x)
+     class(outer1), intent(inout) :: lhs
+     type(inner),  intent(in)    :: x
+     lhs%items = [x]         ! ICE!
+   end subroutine
+ 
+   ! Variant A: whole-array component assignment.
+   subroutine copy_whole2(lhs, rhs)
+     class(outer2), intent(inout) :: lhs
+     type(outer2),  intent(in)    :: rhs
+     lhs%items = rhs%items
+   end subroutine
+ 
+   ! Variant B: assignment from an array constructor.
+   subroutine make_singleton2(lhs, x)
+     class(outer2), intent(inout) :: lhs
+     type(inner),  intent(in)    :: x
+     lhs%items = [x]
+   end subroutine
+ end module
+ 
+ program p
+   use m
+   type(outer1) :: x
+   type(outer2) :: y
+ 
+   ! Verify that the original problem is fixed
+   x%items = [inner(2)]
+   if (ctr /= 0) stop 1            ! x%items not allocated
+   call make_singleton1 (x, inner(42))
+   call copy_whole1 (x, outer1([inner(S)]))
+   if (ctr /= 2) stop 2            ! one finalization for each call
+ 
+   ! Verify that the fix has not broken non-allocatable component references
+   y%items = [inner(2)]            ! y%items finalized before assignment
+   if (ctr /= 3) stop 3
+   call make_singleton2 (y, inner(42))
+   call copy_whole2 (y, outer2([inner(42)]))
+   if (ctr /= 5) stop 4            ! one finalization for each call
+ 
+ end program
diff -Nrcpad gcc-17-20260517/gcc/testsuite/lib/scanasm.exp gcc-17-20260524/gcc/testsuite/lib/scanasm.exp
*** gcc-17-20260517/gcc/testsuite/lib/scanasm.exp	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/testsuite/lib/scanasm.exp	Sun May 24 22:32:12 2026
*************** proc configure_check-function-bodies { c
*** 932,938 ****
  	set up_config(end) {^\}$}
      } elseif { [istarget *-*-darwin*] } {
  	set up_config(end) {^LFE[0-9]+}
!     } elseif { [istarget aarch64*-*-mingw32] } {
  	set up_config(end) {seh_endproc}
      } else {
  	set up_config(end) {^\s*\.size}
--- 932,938 ----
  	set up_config(end) {^\}$}
      } elseif { [istarget *-*-darwin*] } {
  	set up_config(end) {^LFE[0-9]+}
!     } elseif { [istarget *-*-mingw32] } {
  	set up_config(end) {seh_endproc}
      } else {
  	set up_config(end) {^\s*\.size}
diff -Nrcpad gcc-17-20260517/gcc/toplev.cc gcc-17-20260524/gcc/toplev.cc
*** gcc-17-20260517/gcc/toplev.cc	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/toplev.cc	Sun May 24 22:32:13 2026
*************** output_stack_usage_1 (FILE *cf)
*** 842,847 ****
--- 842,851 ----
        print_decl_identifier (stack_usage_file, current_function_decl,
  			     PRINT_DECL_ORIGIN | PRINT_DECL_UNIQUE_NAME
  			     | PRINT_DECL_REMAP_DEBUG);
+       fprintf (stack_usage_file, " `");
+       print_decl_identifier (stack_usage_file, current_function_decl,
+ 			     PRINT_DECL_NAME);
+       fprintf (stack_usage_file, "`");
        fprintf (stack_usage_file, "\t" HOST_WIDE_INT_PRINT_DEC"\t%s\n",
  	       stack_usage, stack_usage_kind_str[stack_usage_kind]);
      }
diff -Nrcpad gcc-17-20260517/gcc/tree-if-conv.cc gcc-17-20260524/gcc/tree-if-conv.cc
*** gcc-17-20260517/gcc/tree-if-conv.cc	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/tree-if-conv.cc	Sun May 24 22:32:13 2026
*************** again:
*** 2277,2291 ****
    if (!gimple_extract_op (arg0_def_stmt, &arg0_op))
      return;
  
!   /* At this point there should be no ssa names occuring in abnormals.  */
!   gcc_assert (!arg0_op.operands_occurs_in_abnormal_phi ());
  
    gimple *arg1_def_stmt = SSA_NAME_DEF_STMT (*arg1);
    if (!gimple_extract_op (arg1_def_stmt, &arg1_op))
      return;
  
!   /* At this point there should be no ssa names occuring in abnormals.  */
!   gcc_assert (!arg1_op.operands_occurs_in_abnormal_phi ());
  
    /* No factoring can happen if the codes are different
       or the number operands.  */
--- 2277,2293 ----
    if (!gimple_extract_op (arg0_def_stmt, &arg0_op))
      return;
  
!   /* Might pick up abnormals from previous bbs so stop the loop.  */
!   if (arg0_op.operands_occurs_in_abnormal_phi ())
!     return;
  
    gimple *arg1_def_stmt = SSA_NAME_DEF_STMT (*arg1);
    if (!gimple_extract_op (arg1_def_stmt, &arg1_op))
      return;
  
!   /* Might pick up abnormals from previous bbs so stop the loop.  */
!   if (arg1_op.operands_occurs_in_abnormal_phi ())
!     return;
  
    /* No factoring can happen if the codes are different
       or the number operands.  */
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-dom.cc gcc-17-20260524/gcc/tree-ssa-dom.cc
*** gcc-17-20260517/gcc/tree-ssa-dom.cc	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/tree-ssa-dom.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 42,48 ****
  #include "tree-ssa-scopedtables.h"
  #include "tree-ssa-threadedge.h"
  #include "tree-ssa-dom.h"
- #include "gimplify.h"
  #include "tree-cfgcleanup.h"
  #include "dbgcnt.h"
  #include "alloc-pool.h"
--- 42,47 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-dse.cc gcc-17-20260524/gcc/tree-ssa-dse.cc
*** gcc-17-20260517/gcc/tree-ssa-dse.cc	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/tree-ssa-dse.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 37,43 ****
  #include "tree-ssa-dse.h"
  #include "builtins.h"
  #include "gimple-fold.h"
- #include "gimplify.h"
  #include "tree-eh.h"
  #include "cfganal.h"
  #include "cgraph.h"
--- 37,42 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-loop-im.cc gcc-17-20260524/gcc/tree-ssa-loop-im.cc
*** gcc-17-20260517/gcc/tree-ssa-loop-im.cc	Sun May 17 22:32:13 2026
--- gcc-17-20260524/gcc/tree-ssa-loop-im.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 30,36 ****
  #include "fold-const.h"
  #include "cfganal.h"
  #include "tree-eh.h"
- #include "gimplify.h"
  #include "gimple-iterator.h"
  #include "tree-cfg.h"
  #include "tree-ssa-loop-manip.h"
--- 30,35 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-loop-manip.cc gcc-17-20260524/gcc/tree-ssa-loop-manip.cc
*** gcc-17-20260517/gcc/tree-ssa-loop-manip.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-loop-manip.cc	Sun May 24 22:32:13 2026
*************** create_iv (tree base, tree_code incr_op,
*** 133,141 ****
  	}
        else
  	{
! 	  bool ovf;
! 
! 	  if (!tree_expr_nonnegative_warnv_p (step, &ovf)
  	      && may_negate_without_overflow_p (step))
  	    {
  	      incr_op = (incr_op == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
--- 133,139 ----
  	}
        else
  	{
! 	  if (!tree_expr_nonnegative_p (step)
  	      && may_negate_without_overflow_p (step))
  	    {
  	      incr_op = (incr_op == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-loop-niter.cc gcc-17-20260524/gcc/tree-ssa-loop-niter.cc
*** gcc-17-20260517/gcc/tree-ssa-loop-niter.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-loop-niter.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 32,38 ****
  #include "fold-const.h"
  #include "calls.h"
  #include "intl.h"
- #include "gimplify.h"
  #include "gimple-iterator.h"
  #include "tree-cfg.h"
  #include "tree-ssa-loop-ivopts.h"
--- 32,37 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-loop-split.cc gcc-17-20260524/gcc/tree-ssa-loop-split.cc
*** gcc-17-20260517/gcc/tree-ssa-loop-split.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-loop-split.cc	Sun May 24 22:32:13 2026
*************** compute_new_first_bound (gimple_seq *stm
*** 521,557 ****
  }
  
  /* Fix the two loop's bb count after split based on the split edge probability,
!    don't adjust the bbs dominated by true branches of that loop to avoid
     dropping 1s down.  */
  static void
! fix_loop_bb_probability (class loop *loop1, class loop *loop2, edge true_edge,
! 			 edge false_edge)
  {
!   /* Proportion first loop's bb counts except those dominated by true
!      branch to avoid drop 1s down.  */
    basic_block *bbs1, *bbs2;
    bbs1 = get_loop_body (loop1);
    unsigned j;
    for (j = 0; j < loop1->num_nodes; j++)
      if (bbs1[j] == loop1->latch
! 	/* Watch for case where the true conditional is empty.  */
! 	|| !single_pred_p (true_edge->dest)
! 	|| !dominated_by_p (CDI_DOMINATORS, bbs1[j], true_edge->dest))
        bbs1[j]->count
! 	= bbs1[j]->count.apply_probability (true_edge->probability);
    free (bbs1);
  
!   /* Proportion second loop's bb counts except those dominated by false
!      branch to avoid drop 1s down.  */
!   basic_block bbi_copy = get_bb_copy (false_edge->dest);
    bbs2 = get_loop_body (loop2);
    for (j = 0; j < loop2->num_nodes; j++)
      if (bbs2[j] == loop2->latch
! 	/* Watch for case where the flase conditional is empty.  */
  	|| !single_pred_p (bbi_copy)
  	|| !dominated_by_p (CDI_DOMINATORS, bbs2[j], bbi_copy))
        bbs2[j]->count
! 	= bbs2[j]->count.apply_probability (true_edge->probability.invert ());
    free (bbs2);
  }
  
--- 521,558 ----
  }
  
  /* Fix the two loop's bb count after split based on the split edge probability,
!    don't adjust the bbs dominated by the branch kept in that loop to avoid
     dropping 1s down.  */
  static void
! fix_loop_bb_probability (class loop *loop1, class loop *loop2, edge loop1_edge,
! 			 edge loop2_edge)
  {
!   /* Proportion first loop's bb counts except those dominated by the
!      branch that stays true/false in the first loop, to avoid dropping
!      1s down.  */
    basic_block *bbs1, *bbs2;
    bbs1 = get_loop_body (loop1);
    unsigned j;
    for (j = 0; j < loop1->num_nodes; j++)
      if (bbs1[j] == loop1->latch
! 	/* Watch for case where the kept conditional arm is empty.  */
! 	|| !single_pred_p (loop1_edge->dest)
! 	|| !dominated_by_p (CDI_DOMINATORS, bbs1[j], loop1_edge->dest))
        bbs1[j]->count
! 	= bbs1[j]->count.apply_probability (loop1_edge->probability);
    free (bbs1);
  
!   /* Proportion second loop's bb counts except those dominated by the
!      opposite branch, which is kept in the second loop.  */
!   basic_block bbi_copy = get_bb_copy (loop2_edge->dest);
    bbs2 = get_loop_body (loop2);
    for (j = 0; j < loop2->num_nodes; j++)
      if (bbs2[j] == loop2->latch
! 	/* Watch for case where the kept conditional arm is empty.  */
  	|| !single_pred_p (bbi_copy)
  	|| !dominated_by_p (CDI_DOMINATORS, bbs2[j], bbi_copy))
        bbs2[j]->count
! 	= bbs2[j]->count.apply_probability (loop2_edge->probability);
    free (bbs2);
  }
  
*************** split_loop (class loop *loop1)
*** 675,680 ****
--- 676,683 ----
  
  	edge true_edge, false_edge;
  	extract_true_false_edges_from_block (bbs[i], &true_edge, &false_edge);
+ 	edge loop1_edge = initial_true ? true_edge : false_edge;
+ 	edge loop2_edge = initial_true ? false_edge : true_edge;
  
  	/* Now version the loop, placing loop2 after loop1 connecting
  	   them, and fix up SSA form for that.  */
*************** split_loop (class loop *loop1)
*** 683,689 ****
  
  	profile_probability loop1_prob
  	  = integer_onep (cond) ? profile_probability::always ()
! 				: true_edge->probability;
  	/* TODO: It is commonly a case that we know that both loops will be
  	   entered.  very_likely below is the probability that second loop will
  	   be entered given by connect_loops.  We should work out the common
--- 686,692 ----
  
  	profile_probability loop1_prob
  	  = integer_onep (cond) ? profile_probability::always ()
! 				: loop1_edge->probability;
  	/* TODO: It is commonly a case that we know that both loops will be
  	   entered.  very_likely below is the probability that second loop will
  	   be entered given by connect_loops.  We should work out the common
*************** split_loop (class loop *loop1)
*** 709,715 ****
  		(loop_preheader_edge (loop2)->src)->probability
  			= loop1_prob.invert ();
  
! 	fix_loop_bb_probability (loop1, loop2, true_edge, false_edge);
  	/* If conditional we split on has reliable profilea nd both
  	   preconditionals of loop1 and loop2 are constant true, we can
  	   only redistribute the iteration counts to the split loops.
--- 712,727 ----
  		(loop_preheader_edge (loop2)->src)->probability
  			= loop1_prob.invert ();
  
! 	fix_loop_bb_probability (loop1, loop2, loop1_edge, loop2_edge);
! 
! 	if (dump_file && (dump_flags & TDF_DETAILS))
! 	  fprintf (dump_file,
! 		   ";; Split loop: initial_true %s, "
! 		   "loop1 count %" PRId64 ", loop2 count %" PRId64 "\n",
! 		   initial_true ? "true" : "false",
! 		   (int64_t) loop1->header->count.to_gcov_type (),
! 		   (int64_t) loop2->header->count.to_gcov_type ());
! 
  	/* If conditional we split on has reliable profilea nd both
  	   preconditionals of loop1 and loop2 are constant true, we can
  	   only redistribute the iteration counts to the split loops.
*************** split_loop (class loop *loop1)
*** 727,736 ****
  	if (loop1->any_estimate
  	    && wi::fits_shwi_p (loop1->nb_iterations_estimate))
  	  {
! 	    sreal scale = true_edge->probability.reliable_p ()
! 			  ? true_edge->probability.to_sreal () : (sreal)1;
! 	    sreal scale2 = false_edge->probability.reliable_p ()
! 			  ? false_edge->probability.to_sreal () : (sreal)1;
  	    sreal div1 = loop1_prob.initialized_p ()
  			 ? loop1_prob.to_sreal () : (sreal)1/(sreal)2;
  	    /* +1 to get header interations rather than latch iterations and then
--- 739,750 ----
  	if (loop1->any_estimate
  	    && wi::fits_shwi_p (loop1->nb_iterations_estimate))
  	  {
! 	    sreal scale
! 	      = loop1_edge->probability.reliable_p ()
! 		? loop1_edge->probability.to_sreal () : (sreal)1;
! 	    sreal scale2
! 	      = loop2_edge->probability.reliable_p ()
! 		? loop2_edge->probability.to_sreal () : (sreal)1;
  	    sreal div1 = loop1_prob.initialized_p ()
  			 ? loop1_prob.to_sreal () : (sreal)1/(sreal)2;
  	    /* +1 to get header interations rather than latch iterations and then
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-loop-unswitch.cc gcc-17-20260524/gcc/tree-ssa-loop-unswitch.cc
*** gcc-17-20260517/gcc/tree-ssa-loop-unswitch.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-loop-unswitch.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 26,32 ****
  #include "tree-pass.h"
  #include "ssa.h"
  #include "fold-const.h"
- #include "gimplify.h"
  #include "tree-cfg.h"
  #include "tree-ssa.h"
  #include "tree-ssa-loop-niter.h"
--- 26,31 ----
*************** set_predicates_for_bb (basic_block bb, v
*** 250,255 ****
--- 249,269 ----
    bb_predicates->safe_push (predicates);
  }
  
+ /* Estimate number of instructions in LOOP using eni_size_weights.  */
+ 
+ static unsigned
+ estimate_loop_insns (class loop *loop)
+ {
+   unsigned insns = 0;
+   basic_block *body = get_loop_body (loop);
+   for (unsigned i = 0; i < loop->num_nodes; i++)
+     for (gimple_stmt_iterator gsi = gsi_start_bb (body[i]);
+ 	 !gsi_end_p (gsi); gsi_next (&gsi))
+       insns += estimate_num_insns (gsi_stmt (gsi), &eni_size_weights);
+   free (body);
+   return insns;
+ }
+ 
  /* Initialize LOOP information reused during the unswitching pass.
     Return total number of instructions in the loop.  Adjusts LOOP to
     the outermost loop all candidates are invariant in.  */
*************** init_loop_unswitch_info (class loop *&lo
*** 262,274 ****
  
    basic_block *bbs = get_loop_body (loop);
  
!   /* Unswitch only nests with no sibling loops.  */
    class loop *outer_loop = loop;
    unsigned max_depth = param_max_unswitch_depth;
    while (loop_outer (outer_loop)->num != 0
! 	 && !loop_outer (outer_loop)->inner->next
! 	 && --max_depth != 0)
!     outer_loop = loop_outer (outer_loop);
    hottest = NULL;
    hottest_bb = NULL;
    /* Find all unswitching candidates in the innermost loop.  */
--- 276,310 ----
  
    basic_block *bbs = get_loop_body (loop);
  
!   /* Unswitch only nests with no sibling loops.  Since predicates come from
!      the innermost loop, only the outer-loop bodies get duplicated by hoisting
!      the unswitching out; the innermost loop is shared in the cost estimate.  */
    class loop *outer_loop = loop;
    unsigned max_depth = param_max_unswitch_depth;
+   unsigned innermost_size = estimate_loop_insns (loop);
    while (loop_outer (outer_loop)->num != 0
! 	 && !loop_outer (outer_loop)->inner->next)
!     {
!       if (--max_depth == 0)
! 	break;
! 
!       class loop *candidate = loop_outer (outer_loop);
!       unsigned candidate_size = estimate_loop_insns (candidate);
! 
!       if (candidate_size - innermost_size
! 	  > (unsigned) param_max_unswitch_insns)
! 	{
! 	  if (dump_enabled_p ())
! 	    dump_printf_loc (MSG_NOTE, find_loop_location (loop),
! 			     "Not unswitching outer loop, duplicated size %u "
! 			     "exceeds max-unswitch-insns %u\n",
! 			     candidate_size - innermost_size,
! 			     (unsigned) param_max_unswitch_insns);
! 	  break;
! 	}
! 
!       outer_loop = candidate;
!     }
    hottest = NULL;
    hottest_bb = NULL;
    /* Find all unswitching candidates in the innermost loop.  */
*************** make_pass_tree_unswitch (gcc::context *c
*** 1678,1681 ****
    return new pass_tree_unswitch (ctxt);
  }
  
- 
--- 1714,1716 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-math-opts.cc gcc-17-20260524/gcc/tree-ssa-math-opts.cc
*** gcc-17-20260517/gcc/tree-ssa-math-opts.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-math-opts.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 102,109 ****
  #include "fold-const.h"
  #include "gimple-iterator.h"
  #include "gimple-fold.h"
- #include "gimplify.h"
- #include "gimplify-me.h"
  #include "stor-layout.h"
  #include "tree-cfg.h"
  #include "tree-dfa.h"
--- 102,107 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-phiopt.cc gcc-17-20260524/gcc/tree-ssa-phiopt.cc
*** gcc-17-20260517/gcc/tree-ssa-phiopt.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-phiopt.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 35,43 ****
  #include "fold-const.h"
  #include "stor-layout.h"
  #include "cfganal.h"
- #include "gimplify.h"
  #include "gimple-iterator.h"
- #include "gimplify-me.h"
  #include "tree-cfg.h"
  #include "tree-dfa.h"
  #include "domwalk.h"
--- 35,41 ----
*************** absorbing_element_p (tree_code code, tre
*** 1331,1337 ****
      case ROUND_MOD_EXPR:
        return (!right
  	      && integer_zerop (arg)
! 	      && tree_single_nonzero_warnv_p (rval, NULL));
  
      default:
        return false;
--- 1329,1335 ----
      case ROUND_MOD_EXPR:
        return (!right
  	      && integer_zerop (arg)
! 	      && tree_single_nonzero_p (rval));
  
      default:
        return false;
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-phiprop.cc gcc-17-20260524/gcc/tree-ssa-phiprop.cc
*** gcc-17-20260517/gcc/tree-ssa-phiprop.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-phiprop.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 29,35 ****
  #include "gimple-pretty-print.h"
  #include "fold-const.h"
  #include "tree-eh.h"
- #include "gimplify.h"
  #include "gimple-iterator.h"
  #include "stor-layout.h"
  #include "tree-ssa-loop.h"
--- 29,34 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-pre.cc gcc-17-20260524/gcc/tree-ssa-pre.cc
*** gcc-17-20260517/gcc/tree-ssa-pre.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-pre.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 37,43 ****
  #include "gimple-iterator.h"
  #include "gimple-fold.h"
  #include "tree-eh.h"
- #include "gimplify.h"
  #include "tree-cfg.h"
  #include "tree-into-ssa.h"
  #include "tree-dfa.h"
--- 37,42 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-propagate.cc gcc-17-20260524/gcc/tree-ssa-propagate.cc
*** gcc-17-20260517/gcc/tree-ssa-propagate.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-propagate.cc	Sun May 24 22:32:13 2026
***************
*** 30,36 ****
  #include "gimple-iterator.h"
  #include "gimple-fold.h"
  #include "tree-eh.h"
- #include "gimplify.h"
  #include "tree-cfg.h"
  #include "tree-ssa.h"
  #include "tree-ssa-propagate.h"
--- 30,35 ----
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-reassoc.cc gcc-17-20260524/gcc/tree-ssa-reassoc.cc
*** gcc-17-20260517/gcc/tree-ssa-reassoc.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-reassoc.cc	Sun May 24 22:32:13 2026
*************** init_range_entry (struct range_entry *r,
*** 2660,2667 ****
  	    return;
  	do_default:
  	  nexp = make_range_step (loc, code, arg0, arg1, exp_type,
! 				  &low, &high, &in_p,
! 				  &strict_overflow_p);
  	  if (nexp != NULL_TREE)
  	    {
  	      exp = nexp;
--- 2660,2666 ----
  	    return;
  	do_default:
  	  nexp = make_range_step (loc, code, arg0, arg1, exp_type,
! 				  &low, &high, &in_p);
  	  if (nexp != NULL_TREE)
  	    {
  	      exp = nexp;
diff -Nrcpad gcc-17-20260517/gcc/tree-ssa-sccvn.cc gcc-17-20260524/gcc/tree-ssa-sccvn.cc
*** gcc-17-20260517/gcc/tree-ssa-sccvn.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree-ssa-sccvn.cc	Sun May 24 22:32:13 2026
*************** along with GCC; see the file COPYING3.
*** 42,48 ****
  #include "gimple-iterator.h"
  #include "gimple-fold.h"
  #include "tree-eh.h"
- #include "gimplify.h"
  #include "flags.h"
  #include "dojump.h"
  #include "explow.h"
--- 42,47 ----
diff -Nrcpad gcc-17-20260517/gcc/tree.cc gcc-17-20260524/gcc/tree.cc
*** gcc-17-20260517/gcc/tree.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree.cc	Sun May 24 22:32:13 2026
*************** diagnose_versioned_decls (tree old_decl,
*** 15847,15852 ****
--- 15847,16011 ----
  	    (old_target_attr, old_decl, new_target_attr, new_decl);
  }
  
+ 
+ /* This page contains routines to unshare tree nodes, i.e. to duplicate tree
+    nodes that are referenced more than once in GENERIC functions.  This is
+    necessary because gimplification (translation into GIMPLE) is performed
+    by modifying tree nodes in-place, so gimplification of a shared node in a
+    first context could generate an invalid GIMPLE form in a second context.
+ 
+    This is achieved with a simple mark/copy/unmark algorithm that walks the
+    GENERIC representation top-down, marks nodes with TREE_VISITED the first
+    time it encounters them, duplicates them if they already have TREE_VISITED
+    set, and finally removes the TREE_VISITED marks it has set.
+ 
+    The algorithm works only at the function level, i.e. it generates a GENERIC
+    representation of a function with no nodes shared within the function when
+    passed a GENERIC function (except for nodes that are allowed to be shared).
+ 
+    At the global level, it is also necessary to unshare tree nodes that are
+    referenced in more than one function, for the same aforementioned reason.
+    This requires some cooperation from the front-end.  There are 2 strategies:
+ 
+      1. Manual unsharing.  The front-end needs to call unshare_expr on every
+         expression that might end up being shared across functions.
+ 
+      2. Deep unsharing.  This is an extension of regular unsharing.  Instead
+         of calling unshare_expr on expressions that might be shared across
+         functions, the front-end pre-marks them with TREE_VISITED.  This will
+         ensure that they are unshared on the first reference within functions
+         when the regular unsharing algorithm runs.  The counterpart is that
+         this algorithm must look deeper than for manual unsharing, which is
+         specified by LANG_HOOKS_DEEP_UNSHARING.
+ 
+   If there are only few specific cases of node sharing across functions, it is
+   probably easier for a front-end to unshare the expressions manually.  On the
+   contrary, if the expressions generated at the global level are as widespread
+   as expressions generated within functions, deep unsharing is very likely the
+   way to go.  */
+ 
+ /* Similar to copy_tree_r but do not copy SAVE_EXPR or TARGET_EXPR nodes.
+    These nodes model computations that must be done once.  If we were to
+    unshare something like SAVE_EXPR(i++), the gimplification process would
+    create wrong code.  However, if DATA is non-null, it must hold a pointer
+    set that is used to unshare the subtrees of these nodes.  */
+ 
+ static tree
+ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
+ {
+   tree t = *tp;
+   enum tree_code code = TREE_CODE (t);
+ 
+   /* Do not copy SAVE_EXPR, TARGET_EXPR or BIND_EXPR nodes themselves, but
+      copy their subtrees if we can make sure to do it only once.  */
+   if (code == SAVE_EXPR || code == TARGET_EXPR || code == BIND_EXPR)
+     {
+       if (data && !((hash_set<tree> *)data)->add (t))
+ 	;
+       else
+ 	*walk_subtrees = 0;
+     }
+ 
+   /* Stop at types, decls, constants like copy_tree_r.  */
+   else if (TREE_CODE_CLASS (code) == tcc_type
+ 	   || TREE_CODE_CLASS (code) == tcc_declaration
+ 	   || TREE_CODE_CLASS (code) == tcc_constant)
+     *walk_subtrees = 0;
+ 
+   /* Cope with the statement expression extension.  */
+   else if (code == STATEMENT_LIST)
+     ;
+ 
+   /* Leave the bulk of the work to copy_tree_r itself.  */
+   else
+     copy_tree_r (tp, walk_subtrees, NULL);
+ 
+   return NULL_TREE;
+ }
+ 
+ /* Callback for walk_tree to unshare most of the shared trees rooted at *TP.
+    If *TP has been visited already, then *TP is deeply copied by calling
+    mostly_copy_tree_r.  DATA is passed to mostly_copy_tree_r unmodified.  */
+ 
+ static tree
+ copy_if_shared_r (tree *tp, int *walk_subtrees, void *data)
+ {
+   tree t = *tp;
+   enum tree_code code = TREE_CODE (t);
+ 
+   /* Skip types, decls, and constants.  But we do want to look at their
+      types and the bounds of types.  Mark them as visited so we properly
+      unmark their subtrees on the unmark pass.  If we've already seen them,
+      don't look down further.  */
+   if (TREE_CODE_CLASS (code) == tcc_type
+       || TREE_CODE_CLASS (code) == tcc_declaration
+       || TREE_CODE_CLASS (code) == tcc_constant)
+     {
+       if (TREE_VISITED (t))
+ 	*walk_subtrees = 0;
+       else
+ 	TREE_VISITED (t) = 1;
+     }
+ 
+   /* If this node has been visited already, unshare it and don't look
+      any deeper.  */
+   else if (TREE_VISITED (t))
+     {
+       walk_tree (tp, mostly_copy_tree_r, data, NULL);
+       *walk_subtrees = 0;
+     }
+ 
+   /* Otherwise, mark the node as visited and keep looking.  */
+   else
+     TREE_VISITED (t) = 1;
+ 
+   return NULL_TREE;
+ }
+ 
+ /* Unshare most of the shared trees rooted at *TP.  DATA is passed to the
+    copy_if_shared_r callback unmodified.  */
+ 
+ void
+ copy_if_shared (tree *tp, void *data)
+ {
+   walk_tree (tp, copy_if_shared_r, data, NULL);
+ }
+ 
+ /* Unconditionally make an unshared copy of EXPR.  This is used when using
+    stored expressions which span multiple functions, such as BINFO_VTABLE,
+    as the normal unsharing process can't tell that they're shared.  */
+ 
+ tree
+ unshare_expr (tree expr)
+ {
+   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
+   return expr;
+ }
+ 
+ /* Worker for unshare_expr_without_location.  */
+ 
+ static tree
+ prune_expr_location (tree *tp, int *walk_subtrees, void *)
+ {
+   if (EXPR_P (*tp))
+     SET_EXPR_LOCATION (*tp, UNKNOWN_LOCATION);
+   else
+     *walk_subtrees = 0;
+   return NULL_TREE;
+ }
+ 
+ /* Similar to unshare_expr but also prune all expression locations
+    from EXPR.  */
+ 
+ tree
+ unshare_expr_without_location (tree expr)
+ {
+   walk_tree (&expr, mostly_copy_tree_r, NULL, NULL);
+   if (EXPR_P (expr))
+     walk_tree (&expr, prune_expr_location, NULL, NULL);
+   return expr;
+ }
+ 
  void
  tree_cc_finalize (void)
  {
diff -Nrcpad gcc-17-20260517/gcc/tree.h gcc-17-20260524/gcc/tree.h
*** gcc-17-20260517/gcc/tree.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/tree.h	Sun May 24 22:32:13 2026
*************** extern bool disjoint_version_decls (tree
*** 7204,7207 ****
--- 7204,7216 ----
  /* Checks if two overlapping decls are not mergeable.  */
  extern bool diagnose_versioned_decls (tree, tree);
  
+ /* Unshare tree if needed.  */
+ extern tree unshare_expr (tree);
+ 
+ /* Unshare tree if needed.
+    Removing the locations if an expr.  */
+ extern tree unshare_expr_without_location (tree);
+ 
+ extern void copy_if_shared (tree *, void * = NULL);
+ 
  #endif  /* GCC_TREE_H  */
diff -Nrcpad gcc-17-20260517/gcc/value-query.cc gcc-17-20260524/gcc/value-query.cc
*** gcc-17-20260517/gcc/value-query.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/value-query.cc	Sun May 24 22:32:13 2026
*************** range_query::get_tree_range (vrange &r,
*** 389,396 ****
      case ADDR_EXPR:
        {
  	// Handle &var which can show up in phi arguments.
! 	bool ov;
! 	if (tree_single_nonzero_warnv_p (expr, &ov))
  	  {
  	    r.set_nonzero (type);
  	    return true;
--- 389,395 ----
      case ADDR_EXPR:
        {
  	// Handle &var which can show up in phi arguments.
! 	if (tree_single_nonzero_p (expr))
  	  {
  	    r.set_nonzero (type);
  	    return true;
diff -Nrcpad gcc-17-20260517/gcc/var-tracking.cc gcc-17-20260524/gcc/var-tracking.cc
*** gcc-17-20260517/gcc/var-tracking.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/gcc/var-tracking.cc	Sun May 24 22:32:13 2026
*************** reverse_op (rtx val, const_rtx expr, rtx
*** 5900,5906 ****
       prefer non-ENTRY_VALUE locations whenever possible.  */
    for (l = v->locs, count = 0; l; l = l->next, count++)
      if (CONSTANT_P (l->loc)
! 	&& (GET_CODE (l->loc) != CONST || !references_value_p (l->loc, 0)))
        return;
      /* Avoid creating too large locs lists.  */
      else if (count == param_max_vartrack_reverse_op_size)
--- 5900,5906 ----
       prefer non-ENTRY_VALUE locations whenever possible.  */
    for (l = v->locs, count = 0; l; l = l->next, count++)
      if (CONSTANT_P (l->loc)
! 	&& (GET_CODE (l->loc) != CONST || !references_value_p (l->loc)))
        return;
      /* Avoid creating too large locs lists.  */
      else if (count == param_max_vartrack_reverse_op_size)
diff -Nrcpad gcc-17-20260517/libffi/ChangeLog gcc-17-20260524/libffi/ChangeLog
*** gcc-17-20260517/libffi/ChangeLog	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/ChangeLog	Sun May 24 22:32:13 2026
***************
*** 1,3 ****
--- 1,105 ----
+ 2026-05-21  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* LOCAL_PATCHES: Update list.
+ 
+ 2026-05-21  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* src/x86/ffitarget.h (if defined (X86_64) &&
+ 	defined (__i386__)): Remove #warning.
+ 
+ 2026-05-21  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* src/aarch64/ffi.c: Define `WIN32_LEAN_AND_MEAN` before
+ 	`#include <windows.h>`.
+ 
+ 2026-05-21  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* testsuite/lib/libffi.exp (load_gcc_lib): Load library from GCC
+ 	testsuite.
+ 	Load target-supports.exp and target-supports-dg.exp.
+ 	(libffi-init): Use libraries in GCC build tree.
+ 	Pass correct flags on darwin.
+ 	(libffi_target_compile): If '--with-build-sysroot=[...]' was
+ 	specified, use it for build-tree testing. Link with
+ 	-shared-libgcc -lstdc++ for C++ sources.
+ 
+ 2026-05-21  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	PR libffi/117635
+ 	* Makefile.am (AUTOMAKE_OPTIONS): Add info-in-builddir.
+ 	(ACLOCAL_AMFLAGS): Set to -I .. -I ../config.
+ 	(SUBDIRS): Don't add doc.
+ 	(TEXINFO_TEX): New.
+ 	(MAKEINFOFLAGS): Likewise.
+ 	(info_TEXINFOS): Likewise.
+ 	(STAMP_GENINSRC): Likewise.
+ 	(STAMP_BUILD_INFO): Likewise.
+ 	(all-local): Likewise.
+ 	(stamp-geninsrc): Likewise.
+ 	(doc/libffi.info): Likewise.
+ 	(stamp-build-info:): Likewise.
+ 	(CLEANFILES): Likewise.
+ 	(MAINTAINERCLEANFILES): Likewise.
+ 	(AM_MAKEFLAGS): Likewise.
+ 	(LTLDFLAGS): Replace libtool-ldflags with ../libtool-ldflags.
+ 	(AM_CFLAGS): Add -Wall -g -fexceptions $(CET_FLAGS).
+ 	(libffi.map-sun): Replace make_sunver.pl with
+ 	../contrib/make_sunver.pl. Pass $(libffi_la_OBJECTS),
+ 	$(libffi_la_LIBADD) to make_sunver.pl unmodified.
+ 	(libffi_la_LDFLAGS): Handle Darwin rpaths.
+ 	(AM_CCASFLAGS): Add $(CET_FLAGS).
+ 	(all-recursive): New.
+ 	(install-recursive): Likewise.
+ 	(mostlyclean-recursive): Likewise.
+ 	(clean-recursive): Likewise.
+ 	(distclean-recursive): Likewise.
+ 	(maintainer-clean-recursive): Likewise.
+ 	(dist-hook): Removed.
+ 	Include $(top_srcdir)/../multilib.am.
+ 	* Makefile.in: Regenerate.
+ 	* configure: Regenerate.
+ 	* configure.ac: Add AM_ENABLE_MULTILIB.
+ 	Remove the frv*-elf check.
+ 	(AX_ENABLE_BUILDDIR): Removed.
+ 	(AM_INIT_AUTOMAKE): Add [no-dist].
+ 	Add --enable-generated-files-in-srcdir.
+ 	(CET_FLAGS): Add GCC_CET_FLAGS and AC_SUBST.
+ 	(AC_CONFIG_MACRO_DIR): Removed.
+ 	(AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH])): New.
+ 	(AX_COMPILER_VENDOR): Removed.
+ 	(AX_CC_MAXOPT): Likewise.
+ 	(AX_CFLAGS_WARN_ALL): Likewise.
+ 	Remove the GCC check.
+ 	(AC_SUBST(SYSROOT_CFLAGS_FOR_TARGET)): New.
+ 	<local.exp>: Don't set 'CC_FOR_TARGET', 'CXX_FOR_TARGET',
+ 	instead set 'SYSROOT_CFLAGS_FOR_TARGET'.
+ 	(m4_warn([obsolete])): Removed.
+ 	(LT_SYS_SYMBOL_USCORE): Likewise.
+ 	(AX_CHECK_COMPILE_FLAG): Likewise.
+ 	Remove --disable-docs.
+ 	(ACX_CHECK_PROG_VER): Check makeinfo.
+ 	(BUILD_DOCS): Updated.
+ 	(exec-static-tramp): Don't enable use of static exec trampolines
+ 	by default.
+ 	Remove --disable-multi-os-directory.
+ 	(GCC_WITH_TOOLEXECLIBDIR): New.
+ 	Support cross host.
+ 	Support --enable-multilib.
+ 	(GCC_BASE_VER): New.
+ 	(AC_CONFIG_FILES): Remove doc/Makefile.
+ 	(AC_CONFIG_LINKS): New.
+ 	* fficonfig.h.in: Regenerate.
+ 	* include/Makefile.am (nodist_include_HEADERS): Removed.
+ 	(gcc_version): New.
+ 	(toollibffidir): Likewise.
+ 	(toollibffi_HEADERS): Likewise.
+ 	* include/Makefile.in: Regenerate.
+ 	* man/Makefile.in: Regenerate.
+ 	* testsuite/Makefile.in: Regenerate.
+ 
  2026-01-29  Pietro Monteiro  <pietro@sociotechnical.xyz>
  
  	PR libffi/117635
diff -Nrcpad gcc-17-20260517/libffi/LICENSE gcc-17-20260524/libffi/LICENSE
*** gcc-17-20260517/libffi/LICENSE	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/LICENSE	Sun May 24 22:32:13 2026
***************
*** 1,4 ****
! libffi - Copyright (c) 1996-2021  Anthony Green, Red Hat, Inc and others.
  See source files for details.
  
  Permission is hereby granted, free of charge, to any person obtaining
--- 1,4 ----
! libffi - Copyright (c) 1996-2025  Anthony Green, Red Hat, Inc and others.
  See source files for details.
  
  Permission is hereby granted, free of charge, to any person obtaining
diff -Nrcpad gcc-17-20260517/libffi/LOCAL_PATCHES gcc-17-20260524/libffi/LOCAL_PATCHES
*** gcc-17-20260517/libffi/LOCAL_PATCHES	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/LOCAL_PATCHES	Sun May 24 22:32:13 2026
***************
*** 1,18 ****
! 5be7b66998127286fada45e4f23bd8a2056d553e
! 4824ed41ba7cd63e60fd9f8769a58b79935a90d1
! 90205f67e465ae7dfcf733c2b2b177ca7ff68da0
! 333efaea633971912f2208d37b7b62992759d400
! a91f844ef449d0dd1cf2e0e47b0ade0d8a6304e1
! 3cc159bc01516e370e8f119db70e2fbd803f3f80
! 902c755930326cb4405672aa3ea13c35c653cbff
! e4703bd0e15b4ed6e5eae36604b28bd4ca4f8cee
! 043550bceea7881163bba5d8a0486bb100a05809
! 4beacf3cb8d128b3b9c8c2d3824693b895414428
! 6a6d3817afa02bbcd2388c8e005da6faf88932f1
! a0673ec5f9236dca6ada23f28343c591ccd575e4
! 967d4171b2eb0557e86ba28996423353f0f1b141
! 35b05a02de1e8aee7c754a20f50736977c71caca
! 61aa380bad45fb070379f259f7abc5e5f50c9009
! 9e1c71bab50d51a1a8ec1a75080ffde6ca3d854c
! 9fb5348e3021021e82d75e4ca4e6f8d51a34c24f
! a616b7e1db7319c587b9c65fe9548c59c67d1234
--- 1,4 ----
! 71ecf327b4486584c0d0e3591caef00e87b40bd3
! 8b5cb5bfeaeb64c232fe0147cb430f22d3f5e18d
! 922414dd0975bd556059a65963f7e2a222849442
! c2fbaa4da5f2c46032109925fa8ae26f5f185ab1
diff -Nrcpad gcc-17-20260517/libffi/MERGE gcc-17-20260524/libffi/MERGE
*** gcc-17-20260517/libffi/MERGE	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/MERGE	Sun May 24 22:32:13 2026
***************
*** 1,4 ****
! f9ea41683444ebe11cfa45b05223899764df28fb
  
  The first line of this file holds the git revision number of the
  last merge done from the master library sources.
--- 1,4 ----
! e2eda0cf72a0598b44278cc91860ea402273fa29
  
  The first line of this file holds the git revision number of the
  last merge done from the master library sources.
diff -Nrcpad gcc-17-20260517/libffi/Makefile.am gcc-17-20260524/libffi/Makefile.am
*** gcc-17-20260517/libffi/Makefile.am	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/Makefile.am	Sun May 24 22:32:13 2026
*************** ACLOCAL_AMFLAGS = -I .. -I ../config
*** 6,19 ****
  
  SUBDIRS = include testsuite man
  
! EXTRA_DIST = LICENSE ChangeLog.old					\
! 	m4/libtool.m4 m4/lt~obsolete.m4					\
! 	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
! 	 m4/ltversion.m4 src/debug.c msvcc.sh				\
! 	generate-darwin-source-and-headers.py				\
! 	libffi.xcodeproj/project.pbxproj				\
! 	libtool-ldflags libtool-version configure.host README.md        \
! 	libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl	
  
  # local.exp is generated by configure
  DISTCLEANFILES = local.exp
--- 6,20 ----
  
  SUBDIRS = include testsuite man
  
! EXTRA_DIST = LICENSE ChangeLog.old                          \
!   m4/libtool.m4 m4/lt~obsolete.m4                           \
!   m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4             \
!   m4/ltversion.m4 src/debug.c msvcc.sh                      \
!   generate-darwin-source-and-headers.py                     \
!   libffi.xcodeproj/project.pbxproj                          \
!   src/powerpc/t-aix                                         \
!   libtool-ldflags libtool-version configure.host README.md  \
!   libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl
  
  # local.exp is generated by configure
  DISTCLEANFILES = local.exp
*************** noinst_HEADERS = src/aarch64/ffitarget.h
*** 130,145 ****
  	src/m32r/ffitarget.h src/m68k/ffitarget.h			\
  	src/m88k/ffitarget.h src/metag/ffitarget.h			\
  	src/microblaze/ffitarget.h src/mips/ffitarget.h			\
! 	src/moxie/ffitarget.h src/nios2/ffitarget.h			\
  	src/or1k/ffitarget.h src/pa/ffitarget.h				\
  	src/powerpc/ffitarget.h src/powerpc/asm.h			\
! 	src/powerpc/ffi_powerpc.h src/riscv/ffitarget.h			\
  	src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h	\
  	src/sh64/ffitarget.h src/sparc/ffitarget.h			\
  	src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h	\
  	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
  	src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c	\
! 	src/kvx/ffitarget.h src/loongarch64/ffitarget.h
  
  EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S		\
  	src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S	\
--- 131,149 ----
  	src/m32r/ffitarget.h src/m68k/ffitarget.h			\
  	src/m88k/ffitarget.h src/metag/ffitarget.h			\
  	src/microblaze/ffitarget.h src/mips/ffitarget.h			\
! 	src/moxie/ffitarget.h \
  	src/or1k/ffitarget.h src/pa/ffitarget.h				\
  	src/powerpc/ffitarget.h src/powerpc/asm.h			\
! 	src/powerpc/ffi_powerpc.h src/powerpc/internal.h		\
! 	src/riscv/ffitarget.h						\
  	src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h	\
  	src/sh64/ffitarget.h src/sparc/ffitarget.h			\
  	src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h	\
+ 	src/wasm/ffitarget.h \
  	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
  	src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c	\
! 	src/kvx/ffitarget.h src/kvx/asm.h				\
! 	src/loongarch64/ffitarget.h
  
  EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S		\
  	src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S	\
*************** EXTRA_libffi_la_SOURCES = src/aarch64/ff
*** 153,161 ****
  	src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c		\
  	src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S		\
  	src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S			\
! 	src/nios2/ffi.c src/nios2/sysv.S src/or1k/ffi.c			\
  	src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S	\
! 	src/powerpc/ffi.c src/powerpc/ffi_sysv.c			\
  	src/powerpc/ffi_linux64.c src/powerpc/sysv.S			\
  	src/powerpc/linux64.S src/powerpc/linux64_closure.S		\
  	src/powerpc/ppc_closure.S src/powerpc/aix.S			\
--- 157,165 ----
  	src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c		\
  	src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S		\
  	src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S			\
! 	src/or1k/ffi.c			\
  	src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S	\
! 	src/pa/hpux64.S src/powerpc/ffi.c src/powerpc/ffi_sysv.c	\
  	src/powerpc/ffi_linux64.c src/powerpc/sysv.S			\
  	src/powerpc/linux64.S src/powerpc/linux64_closure.S		\
  	src/powerpc/ppc_closure.S src/powerpc/aix.S			\
*************** EXTRA_libffi_la_SOURCES = src/aarch64/ff
*** 166,171 ****
--- 170,176 ----
  	src/sh64/sysv.S src/sparc/ffi.c src/sparc/ffi64.c		\
  	src/sparc/v8.S src/sparc/v9.S src/tile/ffi.c src/tile/tile.S	\
  	src/vax/ffi.c src/vax/elfbsd.S src/x86/ffi.c src/x86/sysv.S	\
+ 	src/wasm/ffi.c \
  	src/x86/ffiw64.c src/x86/win64.S src/x86/ffi64.c		\
  	src/x86/unix64.S src/x86/sysv_intel.S src/x86/win64_intel.S	\
  	src/xtensa/ffi.c src/xtensa/sysv.S src/kvx/ffi.c		\
*************** distclean-recursive: distclean-multi
*** 233,235 ****
--- 238,243 ----
  maintainer-clean-recursive: maintainer-clean-multi
  
  include $(top_srcdir)/../multilib.am
+ 
+ # target overrides
+ -include $(tmake_file)
diff -Nrcpad gcc-17-20260517/libffi/Makefile.in gcc-17-20260524/libffi/Makefile.in
*** gcc-17-20260517/libffi/Makefile.in	Sun May 17 22:32:18 2026
--- gcc-17-20260524/libffi/Makefile.in	Sun May 24 22:32:17 2026
*************** CTAGS = ctags
*** 309,315 ****
  CSCOPE = cscope
  DIST_SUBDIRS = $(SUBDIRS)
  ACLOCAL = @ACLOCAL@
- ALLOCA = @ALLOCA@
  AMTAR = @AMTAR@
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_LTLDFLAGS = @AM_LTLDFLAGS@
--- 309,314 ----
*************** ECHO_T = @ECHO_T@
*** 343,348 ****
--- 342,349 ----
  EGREP = @EGREP@
  EXEEXT = @EXEEXT@
  FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+ FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
+ FFI_VERSION_STRING = @FFI_VERSION_STRING@
  FGREP = @FGREP@
  GREP = @GREP@
  HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
*************** TARGET = @TARGET@
*** 391,396 ****
--- 392,398 ----
  TARGETDIR = @TARGETDIR@
  TARGET_OBJ = @TARGET_OBJ@
  VERSION = @VERSION@
+ WASM64_MEMORY64 = @WASM64_MEMORY64@
  abs_builddir = @abs_builddir@
  abs_srcdir = @abs_srcdir@
  abs_top_builddir = @abs_top_builddir@
*************** abs_top_srcdir = @abs_top_srcdir@
*** 398,403 ****
--- 400,406 ----
  ac_ct_CC = @ac_ct_CC@
  ac_ct_CXX = @ac_ct_CXX@
  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ ac_ct_READELF = @ac_ct_READELF@
  am__include = @am__include@
  am__leading_dot = @am__leading_dot@
  am__quote = @am__quote@
*************** target_alias = @target_alias@
*** 446,451 ****
--- 449,455 ----
  target_cpu = @target_cpu@
  target_os = @target_os@
  target_vendor = @target_vendor@
+ tmake_file = @tmake_file@
  toolexecdir = @toolexecdir@
  toolexeclibdir = @toolexeclibdir@
  top_build_prefix = @top_build_prefix@
*************** top_srcdir = @top_srcdir@
*** 454,467 ****
  AUTOMAKE_OPTIONS = foreign subdir-objects info-in-builddir
  ACLOCAL_AMFLAGS = -I .. -I ../config
  SUBDIRS = include testsuite man
! EXTRA_DIST = LICENSE ChangeLog.old					\
! 	m4/libtool.m4 m4/lt~obsolete.m4					\
! 	 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4			\
! 	 m4/ltversion.m4 src/debug.c msvcc.sh				\
! 	generate-darwin-source-and-headers.py				\
! 	libffi.xcodeproj/project.pbxproj				\
! 	libtool-ldflags libtool-version configure.host README.md        \
! 	libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl	
  
  
  # local.exp is generated by configure
--- 458,472 ----
  AUTOMAKE_OPTIONS = foreign subdir-objects info-in-builddir
  ACLOCAL_AMFLAGS = -I .. -I ../config
  SUBDIRS = include testsuite man
! EXTRA_DIST = LICENSE ChangeLog.old                          \
!   m4/libtool.m4 m4/lt~obsolete.m4                           \
!   m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4             \
!   m4/ltversion.m4 src/debug.c msvcc.sh                      \
!   generate-darwin-source-and-headers.py                     \
!   libffi.xcodeproj/project.pbxproj                          \
!   src/powerpc/t-aix                                         \
!   libtool-ldflags libtool-version configure.host README.md  \
!   libffi.map.in LICENSE-BUILDTOOLS msvc_build make_sunver.pl
  
  
  # local.exp is generated by configure
*************** noinst_HEADERS = src/aarch64/ffitarget.h
*** 545,560 ****
  	src/m32r/ffitarget.h src/m68k/ffitarget.h			\
  	src/m88k/ffitarget.h src/metag/ffitarget.h			\
  	src/microblaze/ffitarget.h src/mips/ffitarget.h			\
! 	src/moxie/ffitarget.h src/nios2/ffitarget.h			\
  	src/or1k/ffitarget.h src/pa/ffitarget.h				\
  	src/powerpc/ffitarget.h src/powerpc/asm.h			\
! 	src/powerpc/ffi_powerpc.h src/riscv/ffitarget.h			\
  	src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h	\
  	src/sh64/ffitarget.h src/sparc/ffitarget.h			\
  	src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h	\
  	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
  	src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c	\
! 	src/kvx/ffitarget.h src/loongarch64/ffitarget.h
  
  EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S		\
  	src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S	\
--- 550,568 ----
  	src/m32r/ffitarget.h src/m68k/ffitarget.h			\
  	src/m88k/ffitarget.h src/metag/ffitarget.h			\
  	src/microblaze/ffitarget.h src/mips/ffitarget.h			\
! 	src/moxie/ffitarget.h \
  	src/or1k/ffitarget.h src/pa/ffitarget.h				\
  	src/powerpc/ffitarget.h src/powerpc/asm.h			\
! 	src/powerpc/ffi_powerpc.h src/powerpc/internal.h		\
! 	src/riscv/ffitarget.h						\
  	src/s390/ffitarget.h src/s390/internal.h src/sh/ffitarget.h	\
  	src/sh64/ffitarget.h src/sparc/ffitarget.h			\
  	src/sparc/internal.h src/tile/ffitarget.h src/vax/ffitarget.h	\
+ 	src/wasm/ffitarget.h \
  	src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h	\
  	src/x86/asmnames.h src/xtensa/ffitarget.h src/dlmalloc.c	\
! 	src/kvx/ffitarget.h src/kvx/asm.h				\
! 	src/loongarch64/ffitarget.h
  
  EXTRA_libffi_la_SOURCES = src/aarch64/ffi.c src/aarch64/sysv.S		\
  	src/aarch64/win64_armasm.S src/alpha/ffi.c src/alpha/osf.S	\
*************** EXTRA_libffi_la_SOURCES = src/aarch64/ff
*** 568,576 ****
  	src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c		\
  	src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S		\
  	src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S			\
! 	src/nios2/ffi.c src/nios2/sysv.S src/or1k/ffi.c			\
  	src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S	\
! 	src/powerpc/ffi.c src/powerpc/ffi_sysv.c			\
  	src/powerpc/ffi_linux64.c src/powerpc/sysv.S			\
  	src/powerpc/linux64.S src/powerpc/linux64_closure.S		\
  	src/powerpc/ppc_closure.S src/powerpc/aix.S			\
--- 576,584 ----
  	src/metag/ffi.c src/metag/sysv.S src/microblaze/ffi.c		\
  	src/microblaze/sysv.S src/mips/ffi.c src/mips/o32.S		\
  	src/mips/n32.S src/moxie/ffi.c src/moxie/eabi.S			\
! 	src/or1k/ffi.c			\
  	src/or1k/sysv.S src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S	\
! 	src/pa/hpux64.S src/powerpc/ffi.c src/powerpc/ffi_sysv.c	\
  	src/powerpc/ffi_linux64.c src/powerpc/sysv.S			\
  	src/powerpc/linux64.S src/powerpc/linux64_closure.S		\
  	src/powerpc/ppc_closure.S src/powerpc/aix.S			\
*************** EXTRA_libffi_la_SOURCES = src/aarch64/ff
*** 581,586 ****
--- 589,595 ----
  	src/sh64/sysv.S src/sparc/ffi.c src/sparc/ffi64.c		\
  	src/sparc/v8.S src/sparc/v9.S src/tile/ffi.c src/tile/tile.S	\
  	src/vax/ffi.c src/vax/elfbsd.S src/x86/ffi.c src/x86/sysv.S	\
+ 	src/wasm/ffi.c \
  	src/x86/ffiw64.c src/x86/win64.S src/x86/ffi64.c		\
  	src/x86/unix64.S src/x86/sysv_intel.S src/x86/win64_intel.S	\
  	src/xtensa/ffi.c src/xtensa/sysv.S src/kvx/ffi.c		\
*************** src/moxie/ffi.lo: src/moxie/$(am__dirsta
*** 906,921 ****
  	src/moxie/$(DEPDIR)/$(am__dirstamp)
  src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \
  	src/moxie/$(DEPDIR)/$(am__dirstamp)
- src/nios2/$(am__dirstamp):
- 	@$(MKDIR_P) src/nios2
- 	@: > src/nios2/$(am__dirstamp)
- src/nios2/$(DEPDIR)/$(am__dirstamp):
- 	@$(MKDIR_P) src/nios2/$(DEPDIR)
- 	@: > src/nios2/$(DEPDIR)/$(am__dirstamp)
- src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \
- 	src/nios2/$(DEPDIR)/$(am__dirstamp)
- src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \
- 	src/nios2/$(DEPDIR)/$(am__dirstamp)
  src/or1k/$(am__dirstamp):
  	@$(MKDIR_P) src/or1k
  	@: > src/or1k/$(am__dirstamp)
--- 915,920 ----
*************** src/pa/linux.lo: src/pa/$(am__dirstamp)
*** 937,942 ****
--- 936,943 ----
  	src/pa/$(DEPDIR)/$(am__dirstamp)
  src/pa/hpux32.lo: src/pa/$(am__dirstamp) \
  	src/pa/$(DEPDIR)/$(am__dirstamp)
+ src/pa/hpux64.lo: src/pa/$(am__dirstamp) \
+ 	src/pa/$(DEPDIR)/$(am__dirstamp)
  src/powerpc/$(am__dirstamp):
  	@$(MKDIR_P) src/powerpc
  	@: > src/powerpc/$(am__dirstamp)
*************** src/x86/ffi.lo: src/x86/$(am__dirstamp)
*** 1050,1055 ****
--- 1051,1064 ----
  	src/x86/$(DEPDIR)/$(am__dirstamp)
  src/x86/sysv.lo: src/x86/$(am__dirstamp) \
  	src/x86/$(DEPDIR)/$(am__dirstamp)
+ src/wasm/$(am__dirstamp):
+ 	@$(MKDIR_P) src/wasm
+ 	@: > src/wasm/$(am__dirstamp)
+ src/wasm/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/wasm/$(DEPDIR)
+ 	@: > src/wasm/$(DEPDIR)/$(am__dirstamp)
+ src/wasm/ffi.lo: src/wasm/$(am__dirstamp) \
+ 	src/wasm/$(DEPDIR)/$(am__dirstamp)
  src/x86/ffiw64.lo: src/x86/$(am__dirstamp) \
  	src/x86/$(DEPDIR)/$(am__dirstamp)
  src/x86/win64.lo: src/x86/$(am__dirstamp) \
*************** mostlyclean-compile:
*** 1141,1148 ****
  	-rm -f src/mips/*.lo
  	-rm -f src/moxie/*.$(OBJEXT)
  	-rm -f src/moxie/*.lo
- 	-rm -f src/nios2/*.$(OBJEXT)
- 	-rm -f src/nios2/*.lo
  	-rm -f src/or1k/*.$(OBJEXT)
  	-rm -f src/or1k/*.lo
  	-rm -f src/pa/*.$(OBJEXT)
--- 1150,1155 ----
*************** mostlyclean-compile:
*** 1163,1168 ****
--- 1170,1177 ----
  	-rm -f src/tile/*.lo
  	-rm -f src/vax/*.$(OBJEXT)
  	-rm -f src/vax/*.lo
+ 	-rm -f src/wasm/*.$(OBJEXT)
+ 	-rm -f src/wasm/*.lo
  	-rm -f src/x86/*.$(OBJEXT)
  	-rm -f src/x86/*.lo
  	-rm -f src/xtensa/*.$(OBJEXT)
*************** distclean-compile:
*** 1219,1230 ****
  @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/ffi.Plo@am__quote@
- @AMDEP_TRUE@@am__include@ @am__quote@src/nios2/$(DEPDIR)/sysv.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/sysv.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@
--- 1228,1238 ----
  @AMDEP_TRUE@@am__include@ @am__quote@src/mips/$(DEPDIR)/o32.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/eabi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/moxie/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/or1k/$(DEPDIR)/sysv.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux32.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/hpux64.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/pa/$(DEPDIR)/linux.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/powerpc/$(DEPDIR)/aix_closure.Plo@am__quote@
*************** distclean-compile:
*** 1254,1259 ****
--- 1262,1268 ----
  @AMDEP_TRUE@@am__include@ @am__quote@src/tile/$(DEPDIR)/tile.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/elfbsd.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/vax/$(DEPDIR)/ffi.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@src/wasm/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffi64.Plo@am__quote@
  @AMDEP_TRUE@@am__include@ @am__quote@src/x86/$(DEPDIR)/ffiw64.Plo@am__quote@
*************** clean-libtool:
*** 1338,1344 ****
  	-rm -rf src/microblaze/.libs src/microblaze/_libs
  	-rm -rf src/mips/.libs src/mips/_libs
  	-rm -rf src/moxie/.libs src/moxie/_libs
- 	-rm -rf src/nios2/.libs src/nios2/_libs
  	-rm -rf src/or1k/.libs src/or1k/_libs
  	-rm -rf src/pa/.libs src/pa/_libs
  	-rm -rf src/powerpc/.libs src/powerpc/_libs
--- 1347,1352 ----
*************** clean-libtool:
*** 1349,1354 ****
--- 1357,1363 ----
  	-rm -rf src/sparc/.libs src/sparc/_libs
  	-rm -rf src/tile/.libs src/tile/_libs
  	-rm -rf src/vax/.libs src/vax/_libs
+ 	-rm -rf src/wasm/.libs src/wasm/_libs
  	-rm -rf src/x86/.libs src/x86/_libs
  	-rm -rf src/xtensa/.libs src/xtensa/_libs
  
*************** distclean-generic:
*** 1697,1704 ****
  	-rm -f src/mips/$(am__dirstamp)
  	-rm -f src/moxie/$(DEPDIR)/$(am__dirstamp)
  	-rm -f src/moxie/$(am__dirstamp)
- 	-rm -f src/nios2/$(DEPDIR)/$(am__dirstamp)
- 	-rm -f src/nios2/$(am__dirstamp)
  	-rm -f src/or1k/$(DEPDIR)/$(am__dirstamp)
  	-rm -f src/or1k/$(am__dirstamp)
  	-rm -f src/pa/$(DEPDIR)/$(am__dirstamp)
--- 1706,1711 ----
*************** distclean-generic:
*** 1719,1724 ****
--- 1726,1733 ----
  	-rm -f src/tile/$(am__dirstamp)
  	-rm -f src/vax/$(DEPDIR)/$(am__dirstamp)
  	-rm -f src/vax/$(am__dirstamp)
+ 	-rm -f src/wasm/$(DEPDIR)/$(am__dirstamp)
+ 	-rm -f src/wasm/$(am__dirstamp)
  	-rm -f src/x86/$(DEPDIR)/$(am__dirstamp)
  	-rm -f src/x86/$(am__dirstamp)
  	-rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp)
*************** clean-am: clean-aminfo clean-generic cle
*** 1737,1743 ****
  
  distclean: distclean-recursive
  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
! 	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/csky/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/kvx/$(DEPDIR) src/loongarch64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/riscv/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
  	-rm -f Makefile
  distclean-am: clean-am distclean-compile distclean-generic \
  	distclean-hdr distclean-libtool distclean-local distclean-tags
--- 1746,1752 ----
  
  distclean: distclean-recursive
  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
! 	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/csky/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/kvx/$(DEPDIR) src/loongarch64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/riscv/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/wasm/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
  	-rm -f Makefile
  distclean-am: clean-am distclean-compile distclean-generic \
  	distclean-hdr distclean-libtool distclean-local distclean-tags
*************** installcheck-am:
*** 1876,1882 ****
  maintainer-clean: maintainer-clean-recursive
  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
  	-rm -rf $(top_srcdir)/autom4te.cache
! 	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/csky/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/kvx/$(DEPDIR) src/loongarch64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/riscv/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
  	-rm -f Makefile
  maintainer-clean-am: distclean-am maintainer-clean-aminfo \
  	maintainer-clean-generic maintainer-clean-local \
--- 1885,1891 ----
  maintainer-clean: maintainer-clean-recursive
  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
  	-rm -rf $(top_srcdir)/autom4te.cache
! 	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/csky/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/kvx/$(DEPDIR) src/loongarch64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/riscv/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/wasm/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR)
  	-rm -f Makefile
  maintainer-clean-am: distclean-am maintainer-clean-aminfo \
  	maintainer-clean-generic maintainer-clean-local \
*************** clean-local: clean-multi
*** 1985,1990 ****
--- 1994,2002 ----
  distclean-local: distclean-multi
  maintainer-clean-local: maintainer-clean-multi
  
+ # target overrides
+ -include $(tmake_file)
+ 
  # Tell versions [3.59,3.63) of GNU make to not export all variables.
  # Otherwise a system limit (for SysV at least) may be exceeded.
  .NOEXPORT:
diff -Nrcpad gcc-17-20260517/libffi/README.md gcc-17-20260524/libffi/README.md
*** gcc-17-20260517/libffi/README.md	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/README.md	Sun May 24 22:32:13 2026
***************
*** 1,8 ****
  Status
  ======
  
! libffi-3.4.1 was released on June 28, 2021.  Check the libffi web page
! for updates: <URL:http://sourceware.org/libffi/>.
  
  
  What is libffi?
--- 1,7 ----
  Status
  ======
  
! libffi-3.5.2 was released on August 2, 2025.
  
  
  What is libffi?
*************** tested:
*** 52,57 ****
--- 51,58 ----
  | Alpha           | Linux            | GCC                     |
  | Alpha           | Tru64            | GCC                     |
  | ARC             | Linux            | GCC                     |
+ | ARC32           | Linux            | GCC                     |
+ | ARC64           | Linux            | GCC                     |
  | ARM             | Linux            | GCC                     |
  | ARM             | iOS              | GCC                     |
  | ARM             | Windows          | MSVC                    |
*************** tested:
*** 59,66 ****
--- 60,69 ----
  | Blackfin        | uClinux          | GCC                     |
  | CSKY            | Linux            | GCC                     |
  | HPPA            | HPUX             | GCC                     |
+ | HPPA64          | HPUX             | GCC                     |
  | KVX             | Linux            | GCC                     |
  | IA-64           | Linux            | GCC                     |
+ | LoongArch64     | Linux            | GCC                     |
  | M68K            | FreeMiNT         | GCC                     |
  | M68K            | Linux            | GCC                     |
  | M68K            | RTEMS            | GCC                     |
*************** tested:
*** 72,79 ****
  | MIPS            | RTEMS            | GCC                     |
  | MIPS64          | Linux            | GCC                     |
  | Moxie           | Bare metal       | GCC                     |
- | Nios II         | Linux            | GCC                     |
  | OpenRISC        | Linux            | GCC                     |
  | PowerPC 32-bit  | AIX              | IBM XL C                |
  | PowerPC 64-bit  | AIX              | IBM XL C                |
  | PowerPC         | AMIGA            | GCC                     |
--- 75,82 ----
  | MIPS            | RTEMS            | GCC                     |
  | MIPS64          | Linux            | GCC                     |
  | Moxie           | Bare metal       | GCC                     |
  | OpenRISC        | Linux            | GCC                     |
+ | PowerPC 32-bit  | AIX              | GCC                     |
  | PowerPC 32-bit  | AIX              | IBM XL C                |
  | PowerPC 64-bit  | AIX              | IBM XL C                |
  | PowerPC         | AMIGA            | GCC                     |
*************** tested:
*** 87,92 ****
--- 90,98 ----
  | RISC-V 64-bit   | Linux            | GCC                     |
  | S390            | Linux            | GCC                     |
  | S390X           | Linux            | GCC                     |
+ | SH3             | Linux            | GCC                     |
+ | SH4             | Linux            | GCC                     |
+ | SH5/SH64        | Linux            | GCC                     |
  | SPARC           | Linux            | GCC                     |
  | SPARC           | Solaris          | GCC                     |
  | SPARC           | Solaris          | Oracle Solaris Studio C |
*************** tested:
*** 95,100 ****
--- 101,108 ----
  | SPARC64         | Solaris          | Oracle Solaris Studio C |
  | TILE-Gx/TILEPro | Linux            | GCC                     |
  | VAX             | OpenBSD/vax      | GCC                     |
+ | WASM32          | Emscripten       | EMCC                    |
+ | WASM64          | Emscripten       | EMCC                    |
  | X86             | FreeBSD          | GCC                     |
  | X86             | GNU HURD         | GCC                     |
  | X86             | Interix          | GCC                     |
*************** tested:
*** 105,118 ****
  | X86             | Solaris          | GCC                     |
  | X86             | Solaris          | Oracle Solaris Studio C |
  | X86             | Windows/Cygwin   | GCC                     |
! | X86             | Windows/MingW    | GCC                     |
  | X86-64          | FreeBSD          | GCC                     |
  | X86-64          | Linux            | GCC                     |
  | X86-64          | Linux/x32        | GCC                     |
  | X86-64          | OpenBSD          | GCC                     |
  | X86-64          | Solaris          | Oracle Solaris Studio C |
  | X86-64          | Windows/Cygwin   | GCC                     |
! | X86-64          | Windows/MingW    | GCC                     |
  | X86-64          | Mac OSX          | GCC                     |
  | Xtensa          | Linux            | GCC                     |
  
--- 113,127 ----
  | X86             | Solaris          | GCC                     |
  | X86             | Solaris          | Oracle Solaris Studio C |
  | X86             | Windows/Cygwin   | GCC                     |
! | X86             | Windows/MinGW    | GCC                     |
! | X86-64          | DragonFly BSD    | GCC                     |
  | X86-64          | FreeBSD          | GCC                     |
  | X86-64          | Linux            | GCC                     |
  | X86-64          | Linux/x32        | GCC                     |
  | X86-64          | OpenBSD          | GCC                     |
  | X86-64          | Solaris          | Oracle Solaris Studio C |
  | X86-64          | Windows/Cygwin   | GCC                     |
! | X86-64          | Windows/MinGW    | GCC                     |
  | X86-64          | Mac OSX          | GCC                     |
  | Xtensa          | Linux            | GCC                     |
  
*************** compiler.
*** 130,136 ****
  
  If you're building libffi directly from git hosted sources, configure
  won't exist yet; run ./autogen.sh first.  This will require that you
! install autoconf, automake and libtool.
  
  You may want to tell configure where to install the libffi library and
  header files. To do that, use the ``--prefix`` configure switch.  Libffi
--- 139,145 ----
  
  If you're building libffi directly from git hosted sources, configure
  won't exist yet; run ./autogen.sh first.  This will require that you
! install autoconf, automake, libtool and texinfo.
  
  You may want to tell configure where to install the libffi library and
  header files. To do that, use the ``--prefix`` configure switch.  Libffi
*************** It's also possible to build libffi on Wi
*** 152,158 ****
  Microsoft's Visual C++ compiler.  In this case, use the msvcc.sh
  wrapper script during configuration like so:
  
!     path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL"
  
  For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and
  ``CXX="path/to/msvcc.sh -m64"``.  You may also need to specify
--- 161,167 ----
  Microsoft's Visual C++ compiler.  In this case, use the msvcc.sh
  wrapper script during configuration like so:
  
!     path/to/configure CC=path/to/msvcc.sh CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" CXXCPP="cl -nologo -EP" CPPFLAGS="-DFFI_BUILDING_DLL"
  
  For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and
  ``CXX="path/to/msvcc.sh -m64"``.  You may also need to specify
*************** History
*** 195,201 ****
  
  See the git log for details at http://github.com/libffi/libffi.
  
!     3.4.2 Jun-28-21
          Add static trampoline support for Linux on x86_64 and ARM64.
          Add support for Alibaba's CSKY architecture.
          Add support for Kalray's KVX architecture.
--- 204,269 ----
  
  See the git log for details at http://github.com/libffi/libffi.
  
!     3.5.2 Aug-2-2025
!         Add wasm64 support.
!         Add DragonFly BSD support.
!         Ensure trampoline file descriptors are closed on exec.
! 
!     3.5.1 Jun-10-2025
!         Fix symbol versioning error.
! 
!     3.5.0 Jun-8-2025
!         Add FFI_VERSION_STRING and FFI_VERSION_NUMBER macros, as well
!           as ffi_get_version() and ffi_get_version_number() functions.
!         Add ffi_get_default_abi() and ffi_get_closure_size() functions.
!         Fix closures on powerpc64-linux when statically linking.
!         Mark the PA stack as non-executable.
! 
!     3.4.8 Apr-9-2025
!         Add static trampoline support for powerpc-linux (32-bit SYSV BE),
!           powerpc64-linux (64-bit ELFv1 BE) and
!           powerpc64le-linux (64-bit ELFv2 LE)
!         Various x86-64 bug fixes (x32 ABI and improper memory access for
!           small argument calls).
!         Fix to enable pointer authentication for aarch64.
! 
!     3.4.7 Feb-8-2025
!         Add static trampoline support for Linux on s390x.
!         Fix BTI support for ARM64.
!         Support pointer authentication for ARM64.
!         Fix ASAN compatibility.
!         Fix x86-64 calls with 6 GP registers and some SSE registers.
!         Miscellaneous fixes for ARC and Darwin ARM64.
!         Fix OpenRISC or1k and Solaris 10 builds.
!         Remove nios2 port.
! 
!     3.4.6 Feb-18-2024
!         Fix long double regression on mips64 and alpha.
! 
!     3.4.5 Feb-15-2024
!         Add support for wasm32.
!         Add support for aarch64 branch target identification (bti).
!         Add support for ARCv3: ARC32 & ARC64.
!         Add support for HPPA64, and many HPPA fixes.
!         Add support for Haikuos on PowerPC.
!         Fixes for AIX, loongson, MIPS, power, sparc64, and x86 Darwin.
! 
!     3.4.4 Oct-23-2022
!         Important aarch64 fixes, including support for linux builds
!           with Link Time Optimization (-flto).
!         Fix x86 stdcall stack alignment.
!         Fix x86 Windows msvc assembler compatibility.
!         Fix moxie and or1k small structure args.
! 
!     3.4.3 Sep-19-2022
!         All struct args are passed by value, regardless of size, as per ABIs.
!         Enable static trampolines for Cygwin.
!         Add support for Loongson's LoongArch64 architecture.
!         Fix x32 static trampolines.
!         Fix 32-bit x86 stdcall stack corruption.
!         Fix ILP32 aarch64 support.
! 
!     3.4.2 Jun-28-2021
          Add static trampoline support for Linux on x86_64 and ARM64.
          Add support for Alibaba's CSKY architecture.
          Add support for Kalray's KVX architecture.
*************** See the git log for details at http://gi
*** 208,214 ****
          Reject float and small integer argument in ffi_prep_cif_var().
            Callers must promote these types themselves.
  
!     3.3 Nov-23-19
          Add RISC-V support.
          New API in support of GO closures.
          Add IEEE754 binary128 long double support for 64-bit Power
--- 276,282 ----
          Reject float and small integer argument in ffi_prep_cif_var().
            Callers must promote these types themselves.
  
!     3.3 Nov-23-2019
          Add RISC-V support.
          New API in support of GO closures.
          Add IEEE754 binary128 long double support for 64-bit Power
*************** See the git log for details at http://gi
*** 220,229 ****
          Add pre-built PDF documentation to source distribution.
          Many new test cases and bug fixes.
  
!     3.2.1 Nov-12-14
          Build fix for non-iOS AArch64 targets.
  
!     3.2 Nov-11-14
          Add C99 Complex Type support (currently only supported on
            s390).
          Add support for PASCAL and REGISTER calling conventions on x86
--- 288,297 ----
          Add pre-built PDF documentation to source distribution.
          Many new test cases and bug fixes.
  
!     3.2.1 Nov-12-2014
          Build fix for non-iOS AArch64 targets.
  
!     3.2 Nov-11-2014
          Add C99 Complex Type support (currently only supported on
            s390).
          Add support for PASCAL and REGISTER calling conventions on x86
*************** See the git log for details at http://gi
*** 231,237 ****
          Add OpenRISC and Cygwin-64 support.
          Bug fixes.
  
!     3.1 May-19-14
          Add AArch64 (ARM64) iOS support.
          Add Nios II support.
          Add m88k and DEC VAX support.
--- 299,305 ----
          Add OpenRISC and Cygwin-64 support.
          Bug fixes.
  
!     3.1 May-19-2014
          Add AArch64 (ARM64) iOS support.
          Add Nios II support.
          Add m88k and DEC VAX support.
*************** See the git log for details at http://gi
*** 244,250 ****
          Archive off the manually maintained ChangeLog in favor of git
            log.
  
!     3.0.13 Mar-17-13
          Add Meta support.
          Add missing Moxie bits.
          Fix stack alignment bug on 32-bit x86.
--- 312,318 ----
          Archive off the manually maintained ChangeLog in favor of git
            log.
  
!     3.0.13 Mar-17-2013
          Add Meta support.
          Add missing Moxie bits.
          Fix stack alignment bug on 32-bit x86.
*************** See the git log for details at http://gi
*** 254,260 ****
            with GCC (OS X, Solaris).
          Fix Cygwin regression.
  
!     3.0.12 Feb-11-13
          Add Moxie support.
          Add AArch64 support.
          Add Blackfin support.
--- 322,328 ----
            with GCC (OS X, Solaris).
          Fix Cygwin regression.
  
!     3.0.12 Feb-11-2013
          Add Moxie support.
          Add AArch64 support.
          Add Blackfin support.
*************** See the git log for details at http://gi
*** 266,272 ****
            Solaris and AIX.
          Work around LLVM/GCC interoperability issue on x86_64.
  
!     3.0.11 Apr-11-12
          Lots of build fixes.
          Add support for variadic functions (ffi_prep_cif_var).
          Add Linux/x32 support.
--- 334,340 ----
            Solaris and AIX.
          Work around LLVM/GCC interoperability issue on x86_64.
  
!     3.0.11 Apr-11-2012
          Lots of build fixes.
          Add support for variadic functions (ffi_prep_cif_var).
          Add Linux/x32 support.
*************** See the git log for details at http://gi
*** 277,283 ****
          Fix Octeon and MC68881 support.
          Fix code pessimizations.
  
!     3.0.10 Aug-23-11
          Add support for Apple's iOS.
          Add support for ARM VFP ABI.
          Add RTEMS support for MIPS and M68K.
--- 345,351 ----
          Fix Octeon and MC68881 support.
          Fix code pessimizations.
  
!     3.0.10 Aug-23-2011
          Add support for Apple's iOS.
          Add support for ARM VFP ABI.
          Add RTEMS support for MIPS and M68K.
*************** See the git log for details at http://gi
*** 291,361 ****
          Testsuite fixes for Tru64 Unix.
          Additional platform support.
  
!     3.0.9 Dec-31-09
          Add AVR32 and win64 ports.  Add ARM softfp support.
          Many fixes for AIX, Solaris, HP-UX, *BSD.
          Several PowerPC and x86-64 bug fixes.
          Build DLL for windows.
  
!     3.0.8 Dec-19-08
          Add *BSD, BeOS, and PA-Linux support.
  
!     3.0.7 Nov-11-08
          Fix for ppc FreeBSD.
          (thanks to Andreas Tobler)
  
!     3.0.6 Jul-17-08
          Fix for closures on sh.
          Mark the sh/sh64 stack as non-executable.
          (both thanks to Kaz Kojima)
  
!     3.0.5 Apr-3-08
          Fix libffi.pc file.
          Fix #define ARM for IcedTea users.
          Fix x86 closure bug.
  
!     3.0.4 Feb-24-08
          Fix x86 OpenBSD configury.
  
!     3.0.3 Feb-22-08
          Enable x86 OpenBSD thanks to Thomas Heller, and
            x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
          Clean up test instruction in README.
  
!     3.0.2 Feb-21-08
          Improved x86 FreeBSD support.
          Thanks to Björn König.
  
!     3.0.1 Feb-15-08
          Fix instruction cache flushing bug on MIPS.
          Thanks to David Daney.
  
!     3.0.0 Feb-15-08
          Many changes, mostly thanks to the GCC project.
          Cygnus Solutions is now Red Hat.
  
        [10 years go by...]
  
!     1.20 Oct-5-98
          Raffaele Sena produces ARM port.
  
!     1.19 Oct-5-98
          Fixed x86 long double and long long return support.
          m68k bug fixes from Andreas Schwab.
          Patch for DU assembler compatibility for the Alpha from Richard
            Henderson.
  
!     1.18 Apr-17-98
          Bug fixes and MIPS configuration changes.
  
!     1.17 Feb-24-98
          Bug fixes and m68k port from Andreas Schwab. PowerPC port from
          Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
  
!     1.16 Feb-11-98
          Richard Henderson produces Alpha port.
  
!     1.15 Dec-4-97
          Fixed an n32 ABI bug. New libtool, auto* support.
  
      1.14 May-13-97
--- 359,429 ----
          Testsuite fixes for Tru64 Unix.
          Additional platform support.
  
!     3.0.9 Dec-31-2009
          Add AVR32 and win64 ports.  Add ARM softfp support.
          Many fixes for AIX, Solaris, HP-UX, *BSD.
          Several PowerPC and x86-64 bug fixes.
          Build DLL for windows.
  
!     3.0.8 Dec-19-2008
          Add *BSD, BeOS, and PA-Linux support.
  
!     3.0.7 Nov-11-2008
          Fix for ppc FreeBSD.
          (thanks to Andreas Tobler)
  
!     3.0.6 Jul-17-2008
          Fix for closures on sh.
          Mark the sh/sh64 stack as non-executable.
          (both thanks to Kaz Kojima)
  
!     3.0.5 Apr-3-2008
          Fix libffi.pc file.
          Fix #define ARM for IcedTea users.
          Fix x86 closure bug.
  
!     3.0.4 Feb-24-2008
          Fix x86 OpenBSD configury.
  
!     3.0.3 Feb-22-2008
          Enable x86 OpenBSD thanks to Thomas Heller, and
            x86-64 FreeBSD thanks to Björn König and Andreas Tobler.
          Clean up test instruction in README.
  
!     3.0.2 Feb-21-2008
          Improved x86 FreeBSD support.
          Thanks to Björn König.
  
!     3.0.1 Feb-15-2008
          Fix instruction cache flushing bug on MIPS.
          Thanks to David Daney.
  
!     3.0.0 Feb-15-2008
          Many changes, mostly thanks to the GCC project.
          Cygnus Solutions is now Red Hat.
  
        [10 years go by...]
  
!     1.20 Oct-5-1998
          Raffaele Sena produces ARM port.
  
!     1.19 Oct-5-1998
          Fixed x86 long double and long long return support.
          m68k bug fixes from Andreas Schwab.
          Patch for DU assembler compatibility for the Alpha from Richard
            Henderson.
  
!     1.18 Apr-17-1998
          Bug fixes and MIPS configuration changes.
  
!     1.17 Feb-24-1998
          Bug fixes and m68k port from Andreas Schwab. PowerPC port from
          Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes.
  
!     1.16 Feb-11-1998
          Richard Henderson produces Alpha port.
  
!     1.15 Dec-4-1997
          Fixed an n32 ABI bug. New libtool, auto* support.
  
      1.14 May-13-97
*************** See the git log for details at http://gi
*** 363,418 ****
          Fixed a minor portability problem reported by Russ McManus
          <mcmanr@eq.gs.com>.
  
!     1.13 Dec-2-96
          Added --enable-purify-safety to keep Purify from complaining
            about certain low level code.
          Sparc fix for calling functions with < 6 args.
          Linux x86 a.out fix.
  
!     1.12 Nov-22-96
          Added missing ffi_type_void, needed for supporting void return
            types. Fixed test case for non MIPS machines. Cygnus Support
            is now Cygnus Solutions.
  
!     1.11 Oct-30-96
          Added notes about GNU make.
  
!     1.10 Oct-29-96
          Added configuration fix for non GNU compilers.
  
!     1.09 Oct-29-96
          Added --enable-debug configure switch. Clean-ups based on LCLint
          feedback. ffi_mips.h is always installed. Many configuration
          fixes. Fixed ffitest.c for sparc builds.
  
!     1.08 Oct-15-96
          Fixed n32 problem. Many clean-ups.
  
!     1.07 Oct-14-96
          Gordon Irlam rewrites v8.S again. Bug fixes.
  
!     1.06 Oct-14-96
          Gordon Irlam improved the sparc port.
  
!     1.05 Oct-14-96
          Interface changes based on feedback.
  
!     1.04 Oct-11-96
          Sparc port complete (modulo struct passing bug).
  
!     1.03 Oct-10-96
          Passing struct args, and returning struct values works for
          all architectures/calling conventions. Expanded tests.
  
!     1.02 Oct-9-96
          Added SGI n32 support. Fixed bugs in both o32 and Linux support.
          Added "make test".
  
!     1.01 Oct-8-96
          Fixed float passing bug in mips version. Restructured some
          of the code. Builds cleanly with SGI tools.
  
!     1.00 Oct-7-96
          First release. No public announcement.
  
  Authors & Credits
--- 431,486 ----
          Fixed a minor portability problem reported by Russ McManus
          <mcmanr@eq.gs.com>.
  
!     1.13 Dec-2-1996
          Added --enable-purify-safety to keep Purify from complaining
            about certain low level code.
          Sparc fix for calling functions with < 6 args.
          Linux x86 a.out fix.
  
!     1.12 Nov-22-1996
          Added missing ffi_type_void, needed for supporting void return
            types. Fixed test case for non MIPS machines. Cygnus Support
            is now Cygnus Solutions.
  
!     1.11 Oct-30-1996
          Added notes about GNU make.
  
!     1.10 Oct-29-1996
          Added configuration fix for non GNU compilers.
  
!     1.09 Oct-29-1996
          Added --enable-debug configure switch. Clean-ups based on LCLint
          feedback. ffi_mips.h is always installed. Many configuration
          fixes. Fixed ffitest.c for sparc builds.
  
!     1.08 Oct-15-1996
          Fixed n32 problem. Many clean-ups.
  
!     1.07 Oct-14-1996
          Gordon Irlam rewrites v8.S again. Bug fixes.
  
!     1.06 Oct-14-1996
          Gordon Irlam improved the sparc port.
  
!     1.05 Oct-14-1996
          Interface changes based on feedback.
  
!     1.04 Oct-11-1996
          Sparc port complete (modulo struct passing bug).
  
!     1.03 Oct-10-1996
          Passing struct args, and returning struct values works for
          all architectures/calling conventions. Expanded tests.
  
!     1.02 Oct-9-1996
          Added SGI n32 support. Fixed bugs in both o32 and Linux support.
          Added "make test".
  
!     1.01 Oct-8-1996
          Fixed float passing bug in mips version. Restructured some
          of the code. Builds cleanly with SGI tools.
  
!     1.00 Oct-7-1996
          First release. No public announcement.
  
  Authors & Credits
*************** developers:
*** 444,449 ****
--- 512,519 ----
      frv                 Anthony Green
      ia64                Hans Boehm
      kvx                 Yann Sionneau
+     loongarch64         Cheng Lulu, Xi Ruoyao, Xu Hao,
+                         Zhang Wenlong, Pan Xuefeng
      m32r                Kazuhiro Inaoka
      m68k                Andreas Schwab
      m88k                Miod Vallat
*************** developers:
*** 455,460 ****
--- 525,531 ----
      nios ii             Sandra Loosemore
      openrisc            Sebastian Macke
      pa                  Randolph Chung, Dave Anglin, Andreas Tobler
+     pa64                Dave Anglin
      powerpc             Geoffrey Keating, Andreas Tobler,
                          David Edelsohn, John Hornkvist
      powerpc64           Jakub Jelinek
*************** developers:
*** 465,470 ****
--- 536,542 ----
      sparc               Anthony Green, Gordon Irlam
      tile-gx/tilepro     Walter Lee
      vax                 Miod Vallat
+     wasm32              Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen
      x86                 Anthony Green, Jon Beniston
      x86-64              Bo Thorsen
      xtensa              Chris Zankel
diff -Nrcpad gcc-17-20260517/libffi/acinclude.m4 gcc-17-20260524/libffi/acinclude.m4
*** gcc-17-20260517/libffi/acinclude.m4	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/acinclude.m4	Sun May 24 22:32:13 2026
*************** else
*** 45,60 ****
  
     # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
     AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon,
!     [AC_TRY_COMPILE(
! [#include <sys/types.h>
  #include <sys/mman.h>
  #include <unistd.h>
  
  #ifndef MAP_ANONYMOUS
  #define MAP_ANONYMOUS MAP_ANON
  #endif
! ],
! [int n = MAP_ANONYMOUS;],
      ac_cv_decl_map_anon=yes,
      ac_cv_decl_map_anon=no)])
  
--- 45,60 ----
  
     # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
     AC_CACHE_CHECK([for MAP_ANON(YMOUS)], ac_cv_decl_map_anon,
!     [AC_COMPILE_IFELSE(
! [AC_LANG_PROGRAM([[#include <sys/types.h>
  #include <sys/mman.h>
  #include <unistd.h>
  
  #ifndef MAP_ANONYMOUS
  #define MAP_ANONYMOUS MAP_ANON
  #endif
! ]],
! [[int n = MAP_ANONYMOUS;]])],
      ac_cv_decl_map_anon=yes,
      ac_cv_decl_map_anon=no)])
  
*************** dnl See docs/html/17_intro/configury.htm
*** 104,110 ****
  dnl
  m4_define([LIBFFI_ENABLE],[dnl
  m4_define([_g_switch],[--enable-$1])dnl
! m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl
   AC_ARG_ENABLE($1,_g_help,
    m4_bmatch([$5],
     [^permit ],
--- 104,110 ----
  dnl
  m4_define([LIBFFI_ENABLE],[dnl
  m4_define([_g_switch],[--enable-$1])dnl
! m4_define([_g_help],[AS_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
   AC_ARG_ENABLE($1,_g_help,
    m4_bmatch([$5],
     [^permit ],
*************** AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES],
*** 152,260 ****
    # by now (in libtool), but require it now just to be safe...
    test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   AC_REQUIRE([AC_PROG_LD])
!   AC_REQUIRE([AC_PROG_AWK])
! 
!   # The name set by libtool depends on the version of libtool.  Shame on us
!   # for depending on an impl detail, but c'est la vie.  Older versions used
!   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
!   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
!   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
!   # set (hence we're using an older libtool), then set it.
!   if test x${with_gnu_ld+set} != xset; then
!     if test x${ac_cv_prog_gnu_ld+set} != xset; then
!       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
!       with_gnu_ld=no
!     else
!       with_gnu_ld=$ac_cv_prog_gnu_ld
!     fi
!   fi
! 
!   # Start by getting the version number.  I think the libtool test already
!   # does some of this, but throws away the result.
!   libat_ld_is_gold=no
!   if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then
!     libat_ld_is_gold=yes
!   fi
!   changequote(,)
!   ldver=`$LD --version 2>/dev/null |
!          sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`
!   changequote([,])
!   libat_gnu_ld_version=`echo $ldver | \
!          $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
! 
!   # Set --gc-sections.
!   if test "$with_gnu_ld" = "notbroken"; then
!     # GNU ld it is!  Joy and bunny rabbits!
! 
!     # All these tests are for C++; save the language and the compiler flags.
!     # Need to do this so that g++ won't try to link in libstdc++
!     ac_test_CFLAGS="${CFLAGS+set}"
!     ac_save_CFLAGS="$CFLAGS"
!     CFLAGS='-x c++  -Wl,--gc-sections'
! 
!     # Check for -Wl,--gc-sections
!     # XXX This test is broken at the moment, as symbols required for linking
!     # are now in libsupc++ (not built yet).  In addition, this test has
!     # cored on solaris in the past.  In addition, --gc-sections doesn't
!     # really work at the moment (keeps on discarding used sections, first
!     # .eh_frame and now some of the glibc sections for iconv).
!     # Bzzzzt.  Thanks for playing, maybe next time.
!     AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
!     AC_TRY_RUN([
!      int main(void)
!      {
!        try { throw 1; }
!        catch (...) { };
!        return 0;
!      }
!     ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes])
!     if test "$ac_test_CFLAGS" = set; then
!       CFLAGS="$ac_save_CFLAGS"
!     else
!       # this is the suspicious part
!       CFLAGS=''
!     fi
!     if test "$ac_sectionLDflags" = "yes"; then
!       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
!     fi
!     AC_MSG_RESULT($ac_sectionLDflags)
!   fi
! 
!   # Set linker optimization flags.
!   if test x"$with_gnu_ld" = x"yes"; then
!     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
!   fi
! 
!   AC_SUBST(SECTION_LDFLAGS)
!   AC_SUBST(OPT_LDFLAGS)
! ])
! 
! 
! dnl
! dnl If GNU ld is in use, check to see if tricky linker opts can be used.  If
! dnl the native linker is in use, all variables will be defined to something
! dnl safe (like an empty string).
! dnl
! dnl Defines:
! dnl  SECTION_LDFLAGS='-Wl,--gc-sections' if possible
! dnl  OPT_LDFLAGS='-Wl,-O1' if possible
! dnl  LD (as a side effect of testing)
! dnl Sets:
! dnl  with_gnu_ld
! dnl  libat_ld_is_gold (possibly)
! dnl  libat_gnu_ld_version (possibly)
! dnl
! dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
! dnl set libat_gnu_ld_version to 12345.  Zeros cause problems.
! dnl
! AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [
!   # If we're not using GNU ld, then there's no point in even trying these
!   # tests.  Check for that first.  We should have already tested for gld
!   # by now (in libtool), but require it now just to be safe...
!   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
!   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   AC_REQUIRE([AC_PROG_LD])
    AC_REQUIRE([AC_PROG_AWK])
  
    # The name set by libtool depends on the version of libtool.  Shame on us
--- 152,158 ----
    # by now (in libtool), but require it now just to be safe...
    test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
    test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
!   AC_REQUIRE([LT_PATH_LD])
    AC_REQUIRE([AC_PROG_AWK])
  
    # The name set by libtool depends on the version of libtool.  Shame on us
*************** AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES],
*** 282,287 ****
--- 180,189 ----
    if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then
      libat_ld_is_lld=yes
    fi
+   libat_ld_is_mold=no
+   if $LD --version 2>/dev/null | grep 'mold '> /dev/null 2>&1; then
+     libat_ld_is_mold=yes
+   fi
    changequote(,)
    ldver=`$LD --version 2>/dev/null |
           sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`
*************** AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES],
*** 307,320 ****
      # .eh_frame and now some of the glibc sections for iconv).
      # Bzzzzt.  Thanks for playing, maybe next time.
      AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
!     AC_TRY_RUN([
       int main(void)
       {
         try { throw 1; }
         catch (...) { };
         return 0;
       }
!     ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes])
      if test "$ac_test_CFLAGS" = set; then
        CFLAGS="$ac_save_CFLAGS"
      else
--- 209,222 ----
      # .eh_frame and now some of the glibc sections for iconv).
      # Bzzzzt.  Thanks for playing, maybe next time.
      AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
!     AC_RUN_IFELSE([AC_LANG_SOURCE([[
       int main(void)
       {
         try { throw 1; }
         catch (...) { };
         return 0;
       }
!     ]])],[ac_sectionLDflags=yes],[ac_sectionLDflags=no],[ac_sectionLDflags=yes])
      if test "$ac_test_CFLAGS" = set; then
        CFLAGS="$ac_save_CFLAGS"
      else
*************** if test $enable_symvers != no; then
*** 401,407 ****
    AC_MSG_CHECKING([for shared libgcc])
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS=' -lgcc_s'
!   AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes, libat_shared_libgcc=no)
    CFLAGS="$ac_save_CFLAGS"
    if test $libat_shared_libgcc = no; then
      cat > conftest.c <<EOF
--- 303,309 ----
    AC_MSG_CHECKING([for shared libgcc])
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS=' -lgcc_s'
!   AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[return 0;]])],[libat_shared_libgcc=yes],[libat_shared_libgcc=no])
    CFLAGS="$ac_save_CFLAGS"
    if test $libat_shared_libgcc = no; then
      cat > conftest.c <<EOF
*************** changequote([,])dnl
*** 416,422 ****
      rm -f conftest.c conftest.so
      if test x${libat_libgcc_s_suffix+set} = xset; then
        CFLAGS=" -lgcc_s$libat_libgcc_s_suffix"
!       AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes)
        CFLAGS="$ac_save_CFLAGS"
      fi
    fi
--- 318,324 ----
      rm -f conftest.c conftest.so
      if test x${libat_libgcc_s_suffix+set} = xset; then
        CFLAGS=" -lgcc_s$libat_libgcc_s_suffix"
!       AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[return 0;]])],[libat_shared_libgcc=yes],[])
        CFLAGS="$ac_save_CFLAGS"
      fi
    fi
*************** if test $enable_symvers != no && test $l
*** 438,443 ****
--- 340,347 ----
        enable_symvers=gnu
      elif test $libat_ld_is_lld = yes ; then
        enable_symvers=gnu
+     elif test $libat_ld_is_mold = yes ; then
+       enable_symvers=gnu
      else
        # The right tools, the right setup, but too old.  Fallbacks?
        AC_MSG_WARN(=== Linker version $libat_gnu_ld_version is too old for)
diff -Nrcpad gcc-17-20260517/libffi/configure gcc-17-20260524/libffi/configure
*** gcc-17-20260517/libffi/configure	Sun May 17 22:32:18 2026
--- gcc-17-20260524/libffi/configure	Sun May 24 22:32:17 2026
***************
*** 1,6 ****
  #! /bin/sh
  # Guess values for system-dependent variables and create Makefiles.
! # Generated by GNU Autoconf 2.69 for libffi 3.4.2.
  #
  # Report bugs to <http://github.com/libffi/libffi/issues>.
  #
--- 1,6 ----
  #! /bin/sh
  # Guess values for system-dependent variables and create Makefiles.
! # Generated by GNU Autoconf 2.69 for libffi 3.5.2.
  #
  # Report bugs to <http://github.com/libffi/libffi/issues>.
  #
*************** test -x / || exit 1"
*** 198,203 ****
--- 198,204 ----
    as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
    eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
    test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+ test \$(( 1 + 1 )) = 2 || exit 1
  
    test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
      ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
*************** test -x / || exit 1"
*** 205,212 ****
      ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
      PATH=/empty FPATH=/empty; export PATH FPATH
      test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
!       || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
! test \$(( 1 + 1 )) = 2 || exit 1"
    if (eval "$as_required") 2>/dev/null; then :
    as_have_required=yes
  else
--- 206,212 ----
      ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
      PATH=/empty FPATH=/empty; export PATH FPATH
      test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
!       || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
    if (eval "$as_required") 2>/dev/null; then :
    as_have_required=yes
  else
*************** MAKEFLAGS=
*** 590,597 ****
  # Identity of this package.
  PACKAGE_NAME='libffi'
  PACKAGE_TARNAME='libffi'
! PACKAGE_VERSION='3.4.2'
! PACKAGE_STRING='libffi 3.4.2'
  PACKAGE_BUGREPORT='http://github.com/libffi/libffi/issues'
  PACKAGE_URL=''
  
--- 590,597 ----
  # Identity of this package.
  PACKAGE_NAME='libffi'
  PACKAGE_TARNAME='libffi'
! PACKAGE_VERSION='3.5.2'
! PACKAGE_STRING='libffi 3.5.2'
  PACKAGE_BUGREPORT='http://github.com/libffi/libffi/issues'
  PACKAGE_URL=''
  
*************** LIBFFI_BUILD_VERSIONED_SHLIB_FALSE
*** 644,649 ****
--- 644,650 ----
  LIBFFI_BUILD_VERSIONED_SHLIB_TRUE
  OPT_LDFLAGS
  SECTION_LDFLAGS
+ tmake_file
  toolexeclibdir
  toolexecdir
  FFI_DEBUG_FALSE
*************** BUILD_DOCS_TRUE
*** 656,664 ****
  FFI_EXEC_TRAMPOLINE_TABLE
  FFI_EXEC_TRAMPOLINE_TABLE_FALSE
  FFI_EXEC_TRAMPOLINE_TABLE_TRUE
  HAVE_LONG_DOUBLE_VARIANT
  HAVE_LONG_DOUBLE
- ALLOCA
  AM_LTLDFLAGS
  AM_RUNTESTFLAGS
  TESTSUBDIR_FALSE
--- 657,665 ----
  FFI_EXEC_TRAMPOLINE_TABLE
  FFI_EXEC_TRAMPOLINE_TABLE_FALSE
  FFI_EXEC_TRAMPOLINE_TABLE_TRUE
+ WASM64_MEMORY64
  HAVE_LONG_DOUBLE_VARIANT
  HAVE_LONG_DOUBLE
  AM_LTLDFLAGS
  AM_RUNTESTFLAGS
  TESTSUBDIR_FALSE
*************** MAINT
*** 667,672 ****
--- 668,674 ----
  MAINTAINER_MODE_FALSE
  MAINTAINER_MODE_TRUE
  SYSROOT_CFLAGS_FOR_TARGET
+ ac_ct_READELF
  READELF
  ENABLE_DARWIN_AT_RPATH_FALSE
  ENABLE_DARWIN_AT_RPATH_TRUE
*************** ac_ct_DUMPBIN
*** 687,696 ****
  DUMPBIN
  LD
  FGREP
- EGREP
- GREP
  SED
  LIBTOOL
  am__fastdepCCAS_FALSE
  am__fastdepCCAS_TRUE
  CCASDEPMODE
--- 689,698 ----
  DUMPBIN
  LD
  FGREP
  SED
  LIBTOOL
+ EGREP
+ GREP
  am__fastdepCCAS_FALSE
  am__fastdepCCAS_TRUE
  CCASDEPMODE
*************** build_vendor
*** 762,767 ****
--- 764,771 ----
  build_cpu
  build
  multi_basedir
+ FFI_VERSION_NUMBER
+ FFI_VERSION_STRING
  target_alias
  host_alias
  build_alias
*************** CCAS
*** 833,839 ****
  CCASFLAGS
  CPP
  CPPFLAGS
! CXXCPP'
  
  
  # Initialize some variables set by options.
--- 837,844 ----
  CCASFLAGS
  CPP
  CPPFLAGS
! CXXCPP
! WASM64_MEMORY64'
  
  
  # Initialize some variables set by options.
*************** if test "$ac_init_help" = "long"; then
*** 1374,1380 ****
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat <<_ACEOF
! \`configure' configures libffi 3.4.2 to adapt to many kinds of systems.
  
  Usage: $0 [OPTION]... [VAR=VALUE]...
  
--- 1379,1385 ----
    # Omit some internal or obsolete options to make the list less imposing.
    # This message is too long to be a string in the A/UX 3.1 sh.
    cat <<_ACEOF
! \`configure' configures libffi 3.5.2 to adapt to many kinds of systems.
  
  Usage: $0 [OPTION]... [VAR=VALUE]...
  
*************** fi
*** 1445,1451 ****
  
  if test -n "$ac_init_help"; then
    case $ac_init_help in
!      short | recursive ) echo "Configuration of libffi 3.4.2:";;
     esac
    cat <<\_ACEOF
  
--- 1450,1456 ----
  
  if test -n "$ac_init_help"; then
    case $ac_init_help in
!      short | recursive ) echo "Configuration of libffi 3.5.2:";;
     esac
    cat <<\_ACEOF
  
*************** Optional Features:
*** 1476,1486 ****
    --enable-maintainer-mode
                            enable make rules and dependencies not useful (and
                            sometimes confusing) to the casual installer
!   --enable-pax_emutramp       enable pax emulated trampolines, for we can't use PROT_EXEC
    --enable-debug          debugging mode
    --disable-structs       omit code for struct support
    --disable-raw-api       make the raw api unavailable
!   --enable-exec-static-tramp  enable use of static exec trampolines
    --enable-purify-safety  purify-safe mode
    --enable-symvers=STYLE  enables symbol versioning of the shared library
                            [default=yes]
--- 1481,1491 ----
    --enable-maintainer-mode
                            enable make rules and dependencies not useful (and
                            sometimes confusing) to the casual installer
!   --enable-pax_emutramp       enable pax emulated trampolines (experimental)
    --enable-debug          debugging mode
    --disable-structs       omit code for struct support
    --disable-raw-api       make the raw api unavailable
!   --enable-exec-static-tramp  enable use of static exec trampolines (disabled by default)
    --enable-purify-safety  purify-safe mode
    --enable-symvers=STYLE  enables symbol versioning of the shared library
                            [default=yes]
*************** Some influential environment variables:
*** 1511,1516 ****
--- 1516,1524 ----
    CCASFLAGS   assembler compiler flags (defaults to CFLAGS)
    CPP         C preprocessor
    CXXCPP      C++ preprocessor
+   WASM64_MEMORY64
+               Used only for the wasm64 target. Set to 1 (default) or 2 for
+               Emscripten's -sMEMORY64 mode
  
  Use these variables to override the choices made by `configure' or to help
  it to find libraries and programs with nonstandard names/locations.
*************** fi
*** 1578,1584 ****
  test -n "$ac_init_help" && exit $ac_status
  if $ac_init_version; then
    cat <<\_ACEOF
! libffi configure 3.4.2
  generated by GNU Autoconf 2.69
  
  Copyright (C) 2012 Free Software Foundation, Inc.
--- 1586,1592 ----
  test -n "$ac_init_help" && exit $ac_status
  if $ac_init_version; then
    cat <<\_ACEOF
! libffi configure 3.5.2
  generated by GNU Autoconf 2.69
  
  Copyright (C) 2012 Free Software Foundation, Inc.
*************** fi
*** 2247,2311 ****
    eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  
  } # ac_fn_c_check_header_mongrel
- 
- # ac_fn_c_check_type LINENO TYPE VAR INCLUDES
- # -------------------------------------------
- # Tests whether TYPE exists after having included INCLUDES, setting cache
- # variable VAR accordingly.
- ac_fn_c_check_type ()
- {
-   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
- $as_echo_n "checking for $2... " >&6; }
- if eval \${$3+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   eval "$3=no"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- $4
- int
- main ()
- {
- if (sizeof ($2))
- 	 return 0;
-   ;
-   return 0;
- }
- _ACEOF
- if ac_fn_c_try_compile "$LINENO"; then :
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- $4
- int
- main ()
- {
- if (sizeof (($2)))
- 	    return 0;
-   ;
-   return 0;
- }
- _ACEOF
- if ac_fn_c_try_compile "$LINENO"; then :
- 
- else
-   eval "$3=yes"
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- eval ac_res=\$$3
- 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
- $as_echo "$ac_res" >&6; }
-   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- 
- } # ac_fn_c_check_type
  cat >config.log <<_ACEOF
  This file contains any messages produced by compilers while
  running configure, to aid debugging if configure makes a mistake.
  
! It was created by libffi $as_me 3.4.2, which was
  generated by GNU Autoconf 2.69.  Invocation command line was
  
    $ $0 $@
--- 2255,2265 ----
    eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  
  } # ac_fn_c_check_header_mongrel
  cat >config.log <<_ACEOF
  This file contains any messages produced by compilers while
  running configure, to aid debugging if configure makes a mistake.
  
! It was created by libffi $as_me 3.5.2, which was
  generated by GNU Autoconf 2.69.  Invocation command line was
  
    $ $0 $@
*************** ac_compiler_gnu=$ac_cv_c_compiler_gnu
*** 2659,2664 ****
--- 2613,2623 ----
  ac_config_headers="$ac_config_headers fficonfig.h"
  
  
+ FFI_VERSION_STRING="3.5.2"
+ FFI_VERSION_NUMBER=30502
+ 
+ 
+ 
  # Default to --enable-multilib
  # Check whether --enable-multilib was given.
  if test "${enable_multilib+set}" = set; then :
*************** test -n "$target_alias" &&
*** 2836,2842 ****
    test "$program_prefix$program_suffix$program_transform_name" = \
      NONENONEs,x,x, &&
    program_prefix=${target_alias}-
- 
  target_alias=${target_alias-$host_alias}
  
  am__api_version='1.15'
--- 2795,2800 ----
*************** fi
*** 3325,3331 ****
  
  # Define the identity of the package.
   PACKAGE='libffi'
!  VERSION='3.4.2'
  
  
  cat >>confdefs.h <<_ACEOF
--- 3283,3289 ----
  
  # Define the identity of the package.
   PACKAGE='libffi'
!  VERSION='3.5.2'
  
  
  cat >>confdefs.h <<_ACEOF
*************** fi
*** 5111,5116 ****
--- 5069,5204 ----
  
  
  
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+ $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+ if ${ac_cv_path_GREP+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -z "$GREP"; then
+   ac_path_GREP_found=false
+   # Loop through the user's path and test for each of PROGNAME-LIST
+   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     for ac_prog in grep ggrep; do
+     for ac_exec_ext in '' $ac_executable_extensions; do
+       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+       as_fn_executable_p "$ac_path_GREP" || continue
+ # Check for GNU ac_path_GREP and select it if it is found.
+   # Check for GNU $ac_path_GREP
+ case `"$ac_path_GREP" --version 2>&1` in
+ *GNU*)
+   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+ *)
+   ac_count=0
+   $as_echo_n 0123456789 >"conftest.in"
+   while :
+   do
+     cat "conftest.in" "conftest.in" >"conftest.tmp"
+     mv "conftest.tmp" "conftest.in"
+     cp "conftest.in" "conftest.nl"
+     $as_echo 'GREP' >> "conftest.nl"
+     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+     as_fn_arith $ac_count + 1 && ac_count=$as_val
+     if test $ac_count -gt ${ac_path_GREP_max-0}; then
+       # Best one so far, save it but keep looking for a better one
+       ac_cv_path_GREP="$ac_path_GREP"
+       ac_path_GREP_max=$ac_count
+     fi
+     # 10*(2^10) chars as input seems more than enough
+     test $ac_count -gt 10 && break
+   done
+   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+ esac
+ 
+       $ac_path_GREP_found && break 3
+     done
+   done
+   done
+ IFS=$as_save_IFS
+   if test -z "$ac_cv_path_GREP"; then
+     as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+   fi
+ else
+   ac_cv_path_GREP=$GREP
+ fi
+ 
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+ $as_echo "$ac_cv_path_GREP" >&6; }
+  GREP="$ac_cv_path_GREP"
+ 
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+ $as_echo_n "checking for egrep... " >&6; }
+ if ${ac_cv_path_EGREP+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+    then ac_cv_path_EGREP="$GREP -E"
+    else
+      if test -z "$EGREP"; then
+   ac_path_EGREP_found=false
+   # Loop through the user's path and test for each of PROGNAME-LIST
+   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     for ac_prog in egrep; do
+     for ac_exec_ext in '' $ac_executable_extensions; do
+       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+       as_fn_executable_p "$ac_path_EGREP" || continue
+ # Check for GNU ac_path_EGREP and select it if it is found.
+   # Check for GNU $ac_path_EGREP
+ case `"$ac_path_EGREP" --version 2>&1` in
+ *GNU*)
+   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+ *)
+   ac_count=0
+   $as_echo_n 0123456789 >"conftest.in"
+   while :
+   do
+     cat "conftest.in" "conftest.in" >"conftest.tmp"
+     mv "conftest.tmp" "conftest.in"
+     cp "conftest.in" "conftest.nl"
+     $as_echo 'EGREP' >> "conftest.nl"
+     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+     as_fn_arith $ac_count + 1 && ac_count=$as_val
+     if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+       # Best one so far, save it but keep looking for a better one
+       ac_cv_path_EGREP="$ac_path_EGREP"
+       ac_path_EGREP_max=$ac_count
+     fi
+     # 10*(2^10) chars as input seems more than enough
+     test $ac_count -gt 10 && break
+   done
+   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+ esac
+ 
+       $ac_path_EGREP_found && break 3
+     done
+   done
+   done
+ IFS=$as_save_IFS
+   if test -z "$ac_cv_path_EGREP"; then
+     as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+   fi
+ else
+   ac_cv_path_EGREP=$EGREP
+ fi
+ 
+    fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+ $as_echo "$ac_cv_path_EGREP" >&6; }
+  EGREP="$ac_cv_path_EGREP"
+ 
+ 
  case `pwd` in
    *\ * | *\	*)
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
*************** Xsed="$SED -e 1s/^X//"
*** 5287,5422 ****
  
  
  
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
- $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
- if ${ac_cv_path_GREP+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   if test -z "$GREP"; then
-   ac_path_GREP_found=false
-   # Loop through the user's path and test for each of PROGNAME-LIST
-   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
- for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
- do
-   IFS=$as_save_IFS
-   test -z "$as_dir" && as_dir=.
-     for ac_prog in grep ggrep; do
-     for ac_exec_ext in '' $ac_executable_extensions; do
-       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-       as_fn_executable_p "$ac_path_GREP" || continue
- # Check for GNU ac_path_GREP and select it if it is found.
-   # Check for GNU $ac_path_GREP
- case `"$ac_path_GREP" --version 2>&1` in
- *GNU*)
-   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
- *)
-   ac_count=0
-   $as_echo_n 0123456789 >"conftest.in"
-   while :
-   do
-     cat "conftest.in" "conftest.in" >"conftest.tmp"
-     mv "conftest.tmp" "conftest.in"
-     cp "conftest.in" "conftest.nl"
-     $as_echo 'GREP' >> "conftest.nl"
-     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-     as_fn_arith $ac_count + 1 && ac_count=$as_val
-     if test $ac_count -gt ${ac_path_GREP_max-0}; then
-       # Best one so far, save it but keep looking for a better one
-       ac_cv_path_GREP="$ac_path_GREP"
-       ac_path_GREP_max=$ac_count
-     fi
-     # 10*(2^10) chars as input seems more than enough
-     test $ac_count -gt 10 && break
-   done
-   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
- esac
- 
-       $ac_path_GREP_found && break 3
-     done
-   done
-   done
- IFS=$as_save_IFS
-   if test -z "$ac_cv_path_GREP"; then
-     as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-   fi
- else
-   ac_cv_path_GREP=$GREP
- fi
- 
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
- $as_echo "$ac_cv_path_GREP" >&6; }
-  GREP="$ac_cv_path_GREP"
- 
- 
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
- $as_echo_n "checking for egrep... " >&6; }
- if ${ac_cv_path_EGREP+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-    then ac_cv_path_EGREP="$GREP -E"
-    else
-      if test -z "$EGREP"; then
-   ac_path_EGREP_found=false
-   # Loop through the user's path and test for each of PROGNAME-LIST
-   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
- for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
- do
-   IFS=$as_save_IFS
-   test -z "$as_dir" && as_dir=.
-     for ac_prog in egrep; do
-     for ac_exec_ext in '' $ac_executable_extensions; do
-       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-       as_fn_executable_p "$ac_path_EGREP" || continue
- # Check for GNU ac_path_EGREP and select it if it is found.
-   # Check for GNU $ac_path_EGREP
- case `"$ac_path_EGREP" --version 2>&1` in
- *GNU*)
-   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
- *)
-   ac_count=0
-   $as_echo_n 0123456789 >"conftest.in"
-   while :
-   do
-     cat "conftest.in" "conftest.in" >"conftest.tmp"
-     mv "conftest.tmp" "conftest.in"
-     cp "conftest.in" "conftest.nl"
-     $as_echo 'EGREP' >> "conftest.nl"
-     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-     as_fn_arith $ac_count + 1 && ac_count=$as_val
-     if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-       # Best one so far, save it but keep looking for a better one
-       ac_cv_path_EGREP="$ac_path_EGREP"
-       ac_path_EGREP_max=$ac_count
-     fi
-     # 10*(2^10) chars as input seems more than enough
-     test $ac_count -gt 10 && break
-   done
-   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
- esac
- 
-       $ac_path_EGREP_found && break 3
-     done
-   done
-   done
- IFS=$as_save_IFS
-   if test -z "$ac_cv_path_EGREP"; then
-     as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-   fi
- else
-   ac_cv_path_EGREP=$EGREP
- fi
- 
-    fi
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
- $as_echo "$ac_cv_path_EGREP" >&6; }
-  EGREP="$ac_cv_path_EGREP"
- 
- 
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
  $as_echo_n "checking for fgrep... " >&6; }
  if ${ac_cv_path_FGREP+:} false; then :
--- 5375,5380 ----
*************** else
*** 12077,12083 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12080 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 12035,12041 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12038 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** else
*** 12183,12189 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12186 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 12141,12147 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12144 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** fi
*** 15512,15519 ****
  
  
  if test -n "$ac_tool_prefix"; then
!   # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args.
! set dummy ${ac_tool_prefix}readelf; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
  if ${ac_cv_prog_READELF+:} false; then :
--- 15470,15479 ----
  
  
  if test -n "$ac_tool_prefix"; then
!   for ac_prog in readelf greadelf
!   do
!     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
! set dummy $ac_tool_prefix$ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
  if ${ac_cv_prog_READELF+:} false; then :
*************** do
*** 15529,15535 ****
    test -z "$as_dir" && as_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
    if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
!     ac_cv_prog_READELF="${ac_tool_prefix}readelf"
      $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
      break 2
    fi
--- 15489,15495 ----
    test -z "$as_dir" && as_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
    if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
!     ac_cv_prog_READELF="$ac_tool_prefix$ac_prog"
      $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
      break 2
    fi
*************** $as_echo "no" >&6; }
*** 15549,15559 ****
  fi
  
  
  fi
! if test -z "$ac_cv_prog_READELF"; then
    ac_ct_READELF=$READELF
!   # Extract the first word of "readelf", so it can be a program name with args.
! set dummy readelf; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
  if ${ac_cv_prog_ac_ct_READELF+:} false; then :
--- 15509,15523 ----
  fi
  
  
+     test -n "$READELF" && break
+   done
  fi
! if test -z "$READELF"; then
    ac_ct_READELF=$READELF
!   for ac_prog in readelf greadelf
! do
!   # Extract the first word of "$ac_prog", so it can be a program name with args.
! set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
  if ${ac_cv_prog_ac_ct_READELF+:} false; then :
*************** do
*** 15569,15575 ****
    test -z "$as_dir" && as_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
    if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
!     ac_cv_prog_ac_ct_READELF="readelf"
      $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
      break 2
    fi
--- 15533,15539 ----
    test -z "$as_dir" && as_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
    if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
!     ac_cv_prog_ac_ct_READELF="$ac_prog"
      $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
      break 2
    fi
*************** else
*** 15588,15593 ****
--- 15552,15561 ----
  $as_echo "no" >&6; }
  fi
  
+ 
+   test -n "$ac_ct_READELF" && break
+ done
+ 
    if test "x$ac_ct_READELF" = x; then
      READELF=""
    else
*************** ac_tool_warned=yes ;;
*** 15599,15606 ****
  esac
      READELF=$ac_ct_READELF
    fi
- else
-   READELF="$ac_cv_prog_READELF"
  fi
  
  
--- 15567,15572 ----
*************** fi
*** 15694,15865 ****
  done
  
  
- for ac_header in sys/mman.h
- do :
-   ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
- if test "x$ac_cv_header_sys_mman_h" = xyes; then :
-   cat >>confdefs.h <<_ACEOF
- #define HAVE_SYS_MMAN_H 1
- _ACEOF
- 
- fi
- 
- done
- 
- for ac_func in mmap mkostemp mkstemp
- do :
-   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
- if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-   cat >>confdefs.h <<_ACEOF
- #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
- _ACEOF
- 
- fi
- done
- 
- 
- ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
- if test "x$ac_cv_header_sys_mman_h" = xyes; then :
-   libffi_header_sys_mman_h=yes
- else
-   libffi_header_sys_mman_h=no
- fi
- 
- 
- ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
- if test "x$ac_cv_func_mmap" = xyes; then :
-   libffi_func_mmap=yes
- else
-   libffi_func_mmap=no
- fi
- 
- if test "$libffi_header_sys_mman_h" != yes \
-  || test "$libffi_func_mmap" != yes; then
-    ac_cv_func_mmap_file=no
-    ac_cv_func_mmap_dev_zero=no
-    ac_cv_func_mmap_anon=no
- else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether read-only mmap of a plain file works" >&5
- $as_echo_n "checking whether read-only mmap of a plain file works... " >&6; }
- if ${ac_cv_func_mmap_file+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   # Add a system to this blacklist if
-    # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a
-    # memory area containing the same data that you'd get if you applied
-    # read() to the same fd.  The only system known to have a problem here
-    # is VMS, where text files have record structure.
-    case "$host_os" in
-      vms* | ultrix*)
- 	ac_cv_func_mmap_file=no ;;
-      *)
- 	ac_cv_func_mmap_file=yes;;
-    esac
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_file" >&5
- $as_echo "$ac_cv_func_mmap_file" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap from /dev/zero works" >&5
- $as_echo_n "checking whether mmap from /dev/zero works... " >&6; }
- if ${ac_cv_func_mmap_dev_zero+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   # Add a system to this blacklist if it has mmap() but /dev/zero
-    # does not exist, or if mmapping /dev/zero does not give anonymous
-    # zeroed pages with both the following properties:
-    # 1. If you map N consecutive pages in with one call, and then
-    #    unmap any subset of those pages, the pages that were not
-    #    explicitly unmapped remain accessible.
-    # 2. If you map two adjacent blocks of memory and then unmap them
-    #    both at once, they must both go away.
-    # Systems known to be in this category are Windows (all variants),
-    # VMS, and Darwin.
-    case "$host_os" in
-      vms* | cygwin* | pe | mingw* | darwin* | ultrix* | hpux10* | hpux11.00)
- 	ac_cv_func_mmap_dev_zero=no ;;
-      *)
- 	ac_cv_func_mmap_dev_zero=yes;;
-    esac
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_dev_zero" >&5
- $as_echo "$ac_cv_func_mmap_dev_zero" >&6; }
- 
-    # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for.
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAP_ANON(YMOUS)" >&5
- $as_echo_n "checking for MAP_ANON(YMOUS)... " >&6; }
- if ${ac_cv_decl_map_anon+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- #include <sys/types.h>
- #include <sys/mman.h>
- #include <unistd.h>
- 
- #ifndef MAP_ANONYMOUS
- #define MAP_ANONYMOUS MAP_ANON
- #endif
- 
- int
- main ()
- {
- int n = MAP_ANONYMOUS;
-   ;
-   return 0;
- }
- _ACEOF
- if ac_fn_c_try_compile "$LINENO"; then :
-   ac_cv_decl_map_anon=yes
- else
-   ac_cv_decl_map_anon=no
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_map_anon" >&5
- $as_echo "$ac_cv_decl_map_anon" >&6; }
- 
-    if test $ac_cv_decl_map_anon = no; then
-      ac_cv_func_mmap_anon=no
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap with MAP_ANON(YMOUS) works" >&5
- $as_echo_n "checking whether mmap with MAP_ANON(YMOUS) works... " >&6; }
- if ${ac_cv_func_mmap_anon+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   # Add a system to this blacklist if it has mmap() and MAP_ANON or
-    # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
-    # doesn't give anonymous zeroed pages with the same properties listed
-    # above for use of /dev/zero.
-    # Systems known to be in this category are Windows, VMS, and SCO Unix.
-    case "$host_os" in
-      vms* | cygwin* | pe | mingw* | sco* | udk* )
- 	ac_cv_func_mmap_anon=no ;;
-      *)
- 	ac_cv_func_mmap_anon=yes;;
-    esac
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_anon" >&5
- $as_echo "$ac_cv_func_mmap_anon" >&6; }
-    fi
- fi
- 
- if test $ac_cv_func_mmap_file = yes; then
- 
- $as_echo "#define HAVE_MMAP_FILE 1" >>confdefs.h
- 
- fi
- if test $ac_cv_func_mmap_dev_zero = yes; then
- 
- $as_echo "#define HAVE_MMAP_DEV_ZERO 1" >>confdefs.h
- 
- fi
- if test $ac_cv_func_mmap_anon = yes; then
- 
- $as_echo "#define HAVE_MMAP_ANON 1" >>confdefs.h
- 
- fi
- 
- 
   if test -d $srcdir/testsuite; then
    TESTSUBDIR_TRUE=
    TESTSUBDIR_FALSE='#'
--- 15660,15665 ----
*************** fi
*** 15881,15998 ****
  
  
  
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
- $as_echo_n "checking for ANSI C header files... " >&6; }
- if ${ac_cv_header_stdc+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- #include <stdlib.h>
- #include <stdarg.h>
- #include <string.h>
- #include <float.h>
- 
- int
- main ()
- {
- 
-   ;
-   return 0;
- }
- _ACEOF
- if ac_fn_c_try_compile "$LINENO"; then :
-   ac_cv_header_stdc=yes
- else
-   ac_cv_header_stdc=no
- fi
- rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- 
- if test $ac_cv_header_stdc = yes; then
-   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- #include <string.h>
- 
- _ACEOF
- if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-   $EGREP "memchr" >/dev/null 2>&1; then :
- 
- else
-   ac_cv_header_stdc=no
- fi
- rm -f conftest*
- 
- fi
- 
- if test $ac_cv_header_stdc = yes; then
-   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- #include <stdlib.h>
- 
- _ACEOF
- if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-   $EGREP "free" >/dev/null 2>&1; then :
- 
- else
-   ac_cv_header_stdc=no
- fi
- rm -f conftest*
- 
- fi
- 
- if test $ac_cv_header_stdc = yes; then
-   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-   if test "$cross_compiling" = yes; then :
-   :
- else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
- /* end confdefs.h.  */
- #include <ctype.h>
- #include <stdlib.h>
- #if ((' ' & 0x0FF) == 0x020)
- # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
- # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
- #else
- # define ISLOWER(c) \
- 		   (('a' <= (c) && (c) <= 'i') \
- 		     || ('j' <= (c) && (c) <= 'r') \
- 		     || ('s' <= (c) && (c) <= 'z'))
- # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
- #endif
- 
- #define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
- int
- main ()
- {
-   int i;
-   for (i = 0; i < 256; i++)
-     if (XOR (islower (i), ISLOWER (i))
- 	|| toupper (i) != TOUPPER (i))
-       return 2;
-   return 0;
- }
- _ACEOF
- if ac_fn_c_try_run "$LINENO"; then :
- 
- else
-   ac_cv_header_stdc=no
- fi
- rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-   conftest.$ac_objext conftest.beam conftest.$ac_ext
- fi
- 
- fi
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
- $as_echo "$ac_cv_header_stdc" >&6; }
- if test $ac_cv_header_stdc = yes; then
- 
- $as_echo "#define STDC_HEADERS 1" >>confdefs.h
- 
- fi
- 
  for ac_func in memcpy
  do :
    ac_fn_c_check_func "$LINENO" "memcpy" "ac_cv_func_memcpy"
--- 15681,15686 ----
*************** _ACEOF
*** 16004,16205 ****
  fi
  done
  
! ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
! if test "x$ac_cv_type_size_t" = xyes; then :
! 
! else
! 
! cat >>confdefs.h <<_ACEOF
! #define size_t unsigned int
! _ACEOF
! 
! fi
! 
! # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
! # for constant arguments.  Useless!
! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
! $as_echo_n "checking for working alloca.h... " >&6; }
! if ${ac_cv_working_alloca_h+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
! /* end confdefs.h.  */
! #include <alloca.h>
! int
! main ()
! {
! char *p = (char *) alloca (2 * sizeof (int));
! 			  if (p) return 0;
!   ;
!   return 0;
! }
! _ACEOF
! if ac_fn_c_try_link "$LINENO"; then :
!   ac_cv_working_alloca_h=yes
! else
!   ac_cv_working_alloca_h=no
! fi
! rm -f core conftest.err conftest.$ac_objext \
!     conftest$ac_exeext conftest.$ac_ext
! fi
! { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
! $as_echo "$ac_cv_working_alloca_h" >&6; }
! if test $ac_cv_working_alloca_h = yes; then
! 
! $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
! 
! fi
! 
! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
! $as_echo_n "checking for alloca... " >&6; }
! if ${ac_cv_func_alloca_works+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
! /* end confdefs.h.  */
! #ifdef __GNUC__
! # define alloca __builtin_alloca
! #else
! # ifdef _MSC_VER
! #  include <malloc.h>
! #  define alloca _alloca
! # else
! #  ifdef HAVE_ALLOCA_H
! #   include <alloca.h>
! #  else
! #   ifdef _AIX
!  #pragma alloca
! #   else
! #    ifndef alloca /* predefined by HP cc +Olibcalls */
! void *alloca (size_t);
! #    endif
! #   endif
! #  endif
! # endif
! #endif
! 
! int
! main ()
! {
! char *p = (char *) alloca (1);
! 				    if (p) return 0;
!   ;
!   return 0;
! }
! _ACEOF
! if ac_fn_c_try_link "$LINENO"; then :
!   ac_cv_func_alloca_works=yes
! else
!   ac_cv_func_alloca_works=no
! fi
! rm -f core conftest.err conftest.$ac_objext \
!     conftest$ac_exeext conftest.$ac_ext
! fi
! { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
! $as_echo "$ac_cv_func_alloca_works" >&6; }
! 
! if test $ac_cv_func_alloca_works = yes; then
! 
! $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
! 
! else
!   # The SVR3 libPW and SVR4 libucb both contain incompatible functions
! # that cause trouble.  Some versions do not even contain alloca or
! # contain a buggy version.  If you still want to use their alloca,
! # use ar to extract alloca.o from them instead of compiling alloca.c.
! 
! ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
! 
! $as_echo "#define C_ALLOCA 1" >>confdefs.h
! 
! 
! { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
! $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
! if ${ac_cv_os_cray+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
! /* end confdefs.h.  */
! #if defined CRAY && ! defined CRAY2
! webecray
! #else
! wenotbecray
! #endif
! 
! _ACEOF
! if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
!   $EGREP "webecray" >/dev/null 2>&1; then :
!   ac_cv_os_cray=yes
! else
!   ac_cv_os_cray=no
! fi
! rm -f conftest*
! 
! fi
! { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
! $as_echo "$ac_cv_os_cray" >&6; }
! if test $ac_cv_os_cray = yes; then
!   for ac_func in _getb67 GETB67 getb67; do
!     as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
! ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
! if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
! 
! cat >>confdefs.h <<_ACEOF
! #define CRAY_STACKSEG_END $ac_func
! _ACEOF
! 
!     break
! fi
! 
!   done
! fi
! 
! { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
! $as_echo_n "checking stack direction for C alloca... " >&6; }
! if ${ac_cv_c_stack_direction+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   if test "$cross_compiling" = yes; then :
!   ac_cv_c_stack_direction=0
! else
!   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
! /* end confdefs.h.  */
! $ac_includes_default
! int
! find_stack_direction (int *addr, int depth)
! {
!   int dir, dummy = 0;
!   if (! addr)
!     addr = &dummy;
!   *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
!   dir = depth ? find_stack_direction (addr, depth - 1) : 0;
!   return dir + dummy;
! }
! 
! int
! main (int argc, char **argv)
! {
!   return find_stack_direction (0, argc + !argv + 20) < 0;
! }
  _ACEOF
- if ac_fn_c_try_run "$LINENO"; then :
-   ac_cv_c_stack_direction=1
- else
-   ac_cv_c_stack_direction=-1
- fi
- rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-   conftest.$ac_objext conftest.beam conftest.$ac_ext
- fi
  
  fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
- $as_echo "$ac_cv_c_stack_direction" >&6; }
- cat >>confdefs.h <<_ACEOF
- #define STACK_DIRECTION $ac_cv_c_stack_direction
- _ACEOF
  
! 
! fi
  
  
  # The cast to long int works around a bug in the HP C Compiler
--- 15692,15708 ----
  fi
  done
  
! for ac_header in alloca.h
! do :
!   ac_fn_c_check_header_mongrel "$LINENO" "alloca.h" "ac_cv_header_alloca_h" "$ac_includes_default"
! if test "x$ac_cv_header_alloca_h" = xyes; then :
!   cat >>confdefs.h <<_ACEOF
! #define HAVE_ALLOCA_H 1
  _ACEOF
  
  fi
  
! done
  
  
  # The cast to long int works around a bug in the HP C Compiler
*************** $as_echo "#define HAVE_AS_CFI_PSEUDO_OP
*** 16551,16556 ****
--- 16054,16061 ----
   fi
  
  
+ 
+ 
  case "$TARGET" in
    SPARC)
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5
*************** else
*** 16661,16667 ****
  	libffi_cv_as_s390_zarch=no
  	echo 'void foo(void) { bar(); bar(); }' > conftest.c
  	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
! 	    if grep -q brasl conftest.s; then
  	        libffi_cv_as_s390_zarch=yes
  	    fi
  	fi
--- 16166,16172 ----
  	libffi_cv_as_s390_zarch=no
  	echo 'void foo(void) { bar(); bar(); }' > conftest.c
  	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
! 	    if $GREP -q brasl conftest.s; then
  	        libffi_cv_as_s390_zarch=yes
  	    fi
  	fi
*************** $as_echo "#define HAVE_AS_S390_ZARCH 1"
*** 16675,16680 ****
--- 16180,16191 ----
  
      fi
      ;;
+   wasm64)
+     if test -z "$WASM64_MEMORY64"; then
+       WASM64_MEMORY64=1
+     fi
+     CFLAGS="$CFLAGS -sMEMORY64=$WASM64_MEMORY64"
+     ;;
  esac
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports pointer authentication" >&5
*************** main ()
*** 16693,16703 ****
  
  #ifdef __clang__
  # if __has_feature(ptrauth_calls)
! #  define HAVE_PTRAUTH 1
  # endif
  #endif
  
! #ifndef HAVE_PTRAUTH
  # error Pointer authentication not supported
  #endif
  
--- 16204,16214 ----
  
  #ifdef __clang__
  # if __has_feature(ptrauth_calls)
! #  define HAVE_ARM64E_PTRAUTH 1
  # endif
  #endif
  
! #ifndef HAVE_ARM64E_PTRAUTH
  # error Pointer authentication not supported
  #endif
  
*************** fi
*** 16717,16730 ****
  $as_echo "$libffi_cv_as_ptrauth" >&6; }
  if test "x$libffi_cv_as_ptrauth" = xyes; then
  
! $as_echo "#define HAVE_PTRAUTH 1" >>confdefs.h
  
  fi
  
! # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC.
  # Check whether --enable-pax_emutramp was given.
  if test "${enable_pax_emutramp+set}" = set; then :
    enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then
  
  $as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h
  
--- 16228,16247 ----
  $as_echo "$libffi_cv_as_ptrauth" >&6; }
  if test "x$libffi_cv_as_ptrauth" = xyes; then
  
! $as_echo "#define HAVE_ARM64E_PTRAUTH 1" >>confdefs.h
  
  fi
  
! # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC;
! # if EMUTRAMP is active too ffi could try mapping without PROT_EXEC,
! # but the kernel needs to recognize the trampoline generated by ffi.
! # Otherwise fallback to double mmap trick.
  # Check whether --enable-pax_emutramp was given.
  if test "${enable_pax_emutramp+set}" = set; then :
    enableval=$enable_pax_emutramp; if test "$enable_pax_emutramp" = "yes"; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: EMUTRAMP is experimental only.  Use --enable-pax_emutramp=experimental to enforce." >&5
+ $as_echo "$as_me: WARNING: EMUTRAMP is experimental only.  Use --enable-pax_emutramp=experimental to enforce." >&2;}
+   elif test "$enable_pax_emutramp" = "experimental"; then
  
  $as_echo "#define FFI_MMAP_EXEC_EMUTRAMP_PAX 1" >>confdefs.h
  
*************** case "$target" in
*** 16740,16746 ****
  $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
  
       ;;
!      *-apple-* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*)
  
  $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
  
--- 16257,16263 ----
  $as_echo "#define FFI_EXEC_TRAMPOLINE_TABLE 1" >>confdefs.h
  
       ;;
!      *-apple-* | *-*-dragonfly* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*)
  
  $as_echo "#define FFI_MMAP_EXEC_WRIT 1" >>confdefs.h
  
*************** else
*** 16805,16811 ****
    	libffi_cv_ro_eh_frame=yes
    	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
    	if $CC $CFLAGS -c -fpic -fexceptions -fno-lto -o conftest.o conftest.c > /dev/null 2>&1; then
! 	    if $READELF -WS conftest.o | grep -q -n 'eh_frame .* WA'; then
  	        libffi_cv_ro_eh_frame=no
  	    fi
    	fi
--- 16322,16328 ----
    	libffi_cv_ro_eh_frame=yes
    	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
    	if $CC $CFLAGS -c -fpic -fexceptions -fno-lto -o conftest.o conftest.c > /dev/null 2>&1; then
! 	    if $READELF -WS conftest.o 2>/dev/null | $GREP -q -n 'eh_frame .* WA'; then
  	        libffi_cv_ro_eh_frame=no
  	    fi
    	fi
*************** else
*** 16841,16847 ****
    ac_status=$?
    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    test $ac_status = 0; }; }; then
!   	    if egrep '(\.hidden|\.private_extern).*foo' conftest.s >/dev/null; then
    		libffi_cv_hidden_visibility_attribute=yes
    	    fi
    	fi
--- 16358,16364 ----
    ac_status=$?
    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    test $ac_status = 0; }; }; then
!   	    if $EGREP '(\.hidden|\.private_extern).*foo|foo.*,hidden' conftest.s >/dev/null; then
    		libffi_cv_hidden_visibility_attribute=yes
    	    fi
    	fi
*************** fi
*** 17001,17009 ****
  
  if test "$enable_exec_static_tramp" = yes; then
  case "$target" in
!      *-cygwin*)
       ;;
!      *arm*-*-linux-* | aarch64*-*-linux-* | i*86-*-linux-* | x86_64-*-linux-*)
  
  $as_echo "#define FFI_EXEC_STATIC_TRAMP 1" >>confdefs.h
  
--- 16518,16532 ----
  
  if test "$enable_exec_static_tramp" = yes; then
  case "$target" in
!      *-cygwin* | *-msys*)
!        # Only define static trampolines if we are using the cygwin runtime.
!        # Will this need to be changed for mingw?
! 
! $as_echo "#define FFI_EXEC_STATIC_TRAMP 1" >>confdefs.h
! 
       ;;
!      *arm*-*-linux-* | aarch64*-*-linux-* | i*86-*-linux-* | x86_64-*-linux-* \
!      | loongarch*-*-linux-* | s390x*-linux-* | powerpc*-linux-*)
  
  $as_echo "#define FFI_EXEC_STATIC_TRAMP 1" >>confdefs.h
  
*************** else
*** 17066,17182 ****
    multilib_arg=
  fi
  
! # Check linker support.
! 
! 
! # Check whether --with-gnu-ld was given.
! if test "${with_gnu_ld+set}" = set; then :
!   withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
! else
!   with_gnu_ld=no
! fi
! 
! ac_prog=ld
! if test "$GCC" = yes; then
!   # Check if gcc -print-prog-name=ld gives a path.
!   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
! $as_echo_n "checking for ld used by $CC... " >&6; }
!   case $host in
!   *-*-mingw*)
!     # gcc leaves a trailing carriage return which upsets mingw
!     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
!   *)
!     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
!   esac
!   case $ac_prog in
!     # Accept absolute paths.
!     [\\/]* | ?:[\\/]*)
!       re_direlt='/[^/][^/]*/\.\./'
!       # Canonicalize the pathname of ld
!       ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
!       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
! 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
!       done
!       test -z "$LD" && LD="$ac_prog"
!       ;;
!   "")
!     # If it fails, then pretend we aren't using GCC.
!     ac_prog=ld
!     ;;
!   *)
!     # If it is relative, then search for the first ld in PATH.
!     with_gnu_ld=unknown
!     ;;
!   esac
! elif test "$with_gnu_ld" = yes; then
!   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
! $as_echo_n "checking for GNU ld... " >&6; }
! else
!   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
! $as_echo_n "checking for non-GNU ld... " >&6; }
! fi
! if ${lt_cv_path_LD+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   if test -z "$LD"; then
!   lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
!   for ac_dir in $PATH; do
!     IFS="$lt_save_ifs"
!     test -z "$ac_dir" && ac_dir=.
!     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
!       lt_cv_path_LD="$ac_dir/$ac_prog"
!       # Check to see if the program is GNU ld.  I'd rather use --version,
!       # but apparently some variants of GNU ld only accept -v.
!       # Break only if it was the GNU/non-GNU ld that we prefer.
!       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
!       *GNU* | *'with BFD'*)
! 	test "$with_gnu_ld" != no && break
! 	;;
!       *)
! 	test "$with_gnu_ld" != yes && break
! 	;;
!       esac
!     fi
!   done
!   IFS="$lt_save_ifs"
! else
!   lt_cv_path_LD="$LD" # Let the user override the test with a path.
! fi
! fi
! 
! LD="$lt_cv_path_LD"
! if test -n "$LD"; then
!   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
! $as_echo "$LD" >&6; }
! else
!   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
! $as_echo "no" >&6; }
! fi
! test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
! { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
! $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
! if ${lt_cv_prog_gnu_ld+:} false; then :
!   $as_echo_n "(cached) " >&6
! else
!   # I'd rather use --version here, but apparently some GNU lds only accept -v.
! case `$LD -v 2>&1 </dev/null` in
! *GNU* | *'with BFD'*)
!   lt_cv_prog_gnu_ld=yes
!   ;;
! *)
!   lt_cv_prog_gnu_ld=no
!   ;;
! esac
! fi
! { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
! $as_echo "$lt_cv_prog_gnu_ld" >&6; }
! with_gnu_ld=$lt_cv_prog_gnu_ld
! 
! 
! 
! 
  
  
  
    # If we're not using GNU ld, then there's no point in even trying these
    # tests.  Check for that first.  We should have already tested for gld
--- 16589,16605 ----
    multilib_arg=
  fi
  
! # Conditionalize the makefile for this target machine.
! tmake_file_=
! for f in ${tmake_file}; do
!   if test -f ${srcdir}/src/$TARGETDIR/$f; then
!      tmake_file_="${tmake_file_} \$(srcdir)/src/$TARGETDIR/$f"
!   fi
! done
! tmake_file="${tmake_file_}"
  
  
+ # Check linker support.
  
    # If we're not using GNU ld, then there's no point in even trying these
    # tests.  Check for that first.  We should have already tested for gld
*************** with_gnu_ld=$lt_cv_prog_gnu_ld
*** 17211,17216 ****
--- 16634,16643 ----
    if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then
      libat_ld_is_lld=yes
    fi
+   libat_ld_is_mold=no
+   if $LD --version 2>/dev/null | grep 'mold '> /dev/null 2>&1; then
+     libat_ld_is_mold=yes
+   fi
  
    ldver=`$LD --version 2>/dev/null |
           sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`
*************** if test $enable_symvers != no && test $l
*** 17414,17419 ****
--- 16841,16848 ----
        enable_symvers=gnu
      elif test $libat_ld_is_lld = yes ; then
        enable_symvers=gnu
+     elif test $libat_ld_is_mold = yes ; then
+       enable_symvers=gnu
      else
        # The right tools, the right setup, but too old.  Fallbacks?
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Linker version $libat_gnu_ld_version is too old for" >&5
*************** cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
*** 18094,18100 ****
  # report actual input values of CONFIG_FILES etc. instead of their
  # values after options handling.
  ac_log="
! This file was extended by libffi $as_me 3.4.2, which was
  generated by GNU Autoconf 2.69.  Invocation command line was
  
    CONFIG_FILES    = $CONFIG_FILES
--- 17523,17529 ----
  # report actual input values of CONFIG_FILES etc. instead of their
  # values after options handling.
  ac_log="
! This file was extended by libffi $as_me 3.5.2, which was
  generated by GNU Autoconf 2.69.  Invocation command line was
  
    CONFIG_FILES    = $CONFIG_FILES
*************** _ACEOF
*** 18164,18170 ****
  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
  ac_cs_version="\\
! libffi config.status 3.4.2
  configured by $0, generated by GNU Autoconf 2.69,
    with options \\"\$ac_cs_config\\"
  
--- 17593,17599 ----
  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
  ac_cs_version="\\
! libffi config.status 3.5.2
  configured by $0, generated by GNU Autoconf 2.69,
    with options \\"\$ac_cs_config\\"
  
diff -Nrcpad gcc-17-20260517/libffi/configure.ac gcc-17-20260524/libffi/configure.ac
*** gcc-17-20260517/libffi/configure.ac	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/configure.ac	Sun May 24 22:32:13 2026
***************
*** 1,13 ****
  dnl Process this with autoconf to create configure
  
! AC_PREREQ(2.68)
  
! AC_INIT([libffi], [3.4.2], [http://github.com/libffi/libffi/issues])
  AC_CONFIG_HEADERS([fficonfig.h])
  
  AM_ENABLE_MULTILIB(, ..)
  
! AC_CANONICAL_SYSTEM
  target_alias=${target_alias-$host_alias}
  
  AM_INIT_AUTOMAKE([no-dist])
--- 1,18 ----
  dnl Process this with autoconf to create configure
  
! AC_PREREQ([2.68])
  
! AC_INIT([libffi],[3.5.2],[http://github.com/libffi/libffi/issues])
  AC_CONFIG_HEADERS([fficonfig.h])
  
+ FFI_VERSION_STRING="3.5.2"
+ FFI_VERSION_NUMBER=30502
+ AC_SUBST(FFI_VERSION_STRING)
+ AC_SUBST(FFI_VERSION_NUMBER)
+ 
  AM_ENABLE_MULTILIB(, ..)
  
! AC_CANONICAL_TARGET
  target_alias=${target_alias-$host_alias}
  
  AM_INIT_AUTOMAKE([no-dist])
*************** AC_SUBST(CET_FLAGS)
*** 54,63 ****
  
  AM_PROG_AS
  AM_PROG_CC_C_O
! AC_PROG_LIBTOOL
  AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
  
! AC_CHECK_TOOL(READELF, readelf)
  
  # Test for 64-bit build.
  AC_CHECK_SIZEOF([size_t])
--- 59,69 ----
  
  AM_PROG_AS
  AM_PROG_CC_C_O
! AC_PROG_EGREP
! LT_INIT
  AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = xyes])
  
! AC_CHECK_TOOLS([READELF], [readelf greadelf])
  
  # Test for 64-bit build.
  AC_CHECK_SIZEOF([size_t])
*************** AM_MAINTAINER_MODE
*** 74,83 ****
  AC_CHECK_HEADERS(sys/memfd.h)
  AC_CHECK_FUNCS([memfd_create])
  
- AC_CHECK_HEADERS(sys/mman.h)
- AC_CHECK_FUNCS([mmap mkostemp mkstemp])
- AC_FUNC_MMAP_BLACKLIST
- 
  dnl The -no-testsuite modules omit the test subdir.
  AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
  
--- 80,85 ----
*************** fi
*** 93,101 ****
  AC_SUBST(AM_RUNTESTFLAGS)
  AC_SUBST(AM_LTLDFLAGS)
  
- AC_HEADER_STDC
  AC_CHECK_FUNCS(memcpy)
! AC_FUNC_ALLOCA
  
  AC_CHECK_SIZEOF(double)
  AC_CHECK_SIZEOF(long double)
--- 95,102 ----
  AC_SUBST(AM_RUNTESTFLAGS)
  AC_SUBST(AM_LTLDFLAGS)
  
  AC_CHECK_FUNCS(memcpy)
! AC_CHECK_HEADERS(alloca.h)
  
  AC_CHECK_SIZEOF(double)
  AC_CHECK_SIZEOF(long double)
*************** AC_C_BIGENDIAN
*** 122,127 ****
--- 123,130 ----
  
  GCC_AS_CFI_PSEUDO_OP
  
+ AC_ARG_VAR([WASM64_MEMORY64], [Used only for the wasm64 target. Set to 1 (default) or 2 for Emscripten's -sMEMORY64 mode])
+ 
  case "$TARGET" in
    SPARC)
      AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs],
*************** case "$TARGET" in
*** 130,138 ****
  	save_LDFLAGS="$LDFLAGS"
  	CFLAGS="$CFLAGS -fpic"
  	LDFLAGS="$LDFLAGS -shared"
! 	AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],,
! 		    [libffi_cv_as_sparc_ua_pcrel=yes],
! 		    [libffi_cv_as_sparc_ua_pcrel=no])
  	CFLAGS="$save_CFLAGS"
  	LDFLAGS="$save_LDFLAGS"])
      if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
--- 133,139 ----
  	save_LDFLAGS="$LDFLAGS"
  	CFLAGS="$CFLAGS -fpic"
  	LDFLAGS="$LDFLAGS -shared"
! 	AC_LINK_IFELSE([AC_LANG_PROGRAM([[asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");]], [[]])],[libffi_cv_as_sparc_ua_pcrel=yes],[libffi_cv_as_sparc_ua_pcrel=no])
  	CFLAGS="$save_CFLAGS"
  	LDFLAGS="$save_LDFLAGS"])
      if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then
*************** case "$TARGET" in
*** 144,152 ****
         libffi_cv_as_register_pseudo_op, [
         libffi_cv_as_register_pseudo_op=unknown
         # Check if we have .register
!        AC_TRY_COMPILE(,[asm (".register %g2, #scratch");],
! 		       [libffi_cv_as_register_pseudo_op=yes],
! 		       [libffi_cv_as_register_pseudo_op=no])
      ])
      if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
         AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1,
--- 145,151 ----
         libffi_cv_as_register_pseudo_op, [
         libffi_cv_as_register_pseudo_op=unknown
         # Check if we have .register
!        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[asm (".register %g2, #scratch");]])],[libffi_cv_as_register_pseudo_op=yes],[libffi_cv_as_register_pseudo_op=no])
      ])
      if test "x$libffi_cv_as_register_pseudo_op" = xyes; then
         AC_DEFINE(HAVE_AS_REGISTER_PSEUDO_OP, 1,
*************** case "$TARGET" in
*** 175,181 ****
  	libffi_cv_as_s390_zarch=no
  	echo 'void foo(void) { bar(); bar(); }' > conftest.c
  	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
! 	    if grep -q brasl conftest.s; then
  	        libffi_cv_as_s390_zarch=yes
  	    fi
  	fi
--- 174,180 ----
  	libffi_cv_as_s390_zarch=no
  	echo 'void foo(void) { bar(); bar(); }' > conftest.c
  	if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then
! 	    if $GREP -q brasl conftest.s; then
  	        libffi_cv_as_s390_zarch=yes
  	    fi
  	fi
*************** case "$TARGET" in
*** 185,220 ****
  		  [Define if the compiler uses zarch features.])
      fi
      ;;
  esac
  
  AC_CACHE_CHECK([whether compiler supports pointer authentication],
     libffi_cv_as_ptrauth, [
     libffi_cv_as_ptrauth=unknown
!    AC_TRY_COMPILE(,[
  #ifdef __clang__
  # if __has_feature(ptrauth_calls)
! #  define HAVE_PTRAUTH 1
  # endif
  #endif
  
! #ifndef HAVE_PTRAUTH
  # error Pointer authentication not supported
  #endif
! 		   ],
! 		   [libffi_cv_as_ptrauth=yes],
! 		   [libffi_cv_as_ptrauth=no])
  ])
  if test "x$libffi_cv_as_ptrauth" = xyes; then
!     AC_DEFINE(HAVE_PTRAUTH, 1,
  	      [Define if your compiler supports pointer authentication.])
  fi
  
! # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC.
  AC_ARG_ENABLE(pax_emutramp,
!   [  --enable-pax_emutramp       enable pax emulated trampolines, for we can't use PROT_EXEC],
    if test "$enable_pax_emutramp" = "yes"; then
      AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1,
!       [Define this if you want to enable pax emulated trampolines])
    fi)
  
  FFI_EXEC_TRAMPOLINE_TABLE=0
--- 184,228 ----
  		  [Define if the compiler uses zarch features.])
      fi
      ;;
+   wasm64)
+     if test -z "$WASM64_MEMORY64"; then
+       WASM64_MEMORY64=1
+     fi
+     CFLAGS="$CFLAGS -sMEMORY64=$WASM64_MEMORY64"
+     ;;
  esac
  
  AC_CACHE_CHECK([whether compiler supports pointer authentication],
     libffi_cv_as_ptrauth, [
     libffi_cv_as_ptrauth=unknown
!    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
  #ifdef __clang__
  # if __has_feature(ptrauth_calls)
! #  define HAVE_ARM64E_PTRAUTH 1
  # endif
  #endif
  
! #ifndef HAVE_ARM64E_PTRAUTH
  # error Pointer authentication not supported
  #endif
! 		   ]])],[libffi_cv_as_ptrauth=yes],[libffi_cv_as_ptrauth=no])
  ])
  if test "x$libffi_cv_as_ptrauth" = xyes; then
!     AC_DEFINE(HAVE_ARM64E_PTRAUTH, 1,
  	      [Define if your compiler supports pointer authentication.])
  fi
  
! # On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC;
! # if EMUTRAMP is active too ffi could try mapping without PROT_EXEC,
! # but the kernel needs to recognize the trampoline generated by ffi.
! # Otherwise fallback to double mmap trick.
  AC_ARG_ENABLE(pax_emutramp,
!   [  --enable-pax_emutramp       enable pax emulated trampolines (experimental)],
    if test "$enable_pax_emutramp" = "yes"; then
+     AC_MSG_WARN([EMUTRAMP is experimental only.  Use --enable-pax_emutramp=experimental to enforce.])
+   elif test "$enable_pax_emutramp" = "experimental"; then
      AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1,
!       [Define this if you want to enable pax emulated trampolines (experimental)])
    fi)
  
  FFI_EXEC_TRAMPOLINE_TABLE=0
*************** case "$target" in
*** 225,231 ****
                   [Cannot use PROT_EXEC on this target, so, we revert to
                     alternative means])
       ;;
!      *-apple-* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*)
         AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
                   [Cannot use malloc on this target, so, we revert to
                     alternative means])
--- 233,239 ----
                   [Cannot use PROT_EXEC on this target, so, we revert to
                     alternative means])
       ;;
!      *-apple-* | *-*-dragonfly* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*)
         AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
                   [Cannot use malloc on this target, so, we revert to
                     alternative means])
*************** if test "x$GCC" = "xyes"; then
*** 271,277 ****
    	libffi_cv_ro_eh_frame=yes
    	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
    	if $CC $CFLAGS -c -fpic -fexceptions -fno-lto -o conftest.o conftest.c > /dev/null 2>&1; then
! 	    if $READELF -WS conftest.o | grep -q -n 'eh_frame .* WA'; then
  	        libffi_cv_ro_eh_frame=no
  	    fi
    	fi
--- 279,285 ----
    	libffi_cv_ro_eh_frame=yes
    	echo 'extern void foo (void); void bar (void) { foo (); foo (); }' > conftest.c
    	if $CC $CFLAGS -c -fpic -fexceptions -fno-lto -o conftest.o conftest.c > /dev/null 2>&1; then
! 	    if $READELF -WS conftest.o 2>/dev/null | $GREP -q -n 'eh_frame .* WA'; then
  	        libffi_cv_ro_eh_frame=no
  	    fi
    	fi
*************** if test "x$GCC" = "xyes"; then
*** 292,298 ****
    	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
    	libffi_cv_hidden_visibility_attribute=no
    	if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
!   	    if egrep '(\.hidden|\.private_extern).*foo' conftest.s >/dev/null; then
    		libffi_cv_hidden_visibility_attribute=yes
    	    fi
    	fi
--- 300,306 ----
    	echo 'int __attribute__ ((visibility ("hidden"))) foo (void) { return 1  ; }' > conftest.c
    	libffi_cv_hidden_visibility_attribute=no
    	if AC_TRY_COMMAND(${CC-cc} -Werror -S conftest.c -o conftest.s 1>&AS_MESSAGE_LOG_FD); then
!   	    if $EGREP '(\.hidden|\.private_extern).*foo|foo.*,hidden' conftest.s >/dev/null; then
    		libffi_cv_hidden_visibility_attribute=yes
    	    fi
    	fi
*************** AC_ARG_ENABLE(raw-api,
*** 365,377 ****
    fi)
  
  AC_ARG_ENABLE(exec-static-tramp,
! [  --enable-exec-static-tramp  enable use of static exec trampolines])
  
  if test "$enable_exec_static_tramp" = yes; then
  case "$target" in
!      *-cygwin*)
       ;;
!      *arm*-*-linux-* | aarch64*-*-linux-* | i*86-*-linux-* | x86_64-*-linux-*)
         AC_DEFINE(FFI_EXEC_STATIC_TRAMP, 1,
                   [Define this if you want statically defined trampolines])
       ;;
--- 373,390 ----
    fi)
  
  AC_ARG_ENABLE(exec-static-tramp,
! [  --enable-exec-static-tramp  enable use of static exec trampolines (disabled by default)])
  
  if test "$enable_exec_static_tramp" = yes; then
  case "$target" in
!      *-cygwin* | *-msys*)
!        # Only define static trampolines if we are using the cygwin runtime.
!        # Will this need to be changed for mingw?
!          AC_DEFINE(FFI_EXEC_STATIC_TRAMP, 1,
!                    [Define this if you want statically defined trampolines])
       ;;
!      *arm*-*-linux-* | aarch64*-*-linux-* | i*86-*-linux-* | x86_64-*-linux-* \
!      | loongarch*-*-linux-* | s390x*-linux-* | powerpc*-linux-*)
         AC_DEFINE(FFI_EXEC_STATIC_TRAMP, 1,
                   [Define this if you want statically defined trampolines])
       ;;
*************** else
*** 415,420 ****
--- 428,443 ----
    multilib_arg=
  fi
  
+ # Conditionalize the makefile for this target machine.
+ tmake_file_=
+ for f in ${tmake_file}; do
+   if test -f ${srcdir}/src/$TARGETDIR/$f; then
+      tmake_file_="${tmake_file_} \$(srcdir)/src/$TARGETDIR/$f"
+   fi
+ done
+ tmake_file="${tmake_file_}"
+ AC_SUBST(tmake_file)
+ 
  # Check linker support.
  LIBFFI_ENABLE_SYMVERS
  
diff -Nrcpad gcc-17-20260517/libffi/configure.host gcc-17-20260524/libffi/configure.host
*** gcc-17-20260517/libffi/configure.host	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/configure.host	Sun May 24 22:32:13 2026
***************
*** 6,12 ****
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
  # Most of the time we can define all the variables all at once...
  case "${host}" in
!   aarch64*-*-cygwin* | aarch64*-*-mingw* | aarch64*-*-win* )
  	TARGET=ARM_WIN64; TARGETDIR=aarch64
  	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
  	  MSVC=1
--- 6,12 ----
  # THIS TABLE IS SORTED.  KEEP IT THAT WAY.
  # Most of the time we can define all the variables all at once...
  case "${host}" in
!   aarch64*-*-cygwin* | aarch64*-*-msys* | aarch64*-*-mingw* | aarch64*-*-win* )
  	TARGET=ARM_WIN64; TARGETDIR=aarch64
  	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
  	  MSVC=1
*************** case "${host}" in
*** 30,36 ****
  	SOURCES="ffi.c arcompact.S"
  	;;
  
!   arm*-*-cygwin* | arm*-*-mingw* | arm*-*-win* )
  	TARGET=ARM_WIN32; TARGETDIR=arm
  	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
  	  MSVC=1
--- 30,36 ----
  	SOURCES="ffi.c arcompact.S"
  	;;
  
!   arm*-*-cygwin* | arm*-*-msys* | arm*-*-mingw* | arm*-*-win* )
  	TARGET=ARM_WIN32; TARGETDIR=arm
  	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
  	  MSVC=1
*************** case "${host}" in
*** 73,78 ****
--- 73,79 ----
  	;;
    hppa*64-*-hpux*)
  	TARGET=PA64_HPUX; TARGETDIR=pa
+ 	SOURCES="ffi64.c hpux64.S"
  	;;
    hppa*-*-hpux*)
  	TARGET=PA_HPUX; TARGETDIR=pa
*************** case "${host}" in
*** 83,90 ****
  	TARGET=X86_FREEBSD; TARGETDIR=x86
  	;;
  
!   i?86-*-cygwin* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \
!   | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* )
  	TARGETDIR=x86
  	if test $ac_cv_sizeof_size_t = 4; then
  	  TARGET=X86_WIN32
--- 84,91 ----
  	TARGET=X86_FREEBSD; TARGETDIR=x86
  	;;
  
!   i?86-*-cygwin* | i?86-*-msys* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \
!   | x86_64-*-cygwin* | x86_64-*-msys* | x86_64-*-mingw* | x86_64-*-win* )
  	TARGETDIR=x86
  	if test $ac_cv_sizeof_size_t = 4; then
  	  TARGET=X86_WIN32
*************** case "${host}" in
*** 184,194 ****
  	TARGET=MIPS; TARGETDIR=mips
  	;;
  
-   nios2*-linux*)
- 	TARGET=NIOS2; TARGETDIR=nios2
- 	SOURCES="ffi.c sysv.S"
- 	;;
- 
    or1k*-*-*)
  	TARGET=OR1K; TARGETDIR=or1k
  	SOURCES="ffi.c sysv.S"
--- 185,190 ----
*************** case "${host}" in
*** 204,210 ****
    powerpc-*-eabi*)
  	TARGET=POWERPC; TARGETDIR=powerpc
  	;;
!   powerpc-*-beos*)
  	TARGET=POWERPC; TARGETDIR=powerpc
  	;;
    powerpc-*-darwin* | powerpc64-*-darwin*)
--- 200,206 ----
    powerpc-*-eabi*)
  	TARGET=POWERPC; TARGETDIR=powerpc
  	;;
!   powerpc-*-beos* | powerpc-*-haiku*)
  	TARGET=POWERPC; TARGETDIR=powerpc
  	;;
    powerpc-*-darwin* | powerpc64-*-darwin*)
*************** case "${host}" in
*** 212,217 ****
--- 208,215 ----
  	;;
    powerpc-*-aix* | rs6000-*-aix*)
  	TARGET=POWERPC_AIX; TARGETDIR=powerpc
+ 	# Create AIX-style "FAT" libraries.
+ 	tmake_file="t-aix"
  	;;
    powerpc-*-freebsd* | powerpc-*-openbsd* | powerpc-*-netbsd*)
  	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
*************** case "${host}" in
*** 262,267 ****
--- 260,275 ----
  	SOURCES="ffi.c elfbsd.S"
  	;;
  
+   wasm32-*-*)
+ 	TARGET=wasm32; TARGETDIR=wasm
+ 	SOURCES="ffi.c"
+ 	;;
+ 
+   wasm64-*-*)
+ 	TARGET=wasm64; TARGETDIR=wasm
+ 	SOURCES="ffi.c"
+ 	;;
+ 
    xtensa*-*)
  	TARGET=XTENSA; TARGETDIR=xtensa
  	SOURCES="ffi.c sysv.S"
diff -Nrcpad gcc-17-20260517/libffi/doc/libffi.texi gcc-17-20260524/libffi/doc/libffi.texi
*** gcc-17-20260517/libffi/doc/libffi.texi	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/doc/libffi.texi	Sun May 24 22:32:13 2026
***************
*** 18,24 ****
  This manual is for libffi, a portable foreign function interface
  library.
  
! Copyright @copyright{} 2008--2019, 2021 Anthony Green and Red Hat, Inc.
  
  Permission is hereby granted, free of charge, to any person obtaining
  a copy of this software and associated documentation files (the
--- 18,24 ----
  This manual is for libffi, a portable foreign function interface
  library.
  
! Copyright @copyright{} 2008--2025 Anthony Green and Red Hat, Inc.
  
  Permission is hereby granted, free of charge, to any person obtaining
  a copy of this software and associated documentation files (the
*************** sometimes called the @dfn{ABI} or @dfn{A
*** 91,100 ****
  Some programs may not know at the time of compilation what arguments
  are to be passed to a function.  For instance, an interpreter may be
  told at run-time about the number and types of arguments used to call
! a given function.  @samp{Libffi} can be used in such programs to
  provide a bridge from the interpreter program to compiled code.
  
! The @samp{libffi} library provides a portable, high level programming
  interface to various calling conventions.  This allows a programmer to
  call any function specified by a call interface description at run
  time.
--- 91,100 ----
  Some programs may not know at the time of compilation what arguments
  are to be passed to a function.  For instance, an interpreter may be
  told at run-time about the number and types of arguments used to call
! a given function.  @code{libffi} can be used in such programs to
  provide a bridge from the interpreter program to compiled code.
  
! The @code{libffi} library provides a portable, high level programming
  interface to various calling conventions.  This allows a programmer to
  call any function specified by a call interface description at run
  time.
*************** time.
*** 102,110 ****
  @acronym{FFI} stands for Foreign Function Interface.  A foreign
  function interface is the popular name for the interface that allows
  code written in one language to call code written in another language.
! The @samp{libffi} library really only provides the lowest, machine
  dependent layer of a fully featured foreign function interface.  A
! layer must exist above @samp{libffi} that handles type conversions for
  values passed between the two languages.
  @cindex FFI
  @cindex Foreign Function Interface
--- 102,110 ----
  @acronym{FFI} stands for Foreign Function Interface.  A foreign
  function interface is the popular name for the interface that allows
  code written in one language to call code written in another language.
! The @code{libffi} library really only provides the lowest, machine
  dependent layer of a fully featured foreign function interface.  A
! layer must exist above @code{libffi} that handles type conversions for
  values passed between the two languages.
  @cindex FFI
  @cindex Foreign Function Interface
*************** values passed between the two languages.
*** 127,133 ****
  @node The Basics
  @section The Basics
  
! @samp{Libffi} assumes that you have a pointer to the function you wish
  to call and that you know the number and types of arguments to pass
  it, as well as the return type of the function.
  
--- 127,133 ----
  @node The Basics
  @section The Basics
  
! @code{libffi} assumes that you have a pointer to the function you wish
  to call and that you know the number and types of arguments to pass
  it, as well as the return type of the function.
  
*************** to ensure this.  If @var{cif} declares t
*** 213,234 ****
  @code{void} (using @code{ffi_type_void}), then @var{rvalue} is
  ignored.
  
! In most situations, @samp{libffi} will handle promotion according to
  the ABI.  However, for historical reasons, there is a special case
  with return values that must be handled by your code.  In particular,
  for integral (not @code{struct}) types that are narrower than the
  system register size, the return value will be widened by
! @samp{libffi}.  @samp{libffi} provides a type, @code{ffi_arg}, that
  can be used as the return type.  For example, if the CIF was defined
! with a return type of @code{char}, @samp{libffi} will try to store a
  full @code{ffi_arg} into the return value.
  
  @var{avalues} is a vector of @code{void *} pointers that point to the
  memory locations holding the argument values for a call.  If @var{cif}
  declares that the function has no arguments (i.e., @var{nargs} was 0),
! then @var{avalues} is ignored.  Note that argument values may be
! modified by the callee (for instance, structs passed by value); the
! burden of copying pass-by-value arguments is placed on the caller.
  
  Note that while the return value must be register-sized, arguments
  should exactly match their declared type.  For example, if an argument
--- 213,232 ----
  @code{void} (using @code{ffi_type_void}), then @var{rvalue} is
  ignored.
  
! In most situations, @code{libffi} will handle promotion according to
  the ABI.  However, for historical reasons, there is a special case
  with return values that must be handled by your code.  In particular,
  for integral (not @code{struct}) types that are narrower than the
  system register size, the return value will be widened by
! @code{libffi}.  @code{libffi} provides a type, @code{ffi_arg}, that
  can be used as the return type.  For example, if the CIF was defined
! with a return type of @code{char}, @code{libffi} will try to store a
  full @code{ffi_arg} into the return value.
  
  @var{avalues} is a vector of @code{void *} pointers that point to the
  memory locations holding the argument values for a call.  If @var{cif}
  declares that the function has no arguments (i.e., @var{nargs} was 0),
! then @var{avalues} is ignored.
  
  Note that while the return value must be register-sized, arguments
  should exactly match their declared type.  For example, if an argument
*************** object declared as @code{short}; but if
*** 238,243 ****
--- 236,264 ----
  a larger type -- usually @code{ffi_arg}.
  @end defun
  
+ @findex ffi_get_version
+ @defun {const char *} ffi_get_version (void)
+ Returns the library version as a string.  This string is also
+ available at build time as the macro @code{FFI_VERSION_STRING}.
+ @end defun
+ 
+ @findex ffi_get_version_number
+ @defun {unsigned long} ffi_get_version_number (void)
+ Returns the library version as an unsigned long value where
+ version ``x.y.z'' is represented as the number x*10000+y*100+z.
+ This number is also available at build time as the macro
+ @code{FFI_VERSION_NUMBER}.
+ @end defun
+ 
+ @findex ffi_get_default_abi
+ @defun {unsigned int} ffi_get_default_abi (void)
+ Return the value of @code{FFI_DEFAULT_ABI}.
+ @end defun
+ 
+ @findex ffi_get_closure_size
+ @defun {size_t} ffi_get_closure_size (void)
+ Return @code{sizeof(ffi_closure)}.
+ @end defun
  
  @node Simple Example
  @section Simple Example
*************** int main()
*** 265,278 ****
  		       &ffi_type_sint, args) == FFI_OK)
      @{
        s = "Hello World!";
!       ffi_call(&cif, puts, &rc, values);
        /* rc now holds the result of the call to puts */
  
        /* values holds a pointer to the function's arg, so to
           call puts() again all we need to do is change the
           value of s */
        s = "This is cool!";
!       ffi_call(&cif, puts, &rc, values);
      @}
  
    return 0;
--- 286,299 ----
  		       &ffi_type_sint, args) == FFI_OK)
      @{
        s = "Hello World!";
!       ffi_call(&cif, (void(*)())puts, &rc, values);
        /* rc now holds the result of the call to puts */
  
        /* values holds a pointer to the function's arg, so to
           call puts() again all we need to do is change the
           value of s */
        s = "This is cool!";
!       ffi_call(&cif, (void(*)())puts, &rc, values);
      @}
  
    return 0;
*************** when passing to @code{ffi_prep_cif}.
*** 412,419 ****
  @node Structures
  @subsection Structures
  
! @samp{libffi} is perfectly happy passing structures back and forth.
! You must first describe the structure to @samp{libffi} by creating a
  new @code{ffi_type} object for it.
  
  @tindex ffi_type
--- 433,440 ----
  @node Structures
  @subsection Structures
  
! @code{libffi} is perfectly happy passing structures back and forth.
! You must first describe the structure to @code{libffi} by creating a
  new @code{ffi_type} object for it.
  
  @tindex ffi_type
*************** For a structure, this should be set to @
*** 433,439 ****
  This is a @samp{NULL}-terminated array of pointers to @code{ffi_type}
  objects.  There is one element per field of the struct.
  
! Note that @samp{libffi} has no special support for bit-fields.  You
  must manage these manually.
  @end table
  @end deftp
--- 454,460 ----
  This is a @samp{NULL}-terminated array of pointers to @code{ffi_type}
  objects.  There is one element per field of the struct.
  
! Note that @code{libffi} has no special support for bit-fields.  You
  must manage these manually.
  @end table
  @end deftp
*************** valid here.
*** 510,516 ****
  
  @subsubsection Arrays
  
! @samp{libffi} does not have direct support for arrays or unions.
  However, they can be emulated using structures.
  
  To emulate an array, simply create an @code{ffi_type} using
--- 531,537 ----
  
  @subsubsection Arrays
  
! @code{libffi} does not have direct support for arrays or unions.
  However, they can be emulated using structures.
  
  To emulate an array, simply create an @code{ffi_type} using
*************** structure types created like this should
*** 537,543 ****
  members of real @code{FFI_TYPE_STRUCT} objects.
  
  However, a phony array type like this will not cause any errors from
! @samp{libffi} if you use it as an argument or return type.  This may
  be confusing.
  
  @subsubsection Unions
--- 558,564 ----
  members of real @code{FFI_TYPE_STRUCT} objects.
  
  However, a phony array type like this will not cause any errors from
! @code{libffi} if you use it as an argument or return type.  This may
  be confusing.
  
  @subsubsection Unions
*************** Here is the corresponding code to descri
*** 629,635 ****
  
        tm_type.size = tm_type.alignment = 0;
        tm_type.type = FFI_TYPE_STRUCT;
!       tm_type.elements = &tm_type_elements;
  
        for (i = 0; i < 9; i++)
            tm_type_elements[i] = &ffi_type_sint;
--- 650,656 ----
  
        tm_type.size = tm_type.alignment = 0;
        tm_type.type = FFI_TYPE_STRUCT;
!       tm_type.elements = tm_type_elements;
  
        for (i = 0; i < 9; i++)
            tm_type_elements[i] = &ffi_type_sint;
*************** Here is the corresponding code to descri
*** 646,652 ****
  @node Complex
  @subsection Complex Types
  
! @samp{libffi} supports the complex types defined by the C99
  standard (@code{_Complex float}, @code{_Complex double} and
  @code{_Complex long double} with the built-in type descriptors
  @code{ffi_type_complex_float}, @code{ffi_type_complex_double} and
--- 667,673 ----
  @node Complex
  @subsection Complex Types
  
! @code{libffi} supports the complex types defined by the C99
  standard (@code{_Complex float}, @code{_Complex double} and
  @code{_Complex long double} with the built-in type descriptors
  @code{ffi_type_complex_float}, @code{ffi_type_complex_double} and
*************** standard (@code{_Complex float}, @code{_
*** 654,660 ****
  
  Custom complex types like @code{_Complex int} can also be used.
  An @code{ffi_type} object has to be defined to describe the
! complex type to @samp{libffi}.
  
  @tindex ffi_type
  @deftp {Data type} ffi_type
--- 675,681 ----
  
  Custom complex types like @code{_Complex int} can also be used.
  An @code{ffi_type} object has to be defined to describe the
! complex type to @code{libffi}.
  
  @tindex ffi_type
  @deftp {Data type} ffi_type
*************** Free memory allocated using @code{ffi_cl
*** 821,827 ****
  the writable address that was returned.
  @end defun
  
- 
  Once you have allocated the memory for a closure, you must construct a
  @code{ffi_cif} describing the function call.  Finally you can prepare
  the closure function:
--- 842,847 ----
*************** type is @code{long double}.
*** 977,983 ****
  Note that memory allocated by @code{ffi_closure_alloc} and freed by
  @code{ffi_closure_free} does not come from the same general pool of
  memory that @code{malloc} and @code{free} use.  To accomodate security
! settings, @samp{libffi} may aquire memory, for example, by mapping
  temporary files into multiple places in the address space (once to
  write out the closure, a second to execute it).  The search follows
  this list, using the first that works:
--- 997,1003 ----
  Note that memory allocated by @code{ffi_closure_alloc} and freed by
  @code{ffi_closure_free} does not come from the same general pool of
  memory that @code{malloc} and @code{free} use.  To accomodate security
! settings, @code{libffi} may aquire memory, for example, by mapping
  temporary files into multiple places in the address space (once to
  write out the closure, a second to execute it).  The search follows
  this list, using the first that works:
diff -Nrcpad gcc-17-20260517/libffi/doc/version.texi gcc-17-20260524/libffi/doc/version.texi
*** gcc-17-20260517/libffi/doc/version.texi	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/doc/version.texi	Sun May 24 22:32:13 2026
***************
*** 1,4 ****
! @set UPDATED 31 August 2022
! @set UPDATED-MONTH August 2022
! @set EDITION 3.4.2
! @set VERSION 3.4.2
--- 1,4 ----
! @set UPDATED 2 August 2025
! @set UPDATED-MONTH August 2025
! @set EDITION 3.5.2
! @set VERSION 3.5.2
diff -Nrcpad gcc-17-20260517/libffi/fficonfig.h.in gcc-17-20260524/libffi/fficonfig.h.in
*** gcc-17-20260517/libffi/fficonfig.h.in	Sun May 17 22:32:18 2026
--- gcc-17-20260524/libffi/fficonfig.h.in	Sun May 24 22:32:17 2026
***************
*** 3,16 ****
  /* Define if building universal (internal helper macro) */
  #undef AC_APPLE_UNIVERSAL_BUILD
  
- /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-    systems. This function is required for `alloca.c' support on those systems.
-    */
- #undef CRAY_STACKSEG_END
- 
- /* Define to 1 if using `alloca.c'. */
- #undef C_ALLOCA
- 
  /* Define to the flags needed for the .section .eh_frame directive. */
  #undef EH_FRAME_FLAGS
  
--- 3,8 ----
***************
*** 23,29 ****
  /* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
  #undef FFI_EXEC_TRAMPOLINE_TABLE
  
! /* Define this if you want to enable pax emulated trampolines */
  #undef FFI_MMAP_EXEC_EMUTRAMP_PAX
  
  /* Cannot use malloc on this target, so, we revert to alternative means */
--- 15,22 ----
  /* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
  #undef FFI_EXEC_TRAMPOLINE_TABLE
  
! /* Define this if you want to enable pax emulated trampolines (experimental)
!    */
  #undef FFI_MMAP_EXEC_EMUTRAMP_PAX
  
  /* Cannot use malloc on this target, so, we revert to alternative means */
***************
*** 35,47 ****
  /* Define this if you do not want support for aggregate types. */
  #undef FFI_NO_STRUCTS
  
! /* Define to 1 if you have `alloca', as a function or macro. */
! #undef HAVE_ALLOCA
! 
! /* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
!    */
  #undef HAVE_ALLOCA_H
  
  /* Define if your assembler supports .cfi_* directives. */
  #undef HAVE_AS_CFI_PSEUDO_OP
  
--- 28,39 ----
  /* Define this if you do not want support for aggregate types. */
  #undef FFI_NO_STRUCTS
  
! /* Define to 1 if you have the <alloca.h> header file. */
  #undef HAVE_ALLOCA_H
  
+ /* Define if your compiler supports pointer authentication. */
+ #undef HAVE_ARM64E_PTRAUTH
+ 
  /* Define if your assembler supports .cfi_* directives. */
  #undef HAVE_AS_CFI_PSEUDO_OP
  
***************
*** 85,111 ****
  /* Define to 1 if you have the <memory.h> header file. */
  #undef HAVE_MEMORY_H
  
- /* Define to 1 if you have the `mkostemp' function. */
- #undef HAVE_MKOSTEMP
- 
- /* Define to 1 if you have the `mkstemp' function. */
- #undef HAVE_MKSTEMP
- 
- /* Define to 1 if you have the `mmap' function. */
- #undef HAVE_MMAP
- 
- /* Define if mmap with MAP_ANON(YMOUS) works. */
- #undef HAVE_MMAP_ANON
- 
- /* Define if mmap of /dev/zero works. */
- #undef HAVE_MMAP_DEV_ZERO
- 
- /* Define if read-only mmap of a plain file works. */
- #undef HAVE_MMAP_FILE
- 
- /* Define if your compiler supports pointer authentication. */
- #undef HAVE_PTRAUTH
- 
  /* Define if .eh_frame sections should be read-only. */
  #undef HAVE_RO_EH_FRAME
  
--- 77,82 ----
***************
*** 124,132 ****
  /* Define to 1 if you have the <sys/memfd.h> header file. */
  #undef HAVE_SYS_MEMFD_H
  
- /* Define to 1 if you have the <sys/mman.h> header file. */
- #undef HAVE_SYS_MMAN_H
- 
  /* Define to 1 if you have the <sys/stat.h> header file. */
  #undef HAVE_SYS_STAT_H
  
--- 95,100 ----
***************
*** 173,186 ****
  /* The size of `size_t', as computed by sizeof. */
  #undef SIZEOF_SIZE_T
  
- /* If using the C implementation of alloca, define if you know the
-    direction of stack growth for your system; otherwise it will be
-    automatically deduced at runtime.
- 	STACK_DIRECTION > 0 => grows toward higher addresses
- 	STACK_DIRECTION < 0 => grows toward lower addresses
- 	STACK_DIRECTION = 0 => direction of growth unknown */
- #undef STACK_DIRECTION
- 
  /* Define to 1 if you have the ANSI C header files. */
  #undef STDC_HEADERS
  
--- 141,146 ----
***************
*** 203,211 ****
  # endif
  #endif
  
- /* Define to `unsigned int' if <sys/types.h> does not define. */
- #undef size_t
- 
  
  #ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
  #ifdef LIBFFI_ASM
--- 163,168 ----
diff -Nrcpad gcc-17-20260517/libffi/generate-darwin-source-and-headers.py gcc-17-20260524/libffi/generate-darwin-source-and-headers.py
*** gcc-17-20260517/libffi/generate-darwin-source-and-headers.py	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/generate-darwin-source-and-headers.py	Sun May 24 22:32:13 2026
*************** class Platform(object):
*** 11,29 ****
      pass
  
  
! class simulator_platform(Platform):
!     arch = 'i386'
!     triple = 'i386-apple-darwin11'
! 
!     prefix = "#ifdef __i386__\n\n"
!     suffix = "\n\n#endif"
!     src_dir = 'x86'
!     src_files = ['sysv.S', 'ffi.c', 'internal.h']
! 
! 
! class simulator64_platform(Platform):
      arch = 'x86_64'
-     triple = 'x86_64-apple-darwin13'
  
      prefix = "#ifdef __x86_64__\n\n"
      suffix = "\n\n#endif"
--- 11,18 ----
      pass
  
  
! class x86_64_platform(Platform):
      arch = 'x86_64'
  
      prefix = "#ifdef __x86_64__\n\n"
      suffix = "\n\n#endif"
*************** class simulator64_platform(Platform):
*** 31,131 ****
      src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h']
  
  
! class device_platform(Platform):
!     arch = 'armv7'
!     triple = 'arm-apple-darwin11'
  
!     prefix = "#ifdef __arm__\n\n"
      suffix = "\n\n#endif"
!     src_dir = 'arm'
      src_files = ['sysv.S', 'ffi.c', 'internal.h']
  
  
! class device64_platform(Platform):
!     arch = 'arm64'
!     triple = 'aarch64-apple-darwin13'
  
!     prefix = "#ifdef __arm64__\n\n"
      suffix = "\n\n#endif"
!     src_dir = 'aarch64'
      src_files = ['sysv.S', 'ffi.c', 'internal.h']
  
  
! class ios_simulator_platform(simulator_platform):
      directory = 'darwin_ios'
      sdk = 'iphonesimulator'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_simulator64_platform(simulator64_platform):
      directory = 'darwin_ios'
      sdk = 'iphonesimulator'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_device_platform(device_platform):
      directory = 'darwin_ios'
      sdk = 'iphoneos'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_device64_platform(device64_platform):
      directory = 'darwin_ios'
      sdk = 'iphoneos'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class desktop32_platform(Platform):
      directory = 'darwin_osx'
      sdk = 'macosx'
-     arch = 'i386'
-     triple = 'i386-apple-darwin10'
      version_min = '-mmacosx-version-min=10.6'
-     src_dir = 'x86'
-     src_files = ['sysv.S', 'ffi.c', 'internal.h']
  
-     prefix = "#ifdef __i386__\n\n"
-     suffix = "\n\n#endif"
  
! 
! class desktop64_platform(Platform):
      directory = 'darwin_osx'
      sdk = 'macosx'
!     arch = 'x86_64'
!     triple = 'x86_64-apple-darwin10'
!     version_min = '-mmacosx-version-min=10.6'
  
-     prefix = "#ifdef __x86_64__\n\n"
-     suffix = "\n\n#endif"
-     src_dir = 'x86'
-     src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h']
  
  
! class tvos_simulator64_platform(simulator64_platform):
      directory = 'darwin_tvos'
      sdk = 'appletvsimulator'
      version_min = '-mtvos-version-min=9.0'
  
  
! class tvos_device64_platform(device64_platform):
      directory = 'darwin_tvos'
      sdk = 'appletvos'
      version_min = '-mtvos-version-min=9.0'
  
  
! class watchos_simulator_platform(simulator_platform):
      directory = 'darwin_watchos'
      sdk = 'watchsimulator'
      version_min = '-mwatchos-version-min=4.0'
  
  
! class watchos_device_platform(device_platform):
      directory = 'darwin_watchos'
      sdk = 'watchos'
      arch = 'armv7k'
      version_min = '-mwatchos-version-min=4.0'
  
  
  def mkdir_p(path):
      try:
          os.makedirs(path)
--- 20,136 ----
      src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h']
  
  
! class arm64_platform(Platform):
!     arch = 'arm64'
  
!     prefix = "#ifdef __arm64__\n\n"
      suffix = "\n\n#endif"
!     src_dir = 'aarch64'
      src_files = ['sysv.S', 'ffi.c', 'internal.h']
  
  
! class armv7_platform(Platform):
!     arch = 'armv7'
  
!     prefix = "#ifdef __arm__\n\n"
      suffix = "\n\n#endif"
!     src_dir = 'arm'
      src_files = ['sysv.S', 'ffi.c', 'internal.h']
  
  
! class ios_simulator_x86_64_platform(x86_64_platform):
!     target = 'x86_64-apple-ios-simulator'
      directory = 'darwin_ios'
      sdk = 'iphonesimulator'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_simulator_arm64_platform(arm64_platform):
!     target = 'arm64-apple-ios-simulator'
      directory = 'darwin_ios'
      sdk = 'iphonesimulator'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_device_armv7_platform(armv7_platform):
!     target = 'armv7-apple-ios'
      directory = 'darwin_ios'
      sdk = 'iphoneos'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class ios_device_arm64_platform(arm64_platform):
!     target = 'arm64-apple-ios'
      directory = 'darwin_ios'
      sdk = 'iphoneos'
      version_min = '-miphoneos-version-min=7.0'
  
  
! class desktop_x86_64_platform(x86_64_platform):
!     target = 'x86_64-apple-macos'
      directory = 'darwin_osx'
      sdk = 'macosx'
      version_min = '-mmacosx-version-min=10.6'
  
  
! class desktop_arm64_platform(arm64_platform):
!     target = 'arm64-apple-macos'
      directory = 'darwin_osx'
      sdk = 'macosx'
!     version_min = '-mmacosx-version-min=11.0'
  
  
+ class tvos_simulator_x86_64_platform(x86_64_platform):
+     target = 'x86_64-apple-tvos-simulator'
+     directory = 'darwin_tvos'
+     sdk = 'appletvsimulator'
+     version_min = '-mtvos-version-min=9.0'
  
! 
! class tvos_simulator_arm64_platform(arm64_platform):
!     target = 'arm64-apple-tvos-simulator'
      directory = 'darwin_tvos'
      sdk = 'appletvsimulator'
      version_min = '-mtvos-version-min=9.0'
  
  
! class tvos_device_arm64_platform(arm64_platform):
!     target = 'arm64-apple-tvos'
      directory = 'darwin_tvos'
      sdk = 'appletvos'
      version_min = '-mtvos-version-min=9.0'
  
  
! class watchos_simulator_x86_64_platform(x86_64_platform):
!     target = 'x86_64-apple-watchos-simulator'
      directory = 'darwin_watchos'
      sdk = 'watchsimulator'
      version_min = '-mwatchos-version-min=4.0'
  
  
! class watchos_simulator_arm64_platform(arm64_platform):
!     target = 'arm64-apple-watchos-simulator'
!     directory = 'darwin_watchos'
!     sdk = 'watchsimulator'
!     version_min = '-mwatchos-version-min=4.0'
! 
! 
! class watchos_device_armv7k_platform(armv7_platform):
!     target = 'armv7k-apple-watchos'
      directory = 'darwin_watchos'
      sdk = 'watchos'
      arch = 'armv7k'
      version_min = '-mwatchos-version-min=4.0'
  
  
+ class watchos_device_arm64_32_platform(arm64_platform):
+     target = 'arm64_32-apple-watchos'
+     directory = 'darwin_watchos'
+     sdk = 'watchos'
+     arch = 'arm64_32'
+     version_min = '-mwatchos-version-min=4.0'
+ 
+ 
  def mkdir_p(path):
      try:
          os.makedirs(path)
*************** def copy_src_platform_files(platform):
*** 175,192 ****
  
  def build_target(platform, platform_headers):
      def xcrun_cmd(cmd):
!         return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch)
  
      tag='%s-%s' % (platform.sdk, platform.arch)
      build_dir = 'build_%s' % tag
      mkdir_p(build_dir)
      env = dict(CC=xcrun_cmd('clang'),
                 LD=xcrun_cmd('ld'),
!                CFLAGS='%s -fembed-bitcode' % (platform.version_min))
      working_dir = os.getcwd()
      try:
          os.chdir(build_dir)
!         subprocess.check_call(['../configure', '-host', platform.triple], env=env)
      finally:
          os.chdir(working_dir)
  
--- 180,205 ----
  
  def build_target(platform, platform_headers):
      def xcrun_cmd(cmd):
!         return 'xcrun -sdk %s %s -target %s' % (platform.sdk, cmd, platform.target)
  
      tag='%s-%s' % (platform.sdk, platform.arch)
      build_dir = 'build_%s' % tag
      mkdir_p(build_dir)
      env = dict(CC=xcrun_cmd('clang'),
                 LD=xcrun_cmd('ld'),
!                CFLAGS='%s' % (platform.version_min))
      working_dir = os.getcwd()
      try:
          os.chdir(build_dir)
!         subprocess.check_call(
!             [
!                 "../configure",
!                 f"--host={platform.target}",
!             ] + (
!                 [] if platform.sdk == "macosx" else [f"--build={os.uname().machine}-apple-darwin"]
!             ),
!             env=env
!         )
      finally:
          os.chdir(working_dir)
  
*************** def generate_source_and_headers(
*** 212,245 ****
      copy_files('include', 'darwin_common/include', pattern='*.h')
  
      if generate_ios:
!         copy_src_platform_files(ios_simulator_platform)
!         copy_src_platform_files(ios_simulator64_platform)
!         copy_src_platform_files(ios_device_platform)
!         copy_src_platform_files(ios_device64_platform)
      if generate_osx:
!         copy_src_platform_files(desktop64_platform)
      if generate_tvos:
!         copy_src_platform_files(tvos_simulator64_platform)
!         copy_src_platform_files(tvos_device64_platform)
      if generate_watchos:
!         copy_src_platform_files(watchos_simulator_platform)
!         copy_src_platform_files(watchos_device_platform)
  
      platform_headers = collections.defaultdict(set)
  
      if generate_ios:
!         build_target(ios_simulator_platform, platform_headers)
!         build_target(ios_simulator64_platform, platform_headers)
!         build_target(ios_device_platform, platform_headers)
!         build_target(ios_device64_platform, platform_headers)
      if generate_osx:
!         build_target(desktop64_platform, platform_headers)
      if generate_tvos:
!         build_target(tvos_simulator64_platform, platform_headers)
!         build_target(tvos_device64_platform, platform_headers)
      if generate_watchos:
!         build_target(watchos_simulator_platform, platform_headers)
!         build_target(watchos_device_platform, platform_headers)
  
      mkdir_p('darwin_common/include')
      for header_name, tag_tuples in platform_headers.items():
--- 225,266 ----
      copy_files('include', 'darwin_common/include', pattern='*.h')
  
      if generate_ios:
!         copy_src_platform_files(ios_simulator_x86_64_platform)
!         copy_src_platform_files(ios_simulator_arm64_platform)
!         copy_src_platform_files(ios_device_armv7_platform)
!         copy_src_platform_files(ios_device_arm64_platform)
      if generate_osx:
!         copy_src_platform_files(desktop_x86_64_platform)
!         copy_src_platform_files(desktop_arm64_platform)
      if generate_tvos:
!         copy_src_platform_files(tvos_simulator_x86_64_platform)
!         copy_src_platform_files(tvos_simulator_arm64_platform)
!         copy_src_platform_files(tvos_device_arm64_platform)
      if generate_watchos:
!         copy_src_platform_files(watchos_simulator_x86_64_platform)
!         copy_src_platform_files(watchos_simulator_arm64_platform)
!         copy_src_platform_files(watchos_device_armv7k_platform)
!         copy_src_platform_files(watchos_device_arm64_32_platform)
  
      platform_headers = collections.defaultdict(set)
  
      if generate_ios:
!         build_target(ios_simulator_x86_64_platform, platform_headers)
!         build_target(ios_simulator_arm64_platform, platform_headers)
!         build_target(ios_device_armv7_platform, platform_headers)
!         build_target(ios_device_arm64_platform, platform_headers)
      if generate_osx:
!         build_target(desktop_x86_64_platform, platform_headers)
!         build_target(desktop_arm64_platform, platform_headers)
      if generate_tvos:
!         build_target(tvos_simulator_x86_64_platform, platform_headers)
!         build_target(tvos_simulator_arm64_platform, platform_headers)
!         build_target(tvos_device_arm64_platform, platform_headers)
      if generate_watchos:
!         build_target(watchos_simulator_x86_64_platform, platform_headers)
!         build_target(watchos_simulator_arm64_platform, platform_headers)
!         build_target(watchos_device_armv7k_platform, platform_headers)
!         build_target(watchos_device_arm64_32_platform, platform_headers)
  
      mkdir_p('darwin_common/include')
      for header_name, tag_tuples in platform_headers.items():
diff -Nrcpad gcc-17-20260517/libffi/include/Makefile.in gcc-17-20260524/libffi/include/Makefile.in
*** gcc-17-20260517/libffi/include/Makefile.in	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/include/Makefile.in	Sun May 24 22:32:13 2026
*************** am__define_uniq_tagged_files = \
*** 181,187 ****
  ETAGS = etags
  CTAGS = ctags
  ACLOCAL = @ACLOCAL@
- ALLOCA = @ALLOCA@
  AMTAR = @AMTAR@
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_LTLDFLAGS = @AM_LTLDFLAGS@
--- 181,186 ----
*************** ECHO_T = @ECHO_T@
*** 215,220 ****
--- 214,221 ----
  EGREP = @EGREP@
  EXEEXT = @EXEEXT@
  FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+ FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
+ FFI_VERSION_STRING = @FFI_VERSION_STRING@
  FGREP = @FGREP@
  GREP = @GREP@
  HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
*************** TARGET = @TARGET@
*** 263,268 ****
--- 264,270 ----
  TARGETDIR = @TARGETDIR@
  TARGET_OBJ = @TARGET_OBJ@
  VERSION = @VERSION@
+ WASM64_MEMORY64 = @WASM64_MEMORY64@
  abs_builddir = @abs_builddir@
  abs_srcdir = @abs_srcdir@
  abs_top_builddir = @abs_top_builddir@
*************** abs_top_srcdir = @abs_top_srcdir@
*** 270,275 ****
--- 272,278 ----
  ac_ct_CC = @ac_ct_CC@
  ac_ct_CXX = @ac_ct_CXX@
  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ ac_ct_READELF = @ac_ct_READELF@
  am__include = @am__include@
  am__leading_dot = @am__leading_dot@
  am__quote = @am__quote@
*************** target_alias = @target_alias@
*** 318,323 ****
--- 321,327 ----
  target_cpu = @target_cpu@
  target_os = @target_os@
  target_vendor = @target_vendor@
+ tmake_file = @tmake_file@
  toolexecdir = @toolexecdir@
  toolexeclibdir = @toolexeclibdir@
  top_build_prefix = @top_build_prefix@
diff -Nrcpad gcc-17-20260517/libffi/include/ffi.h.in gcc-17-20260524/libffi/include/ffi.h.in
*** gcc-17-20260517/libffi/include/ffi.h.in	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/include/ffi.h.in	Sun May 24 22:32:13 2026
***************
*** 1,6 ****
  /* -----------------------------------------------------------------*-C-*-
     libffi @VERSION@
!      - Copyright (c) 2011, 2014, 2019, 2021 Anthony Green
       - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
  
     Permission is hereby granted, free of charge, to any person
--- 1,6 ----
  /* -----------------------------------------------------------------*-C-*-
     libffi @VERSION@
!      - Copyright (c) 2011, 2014, 2019, 2021, 2022, 2024, 2025 Anthony Green
       - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
  
     Permission is hereby granted, free of charge, to any person
*************** extern "C" {
*** 56,61 ****
--- 56,86 ----
  
  /* ---- System configuration information --------------------------------- */
  
+ /* If these change, update src/mips/ffitarget.h. */
+ #define FFI_TYPE_VOID       0
+ #define FFI_TYPE_INT        1
+ #define FFI_TYPE_FLOAT      2
+ #define FFI_TYPE_DOUBLE     3
+ #if @HAVE_LONG_DOUBLE@
+ #define FFI_TYPE_LONGDOUBLE 4
+ #else
+ #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
+ #endif
+ #define FFI_TYPE_UINT8      5
+ #define FFI_TYPE_SINT8      6
+ #define FFI_TYPE_UINT16     7
+ #define FFI_TYPE_SINT16     8
+ #define FFI_TYPE_UINT32     9
+ #define FFI_TYPE_SINT32     10
+ #define FFI_TYPE_UINT64     11
+ #define FFI_TYPE_SINT64     12
+ #define FFI_TYPE_STRUCT     13
+ #define FFI_TYPE_POINTER    14
+ #define FFI_TYPE_COMPLEX    15
+ 
+ /* This should always refer to the last type code (for sanity checks).  */
+ #define FFI_TYPE_LAST       FFI_TYPE_COMPLEX
+ 
  #include <ffitarget.h>
  
  #ifndef LIBFFI_ASM
*************** typedef struct _ffi_type
*** 115,127 ****
     when using the static version of the library.
     Besides, as a workaround, they can define FFI_BUILDING if they
     *know* they are going to link with the static library.  */
! #if defined _MSC_VER
  # if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */
  #  define FFI_API __declspec(dllexport)
! # elif !defined FFI_BUILDING  /* Importing libffi.DLL */
  #  define FFI_API __declspec(dllimport)
- # else                        /* Building/linking static library */
- #  define FFI_API
  # endif
  #else
  # define FFI_API
--- 140,150 ----
     when using the static version of the library.
     Besides, as a workaround, they can define FFI_BUILDING if they
     *know* they are going to link with the static library.  */
! #if defined _MSC_VER && !defined(FFI_STATIC_BUILD)
  # if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */
  #  define FFI_API __declspec(dllexport)
! # else  /* Importing libffi.DLL */
  #  define FFI_API __declspec(dllimport)
  # endif
  #else
  # define FFI_API
*************** FFI_EXTERN ffi_type ffi_type_sint64;
*** 197,217 ****
  FFI_EXTERN ffi_type ffi_type_float;
  FFI_EXTERN ffi_type ffi_type_double;
  FFI_EXTERN ffi_type ffi_type_pointer;
- 
- #if @HAVE_LONG_DOUBLE@
  FFI_EXTERN ffi_type ffi_type_longdouble;
- #else
- #define ffi_type_longdouble ffi_type_double
- #endif
  
  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
  FFI_EXTERN ffi_type ffi_type_complex_float;
  FFI_EXTERN ffi_type ffi_type_complex_double;
- #if @HAVE_LONG_DOUBLE@
  FFI_EXTERN ffi_type ffi_type_complex_longdouble;
- #else
- #define ffi_type_complex_longdouble ffi_type_complex_double
- #endif
  #endif
  #endif /* LIBFFI_HIDE_BASIC_TYPES */
  
--- 220,231 ----
*************** void ffi_java_raw_to_ptrarray (ffi_cif *
*** 300,305 ****
--- 314,337 ----
  FFI_API
  size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated));
  
+ /* ---- Version API ------------------------------------------------------ */
+ 
+ #define FFI_VERSION_STRING "@FFI_VERSION_STRING@"
+ #define FFI_VERSION_NUMBER @FFI_VERSION_NUMBER@
+ 
+ #ifndef LIBFFI_ASM
+ /* Return a version string. */
+ FFI_API const char *ffi_get_version (void);
+ 
+ /* Return the version as an unsigned long value: (x * 10000 + y * 100 + z) */
+ FFI_API unsigned long ffi_get_version_number (void);
+ #endif
+ 
+ /* ---- Internals API ---------------------------------------------------- */
+ 
+ FFI_API unsigned int ffi_get_default_abi (void);
+ FFI_API size_t ffi_get_closure_size (void);
+ 
  /* ---- Definitions for closures ----------------------------------------- */
  
  #if FFI_CLOSURES
*************** typedef struct {
*** 320,325 ****
--- 352,360 ----
    ffi_cif   *cif;
    void     (*fun)(ffi_cif*,void*,void**,void*);
    void      *user_data;
+ #if defined(_MSC_VER) && defined(_M_IX86)
+   void      *padding;
+ #endif
  } ffi_closure
  #ifdef __GNUC__
      __attribute__((aligned (8)))
*************** typedef struct {
*** 335,348 ****
  FFI_API void *ffi_closure_alloc (size_t size, void **code);
  FFI_API void ffi_closure_free (void *);
  
- #if defined(PA_LINUX) || defined(PA_HPUX)
- #define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2))
- #define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3))
- #else
- #define FFI_CLOSURE_PTR(X) (X)
- #define FFI_RESTORE_PTR(X) (X)
- #endif
- 
  FFI_API ffi_status
  ffi_prep_closure (ffi_closure*,
  		  ffi_cif *,
--- 370,375 ----
*************** ffi_prep_closure_loc (ffi_closure*,
*** 360,366 ****
  		      ffi_cif *,
  		      void (*fun)(ffi_cif*,void*,void**,void*),
  		      void *user_data,
! 		      void*codeloc);
  
  #ifdef __sgi
  # pragma pack 8
--- 387,393 ----
  		      ffi_cif *,
  		      void (*fun)(ffi_cif*,void*,void**,void*),
  		      void *user_data,
! 		      void *codeloc);
  
  #ifdef __sgi
  # pragma pack 8
*************** typedef struct {
*** 378,384 ****
  
    /* If this is enabled, then a raw closure has the same layout
       as a regular closure.  We use this to install an intermediate
!      handler to do the transaltion, void** -> ffi_raw*.  */
  
    void     (*translate_args)(ffi_cif*,void*,void**,void*);
    void      *this_closure;
--- 405,411 ----
  
    /* If this is enabled, then a raw closure has the same layout
       as a regular closure.  We use this to install an intermediate
!      handler to do the translation, void** -> ffi_raw*.  */
  
    void     (*translate_args)(ffi_cif*,void*,void**,void*);
    void      *this_closure;
*************** ffi_prep_java_raw_closure_loc (ffi_java_
*** 446,452 ****
  
  #endif /* FFI_CLOSURES */
  
! #if FFI_GO_CLOSURES
  
  typedef struct {
    void      *tramp;
--- 473,479 ----
  
  #endif /* FFI_CLOSURES */
  
! #ifdef FFI_GO_CLOSURES
  
  typedef struct {
    void      *tramp;
*************** FFI_API
*** 489,526 ****
  ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type,
  				   size_t *offsets);
  
! /* Useful for eliminating compiler warnings.  */
  #define FFI_FN(f) ((void (*)(void))f)
  
  /* ---- Definitions shared with assembly code ---------------------------- */
  
  #endif
  
- /* If these change, update src/mips/ffitarget.h. */
- #define FFI_TYPE_VOID       0
- #define FFI_TYPE_INT        1
- #define FFI_TYPE_FLOAT      2
- #define FFI_TYPE_DOUBLE     3
- #if @HAVE_LONG_DOUBLE@
- #define FFI_TYPE_LONGDOUBLE 4
- #else
- #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
- #endif
- #define FFI_TYPE_UINT8      5
- #define FFI_TYPE_SINT8      6
- #define FFI_TYPE_UINT16     7
- #define FFI_TYPE_SINT16     8
- #define FFI_TYPE_UINT32     9
- #define FFI_TYPE_SINT32     10
- #define FFI_TYPE_UINT64     11
- #define FFI_TYPE_SINT64     12
- #define FFI_TYPE_STRUCT     13
- #define FFI_TYPE_POINTER    14
- #define FFI_TYPE_COMPLEX    15
- 
- /* This should always refer to the last type code (for sanity checks).  */
- #define FFI_TYPE_LAST       FFI_TYPE_COMPLEX
- 
  #ifdef __cplusplus
  }
  #endif
--- 516,534 ----
  ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type,
  				   size_t *offsets);
  
! /* Convert between closure and function pointers.  */
! #if defined(PA_LINUX) || defined(PA_HPUX)
! #define FFI_FN(f) ((void (*)(void))((unsigned int)(f) | 2))
! #define FFI_CL(f) ((void *)((unsigned int)(f) & ~3))
! #else
  #define FFI_FN(f) ((void (*)(void))f)
+ #define FFI_CL(f) ((void *)(f))
+ #endif
  
  /* ---- Definitions shared with assembly code ---------------------------- */
  
  #endif
  
  #ifdef __cplusplus
  }
  #endif
diff -Nrcpad gcc-17-20260517/libffi/include/ffi_cfi.h gcc-17-20260524/libffi/include/ffi_cfi.h
*** gcc-17-20260517/libffi/include/ffi_cfi.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/include/ffi_cfi.h	Sun May 24 22:32:13 2026
***************
*** 46,55 ****
  # define cfi_remember_state		.cfi_remember_state
  # define cfi_restore_state		.cfi_restore_state
  # define cfi_window_save		.cfi_window_save
- # define cfi_negate_ra_state		.cfi_negate_ra_state
  # define cfi_personality(enc, exp)	.cfi_personality enc, exp
  # define cfi_lsda(enc, exp)		.cfi_lsda enc, exp
  # define cfi_escape(...)		.cfi_escape __VA_ARGS__
  
  #else
  
--- 46,55 ----
  # define cfi_remember_state		.cfi_remember_state
  # define cfi_restore_state		.cfi_restore_state
  # define cfi_window_save		.cfi_window_save
  # define cfi_personality(enc, exp)	.cfi_personality enc, exp
  # define cfi_lsda(enc, exp)		.cfi_lsda enc, exp
  # define cfi_escape(...)		.cfi_escape __VA_ARGS__
+ # define cfi_window_save		.cfi_window_save
  
  #else
  
***************
*** 69,78 ****
  # define cfi_remember_state
  # define cfi_restore_state
  # define cfi_window_save
- # define cfi_negate_ra_state
  # define cfi_personality(enc, exp)
  # define cfi_lsda(enc, exp)
  # define cfi_escape(...)
  
  #endif /* HAVE_AS_CFI_PSEUDO_OP */
  #endif /* FFI_CFI_H */
--- 69,78 ----
  # define cfi_remember_state
  # define cfi_restore_state
  # define cfi_window_save
  # define cfi_personality(enc, exp)
  # define cfi_lsda(enc, exp)
  # define cfi_escape(...)
+ # define cfi_window_save
  
  #endif /* HAVE_AS_CFI_PSEUDO_OP */
  #endif /* FFI_CFI_H */
diff -Nrcpad gcc-17-20260517/libffi/include/ffi_common.h gcc-17-20260524/libffi/include/ffi_common.h
*** gcc-17-20260517/libffi/include/ffi_common.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/include/ffi_common.h	Sun May 24 22:32:13 2026
*************** extern "C" {
*** 49,56 ****
--- 49,58 ----
  #  endif
  # endif
  # define MAYBE_UNUSED __attribute__((__unused__))
+ # define NORETURN __attribute__((__noreturn__))
  #else
  # define MAYBE_UNUSED
+ # define NORETURN
  # if HAVE_ALLOCA_H
  #  include <alloca.h>
  # else
*************** char *alloca ();
*** 81,90 ****
  #include <stdio.h>
  #endif
  
  #ifdef FFI_DEBUG
! void ffi_assert(char *expr, char *file, int line);
  void ffi_stop_here(void);
! void ffi_type_test(ffi_type *a, char *file, int line);
  
  #define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__))
  #define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l)))
--- 83,109 ----
  #include <stdio.h>
  #endif
  
+ #ifndef __SANITIZE_ADDRESS__
+ # ifdef __clang__
+ #  if __has_feature(address_sanitizer)
+ #   define FFI_ASAN
+ #  endif
+ # endif
+ #endif
+ #ifdef __SANITIZE_ADDRESS__
+ #define FFI_ASAN
+ #endif
+ 
+ #ifdef FFI_ASAN
+ #define FFI_ASAN_NO_SANITIZE __attribute__((no_sanitize_address))
+ #else
+ #define FFI_ASAN_NO_SANITIZE
+ #endif
+ 
  #ifdef FFI_DEBUG
! NORETURN void ffi_assert(const char *expr, const char *file, int line);
  void ffi_stop_here(void);
! void ffi_type_test(ffi_type *a, const char *file, int line);
  
  #define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__))
  #define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l)))
*************** void *ffi_data_to_code_pointer (void *da
*** 128,133 ****
--- 147,156 ----
     static trampoline. */
  int ffi_tramp_is_present (void *closure) FFI_HIDDEN;
  
+ /* Return a file descriptor of a temporary zero-sized file in a
+    writable and executable filesystem. */
+ int open_temp_exec_file(void) FFI_HIDDEN;
+ 
  /* Extended cif, used in callback from assembly routine */
  typedef struct
  {
diff -Nrcpad gcc-17-20260517/libffi/libffi.map.in gcc-17-20260524/libffi/libffi.map.in
*** gcc-17-20260517/libffi/libffi.map.in	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/libffi.map.in	Sun May 24 22:32:13 2026
*************** LIBFFI_BASE_8.0 {
*** 23,29 ****
  	ffi_type_longdouble;
  	ffi_type_pointer;
  
- 	/* Exported functions.  */
  	ffi_call;
  	ffi_prep_cif;
  	ffi_prep_cif_var;
--- 23,28 ----
*************** LIBFFI_BASE_8.0 {
*** 33,39 ****
--- 32,41 ----
  	ffi_raw_to_ptrarray;
  	ffi_raw_size;
  
+ #if !FFI_NATIVE_RAW_API
  	ffi_java_raw_call;
+ #endif
+ 
  	ffi_java_ptrarray_to_raw;
  	ffi_java_raw_to_ptrarray;
  	ffi_java_raw_size;
*************** LIBFFI_BASE_8.0 {
*** 43,48 ****
--- 45,63 ----
  	*;
  };
  
+ /* ----------------------------------------------------------------------
+    Symbols **added in libffi 3.5.0**.
+    Give them a fresh namespace so that package managers notice when
+    code requires a newer libffi than 3.4.x.
+    -------------------------------------------------------------------- */
+ LIBFFI_BASE_8.1 {
+   global:
+     ffi_get_version;
+     ffi_get_version_number;
+     ffi_get_default_abi;
+     ffi_get_closure_size;
+ } LIBFFI_BASE_8.0;
+ 
  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
  LIBFFI_COMPLEX_8.0 {
    global:
*************** LIBFFI_CLOSURE_8.0 {
*** 62,69 ****
--- 77,86 ----
  	ffi_prep_closure_loc;
  	ffi_prep_raw_closure;
  	ffi_prep_raw_closure_loc;
+ #if !FFI_NATIVE_RAW_API
  	ffi_prep_java_raw_closure;
  	ffi_prep_java_raw_closure_loc;
+ #endif
  } LIBFFI_BASE_8.0;
  #endif
  
diff -Nrcpad gcc-17-20260517/libffi/libtool-version gcc-17-20260524/libffi/libtool-version
*** gcc-17-20260517/libffi/libtool-version	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/libtool-version	Sun May 24 22:32:13 2026
***************
*** 5,11 ****
  #
  # Here are a set of rules to help you update your library version
  # information:
! # 
  # 1. Start with version information of `0:0:0' for each libtool library.
  #
  # 2. Update the version information only immediately before a public
--- 5,11 ----
  #
  # Here are a set of rules to help you update your library version
  # information:
! #
  # 1. Start with version information of `0:0:0' for each libtool library.
  #
  # 2. Update the version information only immediately before a public
***************
*** 26,29 ****
  #    release, then set age to 0.
  #
  # CURRENT:REVISION:AGE
! 9:0:1
--- 26,29 ----
  #    release, then set age to 0.
  #
  # CURRENT:REVISION:AGE
! 10:0:2
diff -Nrcpad gcc-17-20260517/libffi/man/Makefile.in gcc-17-20260524/libffi/man/Makefile.in
*** gcc-17-20260517/libffi/man/Makefile.in	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/man/Makefile.in	Sun May 24 22:32:13 2026
*************** NROFF = nroff
*** 163,169 ****
  MANS = $(man_MANS)
  am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
  ACLOCAL = @ACLOCAL@
- ALLOCA = @ALLOCA@
  AMTAR = @AMTAR@
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_LTLDFLAGS = @AM_LTLDFLAGS@
--- 163,168 ----
*************** ECHO_T = @ECHO_T@
*** 197,202 ****
--- 196,203 ----
  EGREP = @EGREP@
  EXEEXT = @EXEEXT@
  FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+ FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
+ FFI_VERSION_STRING = @FFI_VERSION_STRING@
  FGREP = @FGREP@
  GREP = @GREP@
  HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
*************** TARGET = @TARGET@
*** 245,250 ****
--- 246,252 ----
  TARGETDIR = @TARGETDIR@
  TARGET_OBJ = @TARGET_OBJ@
  VERSION = @VERSION@
+ WASM64_MEMORY64 = @WASM64_MEMORY64@
  abs_builddir = @abs_builddir@
  abs_srcdir = @abs_srcdir@
  abs_top_builddir = @abs_top_builddir@
*************** abs_top_srcdir = @abs_top_srcdir@
*** 252,257 ****
--- 254,260 ----
  ac_ct_CC = @ac_ct_CC@
  ac_ct_CXX = @ac_ct_CXX@
  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ ac_ct_READELF = @ac_ct_READELF@
  am__include = @am__include@
  am__leading_dot = @am__leading_dot@
  am__quote = @am__quote@
*************** target_alias = @target_alias@
*** 300,305 ****
--- 303,309 ----
  target_cpu = @target_cpu@
  target_os = @target_os@
  target_vendor = @target_vendor@
+ tmake_file = @tmake_file@
  toolexecdir = @toolexecdir@
  toolexeclibdir = @toolexeclibdir@
  top_build_prefix = @top_build_prefix@
diff -Nrcpad gcc-17-20260517/libffi/src/aarch64/ffi.c gcc-17-20260524/libffi/src/aarch64/ffi.c
*** gcc-17-20260517/libffi/src/aarch64/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/aarch64/ffi.c	Sun May 24 22:32:13 2026
*************** struct call_context
*** 64,70 ****
  #if FFI_EXEC_TRAMPOLINE_TABLE
  
  #ifdef __MACH__
! #ifdef HAVE_PTRAUTH
  #include <ptrauth.h>
  #endif
  #include <mach/vm_param.h>
--- 64,70 ----
  #if FFI_EXEC_TRAMPOLINE_TABLE
  
  #ifdef __MACH__
! #ifdef HAVE_ARM64E_PTRAUTH
  #include <ptrauth.h>
  #endif
  #include <mach/vm_param.h>
*************** is_vfp_type (const ffi_type *ty)
*** 249,261 ****
     state.
  
     The terse state variable names match the names used in the AARCH64
!    PCS. */
  
  struct arg_state
  {
    unsigned ngrn;                /* Next general-purpose register number. */
    unsigned nsrn;                /* Next vector register number. */
    size_t nsaa;                  /* Next stack offset. */
  
  #if defined (__APPLE__)
    unsigned allocating_variadic;
--- 249,266 ----
     state.
  
     The terse state variable names match the names used in the AARCH64
!    PCS.
! 
!    The struct area is allocated downwards from the top of the argument
!    area.  It is used to hold copies of structures passed by value that are
!    bigger than 16 bytes.  */
  
  struct arg_state
  {
    unsigned ngrn;                /* Next general-purpose register number. */
    unsigned nsrn;                /* Next vector register number. */
    size_t nsaa;                  /* Next stack offset. */
+   size_t next_struct_area;	/* Place to allocate big structs. */
  
  #if defined (__APPLE__)
    unsigned allocating_variadic;
*************** struct arg_state
*** 264,274 ****
  
  /* Initialize a procedure call argument marshalling state.  */
  static void
! arg_init (struct arg_state *state)
  {
    state->ngrn = 0;
    state->nsrn = 0;
    state->nsaa = 0;
  #if defined (__APPLE__)
    state->allocating_variadic = 0;
  #endif
--- 269,280 ----
  
  /* Initialize a procedure call argument marshalling state.  */
  static void
! arg_init (struct arg_state *state, size_t size)
  {
    state->ngrn = 0;
    state->nsrn = 0;
    state->nsaa = 0;
+   state->next_struct_area = size;
  #if defined (__APPLE__)
    state->allocating_variadic = 0;
  #endif
*************** allocate_to_stack (struct arg_state *sta
*** 290,326 ****
    if (alignment < 8)
      alignment = 8;
  #endif
!     
    nsaa = FFI_ALIGN (nsaa, alignment);
    state->nsaa = nsaa + size;
  
    return (char *)stack + nsaa;
  }
  
  static ffi_arg
  extend_integer_type (void *source, int type)
  {
    switch (type)
      {
      case FFI_TYPE_UINT8:
!       return *(UINT8 *) source;
      case FFI_TYPE_SINT8:
!       return *(SINT8 *) source;
      case FFI_TYPE_UINT16:
!       return *(UINT16 *) source;
      case FFI_TYPE_SINT16:
!       return *(SINT16 *) source;
      case FFI_TYPE_UINT32:
!       return *(UINT32 *) source;
      case FFI_TYPE_INT:
      case FFI_TYPE_SINT32:
!       return *(SINT32 *) source;
      case FFI_TYPE_UINT64:
      case FFI_TYPE_SINT64:
!       return *(UINT64 *) source;
!       break;
      case FFI_TYPE_POINTER:
!       return *(uintptr_t *) source;
      default:
        abort();
      }
--- 296,378 ----
    if (alignment < 8)
      alignment = 8;
  #endif
! 
    nsaa = FFI_ALIGN (nsaa, alignment);
    state->nsaa = nsaa + size;
  
    return (char *)stack + nsaa;
  }
  
+ /* Allocate and copy a structure that is passed by value on the stack and
+    return a pointer to it.  */
+ static void *
+ allocate_and_copy_struct_to_stack (struct arg_state *state, void *stack,
+ 				   size_t alignment, size_t size, void *value)
+ {
+   size_t dest = state->next_struct_area - size;
+ 
+   /* Round down to the natural alignment of the value.  */
+   dest = FFI_ALIGN_DOWN (dest, alignment);
+   state->next_struct_area = dest;
+ 
+   return memcpy ((char *) stack + dest, value, size);
+ }
+ 
  static ffi_arg
  extend_integer_type (void *source, int type)
  {
    switch (type)
      {
      case FFI_TYPE_UINT8:
!       {
!         UINT8 u8;
!         memcpy (&u8, source, sizeof (u8));
!         return u8;
!       }
      case FFI_TYPE_SINT8:
!       {
!         SINT8 s8;
!         memcpy (&s8, source, sizeof (s8));
!         return s8;
!       }
      case FFI_TYPE_UINT16:
!       {
!         UINT16 u16;
!         memcpy (&u16, source, sizeof (u16));
!         return u16;
!       }
      case FFI_TYPE_SINT16:
!       {
!         SINT16 s16;
!         memcpy (&s16, source, sizeof (s16));
!         return s16;
!       }
      case FFI_TYPE_UINT32:
!       {
!         UINT32 u32;
!         memcpy (&u32, source, sizeof (u32));
!         return u32;
!       }
      case FFI_TYPE_INT:
      case FFI_TYPE_SINT32:
!       {
!         SINT32 s32;
!         memcpy (&s32, source, sizeof (s32));
!         return s32;
!       }
      case FFI_TYPE_UINT64:
      case FFI_TYPE_SINT64:
!       {
!         UINT64 u64;
!         memcpy (&u64, source, sizeof (u64));
!         return u64;
!       }
      case FFI_TYPE_POINTER:
!       {
!         uintptr_t uptr;
!         memcpy (&uptr, source, sizeof (uptr));
!         return uptr;
!       }
      default:
        abort();
      }
*************** extend_hfa_type (void *dest, void *src,
*** 335,385 ****
    ssize_t f = h - AARCH64_RET_S4;
    void *x0;
  
    asm volatile (
  	"adr	%0, 0f\n"
  "	add	%0, %0, %1\n"
  "	br	%0\n"
! "0:	ldp	s16, s17, [%3]\n"	/* S4 */
  "	ldp	s18, s19, [%3, #8]\n"
  "	b	4f\n"
! "	ldp	s16, s17, [%3]\n"	/* S3 */
  "	ldr	s18, [%3, #8]\n"
  "	b	3f\n"
! "	ldp	s16, s17, [%3]\n"	/* S2 */
  "	b	2f\n"
  "	nop\n"
! "	ldr	s16, [%3]\n"		/* S1 */
  "	b	1f\n"
  "	nop\n"
! "	ldp	d16, d17, [%3]\n"	/* D4 */
  "	ldp	d18, d19, [%3, #16]\n"
  "	b	4f\n"
! "	ldp	d16, d17, [%3]\n"	/* D3 */
  "	ldr	d18, [%3, #16]\n"
  "	b	3f\n"
! "	ldp	d16, d17, [%3]\n"	/* D2 */
  "	b	2f\n"
  "	nop\n"
! "	ldr	d16, [%3]\n"		/* D1 */
  "	b	1f\n"
  "	nop\n"
! "	ldp	q16, q17, [%3]\n"	/* Q4 */
  "	ldp	q18, q19, [%3, #32]\n"
  "	b	4f\n"
! "	ldp	q16, q17, [%3]\n"	/* Q3 */
  "	ldr	q18, [%3, #32]\n"
  "	b	3f\n"
! "	ldp	q16, q17, [%3]\n"	/* Q2 */
  "	b	2f\n"
  "	nop\n"
! "	ldr	q16, [%3]\n"		/* Q1 */
  "	b	1f\n"
  "4:	str	q19, [%2, #48]\n"
  "3:	str	q18, [%2, #32]\n"
  "2:	str	q17, [%2, #16]\n"
  "1:	str	q16, [%2]"
      : "=&r"(x0)
!     : "r"(f * 12), "r"(dest), "r"(src)
      : "memory", "v16", "v17", "v18", "v19");
  }
  #endif
--- 387,450 ----
    ssize_t f = h - AARCH64_RET_S4;
    void *x0;
  
+ #define BTI_J "hint #36"
    asm volatile (
  	"adr	%0, 0f\n"
  "	add	%0, %0, %1\n"
  "	br	%0\n"
! "0:	"BTI_J"\n"			/* S4 */
! "	ldp	s16, s17, [%3]\n"
  "	ldp	s18, s19, [%3, #8]\n"
  "	b	4f\n"
! "	"BTI_J"\n"			/* S3 */
! "	ldp	s16, s17, [%3]\n"
  "	ldr	s18, [%3, #8]\n"
  "	b	3f\n"
! "	"BTI_J"\n"			/* S2 */
! "	ldp	s16, s17, [%3]\n"
  "	b	2f\n"
  "	nop\n"
! "	"BTI_J"\n"			/* S1 */
! "	ldr	s16, [%3]\n"
  "	b	1f\n"
  "	nop\n"
! "	"BTI_J"\n"			/* D4 */
! "	ldp	d16, d17, [%3]\n"
  "	ldp	d18, d19, [%3, #16]\n"
  "	b	4f\n"
! "	"BTI_J"\n"			/* D3 */
! "	ldp	d16, d17, [%3]\n"
  "	ldr	d18, [%3, #16]\n"
  "	b	3f\n"
! "	"BTI_J"\n"			/* D2 */
! "	ldp	d16, d17, [%3]\n"
  "	b	2f\n"
  "	nop\n"
! "	"BTI_J"\n"			/* D1 */
! "	ldr	d16, [%3]\n"
  "	b	1f\n"
  "	nop\n"
! "	"BTI_J"\n"			/* Q4 */
! "	ldp	q16, q17, [%3]\n"
  "	ldp	q18, q19, [%3, #32]\n"
  "	b	4f\n"
! "	"BTI_J"\n"			/* Q3 */
! "	ldp	q16, q17, [%3]\n"
  "	ldr	q18, [%3, #32]\n"
  "	b	3f\n"
! "	"BTI_J"\n"			/* Q2 */
! "	ldp	q16, q17, [%3]\n"
  "	b	2f\n"
  "	nop\n"
! "	"BTI_J"\n"			/* Q1 */
! "	ldr	q16, [%3]\n"
  "	b	1f\n"
  "4:	str	q19, [%2, #48]\n"
  "3:	str	q18, [%2, #32]\n"
  "2:	str	q17, [%2, #16]\n"
  "1:	str	q16, [%2]"
      : "=&r"(x0)
!     : "r"(f * 16), "r"(dest), "r"(src)
      : "memory", "v16", "v17", "v18", "v19");
  }
  #endif
*************** extern void ffi_call_SYSV (struct call_c
*** 581,587 ****
  			   void *closure) FFI_HIDDEN;
  
  /* Call a function with the provided arguments and capture the return
!    value.  */
  static void
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue,
  	      void **avalue, void *closure)
--- 646,655 ----
  			   void *closure) FFI_HIDDEN;
  
  /* Call a function with the provided arguments and capture the return
!    value.
!    n.b. ffi_call_SYSV will steal the alloca'd `stack` variable here for use
!    _as its own stack_ - so we need to compile this function without ASAN */
! FFI_ASAN_NO_SANITIZE
  static void
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue,
  	      void **avalue, void *closure)
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 618,637 ****
    else if (flags & AARCH64_RET_NEED_COPY)
      rsize = 16;
  
!   /* Allocate consectutive stack for everything we'll need.
       The frame uses 40 bytes for: lr, fp, rvalue, flags, sp */
    context = alloca (sizeof(struct call_context) + stack_bytes + 40 + rsize);
    stack = context + 1;
    frame = (void*)((uintptr_t)stack + (uintptr_t)stack_bytes);
    rvalue = (rsize ? (void*)((uintptr_t)frame + 40) : orig_rvalue);
  
!   arg_init (&state);
    for (i = 0, nargs = cif->nargs; i < nargs; i++)
      {
        ffi_type *ty = cif->arg_types[i];
        size_t s = ty->size;
        void *a = avalue[i];
        int h, t;
  
        t = ty->type;
        switch (t)
--- 686,706 ----
    else if (flags & AARCH64_RET_NEED_COPY)
      rsize = 16;
  
!   /* Allocate consecutive stack for everything we'll need.
       The frame uses 40 bytes for: lr, fp, rvalue, flags, sp */
    context = alloca (sizeof(struct call_context) + stack_bytes + 40 + rsize);
    stack = context + 1;
    frame = (void*)((uintptr_t)stack + (uintptr_t)stack_bytes);
    rvalue = (rsize ? (void*)((uintptr_t)frame + 40) : orig_rvalue);
  
!   arg_init (&state, stack_bytes);
    for (i = 0, nargs = cif->nargs; i < nargs; i++)
      {
        ffi_type *ty = cif->arg_types[i];
        size_t s = ty->size;
        void *a = avalue[i];
        int h, t;
+       void *dest;
  
        t = ty->type;
        switch (t)
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 679,686 ****
  	case FFI_TYPE_STRUCT:
  	case FFI_TYPE_COMPLEX:
  	  {
- 	    void *dest;
- 
  	    h = is_vfp_type (ty);
  	    if (h)
  	      {
--- 748,753 ----
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 713,721 ****
  	    else if (s > 16)
  	      {
  		/* If the argument is a composite type that is larger than 16
! 		   bytes, then the argument has been copied to memory, and
  		   the argument is replaced by a pointer to the copy.  */
! 		a = &avalue[i];
  		t = FFI_TYPE_POINTER;
  		s = sizeof (void *);
  		goto do_pointer;
--- 780,791 ----
  	    else if (s > 16)
  	      {
  		/* If the argument is a composite type that is larger than 16
! 		   bytes, then the argument is copied to memory, and
  		   the argument is replaced by a pointer to the copy.  */
! 		dest = allocate_and_copy_struct_to_stack (&state, stack,
! 							  ty->alignment, s,
! 							  avalue[i]);
! 		a = &dest;
  		t = FFI_TYPE_POINTER;
  		s = sizeof (void *);
  		goto do_pointer;
*************** ffi_prep_closure_loc (ffi_closure *closu
*** 803,823 ****
      return FFI_BAD_ABI;
  
    void (*start)(void);
!   
    if (cif->flags & AARCH64_FLAG_ARG_V)
      start = ffi_closure_SYSV_V;
    else
      start = ffi_closure_SYSV;
  
  #if FFI_EXEC_TRAMPOLINE_TABLE
! #ifdef __MACH__
! #ifdef HAVE_PTRAUTH
    codeloc = ptrauth_auth_data(codeloc, ptrauth_key_function_pointer, 0);
! #endif
    void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE);
    config[0] = closure;
    config[1] = start;
! #endif
  #else
    static const unsigned char trampoline[16] = {
      0x90, 0x00, 0x00, 0x58,	/* ldr	x16, tramp+16	*/
--- 873,893 ----
      return FFI_BAD_ABI;
  
    void (*start)(void);
! 
    if (cif->flags & AARCH64_FLAG_ARG_V)
      start = ffi_closure_SYSV_V;
    else
      start = ffi_closure_SYSV;
  
  #if FFI_EXEC_TRAMPOLINE_TABLE
! # ifdef __MACH__
! #  ifdef HAVE_ARM64E_PTRAUTH
    codeloc = ptrauth_auth_data(codeloc, ptrauth_key_function_pointer, 0);
! #  endif
    void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE);
    config[0] = closure;
    config[1] = start;
! # endif
  #else
    static const unsigned char trampoline[16] = {
      0x90, 0x00, 0x00, 0x58,	/* ldr	x16, tramp+16	*/
*************** ffi_prep_closure_loc (ffi_closure *closu
*** 826,832 ****
    };
    char *tramp = closure->tramp;
  
! #if defined(FFI_EXEC_STATIC_TRAMP)
    if (ffi_tramp_is_present(closure))
      {
        /* Initialize the static trampoline's parameters. */
--- 896,902 ----
    };
    char *tramp = closure->tramp;
  
! # if defined(FFI_EXEC_STATIC_TRAMP)
    if (ffi_tramp_is_present(closure))
      {
        /* Initialize the static trampoline's parameters. */
*************** ffi_prep_closure_loc (ffi_closure *closu
*** 837,861 ****
        ffi_tramp_set_parms (closure->ftramp, start, closure);
        goto out;
      }
! #endif
  
    /* Initialize the dynamic trampoline. */
    memcpy (tramp, trampoline, sizeof(trampoline));
!   
    *(UINT64 *)(tramp + 16) = (uintptr_t)start;
  
    ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE);
  
    /* Also flush the cache for code mapping.  */
! #ifdef _WIN32
    // Not using dlmalloc.c for Windows ARM64 builds
    // so calling ffi_data_to_code_pointer() isn't necessary
    unsigned char *tramp_code = tramp;
!   #else
    unsigned char *tramp_code = ffi_data_to_code_pointer (tramp);
!   #endif
    ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE);
  out:
  #endif
  
    closure->cif = cif;
--- 907,933 ----
        ffi_tramp_set_parms (closure->ftramp, start, closure);
        goto out;
      }
! # endif
  
    /* Initialize the dynamic trampoline. */
    memcpy (tramp, trampoline, sizeof(trampoline));
! 
    *(UINT64 *)(tramp + 16) = (uintptr_t)start;
  
    ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE);
  
    /* Also flush the cache for code mapping.  */
! # ifdef _WIN32
    // Not using dlmalloc.c for Windows ARM64 builds
    // so calling ffi_data_to_code_pointer() isn't necessary
    unsigned char *tramp_code = tramp;
! # else
    unsigned char *tramp_code = ffi_data_to_code_pointer (tramp);
! # endif
    ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE);
+ # if defined(FFI_EXEC_STATIC_TRAMP)
  out:
+ # endif
  #endif
  
    closure->cif = cif;
*************** ffi_closure_SYSV_inner (ffi_cif *cif,
*** 918,924 ****
    int i, h, nargs, flags, isvariadic = 0;
    struct arg_state state;
  
!   arg_init (&state);
  
    flags = cif->flags;
    if (flags & AARCH64_FLAG_VARARG)
--- 990,996 ----
    int i, h, nargs, flags, isvariadic = 0;
    struct arg_state state;
  
!   arg_init (&state, cif->bytes);
  
    flags = cif->flags;
    if (flags & AARCH64_FLAG_VARARG)
*************** ffi_closure_SYSV_inner (ffi_cif *cif,
*** 967,973 ****
                      {
                        void *reg = &context->x[state.ngrn];
                        state.ngrn += (unsigned int)n;
!     
                        /* Eeek! We need a pointer to the structure, however the
                         homogeneous float elements are being passed in individual
                         registers, therefore for float and double the structure
--- 1039,1045 ----
                      {
                        void *reg = &context->x[state.ngrn];
                        state.ngrn += (unsigned int)n;
! 
                        /* Eeek! We need a pointer to the structure, however the
                         homogeneous float elements are being passed in individual
                         registers, therefore for float and double the structure
*************** ffi_closure_SYSV_inner (ffi_cif *cif,
*** 1005,1013 ****
--- 1077,1094 ----
              {
                /* Replace Composite type of size greater than 16 with a
                    pointer.  */
+ #ifdef __ILP32__
+              UINT64 avalue_tmp;
+              memcpy (&avalue_tmp,
+                   allocate_int_to_reg_or_stack (context, &state,
+                                                stack, sizeof (void *)),
+                   sizeof (UINT64));
+              avalue[i] = (void *)(UINT32)avalue_tmp;
+ #else
                avalue[i] = *(void **)
                allocate_int_to_reg_or_stack (context, &state, stack,
                                           sizeof (void *));
+ #endif
              }
            else
              {
diff -Nrcpad gcc-17-20260517/libffi/src/aarch64/ffitarget.h gcc-17-20260524/libffi/src/aarch64/ffitarget.h
*** gcc-17-20260517/libffi/src/aarch64/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/aarch64/ffitarget.h	Sun May 24 22:32:13 2026
*************** typedef enum ffi_abi
*** 83,90 ****
  
  #if defined (__APPLE__)
  #define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs
! #elif !defined(_WIN32)
! /* iOS and Windows reserve x18 for the system.  Disable Go closures until
     a new static chain is chosen.  */
  #define FFI_GO_CLOSURES 1
  #endif
--- 83,90 ----
  
  #if defined (__APPLE__)
  #define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs
! #elif !defined(_WIN32) && !defined(__ANDROID__)
! /* iOS, Windows and Android reserve x18 for the system.  Disable Go closures until
     a new static chain is chosen.  */
  #define FFI_GO_CLOSURES 1
  #endif
diff -Nrcpad gcc-17-20260517/libffi/src/aarch64/internal.h gcc-17-20260524/libffi/src/aarch64/internal.h
*** gcc-17-20260517/libffi/src/aarch64/internal.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/aarch64/internal.h	Sun May 24 22:32:13 2026
*************** SOFTWARE OR THE USE OR OTHER DEALINGS IN
*** 81,100 ****
  /* Helpers for writing assembly compatible with arm ptr auth */
  #ifdef LIBFFI_ASM
  
! #ifdef HAVE_PTRAUTH
! #define SIGN_LR pacibsp
! #define SIGN_LR_WITH_REG(x) pacib lr, x
! #define AUTH_LR_AND_RET retab
! #define AUTH_LR_WITH_REG(x) autib lr, x
! #define BRANCH_AND_LINK_TO_REG blraaz
! #define BRANCH_TO_REG braaz
! #else
! #define SIGN_LR
! #define SIGN_LR_WITH_REG(x)
! #define AUTH_LR_AND_RET ret
! #define AUTH_LR_WITH_REG(x)
! #define BRANCH_AND_LINK_TO_REG blr
! #define BRANCH_TO_REG br
! #endif
  
! #endif
--- 81,146 ----
  /* Helpers for writing assembly compatible with arm ptr auth */
  #ifdef LIBFFI_ASM
  
!   #if defined(HAVE_ARM64E_PTRAUTH)
!   /* ARM64E ABI For Darwin */
!   #define SIGN_LR pacibsp
!   #define SIGN_LR_WITH_REG(x) pacib lr, x
!   #define AUTH_LR_AND_RET retab
!   #define AUTH_LR_WITH_REG(x) autib lr, x
!   #define BRANCH_AND_LINK_TO_REG blraaz
!   #define SIGN_LR_LINUX_ONLY
!   #define BRANCH_TO_REG braaz
!   #define PAC_CFI_WINDOW_SAVE
!   #define GNU_PROPERTY_AARCH64_POINTER_AUTH 0
!   /* Linux PAC Support */
!   #elif defined(__ARM_FEATURE_PAC_DEFAULT)
!     #define GNU_PROPERTY_AARCH64_POINTER_AUTH (1 << 1)
!     #define PAC_CFI_WINDOW_SAVE cfi_window_save
!     #define TMP_REG x9
!     #define BRANCH_TO_REG br
!     #define BRANCH_AND_LINK_TO_REG blr
! 	#define SIGN_LR_LINUX_ONLY SIGN_LR
!     /* Which key to sign with? */
!     #if (__ARM_FEATURE_PAC_DEFAULT & 1) == 1
!       /* Signed with A-key */
!       #define SIGN_LR            hint #25  /* paciasp */
!       #define AUTH_LR            hint #29  /* autiasp */
!     #else
!       /* Signed with B-key */
!       #define SIGN_LR            hint #27  /* pacibsp */
!       #define AUTH_LR            hint #31  /* autibsp */
!     #endif /* __ARM_FEATURE_PAC_DEFAULT */
!     #define AUTH_LR_WITH_REG(x) _auth_lr_with_reg x
! .macro _auth_lr_with_reg modifier
!     mov TMP_REG, sp
!     mov sp, \modifier
!     AUTH_LR
!     mov sp, TMP_REG
! .endm
!   #define SIGN_LR_WITH_REG(x) _sign_lr_with_reg x
! .macro _sign_lr_with_reg modifier
!     mov TMP_REG, sp
!     mov sp, \modifier
!     SIGN_LR
!     mov sp, TMP_REG
! .endm
!   #define AUTH_LR_AND_RET _auth_lr_and_ret modifier
! .macro _auth_lr_and_ret modifier
!     AUTH_LR
!     ret
! .endm
!   #undef TMP_REG
  
!   /* No Pointer Auth */
!   #else
!     #define SIGN_LR
!     #define SIGN_LR_WITH_REG(x)
!     #define AUTH_LR_AND_RET ret
!     #define AUTH_LR_WITH_REG(x)
!     #define BRANCH_AND_LINK_TO_REG blr
!     #define SIGN_LR_LINUX_ONLY
!     #define BRANCH_TO_REG br
!     #define PAC_CFI_WINDOW_SAVE
!     #define GNU_PROPERTY_AARCH64_POINTER_AUTH 0
!   #endif /* HAVE_ARM64E_PTRAUTH */
! #endif /* LIBFFI_ASM */
diff -Nrcpad gcc-17-20260517/libffi/src/aarch64/sysv.S gcc-17-20260524/libffi/src/aarch64/sysv.S
*** gcc-17-20260517/libffi/src/aarch64/sysv.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/aarch64/sysv.S	Sun May 24 22:32:13 2026
*************** SOFTWARE OR THE USE OR OTHER DEALINGS IN
*** 40,45 ****
--- 40,51 ----
  #endif
  #endif
  
+ #ifdef __APPLE__
+ # define L(X)     CONCAT1(L, X)
+ #else
+ # define L(X)     CONCAT1(.L, X)
+ #endif
+ 
  #ifdef __AARCH64EB__
  # define BE(X)	X
  #else
*************** SOFTWARE OR THE USE OR OTHER DEALINGS IN
*** 58,63 ****
--- 64,76 ----
  #define PTR_SIZE	8
  #endif
  
+ #define BTI_C hint #34
+ #define BTI_J hint #36
+ /*
+  * The ELF Notes section needs to indicate if BTI is supported, as the first ELF loaded that doesn't
+  * declare this support disables it for memory region containing the loaded library.
+  */
+ # define GNU_PROPERTY_AARCH64_BTI (1 << 0)         /* Has Branch Target Identification */
  	.text
  	.align 4
  
*************** SOFTWARE OR THE USE OR OTHER DEALINGS IN
*** 76,104 ****
     x5 closure
  */
  
- 	cfi_startproc
  CNAME(ffi_call_SYSV):
! 	/* Sign the lr with x1 since that is where it will be stored */
  	SIGN_LR_WITH_REG(x1)
  
! 	/* Use a stack frame allocated by our caller.  */
! #if defined(HAVE_PTRAUTH) && defined(__APPLE__)
  	/* darwin's libunwind assumes that the cfa is the sp and that's the data
  	 * used to sign the lr.  In order to allow unwinding through this
  	 * function it is necessary to point the cfa at the signing register.
  	 */
  	cfi_def_cfa(x1, 0);
- #else
- 	cfi_def_cfa(x1, 40);
  #endif
  	stp	x29, x30, [x1]
  	mov	x9, sp
  	str	x9, [x1, #32]
  	mov	x29, x1
- 	mov	sp, x0
  	cfi_def_cfa_register(x29)
! 	cfi_rel_offset (x29, 0)
! 	cfi_rel_offset (x30, 8)
  
  	mov	x9, x2			/* save fn */
  	mov	x8, x3			/* install structure return */
--- 89,118 ----
     x5 closure
  */
  
  CNAME(ffi_call_SYSV):
! 	cfi_startproc
! 	BTI_C
! 	PAC_CFI_WINDOW_SAVE
! 	/* Sign the lr with x1 since that is the CFA which is the modifer used in auth instructions */
  	SIGN_LR_WITH_REG(x1)
  
! #if defined(HAVE_ARM64E_PTRAUTH) && defined(__APPLE__)
  	/* darwin's libunwind assumes that the cfa is the sp and that's the data
  	 * used to sign the lr.  In order to allow unwinding through this
  	 * function it is necessary to point the cfa at the signing register.
  	 */
  	cfi_def_cfa(x1, 0);
  #endif
+ 	/* Use a stack frame allocated by our caller.  */
  	stp	x29, x30, [x1]
+ 	cfi_def_cfa_register(x1)
+ 	cfi_rel_offset (x29, 0)
+ 	cfi_rel_offset (x30, 8)
  	mov	x9, sp
  	str	x9, [x1, #32]
  	mov	x29, x1
  	cfi_def_cfa_register(x29)
! 	mov	sp, x0
  
  	mov	x9, x2			/* save fn */
  	mov	x8, x3			/* install structure return */
*************** CNAME(ffi_call_SYSV):
*** 138,215 ****
  	/* Save the return value as directed.  */
  	adr	x5, 0f
  	and	w4, w4, #AARCH64_RET_MASK
! 	add	x5, x5, x4, lsl #3
  	br	x5
  
! 	/* Note that each table entry is 2 insns, and thus 8 bytes.
  	   For integer data, note that we're storing into ffi_arg
  	   and therefore we want to extend to 64 bits; these types
  	   have two consecutive entries allocated for them.  */
  	.align	4
! 0:	b 99f				/* VOID */
  	nop
! 1:	str	x0, [x3]		/* INT64 */
  	b 99f
! 2:	stp	x0, x1, [x3]		/* INT128 */
  	b 99f
  3:	brk	#1000			/* UNUSED */
  	b 99f
  4:	brk	#1000			/* UNUSED */
  	b 99f
  5:	brk	#1000			/* UNUSED */
  	b 99f
  6:	brk	#1000			/* UNUSED */
  	b 99f
  7:	brk	#1000			/* UNUSED */
  	b 99f
! 8:	st4	{ v0.s, v1.s, v2.s, v3.s }[0], [x3]	/* S4 */
  	b 99f
! 9:	st3	{ v0.s, v1.s, v2.s }[0], [x3]	/* S3 */
  	b 99f
! 10:	stp	s0, s1, [x3]		/* S2 */
  	b 99f
! 11:	str	s0, [x3]		/* S1 */
  	b 99f
! 12:	st4	{ v0.d, v1.d, v2.d, v3.d }[0], [x3]	/* D4 */
  	b 99f
! 13:	st3	{ v0.d, v1.d, v2.d }[0], [x3]	/* D3 */
  	b 99f
! 14:	stp	d0, d1, [x3]		/* D2 */
  	b 99f
! 15:	str	d0, [x3]		/* D1 */
  	b 99f
- 16:	str	q3, [x3, #48]		/* Q4 */
  	nop
! 17:	str	q2, [x3, #32]		/* Q3 */
  	nop
! 18:	stp	q0, q1, [x3]		/* Q2 */
  	b 99f
! 19:	str	q0, [x3]		/* Q1 */
  	b 99f
! 20:	uxtb	w0, w0			/* UINT8 */
  	str	x0, [x3]
  21:	b 99f				/* reserved */
  	nop
! 22:	uxth	w0, w0			/* UINT16 */
  	str	x0, [x3]
  23:	b 99f				/* reserved */
  	nop
! 24:	mov	w0, w0			/* UINT32 */
  	str	x0, [x3]
  25:	b 99f				/* reserved */
  	nop
! 26:	sxtb	x0, w0			/* SINT8 */
  	str	x0, [x3]
  27:	b 99f				/* reserved */
  	nop
! 28:	sxth	x0, w0			/* SINT16 */
  	str	x0, [x3]
  29:	b 99f				/* reserved */
  	nop
! 30:	sxtw	x0, w0			/* SINT32 */
  	str	x0, [x3]
  31:	b 99f				/* reserved */
  	nop
  
  	/* Return now that result has been populated. */
  99:
--- 152,293 ----
  	/* Save the return value as directed.  */
  	adr	x5, 0f
  	and	w4, w4, #AARCH64_RET_MASK
! 	add	x5, x5, x4, lsl #4
  	br	x5
  
! 	/* Note that each table entry is 4 insns, and thus 16 bytes.
  	   For integer data, note that we're storing into ffi_arg
  	   and therefore we want to extend to 64 bits; these types
  	   have two consecutive entries allocated for them.  */
  	.align	4
! 0:	BTI_J				/* VOID */
! 	b 99f
! 	nop 
  	nop
! 1:	BTI_J				/* INT64 */
! 	str	x0, [x3]
  	b 99f
! 	nop
! 2:	BTI_J				/* INT128 */
! 	stp	x0, x1, [x3]
  	b 99f
+ 	nop
  3:	brk	#1000			/* UNUSED */
  	b 99f
+ 	nop
+ 	nop
  4:	brk	#1000			/* UNUSED */
  	b 99f
+ 	nop
+ 	nop
  5:	brk	#1000			/* UNUSED */
  	b 99f
+ 	nop
+ 	nop
  6:	brk	#1000			/* UNUSED */
  	b 99f
+ 	nop
+ 	nop
  7:	brk	#1000			/* UNUSED */
  	b 99f
! 	nop
! 	nop
! 8:	BTI_J				/* S4 */
! 	st4	{ v0.s, v1.s, v2.s, v3.s }[0], [x3]
  	b 99f
! 	nop
! 9:	BTI_J				/* S3 */
! 	st3	{ v0.s, v1.s, v2.s }[0], [x3]
  	b 99f
! 	nop
! 10:	BTI_J				/* S2 */
! 	stp	s0, s1, [x3]
  	b 99f
! 	nop
! 11:	BTI_J
! 	str	s0, [x3]		/* S1 */
  	b 99f
! 	nop
! 12:	BTI_J				/* D4 */
! 	st4	{ v0.d, v1.d, v2.d, v3.d }[0], [x3]
  	b 99f
! 	nop
! 13:	BTI_J				/* D3 */
! 	st3	{ v0.d, v1.d, v2.d }[0], [x3]
  	b 99f
! 	nop
! 14:	BTI_J				/* D2 */
! 	stp	d0, d1, [x3]
  	b 99f
! 	nop
! 15:	BTI_J				/* D1 */
! 	str	d0, [x3]
  	b 99f
  	nop
! 16:	BTI_J				/* Q4 */
! 	str	q3, [x3, #48]
  	nop
! 	nop
! 17:	BTI_J				/* Q3 */
! 	str	q2, [x3, #32]
! 	nop
! 	nop
! 18:	BTI_J				/* Q2 */
! 	stp	q0, q1, [x3]
  	b 99f
! 	nop
! 19:	BTI_J				/* Q1 */
! 	str	q0, [x3]
  	b 99f
! 	nop
! 20:	BTI_J				/* UINT8 */
! 	uxtb	w0, w0
  	str	x0, [x3]
+ 	nop
  21:	b 99f				/* reserved */
  	nop
! 	nop
! 	nop
! 22:	BTI_J				/* UINT16 */
! 	uxth	w0, w0
  	str	x0, [x3]
+ 	nop
  23:	b 99f				/* reserved */
  	nop
! 	nop
! 	nop
! 24:	BTI_J				/* UINT32 */
! 	mov	w0, w0
  	str	x0, [x3]
+ 	nop
  25:	b 99f				/* reserved */
  	nop
! 	nop
! 	nop
! 26:	BTI_J				/* SINT8 */
! 	sxtb	x0, w0
  	str	x0, [x3]
+ 	nop
  27:	b 99f				/* reserved */
  	nop
! 	nop
! 	nop
! 28:	BTI_J				/* SINT16 */
! 	sxth	x0, w0
  	str	x0, [x3]
+ 	nop
  29:	b 99f				/* reserved */
  	nop
! 	nop
! 	nop
! 30:	BTI_J				/* SINT32 */
! 	sxtw	x0, w0
  	str	x0, [x3]
+ 	nop
  31:	b 99f				/* reserved */
  	nop
+ 	nop
+ 	nop
  
  	/* Return now that result has been populated. */
  99:
*************** CNAME(ffi_call_SYSV):
*** 246,252 ****
--- 324,332 ----
  	.align 4
  CNAME(ffi_closure_SYSV_V):
  	cfi_startproc
+ 	BTI_C
  	SIGN_LR
+ 	PAC_CFI_WINDOW_SAVE
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
*************** CNAME(ffi_closure_SYSV_V):
*** 268,276 ****
  #endif
  
  	.align	4
- 	cfi_startproc
  CNAME(ffi_closure_SYSV):
  	SIGN_LR
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
--- 348,358 ----
  #endif
  
  	.align	4
  CNAME(ffi_closure_SYSV):
+ 	cfi_startproc
+ 	BTI_C
  	SIGN_LR
+ 	PAC_CFI_WINDOW_SAVE
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
*************** CNAME(ffi_closure_SYSV):
*** 288,294 ****
  	ldp	PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET]	/* load cif, fn */
  	ldr	PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2]	/* load user_data */
  #ifdef FFI_GO_CLOSURES
! .Ldo_closure:
  #endif
  	add	x3, sp, #16				/* load context */
  	add	x4, sp, #ffi_closure_SYSV_FS		/* load stack */
--- 370,376 ----
  	ldp	PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET]	/* load cif, fn */
  	ldr	PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2]	/* load user_data */
  #ifdef FFI_GO_CLOSURES
! L(do_closure):
  #endif
  	add	x3, sp, #16				/* load context */
  	add	x4, sp, #ffi_closure_SYSV_FS		/* load stack */
*************** CNAME(ffi_closure_SYSV):
*** 299,371 ****
  	/* Load the return value as directed.  */
  	adr	x1, 0f
  	and	w0, w0, #AARCH64_RET_MASK
! 	add	x1, x1, x0, lsl #3
  	add	x3, sp, #16+CALL_CONTEXT_SIZE
  	br	x1
  
! 	/* Note that each table entry is 2 insns, and thus 8 bytes.  */
  	.align	4
! 0:	b	99f			/* VOID */
  	nop
! 1:	ldr	x0, [x3]		/* INT64 */
  	b	99f
! 2:	ldp	x0, x1, [x3]		/* INT128 */
  	b	99f
  3:	brk	#1000			/* UNUSED */
  	nop
  4:	brk	#1000			/* UNUSED */
  	nop
  5:	brk	#1000			/* UNUSED */
  	nop
  6:	brk	#1000			/* UNUSED */
  	nop
  7:	brk	#1000			/* UNUSED */
  	nop
- 8:	ldr	s3, [x3, #12]		/* S4 */
  	nop
- 9:	ldr	s2, [x3, #8]		/* S3 */
  	nop
! 10:	ldp	s0, s1, [x3]		/* S2 */
  	b	99f
! 11:	ldr	s0, [x3]		/* S1 */
  	b	99f
- 12:	ldr	d3, [x3, #24]		/* D4 */
  	nop
! 13:	ldr	d2, [x3, #16]		/* D3 */
  	nop
! 14:	ldp	d0, d1, [x3]		/* D2 */
  	b	99f
! 15:	ldr	d0, [x3]		/* D1 */
  	b	99f
- 16:	ldr	q3, [x3, #48]		/* Q4 */
  	nop
! 17:	ldr	q2, [x3, #32]		/* Q3 */
  	nop
! 18:	ldp	q0, q1, [x3]		/* Q2 */
  	b	99f
! 19:	ldr	q0, [x3]		/* Q1 */
  	b	99f
! 20:	ldrb	w0, [x3, #BE(7)]	/* UINT8 */
  	b	99f
  21:	brk	#1000			/* reserved */
  	nop
! 22:	ldrh	w0, [x3, #BE(6)]	/* UINT16 */
  	b	99f
  23:	brk	#1000			/* reserved */
  	nop
! 24:	ldr	w0, [x3, #BE(4)]	/* UINT32 */
  	b	99f
  25:	brk	#1000			/* reserved */
  	nop
! 26:	ldrsb	x0, [x3, #BE(7)]	/* SINT8 */
  	b	99f
  27:	brk	#1000			/* reserved */
  	nop
! 28:	ldrsh	x0, [x3, #BE(6)]	/* SINT16 */
  	b	99f
  29:	brk	#1000			/* reserved */
  	nop
! 30:	ldrsw	x0, [x3, #BE(4)]	/* SINT32 */
  	nop
  31:					/* reserved */
  99:	ldp     x29, x30, [sp], #ffi_closure_SYSV_FS
--- 381,515 ----
  	/* Load the return value as directed.  */
  	adr	x1, 0f
  	and	w0, w0, #AARCH64_RET_MASK
! 	add	x1, x1, x0, lsl #4
  	add	x3, sp, #16+CALL_CONTEXT_SIZE
  	br	x1
  
! 	/* Note that each table entry is 4 insns, and thus 16 bytes.  */
  	.align	4
! 0:	BTI_J				/* VOID */
! 	b	99f
  	nop
! 	nop
! 1:	BTI_J				/* INT64 */
! 	ldr	x0, [x3]
  	b	99f
! 	nop
! 2:	BTI_J				/* INT128 */
! 	ldp	x0, x1, [x3]
  	b	99f
+ 	nop
  3:	brk	#1000			/* UNUSED */
  	nop
+ 	nop
+ 	nop
  4:	brk	#1000			/* UNUSED */
  	nop
+ 	nop
+ 	nop
  5:	brk	#1000			/* UNUSED */
  	nop
+ 	nop
+ 	nop
  6:	brk	#1000			/* UNUSED */
  	nop
+ 	nop
+ 	nop
  7:	brk	#1000			/* UNUSED */
  	nop
  	nop
  	nop
! 8:	BTI_J				/* S4 */
! 	ldr	s3, [x3, #12]
! 	nop
! 	nop
! 9:	BTI_J				/* S3 */
! 	ldr	s2, [x3, #8]
! 	nop
! 	nop
! 10:	BTI_J				/* S2 */
! 	ldp	s0, s1, [x3]
  	b	99f
! 	nop
! 11:	BTI_J				/* S1 */
! 	ldr	s0, [x3]
  	b	99f
  	nop
! 12:	BTI_J				/* D4 */
! 	ldr	d3, [x3, #24]
  	nop
! 	nop
! 13:	BTI_J				/* D3 */
! 	ldr	d2, [x3, #16]
! 	nop
! 	nop
! 14:	BTI_J				/* D2 */
! 	ldp	d0, d1, [x3]
  	b	99f
! 	nop
! 15:	BTI_J				/* D1 */
! 	ldr	d0, [x3]
  	b	99f
  	nop
! 16:	BTI_J				/* Q4 */
! 	ldr	q3, [x3, #48]
  	nop
! 	nop
! 17:	BTI_J				/* Q3 */
! 	ldr	q2, [x3, #32]
! 	nop
! 	nop
! 18:	BTI_J				/* Q2 */
! 	ldp	q0, q1, [x3]
  	b	99f
! 	nop
! 19:	BTI_J				/* Q1 */
! 	ldr	q0, [x3]
  	b	99f
! 	nop
! 20:	BTI_J				/* UINT8 */
! 	ldrb	w0, [x3, #BE(7)]
  	b	99f
+ 	nop
  21:	brk	#1000			/* reserved */
  	nop
! 	nop
! 	nop
! 22:	BTI_J				/* UINT16 */
! 	ldrh	w0, [x3, #BE(6)]
  	b	99f
+ 	nop
  23:	brk	#1000			/* reserved */
  	nop
! 	nop
! 	nop
! 24:	BTI_J				/* UINT32 */
! 	ldr	w0, [x3, #BE(4)]
  	b	99f
+ 	nop
  25:	brk	#1000			/* reserved */
  	nop
! 	nop
! 	nop
! 26:	BTI_J				/* SINT8 */
! 	ldrsb	x0, [x3, #BE(7)]
  	b	99f
+ 	nop
  27:	brk	#1000			/* reserved */
  	nop
! 	nop
! 	nop
! 28:	BTI_J				/* SINT16 */
! 	ldrsh	x0, [x3, #BE(6)]
  	b	99f
+ 	nop
  29:	brk	#1000			/* reserved */
  	nop
! 	nop
! 	nop
! 30:	BTI_J				/* SINT32 */
! 	ldrsw	x0, [x3, #BE(4)]
! 	nop
  	nop
  31:					/* reserved */
  99:	ldp     x29, x30, [sp], #ffi_closure_SYSV_FS
*************** CNAME(ffi_closure_SYSV):
*** 385,390 ****
--- 529,535 ----
  #if defined(FFI_EXEC_STATIC_TRAMP)
  	.align 4
  CNAME(ffi_closure_SYSV_V_alt):
+ 	BTI_C
  	/* See the comments above trampoline_code_table. */
  	ldr	x17, [sp, #8]			/* Load closure in x17 */
  	add	sp, sp, #16			/* Restore the stack */
*************** CNAME(ffi_closure_SYSV_V_alt):
*** 399,404 ****
--- 544,550 ----
  
  	.align 4
  CNAME(ffi_closure_SYSV_alt):
+ 	BTI_C
  	/* See the comments above trampoline_code_table. */
  	ldr	x17, [sp, #8]			/* Load closure in x17 */
  	add	sp, sp, #16			/* Restore the stack */
*************** CNAME(ffi_closure_trampoline_table_page)
*** 479,484 ****
--- 625,631 ----
  	.align 4
  CNAME(ffi_go_closure_SYSV_V):
  	cfi_startproc
+ 	BTI_C
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
*************** CNAME(ffi_go_closure_SYSV_V):
*** 500,507 ****
  #endif
  
  	.align	4
- 	cfi_startproc
  CNAME(ffi_go_closure_SYSV):
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
--- 647,657 ----
  #endif
  
  	.align	4
  CNAME(ffi_go_closure_SYSV):
+ 	cfi_startproc
+ 	BTI_C
+ 	SIGN_LR_LINUX_ONLY
+ 	PAC_CFI_WINDOW_SAVE
  	stp     x29, x30, [sp, #-ffi_closure_SYSV_FS]!
  	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
  	cfi_rel_offset (x29, 0)
*************** CNAME(ffi_go_closure_SYSV):
*** 518,524 ****
  	/* Load ffi_closure_inner arguments.  */
  	ldp	PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */
  	mov	x2, x18					/* load user_data */
! 	b	.Ldo_closure
  	cfi_endproc
  
  	.globl	CNAME(ffi_go_closure_SYSV)
--- 668,674 ----
  	/* Load ffi_closure_inner arguments.  */
  	ldp	PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */
  	mov	x2, x18					/* load user_data */
! 	b	L(do_closure)
  	cfi_endproc
  
  	.globl	CNAME(ffi_go_closure_SYSV)
*************** CNAME(ffi_go_closure_SYSV):
*** 533,537 ****
--- 683,699 ----
  
  #if defined __ELF__ && defined __linux__
  	.section .note.GNU-stack,"",%progbits
+ 
+ 	.pushsection .note.gnu.property, "a";
+ 	.balign 8;
+ 	.long 4;
+ 	.long 0x10;
+ 	.long 0x5;
+ 	.asciz "GNU";
+ 	.long 0xc0000000; /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */
+ 	.long 4;
+ 	.long GNU_PROPERTY_AARCH64_BTI | GNU_PROPERTY_AARCH64_POINTER_AUTH;
+ 	.long 0;
+ 	.popsection;
  #endif
  
diff -Nrcpad gcc-17-20260517/libffi/src/arc/arcompact.S gcc-17-20260524/libffi/src/arc/arcompact.S
*** gcc-17-20260517/libffi/src/arc/arcompact.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/arc/arcompact.S	Sun May 24 22:32:13 2026
***************
*** 33,135 ****
  #define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
  #endif
  
  .text
  
!         /* R0:   ffi_prep_args */
!         /* R1:   &ecif */
!         /* R2:   cif->bytes */
!         /* R3:   fig->flags */
!         /* R4:   ecif.rvalue */
!         /* R5:   fn */
! ENTRY(ffi_call_ARCompact)
          /* Save registers.  */
!         st.a       fp, [sp, -4]        /* fp + 20, fp */
!         push_s     blink               /* fp + 16, blink */
!         st.a       r4, [sp, -4]        /* fp + 12, ecif.rvalue */
!         push_s     r3                  /* fp +  8, fig->flags */
!         st.a       r5, [sp, -4]        /* fp +  4, fn */
!         push_s     r2                  /* fp +  0, cif->bytes */
!         mov        fp, sp
  
!         /* Make room for all of the new args.  */
!         sub        sp, sp, r2
  
!         /* Place all of the ffi_prep_args in position.  */
!         /* ffi_prep_args(char *stack, extended_cif *ecif) */
!         /* R1 already set.  */
  
!         /* And call.  */
!         jl_s.d     [r0]
!         mov_s      r0, sp
  
!         ld.ab      r12, [fp, 4]        /* cif->bytes */
!         ld.ab      r11, [fp, 4]        /* fn */
  
!         /* Move first 8 parameters in registers...  */
!         ld_s       r0, [sp]
!         ld_s       r1, [sp, 4]
!         ld_s       r2, [sp, 8]
!         ld_s       r3, [sp, 12]
!         ld         r4, [sp, 16]
!         ld         r5, [sp, 20]
!         ld         r6, [sp, 24]
!         ld         r7, [sp, 28]
  
!         /* ...and adjust the stack.  */
!         min        r12, r12, 32
  
!         /* Call the function.  */
!         jl.d       [r11]
!         add        sp, sp, r12 
  
!         mov        sp, fp        
!         pop_s      r3        /* fig->flags, return type */
!         pop_s      r2        /* ecif.rvalue, pointer for return value */
  
!         /* If the return value pointer is NULL, assume no return value.  */
!         breq.d     r2, 0, epilogue
!         pop_s      blink
  
!         /* Return INT.  */
!         brne       r3, FFI_TYPE_INT, return_double
!         b.d        epilogue
!         st_s       r0, [r2]        
  
! return_double:
!         brne       r3, FFI_TYPE_DOUBLE, epilogue
!         st_s       r0, [r2]        
!         st_s       r1, [r2,4]
  
! epilogue:
!         j_s.d      [blink]
!         ld.ab      fp, [sp, 4]
  
! ENTRY(ffi_closure_ARCompact)
!         st.a       r0, [sp, -32]
!         st_s       r1, [sp, 4]
!         st_s       r2, [sp, 8]
!         st_s       r3, [sp, 12]
!         st         r4, [sp, 16]
!         st         r5, [sp, 20]
!         st         r6, [sp, 24]
!         st         r7, [sp, 28]
  
!         /* pointer to arguments */
!         mov_s      r2, sp
  
!         /* return value goes here */
!         sub        sp, sp, 8
!         mov_s      r1, sp
  
!         push_s     blink
!         
!         bl.d       ffi_closure_inner_ARCompact
!         mov_s      r0, r8                /* codeloc, set by trampoline */
  
!         pop_s      blink
  
!         /* set return value to r1:r0 */
!         pop_s      r0
!         pop_s      r1
!         j_s.d      [blink]
!         add_s      sp, sp, 32
--- 33,210 ----
  #define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x):
  #endif
  
+ #if __SIZEOF_POINTER__ == 8
+ #define PTRS 8
+ #define FLTS 8
+ #define LARG ldl
+ #define SARG stl
+ #define ADDPTR addl
+ #define MOVPTR movl
+ #else
+ #define PTRS 4
+ #define FLTS 4
+ #define LARG ld
+ #define SARG st
+ #define ADDPTR add
+ #define MOVPTR mov
+ #endif
+ 
+ #define FRAME_LEN (8 * PTRS + 16)
+ 
  .text
  
! ENTRY(ffi_call_asm)
!         .cfi_startproc
! 
          /* Save registers.  */
!         .cfi_def_cfa r1, FRAME_LEN
!         SARG    fp, [r1, FRAME_LEN - 2*PTRS]
!         .cfi_offset fp, -2*PTRS
!         SARG    blink, [r1, FRAME_LEN - 1*PTRS]
!         .cfi_offset blink, -1*PTRS
!         ADDPTR  fp, r1, FRAME_LEN
!         MOVPTR  sp, r0
!         .cfi_def_cfa fp, 0
  
!         /* Load arguments.  */
!         MOVPTR  r11, r2      /* fn */
!         MOVPTR  r12, r3      /* closure */
  
!         /* Save arguments.  */
!         LARG    r0, [fp, -FRAME_LEN+0*PTRS]
!         LARG    r1, [fp, -FRAME_LEN+1*PTRS]
!         LARG    r2, [fp, -FRAME_LEN+2*PTRS]
!         LARG    r3, [fp, -FRAME_LEN+3*PTRS]
!         LARG    r4, [fp, -FRAME_LEN+4*PTRS]
!         LARG    r5, [fp, -FRAME_LEN+5*PTRS]
!         LARG    r6, [fp, -FRAME_LEN+6*PTRS]
!         LARG    r7, [fp, -FRAME_LEN+7*PTRS]
  
!         /* Call the function.  */
!         jl         [r11] 
  
!         /* Save return value (r0/r1)  */
!         SARG    r0, [fp, -FRAME_LEN+0*PTRS]
!         SARG    r1, [fp, -FRAME_LEN+1*PTRS]
  
!         /* Restore and return.  */
!         add     sp, fp, -FRAME_LEN
!         .cfi_def_cfa sp, FRAME_LEN
!         LARG    blink, [fp, -1*PTRS]
!         .cfi_restore blink
!         LARG    fp, [fp, -2*PTRS]
!         .cfi_restore fp
!         j_s     [blink]
!         .cfi_endproc
!         .size   ffi_call_asm, .-ffi_call_asm
  
! /*
!   ffi_closure_asm. Expects address of the passed-in ffi_closure in r8.
!   void ffi_closure_inner (ffi_cif *cif,
! 		          void (*fun) (ffi_cif *, void *, void **, void *),
! 		          void *user_data,
! 		          size_t *stackargs, struct call_context *regargs)
! */
  
! ENTRY(ffi_closure_asm)
!         .cfi_startproc
  
!         ADDPTR  sp, sp, -FRAME_LEN
!         .cfi_def_cfa_offset FRAME_LEN
  
!         /* Make a frame.  */
!         SARG    fp, [sp, FRAME_LEN-2*PTRS]
!         .cfi_offset fp, -2*PTRS
!         SARG    blink, [sp, FRAME_LEN-1*PTRS]
!         .cfi_offset blink, -1*PTRS
!         ADDPTR  fp, sp, FRAME_LEN
  
!         /* Save arguments.  */
!         SARG    r0, [sp, 0*PTRS]
!         SARG    r1, [sp, 1*PTRS]
!         SARG    r2, [sp, 2*PTRS]
!         SARG    r3, [sp, 3*PTRS]
!         SARG    r4, [sp, 4*PTRS]
!         SARG    r5, [sp, 5*PTRS]
!         SARG    r6, [sp, 6*PTRS]
!         SARG    r7, [sp, 7*PTRS]
  
!         /* Enter C.  */
!         LARG    r0, [r8, FFI_TRAMPOLINE_SIZE+0*PTRS]
!         LARG    r1, [r8, FFI_TRAMPOLINE_SIZE+1*PTRS]
!         LARG    r2, [r8, FFI_TRAMPOLINE_SIZE+2*PTRS]
!         ADDPTR  r3, sp, FRAME_LEN
!         MOVPTR  r4, sp
  
!         /* Call the C code.  */
!         bl      ffi_closure_inner
!         
!         /* Return values.  */
!         LARG    r0, [sp, 0*PTRS]
!         LARG    r1, [sp, 1*PTRS]
  
!         /* Restore and return.  */
!         LARG    blink, [sp, FRAME_LEN-1*PTRS]
!         .cfi_restore blink
!         LARG    fp, [sp, FRAME_LEN-2*PTRS]
!         .cfi_restore fp
!         ADDPTR  sp, sp, FRAME_LEN
!         .cfi_def_cfa_offset 0
!         j_s     [blink]
!         .cfi_endproc
!         .size ffi_closure_asm, .-ffi_closure_asm
  
! /*
!   ffi_go_closure_asm.  Expects address of the passed-in ffi_go_closure in r12.
!   void ffi_closure_inner (ffi_cif *cif,
! 		          void (*fun) (ffi_cif *, void *, void **, void *),
! 		          void *user_data,
! 		          size_t *stackargs, struct call_context *regargs)
! */
  
! ENTRY(ffi_go_closure_asm)
!         .cfi_startproc
  
!         ADDPTR  sp, sp, -FRAME_LEN
!         .cfi_def_cfa_offset FRAME_LEN
  
!         /* make a frame */
!         SARG    fp, [sp, FRAME_LEN-2*PTRS]
!         .cfi_offset fp, -2*PTRS
!         SARG    blink, [sp, FRAME_LEN-1*PTRS]
!         .cfi_offset blink, -1*PTRS
!         ADDPTR  fp, sp, FRAME_LEN
  
!         /* save arguments */
!         SARG    r0, [sp, 0*PTRS]
!         SARG    r1, [sp, 1*PTRS]
!         SARG    r2, [sp, 2*PTRS]
!         SARG    r3, [sp, 3*PTRS]
!         SARG    r4, [sp, 4*PTRS]
!         SARG    r5, [sp, 5*PTRS]
!         SARG    r6, [sp, 6*PTRS]
!         SARG    r7, [sp, 7*PTRS]
! 
!         /* enter C */
!         LARG    r0, [r12, 1*PTRS]
!         LARG    r1, [r12, 2*PTRS]
!         MOVPTR  r2, r12
!         ADDPTR  r3, sp, FRAME_LEN
!         MOVPTR  r4, sp
! 
!         bl      ffi_closure_inner
! 
!         /* Return values. */
!         LARG    r0, [sp, 0*PTRS]
!         LARG    r1, [sp, 1*PTRS]
! 
! 
!         LARG    blink, [sp, FRAME_LEN-1*PTRS]
!         .cfi_restore blink
!         LARG    fp, [sp, FRAME_LEN-2*PTRS]
!         .cfi_restore fp
!         ADDPTR  sp, sp, FRAME_LEN
!         .cfi_def_cfa_offset 0
!         j_s     [blink]
!         .cfi_endproc
!         .size ffi_go_closure_asm, .-ffi_go_closure_asm
diff -Nrcpad gcc-17-20260517/libffi/src/arc/ffi.c gcc-17-20260524/libffi/src/arc/ffi.c
*** gcc-17-20260517/libffi/src/arc/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/arc/ffi.c	Sun May 24 22:32:13 2026
***************
*** 31,36 ****
--- 31,64 ----
  
  #include <sys/cachectl.h>
  
+ #define NARGREG 8
+ #define STKALIGN 4
+ #define MAXCOPYARG (2 * sizeof(double))
+ 
+ typedef struct call_context
+ {
+   size_t r[8];
+   /* used by the assembly code to in-place construct its own stack frame */
+   char frame[16];
+ } call_context;
+ 
+ typedef struct call_builder
+ {
+   call_context *aregs;
+   int used_integer;
+   //int used_float;
+   size_t *used_stack;
+   void *struct_stack;
+ } call_builder;
+ 
+ /* integer (not pointer) less than ABI XLEN */
+ /* FFI_TYPE_INT does not appear to be used */
+ #if defined(__ARC64_ARCH64__)
+ #define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT64)
+ #else
+ #define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT32)
+ #endif
+ 
  /* for little endian ARC, the code is in fact stored as mixed endian for
     performance reasons */
  #if __BIG_ENDIAN__
***************
*** 39,132 ****
  #define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16))
  #endif
  
- /* ffi_prep_args is called by the assembly routine once stack
-    space has been allocated for the function's arguments.  */
- 
- void
- ffi_prep_args (char *stack, extended_cif * ecif)
- {
-   unsigned int i;
-   void **p_argv;
-   char *argp;
-   ffi_type **p_arg;
- 
-   argp = stack;
- 
-   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
-     {
-       *(void **) argp = ecif->rvalue;
-       argp += 4;
-     }
- 
-   p_argv = ecif->avalue;
- 
-   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
-        (i != 0); i--, p_arg++)
-     {
-       size_t z;
-       int alignment;
- 
-       /* align alignment to 4 */
-       alignment = (((*p_arg)->alignment - 1) | 3) + 1;
- 
-       /* Align if necessary.  */
-       if ((alignment - 1) & (unsigned) argp)
- 	argp = (char *) FFI_ALIGN (argp, alignment);
- 
-       z = (*p_arg)->size;
-       if (z < sizeof (int))
- 	{
- 	  z = sizeof (int);
- 
- 	  switch ((*p_arg)->type)
- 	    {
- 	    case FFI_TYPE_SINT8:
- 	      *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
- 	      break;
- 
- 	    case FFI_TYPE_UINT8:
- 	      *(unsigned int *) argp = (unsigned int) *(UINT8 *) (*p_argv);
- 	      break;
- 
- 	    case FFI_TYPE_SINT16:
- 	      *(signed int *) argp = (signed int) *(SINT16 *) (*p_argv);
- 	      break;
- 
- 	    case FFI_TYPE_UINT16:
- 	      *(unsigned int *) argp = (unsigned int) *(UINT16 *) (*p_argv);
- 	      break;
- 
- 	    case FFI_TYPE_STRUCT:
- 	      memcpy (argp, *p_argv, (*p_arg)->size);
- 	      break;
- 
- 	    default:
- 	      FFI_ASSERT (0);
- 	    }
- 	}
-       else if (z == sizeof (int))
- 	{
- 	  *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
- 	}
-       else
- 	{
- 	  if ((*p_arg)->type == FFI_TYPE_STRUCT)
- 	    {
- 	      memcpy (argp, *p_argv, z);
- 	    }
- 	  else
- 	    {
- 	      /* Double or long long 64bit.  */
- 	      memcpy (argp, *p_argv, z);
- 	    }
- 	}
-       p_argv++;
-       argp += z;
-     }
- 
-   return;
- }
- 
  /* Perform machine dependent cif processing.  */
  ffi_status
  ffi_prep_cif_machdep (ffi_cif * cif)
--- 67,72 ----
*************** ffi_prep_cif_machdep (ffi_cif * cif)
*** 157,241 ****
    return FFI_OK;
  }
  
! extern void ffi_call_ARCompact (void (*)(char *, extended_cif *),
! 				extended_cif *, unsigned, unsigned,
! 				unsigned *, void (*fn) (void));
  
! void
! ffi_call (ffi_cif * cif, void (*fn) (void), void *rvalue, void **avalue)
! {
!   extended_cif ecif;
  
!   ecif.cif = cif;
!   ecif.avalue = avalue;
  
!   /* If the return value is a struct and we don't have
!      a return value address then we need to make one.  */
!   if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
!     {
!       ecif.rvalue = alloca (cif->rtype->size);
      }
!   else
!     ecif.rvalue = rvalue;
  
!   switch (cif->abi)
!     {
!     case FFI_ARCOMPACT:
!       ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes,
! 			  cif->flags, ecif.rvalue, fn);
!       break;
  
!     default:
!       FFI_ASSERT (0);
!       break;
      }
  }
  
! int
! ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue,
! 			     ffi_arg * args)
  {
!   void **arg_area, **p_argv;
!   ffi_cif *cif = closure->cif;
!   char *argp = (char *) args;
!   ffi_type **p_argt;
!   int i;
  
!   arg_area = (void **) alloca (cif->nargs * sizeof (void *));
  
!   /* handle hidden argument */
!   if (cif->flags == FFI_TYPE_STRUCT)
!     {
!       rvalue = *(void **) argp;
!       argp += 4;
!     }
  
!   p_argv = arg_area;
  
!   for (i = 0, p_argt = cif->arg_types; i < cif->nargs;
!        i++, p_argt++, p_argv++)
!     {
!       size_t z;
!       int alignment;
  
!       /* align alignment to 4 */
!       alignment = (((*p_argt)->alignment - 1) | 3) + 1;
  
!       /* Align if necessary.  */
!       if ((alignment - 1) & (unsigned) argp)
! 	argp = (char *) FFI_ALIGN (argp, alignment);
  
!       z = (*p_argt)->size;
!       *p_argv = (void *) argp;
!       argp += z;
      }
  
!   (closure->fun) (cif, rvalue, arg_area, closure->user_data);
  
!   return cif->flags;
  }
  
! extern void ffi_closure_ARCompact (void);
  
  ffi_status
  ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
--- 97,347 ----
    return FFI_OK;
  }
  
! /* allocates a single register, float register, or XLEN-sized stack slot to a datum */
! static void marshal_atom(call_builder *cb, int type, void *data) {
!   size_t value = 0;
!   switch (type) {
!     case FFI_TYPE_UINT8: value = *(uint8_t *)data; break;
!     case FFI_TYPE_SINT8: value = *(int8_t *)data; break;
!     case FFI_TYPE_UINT16: value = *(uint16_t *)data; break;
!     case FFI_TYPE_SINT16: value = *(int16_t *)data; break;
!     /* 32-bit quantities are always sign-extended in the ABI */
!     case FFI_TYPE_UINT32: value = *(int32_t *)data; break;
!     case FFI_TYPE_SINT32: value = *(int32_t *)data; break;
! #if defined(__ARC64_ARCH64__)
!     case FFI_TYPE_UINT64: value = *(uint64_t *)data; break;
!     case FFI_TYPE_SINT64: value = *(int64_t *)data; break;
! #endif
!     case FFI_TYPE_POINTER: value = *(size_t *)data; break;
!     default: FFI_ASSERT(0); break;
!   }
  
!   if (cb->used_integer == NARGREG) {
!     *cb->used_stack++ = value;
!   } else {
!     cb->aregs->r[cb->used_integer++] = value;
!   }
! }
  
! /* adds an argument to a call, or a not by reference return value */
! static void marshal(call_builder *cb, ffi_type *type, int var, void *data) {
!   size_t realign[2];
  
! #if (defined(__ARC64_ARCH64__) || defined(__ARC64_ARCH32__))
!   if (type->size > 2 * __SIZEOF_POINTER__) {
!     if (var) {
!       marshal_atom(cb, FFI_TYPE_POINTER, &data);
!     } else {
!       /* copy to stack and pass by reference */
!       data = memcpy (cb->struct_stack, data, type->size);
!       cb->struct_stack = (size_t *) FFI_ALIGN ((char *) cb->struct_stack + type->size, __SIZEOF_POINTER__);
!       marshal_atom(cb, FFI_TYPE_POINTER, &data);
      }
!   }
! #else
!   if (type->type == FFI_TYPE_STRUCT) {
!     if (var) {
!       if (type->size > 0)
!         marshal_atom(cb, FFI_TYPE_POINTER, data);
!     } else {
!       int i;
!       
!       for (i = 0; i < type->size; i += sizeof(size_t)) {
!         marshal_atom(cb, FFI_TYPE_POINTER, data);
!         data += sizeof(size_t);
!       }
!     }
!   }
! #endif
!   else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
!     marshal_atom(cb, type->type, data);
!   } else {
!       memcpy(realign, data, type->size);
!       if (type->size > 0)
!         marshal_atom(cb, FFI_TYPE_POINTER, realign);
!       if (type->size > __SIZEOF_POINTER__)
!         marshal_atom(cb, FFI_TYPE_POINTER, realign + 1);
!   }
! }
  
! static void unmarshal_atom(call_builder *cb, int type, void *data) {
!   size_t value;
  
!   if (cb->used_integer == NARGREG) {
!     value = *cb->used_stack++;
!   } else {
!     value = cb->aregs->r[cb->used_integer++];
!   }
! 
!   switch (type) {
!     case FFI_TYPE_UINT8: *(uint8_t *)data = value; break;
!     case FFI_TYPE_SINT8: *(uint8_t *)data = value; break;
!     case FFI_TYPE_UINT16: *(uint16_t *)data = value; break;
!     case FFI_TYPE_SINT16: *(uint16_t *)data = value; break;
!     case FFI_TYPE_UINT32: *(uint32_t *)data = value; break;
!     case FFI_TYPE_SINT32: *(uint32_t *)data = value; break;
! #if defined(__ARC64_ARCH64__)
!     case FFI_TYPE_UINT64: *(uint64_t *)data = value; break;
!     case FFI_TYPE_SINT64: *(uint64_t *)data = value; break;
! #endif
!     case FFI_TYPE_POINTER: *(size_t *)data = value; break;
!     default: FFI_ASSERT(0); break;
!   }
! }
! 
! /* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */
! static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) {
!   size_t realign[2];
! 
! #if defined(__ARC64_ARCH64__)
!   void *pointer;
! 
!   if (type->size > 2 * __SIZEOF_POINTER__) {
!         /* pass by reference */
!         unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer);
!         return pointer;
!     }
! #elif defined(__ARC64_ARCH32__)
!   if (type->type == FFI_TYPE_STRUCT) {
!     if (type->size > 2 * __SIZEOF_POINTER__) {
!       unmarshal_atom(cb, FFI_TYPE_POINTER, &realign[0]);
!       memcpy(data, (const void*)realign[0], type->size);
!       return data;
!     } else {
!       int i;
!       void *pdata = data;
! 
!       for (i = 0; i < type->size; i += sizeof(size_t)) {
!         unmarshal_atom(cb, FFI_TYPE_POINTER, pdata);
!         pdata += sizeof(size_t);
!       }
!       return data;
      }
+   }
+ #else
+   if (type->type == FFI_TYPE_STRUCT) {
+ 
+       if (var) {
+         int i;
+         void *pdata = data;
+ 
+         for (i = 0; i < type->size; i += sizeof(size_t)) {
+           unmarshal_atom(cb, FFI_TYPE_POINTER, pdata);
+           pdata += sizeof(size_t);
+         }
+         return data;
+       } else {
+         if (type->size > 0)
+           unmarshal_atom(cb, FFI_TYPE_POINTER, &realign[0]);
+         memcpy(data, (const void*)realign[0], type->size);
+         return data;
+       }
+   }
+ #endif
+   else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
+     unmarshal_atom(cb, type->type, data);
+     return data;
+   } else {
+       if (type->size > 0)
+         unmarshal_atom(cb, FFI_TYPE_POINTER, realign);
+       if (type->size > __SIZEOF_POINTER__)
+         unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1);
+       memcpy(data, realign, type->size);
+       return data;
+   }
  }
  
! static int passed_by_ref(ffi_type *type, int var) {
!   if (type->type == FFI_TYPE_STRUCT)
! 	  return 1;
!   
!   return type->size > 2 * __SIZEOF_POINTER__;
! }
! 
! /* Low level routine for calling functions */
! extern void ffi_call_asm (void *stack, struct call_context *regs,
! 			  void (*fn) (void), void *closure) FFI_HIDDEN;
! 
! static void
! ffi_call_int (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue,
! 	      void *closure)
  {
!   int return_by_ref = passed_by_ref(cif->rtype, 0);
  
!   /* Allocate space for stack arg parameters.  */
!   size_t arg_bytes = FFI_ALIGN(2 * sizeof(size_t) * cif->nargs, STKALIGN);
!   /* Allocate space for copies of big structures.  */
!   size_t struct_bytes = FFI_ALIGN(cif->bytes, STKALIGN);
!   // size_t rval_bytes = 0;
!   // if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
!   //   rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
!   size_t alloc_size = arg_bytes + /*rval_bytes +*/ struct_bytes + sizeof(call_context);
!   size_t alloc_base = (size_t)alloca(alloc_size);
  
!   // if (rval_bytes)
!   //   rvalue = (void*)(alloc_base + arg_bytes);
  
!   call_builder cb;
!   cb.used_integer = 0;
!   cb.aregs = (call_context*)(alloc_base + arg_bytes /*+ rval_bytes*/ + struct_bytes);
!   cb.used_stack = (void*)alloc_base;
!   cb.struct_stack = (void *)(alloc_base + arg_bytes /*+ rval_bytes*/);
  
!   // if (cif->rtype->type == FFI_TYPE_STRUCT)
!   //   marshal(&cb, &ffi_type_pointer, 0, &rvalue);
  
!   if (return_by_ref)
! 	  marshal(&cb, &ffi_type_pointer, 0, &rvalue);
  
!   int i;
!   for (i = 0; i < cif->nargs; i++)
!     marshal(&cb, cif->arg_types[i], 0, avalue[i]);
  
!   ffi_call_asm ((void *) alloc_base, cb.aregs, fn, closure);
! 
!   cb.used_integer = 0;
!   if (!return_by_ref && rvalue)
!     {
! 	    if (IS_INT(cif->rtype->type)
! 	        && cif->rtype->size < sizeof (ffi_arg))
! 	    {
!         /* Integer types smaller than ffi_arg need to be extended.  */
! 	    switch (cif->rtype->type) {
! 	      case FFI_TYPE_SINT8:
! 	      case FFI_TYPE_SINT16:
! 	      case FFI_TYPE_SINT32:
! 		      unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
!                           ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32),
! 				                  rvalue);
! 		      break;
! 	      case FFI_TYPE_UINT8:
! 	      case FFI_TYPE_UINT16:
! 	      case FFI_TYPE_UINT32:
! 		      unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
! 				                  ? FFI_TYPE_UINT64 : FFI_TYPE_UINT32),
! 				                  rvalue);
! 		      break;
! 	      }
! 	    }
! 	    else
! 	      unmarshal(&cb, cif->rtype, 0, rvalue);
      }
+ }
  
! void
! ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue)
! {
!   ffi_call_int(cif, fn, rvalue, avalue, NULL);
! }
  
! void
! ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue,
! 	     void **avalue, void *closure)
! {
!   ffi_call_int(cif, fn, rvalue, avalue, closure);
  }
  
! extern void ffi_closure_asm(void) FFI_HIDDEN;
  
  ffi_status
  ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
*************** ffi_prep_closure_loc (ffi_closure * clos
*** 244,257 ****
  {
    uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
  
    switch (cif->abi)
      {
      case FFI_ARCOMPACT:
        FFI_ASSERT (tramp == codeloc);
        tramp[0] = CODE_ENDIAN (0x200a1fc0);	/* mov r8, pcl  */
        tramp[1] = CODE_ENDIAN (0x20200f80);	/* j [long imm] */
!       tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact);
        break;
  
      default:
        return FFI_BAD_ABI;
--- 350,379 ----
  {
    uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
  
+ #if defined(__ARC64_ARCH64__)
+   size_t address_ffi_closure = (size_t) ffi_closure_asm;
+ #endif
+ 
    switch (cif->abi)
      {
+ #if defined(__ARC64_ARCH64__)
+     case FFI_ARC64:
+       FFI_ASSERT (tramp == codeloc);
+       tramp[0] = CODE_ENDIAN (0x580a1fc0);	/* movl r8, pcl  */
+       tramp[1] = CODE_ENDIAN (0x5c0b1f80);	/* movhl r12, limm */
+       tramp[2] = CODE_ENDIAN ((uint32_t)(address_ffi_closure >> 32));
+       tramp[3] = CODE_ENDIAN (0x5c051f8c);	/* orl r12, r12, limm */
+       tramp[4] = CODE_ENDIAN ((uint32_t)(address_ffi_closure & 0xffffffff));
+       tramp[5] = CODE_ENDIAN (0x20200300);	/* j [r12] */
+       break;
+ #else
      case FFI_ARCOMPACT:
        FFI_ASSERT (tramp == codeloc);
        tramp[0] = CODE_ENDIAN (0x200a1fc0);	/* mov r8, pcl  */
        tramp[1] = CODE_ENDIAN (0x20200f80);	/* j [long imm] */
!       tramp[2] = CODE_ENDIAN ((uint32_t) ffi_closure_asm);
        break;
+ #endif
  
      default:
        return FFI_BAD_ABI;
*************** ffi_prep_closure_loc (ffi_closure * clos
*** 264,266 ****
--- 386,447 ----
  
    return FFI_OK;
  }
+ 
+ extern void ffi_go_closure_asm (void) FFI_HIDDEN;
+ 
+ ffi_status
+ ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
+ 		     void (*fun) (ffi_cif *, void *, void **, void *))
+ {
+   if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI)
+     return FFI_BAD_ABI;
+ 
+   closure->tramp = (void *) ffi_go_closure_asm;
+   closure->cif = cif;
+   closure->fun = fun;
+ 
+   return FFI_OK;
+ }
+ 
+ /* Called by the assembly code with aregs pointing to saved argument registers
+    and stack pointing to the stacked arguments.  Return values passed in
+    registers will be reloaded from aregs. */
+ void FFI_HIDDEN
+ ffi_closure_inner (ffi_cif *cif,
+ 		   void (*fun) (ffi_cif *, void *, void **, void *),
+ 		   void *user_data,
+ 		   size_t *stack, call_context *aregs)
+ {
+     void **avalue = alloca(cif->nargs * sizeof(void*));
+     /* storage for arguments which will be copied by unmarshal().  We could
+        theoretically avoid the copies in many cases and use at most 128 bytes
+        of memory, but allocating disjoint storage for each argument is
+        simpler. */
+     char *astorage = alloca(cif->bytes);
+     char *ptr = astorage;
+     void *rvalue;
+     call_builder cb;
+     int i;
+ 
+     cb.aregs = aregs;
+     cb.used_integer = 0;
+     cb.used_stack = stack;
+     
+     /* handle hidden argument */
+     if (cif->flags == FFI_TYPE_STRUCT)
+       unmarshal(&cb, &ffi_type_pointer, 0, &rvalue);
+     else
+       rvalue = alloca(cif->rtype->size);
+ 
+     for (i = 0; i < cif->nargs; i++) {
+       avalue[i] = unmarshal(&cb, cif->arg_types[i], 1, ptr);
+       ptr += cif->arg_types[i]->size;
+     }
+ 
+     fun (cif, rvalue, avalue, user_data);
+ 
+     if (cif->rtype->type != FFI_TYPE_VOID) {
+         cb.used_integer = 0;
+         marshal(&cb, cif->rtype, 1, rvalue);
+     }
+ }
diff -Nrcpad gcc-17-20260517/libffi/src/arc/ffitarget.h gcc-17-20260524/libffi/src/arc/ffitarget.h
*** gcc-17-20260517/libffi/src/arc/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/arc/ffitarget.h	Sun May 24 22:32:13 2026
*************** typedef signed long ffi_sarg;
*** 40,53 ****
--- 40,67 ----
  typedef enum ffi_abi
  {
    FFI_FIRST_ABI = 0,
+ #if __SIZEOF_POINTER__ == 8
+   FFI_ARC64,
+ #else
    FFI_ARCOMPACT,
+ #endif
    FFI_LAST_ABI,
+ #if __SIZEOF_POINTER__ == 8
+   FFI_DEFAULT_ABI = FFI_ARC64
+ #else
    FFI_DEFAULT_ABI = FFI_ARCOMPACT
+ #endif
  } ffi_abi;
  #endif
  
  #define FFI_CLOSURES 		1
+ #define FFI_GO_CLOSURES 1
+ #if __SIZEOF_POINTER__ == 8
+ #define FFI_TRAMPOLINE_SIZE	24
+ #else
  #define FFI_TRAMPOLINE_SIZE	12
+ #endif
+ 
  #define FFI_NATIVE_RAW_API 	0
  
  #endif
diff -Nrcpad gcc-17-20260517/libffi/src/arm/ffi.c gcc-17-20260524/libffi/src/arm/ffi.c
*** gcc-17-20260517/libffi/src/arm/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/arm/ffi.c	Sun May 24 22:32:13 2026
*************** extern unsigned char ffi_arm_trampoline[
*** 64,69 ****
--- 64,73 ----
  #include <machine/sysarch.h>
  #endif
  
+ #if defined(__QNX__)
+ #include <sys/mman.h>
+ #endif
+ 
  /* Forward declares. */
  static int vfp_type_p (const ffi_type *);
  static void layout_vfp_args (ffi_cif *);
*************** ffi_prep_closure_loc (ffi_closure * clos
*** 622,628 ****
    config[1] = closure_func;
  #else
  
! #if defined(FFI_EXEC_STATIC_TRAMP)
    if (ffi_tramp_is_present(closure))
      {
        /* Initialize the static trampoline's parameters. */
--- 626,632 ----
    config[1] = closure_func;
  #else
  
! # if defined(FFI_EXEC_STATIC_TRAMP)
    if (ffi_tramp_is_present(closure))
      {
        /* Initialize the static trampoline's parameters. */
*************** ffi_prep_closure_loc (ffi_closure * clos
*** 633,663 ****
        ffi_tramp_set_parms (closure->ftramp, closure_func, closure);
        goto out;
      }
! #endif
  
    /* Initialize the dynamic trampoline. */
! #ifndef _WIN32
    memcpy(closure->tramp, ffi_arm_trampoline, 8);
! #else
    // cast away function type so MSVC doesn't set the lower bit of the function pointer
    memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET);
! #endif
  
! #if defined (__QNX__)
!   msync(closure->tramp, 8, 0x1000000);	/* clear data map */
!   msync(codeloc, 8, 0x1000000);	/* clear insn map */
! #elif defined(_WIN32)
    FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE);
! #else
    __clear_cache(closure->tramp, closure->tramp + 8);	/* clear data map */
    __clear_cache(codeloc, codeloc + 8);			/* clear insn map */
! #endif
! #ifdef _WIN32
    *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func;
! #else
    *(void (**)(void))(closure->tramp + 8) = closure_func;
! #endif
  out:
  #endif
  
    closure->cif = cif;
--- 637,669 ----
        ffi_tramp_set_parms (closure->ftramp, closure_func, closure);
        goto out;
      }
! # endif
  
    /* Initialize the dynamic trampoline. */
! # ifndef _WIN32
    memcpy(closure->tramp, ffi_arm_trampoline, 8);
! # else
    // cast away function type so MSVC doesn't set the lower bit of the function pointer
    memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET);
! # endif
  
! # if defined(__QNX__)
!   msync (closure->tramp, 8, MS_INVALIDATE_ICACHE);	/* clear data map */
!   msync (codeloc, 8, MS_INVALIDATE_ICACHE);		/* clear insn map */
! # elif defined(_WIN32)
    FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE);
! # else
    __clear_cache(closure->tramp, closure->tramp + 8);	/* clear data map */
    __clear_cache(codeloc, codeloc + 8);			/* clear insn map */
! # endif
! # ifdef _WIN32
    *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func;
! # else
    *(void (**)(void))(closure->tramp + 8) = closure_func;
! # endif
! # if defined(FFI_EXEC_STATIC_TRAMP)
  out:
+ # endif
  #endif
  
    closure->cif = cif;
diff -Nrcpad gcc-17-20260517/libffi/src/arm/sysv.S gcc-17-20260524/libffi/src/arm/sysv.S
*** gcc-17-20260517/libffi/src/arm/sysv.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/arm/sysv.S	Sun May 24 22:32:13 2026
*************** ARM_FUNC_START(ffi_call_VFP)
*** 142,154 ****
  
  	cmp	r3, #3			@ load only d0 if possible
  	ite	le
- #ifdef __clang__
- 	vldrle d0, [r0]
- 	vldmgt r0, {d0-d7}
- #else
  	ldcle	p11, cr0, [r0]		@ vldrle d0, [r0]
  	ldcgt	p11, cr0, [r0], {16}	@ vldmgt r0, {d0-d7}
- #endif
  	add	r0, r0, #64		@ discard the vfp register args
  	/* FALLTHRU */
  ARM_FUNC_END(ffi_call_VFP)
--- 142,149 ----
*************** ARM_FUNC_START(ffi_call_SYSV)
*** 193,217 ****
  #endif
  0:
  E(ARM_TYPE_VFP_S)
- #ifdef __clang__
- 	vstr s0, [r2]
- #else
  	stc	p10, cr0, [r2]		@ vstr s0, [r2]
- #endif
  	pop	{fp,pc}
  E(ARM_TYPE_VFP_D)
- #ifdef __clang__
- 	vstr d0, [r2]
- #else
  	stc	p11, cr0, [r2]		@ vstr d0, [r2]
- #endif
  	pop	{fp,pc}
  E(ARM_TYPE_VFP_N)
- #ifdef __clang__
- 	vstm r2, {d0-d3}
- #else
  	stc	p11, cr0, [r2], {8}	@ vstm r2, {d0-d3}
- #endif
  	pop	{fp,pc}
  E(ARM_TYPE_INT64)
  	str	r1, [r2, #4]
--- 188,200 ----
*************** ARM_FUNC_START(ffi_closure_VFP)
*** 320,330 ****
  	add	ip, sp, #16
  	sub	sp, sp, #64+32			@ allocate frame
  	cfi_adjust_cfa_offset(64+32)
- #ifdef __clang__
- 	vstm sp, {d0-d7}
- #else
  	stc	p11, cr0, [sp], {16}		@ vstm sp, {d0-d7}
- #endif
  	stmdb	sp!, {ip,lr}
  
  	/* See above.  */
--- 303,309 ----
*************** ARM_FUNC_START_LOCAL(ffi_closure_ret)
*** 358,382 ****
  	cfi_rel_offset(lr, 4)
  0:
  E(ARM_TYPE_VFP_S)
- #ifdef __clang__
- 	vldr s0, [r2]
- #else
  	ldc	p10, cr0, [r2]			@ vldr s0, [r2]
- #endif
  	b	call_epilogue
  E(ARM_TYPE_VFP_D)
- #ifdef __clang__
- 	vldr d0, [r2]
- #else
  	ldc	p11, cr0, [r2]			@ vldr d0, [r2]
- #endif
  	b	call_epilogue
  E(ARM_TYPE_VFP_N)
- #ifdef __clang__
- 	vldm r2, {d0-d3}
- #else
  	ldc	p11, cr0, [r2], {8}		@ vldm r2, {d0-d3}
- #endif
  	b	call_epilogue
  E(ARM_TYPE_INT64)
  	ldr	r1, [r2, #4]
--- 337,349 ----
diff -Nrcpad gcc-17-20260517/libffi/src/closures.c gcc-17-20260524/libffi/src/closures.c
*** gcc-17-20260517/libffi/src/closures.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/closures.c	Sun May 24 22:32:13 2026
***************
*** 1,5 ****
  /* -----------------------------------------------------------------------
!    closures.c - Copyright (c) 2019 Anthony Green
                  Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
                  Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
                  Copyright (c) 2011 Plausible Labs Cooperative, Inc.
--- 1,5 ----
  /* -----------------------------------------------------------------------
!    closures.c - Copyright (c) 2019, 2022 Anthony Green
                  Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
                  Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
                  Copyright (c) 2011 Plausible Labs Cooperative, Inc.
***************
*** 27,36 ****
     DEALINGS IN THE SOFTWARE.
     ----------------------------------------------------------------------- */
  
! #if defined __linux__ && !defined _GNU_SOURCE
  #define _GNU_SOURCE 1
  #endif
  
  #include <fficonfig.h>
  #include <ffi.h>
  #include <ffi_common.h>
--- 27,38 ----
     DEALINGS IN THE SOFTWARE.
     ----------------------------------------------------------------------- */
  
! #if (defined __linux__ || defined __CYGWIN__) && !defined _GNU_SOURCE
  #define _GNU_SOURCE 1
  #endif
  
+ #ifndef __EMSCRIPTEN__
+ 
  #include <fficonfig.h>
  #include <ffi.h>
  #include <ffi_common.h>
*************** ffi_tramp_is_present (__attribute__((unu
*** 133,154 ****
  #  define FFI_MMAP_EXEC_WRIT 1
  #  define HAVE_MNTENT 1
  # endif
! # if defined(_WIN32) || defined(__OS2__)
! /* Windows systems may have Data Execution Protection (DEP) enabled, 
     which requires the use of VirtualMalloc/VirtualFree to alloc/free
     executable memory. */
  #  define FFI_MMAP_EXEC_WRIT 1
  # endif
  #endif
  
! #if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX
! # if defined(__linux__) && !defined(__ANDROID__)
  /* When defined to 1 check for SELinux and if SELinux is active,
     don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
     might cause audit messages.  */
  #  define FFI_MMAP_EXEC_SELINUX 1
! # endif
! #endif
  
  #if FFI_CLOSURES
  
--- 135,160 ----
  #  define FFI_MMAP_EXEC_WRIT 1
  #  define HAVE_MNTENT 1
  # endif
! # if defined(__CYGWIN__) || defined(_WIN32) || defined(__OS2__)
! /* Windows systems may have Data Execution Protection (DEP) enabled,
     which requires the use of VirtualMalloc/VirtualFree to alloc/free
     executable memory. */
  #  define FFI_MMAP_EXEC_WRIT 1
  # endif
  #endif
  
! #if FFI_MMAP_EXEC_WRIT && defined(__linux__) && !defined(__ANDROID__)
! # if !defined FFI_MMAP_EXEC_SELINUX
  /* When defined to 1 check for SELinux and if SELinux is active,
     don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that
     might cause audit messages.  */
  #  define FFI_MMAP_EXEC_SELINUX 1
! # endif /* !defined FFI_MMAP_EXEC_SELINUX */
! # if !defined FFI_MMAP_PAX
! /* Also check for PaX MPROTECT */
! #  define FFI_MMAP_PAX 1
! # endif /* !defined FFI_MMAP_PAX */
! #endif /* FFI_MMAP_EXEC_WRIT && defined(__linux__) && !defined(__ANDROID__) */
  
  #if FFI_CLOSURES
  
*************** ffi_tramp_is_present (__attribute__((unu
*** 158,164 ****
  
  #include <mach/mach.h>
  #include <pthread.h>
! #ifdef HAVE_PTRAUTH
  #include <ptrauth.h>
  #endif
  #include <stdio.h>
--- 164,170 ----
  
  #include <mach/mach.h>
  #include <pthread.h>
! #ifdef HAVE_ARM64E_PTRAUTH
  #include <ptrauth.h>
  #endif
  #include <stdio.h>
*************** ffi_trampoline_table_alloc (void)
*** 217,223 ****
    /* Remap the trampoline table on top of the placeholder page */
    trampoline_page = config_page + PAGE_MAX_SIZE;
  
! #ifdef HAVE_PTRAUTH
    trampoline_page_template = (vm_address_t)(uintptr_t)ptrauth_auth_data((void *)&ffi_closure_trampoline_table_page, ptrauth_key_function_pointer, 0);
  #else
    trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
--- 223,229 ----
    /* Remap the trampoline table on top of the placeholder page */
    trampoline_page = config_page + PAGE_MAX_SIZE;
  
! #ifdef HAVE_ARM64E_PTRAUTH
    trampoline_page_template = (vm_address_t)(uintptr_t)ptrauth_auth_data((void *)&ffi_closure_trampoline_table_page, ptrauth_key_function_pointer, 0);
  #else
    trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
*************** ffi_trampoline_table_alloc (void)
*** 230,241 ****
    kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0,
  		 VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template,
  		 FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
!   if (kt != KERN_SUCCESS || !(cur_prot & VM_PROT_EXECUTE))
      {
        vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
        return NULL;
      }
  
    /* We have valid trampoline and config pages */
    table = calloc (1, sizeof (ffi_trampoline_table));
    table->free_count = FFI_TRAMPOLINE_COUNT;
--- 236,259 ----
    kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0,
  		 VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template,
  		 FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
!   if (kt != KERN_SUCCESS)
      {
        vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
        return NULL;
      }
  
+   if (!(cur_prot & VM_PROT_EXECUTE))
+     {
+       /* If VM_PROT_EXECUTE isn't set on the remapped trampoline page, set it */
+       kt = vm_protect (mach_task_self (), trampoline_page, PAGE_MAX_SIZE,
+          FALSE, cur_prot | VM_PROT_EXECUTE);
+       if (kt != KERN_SUCCESS)
+         {
+           vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2);
+           return NULL;
+         }
+     }
+ 
    /* We have valid trampoline and config pages */
    table = calloc (1, sizeof (ffi_trampoline_table));
    table->free_count = FFI_TRAMPOLINE_COUNT;
*************** ffi_trampoline_table_alloc (void)
*** 250,256 ****
        ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
        entry->trampoline =
  	(void *) (trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
! #ifdef HAVE_PTRAUTH
        entry->trampoline = ptrauth_sign_unauthenticated(entry->trampoline, ptrauth_key_function_pointer, 0);
  #endif
  
--- 268,274 ----
        ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
        entry->trampoline =
  	(void *) (trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
! #ifdef HAVE_ARM64E_PTRAUTH
        entry->trampoline = ptrauth_sign_unauthenticated(entry->trampoline, ptrauth_key_function_pointer, 0);
  #endif
  
*************** selinux_enabled_check (void)
*** 467,480 ****
  
  #endif /* !FFI_MMAP_EXEC_SELINUX */
  
! /* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */
! #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
  #include <stdlib.h>
  
! static int emutramp_enabled = -1;
  
  static int
! emutramp_enabled_check (void)
  {
    char *buf = NULL;
    size_t len = 0;
--- 485,502 ----
  
  #endif /* !FFI_MMAP_EXEC_SELINUX */
  
! /* On PaX enable kernels that have MPROTECT enabled we can't use PROT_EXEC. */
! #if defined FFI_MMAP_PAX
  #include <stdlib.h>
  
! enum {
!   PAX_MPROTECT = (1 << 0),
!   PAX_EMUTRAMP = (1 << 1),
! };
! static int cached_pax_flags = -1;
  
  static int
! pax_flags_check (void)
  {
    char *buf = NULL;
    size_t len = 0;
*************** emutramp_enabled_check (void)
*** 488,496 ****
    while (getline (&buf, &len, f) != -1)
      if (!strncmp (buf, "PaX:", 4))
        {
!         char emutramp;
!         if (sscanf (buf, "%*s %*c%c", &emutramp) == 1)
!           ret = (emutramp == 'E');
          break;
        }
    free (buf);
--- 510,519 ----
    while (getline (&buf, &len, f) != -1)
      if (!strncmp (buf, "PaX:", 4))
        {
!         if (NULL != strchr (buf + 4, 'M'))
!           ret |= PAX_MPROTECT;
!         if (NULL != strchr (buf + 4, 'E'))
!           ret |= PAX_EMUTRAMP;
          break;
        }
    free (buf);
*************** emutramp_enabled_check (void)
*** 498,506 ****
    return ret;
  }
  
! #define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \
!                                : (emutramp_enabled = emutramp_enabled_check ()))
! #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
  
  #elif defined (__CYGWIN__) || defined(__INTERIX)
  
--- 521,533 ----
    return ret;
  }
  
! #define get_pax_flags() (cached_pax_flags >= 0 ? cached_pax_flags \
!                                : (cached_pax_flags = pax_flags_check ()))
! #define has_pax_flags(flags) ((flags) == ((flags) & get_pax_flags ()))
! #define is_mprotect_enabled() (has_pax_flags (PAX_MPROTECT))
! #define is_emutramp_enabled() (has_pax_flags (PAX_EMUTRAMP))
! 
! #endif /* defined FFI_MMAP_PAX */
  
  #elif defined (__CYGWIN__) || defined(__INTERIX)
  
*************** emutramp_enabled_check (void)
*** 511,519 ****
  
  #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
  
! #ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX
! #define is_emutramp_enabled() 0
! #endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */
  
  /* Declare all functions defined in dlmalloc.c as static.  */
  static void *dlmalloc(size_t);
--- 538,547 ----
  
  #endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */
  
! #if !defined FFI_MMAP_PAX
! # define is_mprotect_enabled() 0
! # define is_emutramp_enabled() 0
! #endif /* !defined FFI_MMAP_PAX */
  
  /* Declare all functions defined in dlmalloc.c as static.  */
  static void *dlmalloc(size_t);
*************** open_temp_exec_file_memfd (const char *n
*** 571,577 ****
  
  /* Open a temporary file name, and immediately unlink it.  */
  static int
! open_temp_exec_file_name (char *name, int flags)
  {
    int fd;
  
--- 599,605 ----
  
  /* Open a temporary file name, and immediately unlink it.  */
  static int
! open_temp_exec_file_name (char *name, int flags MAYBE_UNUSED)
  {
    int fd;
  
*************** open_temp_exec_file_opts_next (void)
*** 737,743 ****
  
  /* Return a file descriptor of a temporary zero-sized file in a
     writable and executable filesystem.  */
! static int
  open_temp_exec_file (void)
  {
    int fd;
--- 765,771 ----
  
  /* Return a file descriptor of a temporary zero-sized file in a
     writable and executable filesystem.  */
! int
  open_temp_exec_file (void)
  {
    int fd;
*************** open_temp_exec_file (void)
*** 767,775 ****
     Failure to allocate the space will cause SIGBUS to be thrown when
     the mapping is subsequently written to.  */
  static int
! allocate_space (int fd, off_t offset, off_t len)
  {
!   static size_t page_size;
  
    /* Obtain system page size. */
    if (!page_size)
--- 795,803 ----
     Failure to allocate the space will cause SIGBUS to be thrown when
     the mapping is subsequently written to.  */
  static int
! allocate_space (int fd, off_t len)
  {
!   static long page_size;
  
    /* Obtain system page size. */
    if (!page_size)
*************** dlmmap_locked (void *start, size_t lengt
*** 810,816 ****
  
    offset = execsize;
  
!   if (allocate_space (execfd, offset, length))
      return MFAIL;
  
    flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS);
--- 838,844 ----
  
    offset = execsize;
  
!   if (allocate_space (execfd, length))
      return MFAIL;
  
    flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS);
*************** dlmmap (void *start, size_t length, int
*** 878,890 ****
        return ptr;
      }
  
!   if (execfd == -1 && is_emutramp_enabled ())
      {
!       ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
!       return ptr;
      }
! 
!   if (execfd == -1 && !is_selinux_enabled ())
      {
        ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset);
  
--- 906,928 ----
        return ptr;
      }
  
!   /* -1 != execfd hints that we already decided to use dlmmap_locked
!      last time.  */
!   if (execfd == -1 && is_mprotect_enabled ())
      {
! #ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX
!       if (is_emutramp_enabled ())
!         {
!           /* emutramp requires the kernel recognizing the trampoline pattern
!              generated by ffi_prep_closure_loc; there is no way to test
!              in advance whether this will work, so this is experimental.  */
!           ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset);
!           return ptr;
!         }
! #endif
!       /* fallback to dlmmap_locked.  */
      }
!   else if (execfd == -1 && !is_selinux_enabled ())
      {
        ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset);
  
*************** dlmmap (void *start, size_t length, int
*** 897,912 ****
  	 MREMAP_DUP and prot at this point.  */
      }
  
!   if (execsize == 0 || execfd == -1)
!     {
!       pthread_mutex_lock (&open_temp_exec_file_mutex);
!       ptr = dlmmap_locked (start, length, prot, flags, offset);
!       pthread_mutex_unlock (&open_temp_exec_file_mutex);
! 
!       return ptr;
!     }
  
!   return dlmmap_locked (start, length, prot, flags, offset);
  }
  
  /* Release memory at the given address, as well as the corresponding
--- 935,945 ----
  	 MREMAP_DUP and prot at this point.  */
      }
  
!   pthread_mutex_lock (&open_temp_exec_file_mutex);
!   ptr = dlmmap_locked (start, length, prot, flags, offset);
!   pthread_mutex_unlock (&open_temp_exec_file_mutex);
  
!   return ptr;
  }
  
  /* Release memory at the given address, as well as the corresponding
*************** ffi_closure_alloc (size_t size, void **c
*** 962,984 ****
    if (!code)
      return NULL;
  
!   ptr = FFI_CLOSURE_PTR (dlmalloc (size));
  
    if (ptr)
      {
        msegmentptr seg = segment_holding (gm, ptr);
  
!       *code = add_segment_exec_offset (ptr, seg);
        if (!ffi_tramp_is_supported ())
          return ptr;
  
        ftramp = ffi_tramp_alloc (0);
        if (ftramp == NULL)
        {
!         dlfree (FFI_RESTORE_PTR (ptr));
          return NULL;
        }
!       *code = ffi_tramp_get_addr (ftramp);
        ((ffi_closure *) ptr)->ftramp = ftramp;
      }
  
--- 995,1017 ----
    if (!code)
      return NULL;
  
!   ptr = dlmalloc (size);
  
    if (ptr)
      {
        msegmentptr seg = segment_holding (gm, ptr);
  
!       *code = FFI_FN (add_segment_exec_offset (ptr, seg));
        if (!ffi_tramp_is_supported ())
          return ptr;
  
        ftramp = ffi_tramp_alloc (0);
        if (ftramp == NULL)
        {
!         dlfree (ptr);
          return NULL;
        }
!       *code = FFI_FN (ffi_tramp_get_addr (ftramp));
        ((ffi_closure *) ptr)->ftramp = ftramp;
      }
  
*************** ffi_closure_free (void *ptr)
*** 1019,1025 ****
    if (ffi_tramp_is_supported ())
      ffi_tramp_free (((ffi_closure *) ptr)->ftramp);
  
!   dlfree (FFI_RESTORE_PTR (ptr));
  }
  
  int
--- 1052,1058 ----
    if (ffi_tramp_is_supported ())
      ffi_tramp_free (((ffi_closure *) ptr)->ftramp);
  
!   dlfree (ptr);
  }
  
  int
*************** ffi_tramp_is_present (void *ptr)
*** 1039,1054 ****
  void *
  ffi_closure_alloc (size_t size, void **code)
  {
    if (!code)
      return NULL;
  
!   return *code = FFI_CLOSURE_PTR (malloc (size));
  }
  
  void
  ffi_closure_free (void *ptr)
  {
!   free (FFI_RESTORE_PTR (ptr));
  }
  
  void *
--- 1072,1091 ----
  void *
  ffi_closure_alloc (size_t size, void **code)
  {
+   void *c;
+ 
    if (!code)
      return NULL;
  
!   c = malloc (size);
!   *code = FFI_FN (c);
!   return c;
  }
  
  void
  ffi_closure_free (void *ptr)
  {
!   free (ptr);
  }
  
  void *
*************** ffi_tramp_is_present (__attribute__((unu
*** 1067,1069 ****
--- 1104,1107 ----
  #endif /* FFI_CLOSURES */
  
  #endif /* NetBSD with PROT_MPROTECT */
+ #endif /* __EMSCRIPTEN__ */
diff -Nrcpad gcc-17-20260517/libffi/src/debug.c gcc-17-20260524/libffi/src/debug.c
*** gcc-17-20260517/libffi/src/debug.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/debug.c	Sun May 24 22:32:13 2026
*************** void ffi_stop_here(void)
*** 38,44 ****
  
  /* This function should only be called via the FFI_ASSERT() macro */
  
! void ffi_assert(char *expr, char *file, int line)
  {
    fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line);
    ffi_stop_here();
--- 38,44 ----
  
  /* This function should only be called via the FFI_ASSERT() macro */
  
! NORETURN void ffi_assert(const char *expr, const char *file, int line)
  {
    fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line);
    ffi_stop_here();
*************** void ffi_assert(char *expr, char *file,
*** 47,53 ****
  
  /* Perform a sanity check on an ffi_type structure */
  
! void ffi_type_test(ffi_type *a, char *file, int line)
  {
    FFI_ASSERT_AT(a != NULL, file, line);
  
--- 47,53 ----
  
  /* Perform a sanity check on an ffi_type structure */
  
! void ffi_type_test(ffi_type *a, const char *file, int line)
  {
    FFI_ASSERT_AT(a != NULL, file, line);
  
diff -Nrcpad gcc-17-20260517/libffi/src/dlmalloc.c gcc-17-20260524/libffi/src/dlmalloc.c
*** gcc-17-20260517/libffi/src/dlmalloc.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/dlmalloc.c	Sun May 24 22:32:13 2026
*************** DEFAULT_MMAP_THRESHOLD       default: 25
*** 592,597 ****
--- 592,602 ----
    malloc does support the following options.
  */
  
+ /* The system's malloc.h may have conflicting defines. */
+ #undef M_TRIM_THRESHOLD
+ #undef M_GRANULARITY
+ #undef M_MMAP_THRESHOLD
+ 
  #define M_TRIM_THRESHOLD     (-1)
  #define M_GRANULARITY        (-2)
  #define M_MMAP_THRESHOLD     (-3)
*************** static void add_segment(mstate m, char*
*** 3383,3388 ****
--- 3388,3394 ----
    mchunkptr tnext = chunk_plus_offset(sp, ssize);
    mchunkptr p = tnext;
    int nfences = 0;
+   (void)nfences; // Suppress unused variable warning
  
    /* reset top to new space */
    init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
*************** struct mallinfo dlmallinfo(void) {
*** 4447,4453 ****
  }
  #endif /* NO_MALLINFO */
  
! void dlmalloc_stats() {
    internal_malloc_stats(gm);
  }
  
--- 4453,4459 ----
  }
  #endif /* NO_MALLINFO */
  
! void dlmalloc_stats(void) {
    internal_malloc_stats(gm);
  }
  
diff -Nrcpad gcc-17-20260517/libffi/src/ia64/ffi.c gcc-17-20260524/libffi/src/ia64/ffi.c
*** gcc-17-20260517/libffi/src/ia64/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/ia64/ffi.c	Sun May 24 22:32:13 2026
***************
*** 38,44 ****
--- 38,48 ----
  /* A 64-bit pointer value.  In LP64 mode, this is effectively a plain
     pointer.  In ILP32 mode, it's a pointer that's been extended to 
     64 bits by "addp4".  */
+ #ifdef __hpux
+ typedef void *PTR64;
+ #else // some other unix
  typedef void *PTR64 __attribute__((mode(DI)));
+ #endif
  
  /* Memory image of fp register contents.  This is the implementation
     specific format used by ldf.fill/stf.spill.  All we care about is
*************** endian_adjust (void *addr, size_t len)
*** 76,89 ****
--- 80,101 ----
     point types without type conversions.  Type conversion to long double breaks
     the denorm support.  */
  
+ #ifdef __hpux
+ #define stf_spill(addr, value)
+ #else
  #define stf_spill(addr, value)	\
    asm ("stf.spill %0 = %1%P0" : "=m" (*addr) : "f"(value));
+ #endif
  
  /* Load a value from ADDR, which is in the current cpu implementation's
     fp spill format.  As above, this must also be a macro.  */
  
+ #ifdef __hpux
+ #define ldf_fill(result, addr)
+ #else
  #define ldf_fill(result, addr)	\
    asm ("ldf.fill %0 = %1%P1" : "=f"(result) : "m"(*addr));
+ #endif
  
  /* Return the size of the C type associated with with TYPE.  Which will
     be one of the FFI_IA64_TYPE_HFA_* values.  */
diff -Nrcpad gcc-17-20260517/libffi/src/ia64/unix.S gcc-17-20260524/libffi/src/ia64/unix.S
*** gcc-17-20260517/libffi/src/ia64/unix.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/ia64/unix.S	Sun May 24 22:32:13 2026
***************
*** 36,41 ****
--- 36,47 ----
  
  	.pred.safe_across_calls p1-p5,p16-p63
  .text
+ /* HPUX assembler needs to see these symbols, otherwise compilation
+    fails */
+ #ifdef __hpux
+       .global memcpy
+       .global ffi_closure_unix_inner
+ #endif
  
  /* int ffi_call_unix (struct ia64_args *stack, PTR64 rvalue,
  		      void (*fn)(void), int flags);
*************** ffi_call_unix:
*** 104,110 ****
--- 110,121 ----
  	mov	ar.pfs = loc0
  	addl	r18 = @ltoffx(.Lst_table), gp
  	;;
+ 	/* default assembler on HP-UX does not support LDXMOV */
+ #ifdef __hpux
+ 	ld8	r18 = [r18]
+ #else
  	ld8.mov	r18 = [r18], .Lst_table
+ #endif
  	mov	b0 = loc1
  	;;
  	shladd	r18 = r16, 3, r18
*************** ffi_closure_unix:
*** 357,363 ****
  	addl	r18 = @ltoffx(.Lld_table), gp
  	mov	ar.pfs = loc0
  	;;
! 	ld8.mov	r18 = [r18], .Lld_table
  	mov	b0 = loc1
  	;;
  	shladd	r18 = r16, 3, r18
--- 368,378 ----
  	addl	r18 = @ltoffx(.Lld_table), gp
  	mov	ar.pfs = loc0
  	;;
! #ifdef __hpux
! 	ld8	r18 = [r18]
! #else
! 	ld8.mov	r18 = [r18], .Lst_table
! #endif
  	mov	b0 = loc1
  	;;
  	shladd	r18 = r16, 3, r18
*************** ffi_closure_unix:
*** 515,522 ****
  	;;
  
  	.endp	ffi_closure_unix
! 
  	.section .rodata
  	.align	8
  .Lst_table:
  	data8	@pcrel(.Lst_void)		// FFI_TYPE_VOID
--- 530,540 ----
  	;;
  
  	.endp	ffi_closure_unix
! #ifdef __hpux
! 	.rodata
! #else
  	.section .rodata
+ #endif
  	.align	8
  .Lst_table:
  	data8	@pcrel(.Lst_void)		// FFI_TYPE_VOID
diff -Nrcpad gcc-17-20260517/libffi/src/loongarch64/ffi.c gcc-17-20260524/libffi/src/loongarch64/ffi.c
*** gcc-17-20260517/libffi/src/loongarch64/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/loongarch64/ffi.c	Sun May 24 22:32:13 2026
***************
*** 28,33 ****
--- 28,34 ----
  
  #include <ffi.h>
  #include <ffi_common.h>
+ #include <tramp.h>
  
  #include <stdlib.h>
  #include <stdint.h>
diff -Nrcpad gcc-17-20260517/libffi/src/m32r/ffi.c gcc-17-20260524/libffi/src/m32r/ffi.c
*** gcc-17-20260517/libffi/src/m32r/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/m32r/ffi.c	Sun May 24 22:32:13 2026
***************
*** 1,8 ****
  /* -----------------------------------------------------------------------
     ffi.c - Copyright (c) 2004  Renesas Technology
             Copyright (c) 2008  Red Hat, Inc.
!    
!    M32R Foreign Function Interface 
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
--- 1,9 ----
  /* -----------------------------------------------------------------------
     ffi.c - Copyright (c) 2004  Renesas Technology
             Copyright (c) 2008  Red Hat, Inc.
!            Copyright (c) 2022  Anthony Green
! 
!    M32R Foreign Function Interface
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
*************** void ffi_prep_args(char *stack, extended
*** 63,69 ****
        if (((*p_arg)->alignment - 1) & (unsigned) argp)
  	argp = (char *) FFI_ALIGN (argp, (*p_arg)->alignment);
  
!       if (avn != 0) 
  	{
  	  avn--;
  	  z = (*p_arg)->size;
--- 64,70 ----
        if (((*p_arg)->alignment - 1) & (unsigned) argp)
  	argp = (char *) FFI_ALIGN (argp, (*p_arg)->alignment);
  
!       if (avn != 0)
  	{
  	  avn--;
  	  z = (*p_arg)->size;
*************** void ffi_prep_args(char *stack, extended
*** 76,94 ****
  		case FFI_TYPE_SINT8:
  		  *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  		  break;
! 		  
  		case FFI_TYPE_UINT8:
  		  *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  		  break;
! 		  
  		case FFI_TYPE_SINT16:
  		  *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  		  break;
! 		  
  		case FFI_TYPE_UINT16:
  		  *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  		  break;
! 		  
  		case FFI_TYPE_STRUCT:
  	  	  z = (*p_arg)->size;
  	  	  if ((*p_arg)->alignment != 1)
--- 77,95 ----
  		case FFI_TYPE_SINT8:
  		  *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  		  break;
! 
  		case FFI_TYPE_UINT8:
  		  *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  		  break;
! 
  		case FFI_TYPE_SINT16:
  		  *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  		  break;
! 
  		case FFI_TYPE_UINT16:
  		  *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  		  break;
! 
  		case FFI_TYPE_STRUCT:
  	  	  z = (*p_arg)->size;
  	  	  if ((*p_arg)->alignment != 1)
*************** void ffi_prep_args(char *stack, extended
*** 131,137 ****
  	  argp += z;
  	}
      }
!   
    return;
  }
  
--- 132,138 ----
  	  argp += z;
  	}
      }
! 
    return;
  }
  
*************** extern void ffi_call_SYSV(void (*)(char
*** 178,201 ****
  void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
  {
    extended_cif ecif;
  
    ecif.cif = cif;
    ecif.avalue = avalue;
!   
    /* If the return value is a struct and we don't have
       a return value address then we need to make one.  */
!   if ((rvalue == NULL) && 
        (cif->rtype->type == FFI_TYPE_STRUCT))
      {
        ecif.rvalue = alloca (cif->rtype->size);
      }
    else
!     ecif.rvalue = rvalue;    
!   
!   switch (cif->abi) 
      {
      case FFI_SYSV:
!       ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
  		    cif->flags, ecif.rvalue, fn);
        if (cif->rtype->type == FFI_TYPE_STRUCT)
  	{
--- 179,218 ----
  void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
  {
    extended_cif ecif;
+   ffi_type **arg_types = cif->arg_types;
+   int i, nargs = cif->nargs;
  
    ecif.cif = cif;
    ecif.avalue = avalue;
! 
    /* If the return value is a struct and we don't have
       a return value address then we need to make one.  */
!   if ((rvalue == NULL) &&
        (cif->rtype->type == FFI_TYPE_STRUCT))
      {
        ecif.rvalue = alloca (cif->rtype->size);
      }
    else
!     ecif.rvalue = rvalue;
! 
!   /* If we have any large structure arguments, make a copy so we are passing
!      by value.  */
!   for (i = 0; i < nargs; i++)
!     {
!       ffi_type *at = arg_types[i];
!       int size = at->size;
!       if (at->type == FFI_TYPE_STRUCT && size > 4)
!         {
!           char *argcopy = alloca (size);
!           memcpy (argcopy, avalue[i], size);
!           avalue[i] = argcopy;
!         }
!     }
! 
!   switch (cif->abi)
      {
      case FFI_SYSV:
!       ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
  		    cif->flags, ecif.rvalue, fn);
        if (cif->rtype->type == FFI_TYPE_STRUCT)
  	{
diff -Nrcpad gcc-17-20260517/libffi/src/mips/ffi.c gcc-17-20260524/libffi/src/mips/ffi.c
*** gcc-17-20260517/libffi/src/mips/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/mips/ffi.c	Sun May 24 22:32:13 2026
***************
*** 31,36 ****
--- 31,37 ----
  
  #include <stdint.h>
  #include <stdlib.h>
+ #include <stdio.h>
  
  #ifdef __GNUC__
  #  if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
*************** static void ffi_prep_args(char *stack,
*** 77,98 ****
  {
    int i;
    void **p_argv;
!   char *argp;
    ffi_type **p_arg;
  
  #ifdef FFI_MIPS_N32
    /* If more than 8 double words are used, the remainder go
       on the stack. We reorder stuff on the stack here to 
       support this easily. */
!   if (bytes > 8 * sizeof(ffi_arg))
!     argp = &stack[bytes - (8 * sizeof(ffi_arg))];
    else
!     argp = stack;
  #else
    argp = stack;
  #endif
  
!   memset(stack, 0, bytes);
  
  #ifdef FFI_MIPS_N32
    if ( ecif->cif->rstruct_flag != 0 )
--- 78,116 ----
  {
    int i;
    void **p_argv;
!   char *argp, *argp_f;
    ffi_type **p_arg;
  
+   memset(stack, 0, bytes);
+ 
  #ifdef FFI_MIPS_N32
+   int soft_float = (ecif->cif->abi == FFI_N32_SOFT_FLOAT
+ 		    || ecif->cif->abi == FFI_N64_SOFT_FLOAT);
    /* If more than 8 double words are used, the remainder go
       on the stack. We reorder stuff on the stack here to 
       support this easily. */
!   /* if ret is _Complex long double, args reg shift2, and a0 should holds pointer to rvalue */
!   if (ecif->cif->rtype->type == FFI_TYPE_COMPLEX && ecif->cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
!     {
!       if (bytes + 16 > 8 * sizeof(ffi_arg))
!         argp = &stack[bytes - (8 * sizeof(ffi_arg))];
!       else
!         argp = stack;
!       * (unsigned long *) argp = (unsigned long) ecif->rvalue;
!       argp += 16;
!     }
    else
!     {
!       if (bytes > 8 * sizeof(ffi_arg))
!         argp = &stack[bytes - (8 * sizeof(ffi_arg))];
!       else
!         argp = stack;
!     }
  #else
    argp = stack;
  #endif
  
!   argp_f = argp;
  
  #ifdef FFI_MIPS_N32
    if ( ecif->cif->rstruct_flag != 0 )
*************** static void ffi_prep_args(char *stack,
*** 133,139 ****
            if (type == FFI_TYPE_POINTER)
              type = (ecif->cif->abi == FFI_N64
  		    || ecif->cif->abi == FFI_N64_SOFT_FLOAT)
! 	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
  
  	if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
  		      || ecif->cif->abi == FFI_N64_SOFT_FLOAT))
--- 151,157 ----
            if (type == FFI_TYPE_POINTER)
              type = (ecif->cif->abi == FFI_N64
  		    || ecif->cif->abi == FFI_N64_SOFT_FLOAT)
! 	      ? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
  
  	if (i < 8 && (ecif->cif->abi == FFI_N32_SOFT_FLOAT
  		      || ecif->cif->abi == FFI_N64_SOFT_FLOAT))
*************** static void ffi_prep_args(char *stack,
*** 183,188 ****
--- 201,225 ----
  #endif
  		break;
  
+ #ifdef FFI_MIPS_N32
+ 	      case FFI_TYPE_COMPLEX:
+ 		/* expand from 4+4 to 8+8 if pass with fpr reg */
+ 		/* argp will wind back to stack when we process all of reg args */
+ 		/* all var_args passed with gpr, should be expand */
+ 	        if(!soft_float
+ 		    && (*p_arg)->elements[0]->type == FFI_TYPE_FLOAT
+ 		    && argp>=argp_f
+ 		    && i < ecif->cif->mips_nfixedargs)
+ 		  {
+ 		    *(float *) argp = *(float *)(* p_argv);
+ 		    argp += z;
+ 		    char *tmp = (void *) (*p_argv);
+ 		    *(float *) argp = *(float *)(tmp+4);
+ 		  }
+ 		else
+ 		  memcpy(argp, *p_argv, (*p_arg)->size);
+ 		break;
+ #endif
  	      /* This can only happen with 64bit slots.  */
  	      case FFI_TYPE_FLOAT:
  		*(float *) argp = *(float *)(* p_argv);
*************** static void ffi_prep_args(char *stack,
*** 235,240 ****
--- 272,295 ----
     passed in an integer register". This code traverses structure
     definitions and generates the appropriate flags. */
  
+ static int
+ calc_n32_struct_flags_element(unsigned *flags, ffi_type *e,
+ 			      unsigned *loc, unsigned *arg_reg)
+ {
+   /* Align this object.  */
+   *loc = FFI_ALIGN(*loc, e->alignment);
+   if (e->type == FFI_TYPE_DOUBLE)
+     {
+       /* Already aligned to FFI_SIZEOF_ARG.  */
+       *arg_reg = *loc / FFI_SIZEOF_ARG;
+       if (*arg_reg > 7)
+ 	return 1;
+       *flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
+     }
+   *loc += e->size;
+   return 0;
+ }
+ 
  static unsigned
  calc_n32_struct_flags(int soft_float, ffi_type *arg,
  		      unsigned *loc, unsigned *arg_reg)
*************** calc_n32_struct_flags(int soft_float, ff
*** 249,267 ****
  
    while ((e = arg->elements[index]))
      {
!       /* Align this object.  */
!       *loc = FFI_ALIGN(*loc, e->alignment);
!       if (e->type == FFI_TYPE_DOUBLE)
  	{
!           /* Already aligned to FFI_SIZEOF_ARG.  */
!           *arg_reg = *loc / FFI_SIZEOF_ARG;
!           if (*arg_reg > 7)
!             break;
! 	  flags += (FFI_TYPE_DOUBLE << (*arg_reg * FFI_FLAG_BITS));
!           *loc += e->size;
  	}
        else
!         *loc += e->size;
        index++;
      }
    /* Next Argument register at alignment of FFI_SIZEOF_ARG.  */
--- 304,319 ----
  
    while ((e = arg->elements[index]))
      {
!       if (e->type == FFI_TYPE_COMPLEX)
  	{
! 	  if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
! 	    break;
! 	  if (calc_n32_struct_flags_element(&flags, e->elements[0], loc, arg_reg))
! 	    break;
  	}
        else
! 	if (calc_n32_struct_flags_element(&flags, e, loc, arg_reg))
! 	  break;
        index++;
      }
    /* Next Argument register at alignment of FFI_SIZEOF_ARG.  */
*************** calc_n32_struct_flags(int soft_float, ff
*** 273,279 ****
  static unsigned
  calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
  {
!   unsigned flags = 0;
    unsigned small = FFI_TYPE_SMALLSTRUCT;
    ffi_type *e;
  
--- 325,331 ----
  static unsigned
  calc_n32_return_struct_flags(int soft_float, ffi_type *arg)
  {
!   unsigned flags;
    unsigned small = FFI_TYPE_SMALLSTRUCT;
    ffi_type *e;
  
*************** calc_n32_return_struct_flags(int soft_fl
*** 292,324 ****
  
    e = arg->elements[0];
  
!   if (e->type == FFI_TYPE_DOUBLE)
!     flags = FFI_TYPE_DOUBLE;
!   else if (e->type == FFI_TYPE_FLOAT)
!     flags = FFI_TYPE_FLOAT;
! 
!   if (flags && (e = arg->elements[1]))
      {
!       if (e->type == FFI_TYPE_DOUBLE)
! 	flags += FFI_TYPE_DOUBLE << FFI_FLAG_BITS;
!       else if (e->type == FFI_TYPE_FLOAT)
! 	flags += FFI_TYPE_FLOAT << FFI_FLAG_BITS;
!       else 
  	return small;
  
!       if (flags && (arg->elements[2]))
  	{
! 	  /* There are three arguments and the first two are 
! 	     floats! This must be passed the old way. */
  	  return small;
  	}
!       if (soft_float)
! 	flags += FFI_TYPE_STRUCT_SOFT;
      }
    else
!     if (!flags)
!       return small;
  
    return flags;
  }
  
--- 344,391 ----
  
    e = arg->elements[0];
  
!   if (e->type == FFI_TYPE_COMPLEX)
      {
!       int type = e->elements[0]->type;
! 
!       if (type != FFI_TYPE_DOUBLE && type != FFI_TYPE_FLOAT)
  	return small;
  
!       if (arg->elements[1])
  	{
! 	  /* Two floating point fields with more fields!
! 	     This must be passed the old way. */
  	  return small;
  	}
! 
!       flags = (type << FFI_FLAG_BITS) + type;
      }
    else
!     {
!       if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
! 	return small;
! 
!       flags = e->type;
  
+       if (arg->elements[1])
+ 	{
+ 	  e = arg->elements[1];
+ 	  if (e->type != FFI_TYPE_DOUBLE && e->type != FFI_TYPE_FLOAT)
+ 	    return small;
+ 
+ 	  if (arg->elements[2])
+ 	    {
+ 	      /* There are three arguments and the first two are
+ 		 floats! This must be passed the old way. */
+ 	      return small;
+ 	    }
+ 
+ 	  flags += e->type << FFI_FLAG_BITS;
+ 	}
+     }
+ 
+   if (soft_float)
+     flags += FFI_TYPE_STRUCT_SOFT;
    return flags;
  }
  
*************** static ffi_status ffi_prep_cif_machdep_i
*** 335,341 ****
     * does not have special handling for floating point args.
     */
  
!   if (cif->rtype->type != FFI_TYPE_STRUCT && cif->abi == FFI_O32)
      {
        if (cif->nargs > 0 && cif->nargs == nfixedargs)
  	{
--- 402,408 ----
     * does not have special handling for floating point args.
     */
  
!   if (cif->rtype->type != FFI_TYPE_STRUCT && cif->rtype->type != FFI_TYPE_COMPLEX && cif->abi == FFI_O32)
      {
        if (cif->nargs > 0 && cif->nargs == nfixedargs)
  	{
*************** static ffi_status ffi_prep_cif_machdep_i
*** 403,409 ****
--- 470,479 ----
          case FFI_TYPE_STRUCT:
          case FFI_TYPE_FLOAT:
          case FFI_TYPE_DOUBLE:
+         case FFI_TYPE_COMPLEX:
            cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 2);
+ 	  if (cif->rtype->type == FFI_TYPE_COMPLEX)
+             cif->flags +=  ((*cif->rtype->elements[0]).type) << (FFI_FLAG_BITS * 4);
            break;
  
          case FFI_TYPE_SINT64:
*************** static ffi_status ffi_prep_cif_machdep_i
*** 421,427 ****
  #ifdef FFI_MIPS_N32
    /* Set the flags necessary for N32 processing */
    {
-     int type;
      unsigned arg_reg = 0;
      unsigned loc = 0;
      unsigned count = (cif->nargs < 8) ? cif->nargs : 8;
--- 491,496 ----
*************** static ffi_status ffi_prep_cif_machdep_i
*** 453,481 ****
  
      while (count-- > 0 && arg_reg < 8)
        {
! 	type = (cif->arg_types)[index]->type;
  
! 	// Pass variadic arguments in integer registers even if they're floats
! 	if (soft_float || index >= nfixedargs)
! 	  {
! 	    switch (type)
! 	      {
! 	      case FFI_TYPE_FLOAT:
! 		type = FFI_TYPE_UINT32;
! 		break;
! 	      case FFI_TYPE_DOUBLE:
! 		type = FFI_TYPE_UINT64;
! 		break;
! 	      default:
! 		break;
! 	      }
! 	  }
! 	switch (type)
  	  {
  	  case FFI_TYPE_FLOAT:
  	  case FFI_TYPE_DOUBLE:
! 	    cif->flags +=
!               ((cif->arg_types)[index]->type << (arg_reg * FFI_FLAG_BITS));
  	    arg_reg++;
  	    break;
            case FFI_TYPE_LONGDOUBLE:
--- 522,535 ----
  
      while (count-- > 0 && arg_reg < 8)
        {
! 	ffi_type *t = cif->arg_types[index];
  
! 	switch (t->type)
  	  {
  	  case FFI_TYPE_FLOAT:
  	  case FFI_TYPE_DOUBLE:
! 	    if (!soft_float && index < nfixedargs)
!               cif->flags += t->type << (arg_reg * FFI_FLAG_BITS);
  	    arg_reg++;
  	    break;
            case FFI_TYPE_LONGDOUBLE:
*************** static ffi_status ffi_prep_cif_machdep_i
*** 491,507 ****
  		cif->flags +=
  		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
  		arg_reg++;
  		cif->flags +=
  		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
  		arg_reg++;
  	      }
              break;
  
  	  case FFI_TYPE_STRUCT:
              loc = arg_reg * FFI_SIZEOF_ARG;
  	    cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs,
! 						(cif->arg_types)[index],
! 						&loc, &arg_reg);
  	    break;
  
  	  default:
--- 545,615 ----
  		cif->flags +=
  		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
  		arg_reg++;
+ 		if (arg_reg >= 8)
+ 		  continue;
  		cif->flags +=
  		  (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
  		arg_reg++;
  	      }
              break;
  
+ 	  case FFI_TYPE_COMPLEX:
+ 	    switch (t->elements[0]->type)
+ 	      {
+ 	      case FFI_TYPE_LONGDOUBLE:
+ 		arg_reg = FFI_ALIGN(arg_reg, 2);
+ 		if (soft_float || index >= nfixedargs)
+ 		  {
+ 		    arg_reg += 2;
+ 		  }
+ 		else
+ 		  {
+ 		    cif->flags +=
+ 		      (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
+ 		    arg_reg++;
+ 		    if (arg_reg >= 8)
+ 		        continue;
+ 		    cif->flags +=
+ 		      (FFI_TYPE_DOUBLE << (arg_reg * FFI_FLAG_BITS));
+ 		    arg_reg++;
+ 		    if (arg_reg >= 8)
+ 		        continue;
+ 		  }
+ 		/* passthrough */
+ 	      case FFI_TYPE_FLOAT:
+ 		// one fpr can only holds one arg even it is single
+ 		cif->bytes += 16;
+ 		/* passthrough */
+ 	      case FFI_TYPE_SINT32:
+ 	      case FFI_TYPE_UINT32:
+ 	      case FFI_TYPE_DOUBLE:
+ 		if (soft_float || index >= nfixedargs)
+ 		  {
+ 		    arg_reg += 2;
+ 		  }
+ 		else
+ 		  {
+ 		    uint32_t type = t->elements[0]->type != FFI_TYPE_LONGDOUBLE? t->elements[0]->type: FFI_TYPE_DOUBLE;
+ 		    cif->flags +=
+ 		      (type << (arg_reg * FFI_FLAG_BITS));
+ 		    arg_reg++;
+ 		    if (arg_reg >= 8)
+ 		        continue;
+ 		    cif->flags +=
+ 		      (type << (arg_reg * FFI_FLAG_BITS));
+ 		    arg_reg++;
+ 		  }
+ 		break;
+ 	      default:
+ 		arg_reg += 2;
+ 		break;
+ 	      }
+ 	    break;
+ 
  	  case FFI_TYPE_STRUCT:
              loc = arg_reg * FFI_SIZEOF_ARG;
  	    cif->flags += calc_n32_struct_flags(soft_float || index >= nfixedargs,
! 						t, &loc, &arg_reg);
  	    break;
  
  	  default:
*************** static ffi_status ffi_prep_cif_machdep_i
*** 541,547 ****
  	if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
  	  cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
  	else
! 	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
  	break;
  
        case FFI_TYPE_FLOAT:
--- 649,655 ----
  	if (cif->abi == FFI_N32_SOFT_FLOAT || cif->abi == FFI_N32)
  	  cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
  	else
! 	  cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
  	break;
  
        case FFI_TYPE_FLOAT:
*************** static ffi_status ffi_prep_cif_machdep_i
*** 553,559 ****
  	/* else fall through */
        case FFI_TYPE_DOUBLE:
  	if (soft_float)
! 	  cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
  	else
  	  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
  	break;
--- 661,667 ----
  	/* else fall through */
        case FFI_TYPE_DOUBLE:
  	if (soft_float)
! 	  cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
  	else
  	  cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
  	break;
*************** static ffi_status ffi_prep_cif_machdep_i
*** 563,570 ****
  	   two doubles.  */
  	if (soft_float)
  	  {
! 	    cif->flags += FFI_TYPE_STRUCT << (FFI_FLAG_BITS * 8);
! 	    cif->flags += FFI_TYPE_SMALLSTRUCT2 << (4 + (FFI_FLAG_BITS * 8));
   	  }
  	else
  	  {
--- 671,679 ----
  	   two doubles.  */
  	if (soft_float)
  	  {
! 	    /* if ret is long double, the ret is given by v0 and a0, no idea why
! 	     * Let's us VOID | VOID | LONGDOUBLE for it*/
! 	    cif->flags += FFI_TYPE_LONGDOUBLE << (FFI_FLAG_BITS * 8);
   	  }
  	else
  	  {
*************** static ffi_status ffi_prep_cif_machdep_i
*** 574,586 ****
  					      << (4 + (FFI_FLAG_BITS * 8));
  	  }
  	break;
        default:
! 	cif->flags += FFI_TYPE_INT << (FFI_FLAG_BITS * 8);
  	break;
        }
    }
  #endif
-   
    return FFI_OK;
  }
  
--- 683,734 ----
  					      << (4 + (FFI_FLAG_BITS * 8));
  	  }
  	break;
+       case FFI_TYPE_COMPLEX:
+ 	{
+ 	  int type = cif->rtype->elements[0]->type;
+ 
+ 	  cif->flags += (FFI_TYPE_COMPLEX << (FFI_FLAG_BITS * 8));
+ 	  if (soft_float || (type != FFI_TYPE_FLOAT && type != FFI_TYPE_DOUBLE && type != FFI_TYPE_LONGDOUBLE))
+ 	    {
+ 	      switch (type)
+ 		{
+ 		case FFI_TYPE_DOUBLE:
+ 		case FFI_TYPE_SINT64:
+ 		case FFI_TYPE_UINT64:
+ 		case FFI_TYPE_INT:
+ 		  type = FFI_TYPE_SMALLSTRUCT2;
+ 		  break;
+ 		case FFI_TYPE_LONGDOUBLE:
+ 		  type = FFI_TYPE_LONGDOUBLE;
+ 		  break;
+ 		case FFI_TYPE_FLOAT:
+ 		default:
+ 		  type = FFI_TYPE_SMALLSTRUCT;
+ 		}
+ 	      cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
+ 	    }
+ 	  else
+ 	    {
+ 	      //cif->flags += (type + (type << FFI_FLAG_BITS))
+ 		//	    << (4 + (FFI_FLAG_BITS * 8));
+ 	      cif->flags += type << (4 + (FFI_FLAG_BITS * 8));
+ 	    }
+ 	  break;
+ 	}
+       case FFI_TYPE_UINT32:
+ 	/* In the N32 or N64 ABI unsigned 32-bit integer should be
+ 	   *sign*-extended.  */
+ 	cif->flags += FFI_TYPE_SINT32 << (FFI_FLAG_BITS * 8);
+ 	break;
+       case FFI_TYPE_SINT64:
+ 	cif->flags += FFI_TYPE_UINT64 << (FFI_FLAG_BITS * 8);
+ 	break;
        default:
! 	cif->flags += cif->rtype->type << (FFI_FLAG_BITS * 8);
  	break;
        }
    }
  #endif
    return FFI_OK;
  }
  
*************** void ffi_call_int(ffi_cif *cif, void (*f
*** 618,624 ****
    /* value address then we need to make one		        */
    
    if ((rvalue == NULL) && 
!       (cif->rtype->type == FFI_TYPE_STRUCT))
      ecif.rvalue = alloca(cif->rtype->size);
    else
      ecif.rvalue = rvalue;
--- 766,772 ----
    /* value address then we need to make one		        */
    
    if ((rvalue == NULL) && 
!       (cif->rtype->type == FFI_TYPE_STRUCT || cif->rtype->type == FFI_TYPE_COMPLEX))
      ecif.rvalue = alloca(cif->rtype->size);
    else
      ecif.rvalue = rvalue;
*************** ffi_closure_mips_inner_O32 (ffi_cif *cif
*** 830,835 ****
--- 978,988 ----
        argn = 1;
        seen_int = 1;
      }
+   if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_COMPLEX)
+     {
+       rvalue = fpr;
+       argn = 1;
+     }
  
    i = 0;
    avn = cif->nargs;
*************** ffi_closure_mips_inner_O32 (ffi_cif *cif
*** 902,907 ****
--- 1055,1063 ----
      }
    else
      {
+       if (cif->rtype->type == FFI_TYPE_COMPLEX) {
+           __asm__ volatile ("move $v1, %0" : : "r"(cif->rtype->size));
+       }
        return cif->rtype->type;
      }
  }
*************** ffi_closure_mips_inner_N32 (ffi_cif *cif
*** 991,996 ****
--- 1147,1154 ----
  #endif
        argn = 1;
      }
+   if (cif->rtype->type == FFI_TYPE_COMPLEX && cif->rtype->elements[0]->type == FFI_TYPE_LONGDOUBLE)
+     argn = 2;
  
    i = 0;
    avn = cif->nargs;
*************** ffi_closure_mips_inner_N32 (ffi_cif *cif
*** 1015,1020 ****
--- 1173,1203 ----
  #endif
              avaluep[i] = (char *) argp;
          }
+       else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE)
+         {
+           argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
+           avaluep[i] = (char *) argp;
+         }
+       else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_LONGDOUBLE)
+         {
+ 	  /* align long double */
+ 	  argn += ((argn & 0x1)? 1 : 0);
+           argp = (argn >= 8 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn;
+           avaluep[i] = (char *) argp;
+         }
+       else if (arg_types[i]->type == FFI_TYPE_COMPLEX && arg_types[i]->elements[0]->type == FFI_TYPE_FLOAT)
+         {
+           if (argn >= 8 || i >= cif->mips_nfixedargs || soft_float)
+ 	     argp = ar + argn;
+ 	  else
+ 	    {
+ 	      argp = fpr + argn;
+ 	      /* the normal args for function holds 8bytes, while here we convert it to ptr */
+ 	      uint32_t *tmp = (uint32_t *)argp;
+ 	      tmp[1] = tmp[2];
+ 	    }
+           avaluep[i] = (char *) argp;
+         }
        else
          {
            unsigned type = arg_types[i]->type;
*************** ffi_closure_mips_inner_N32 (ffi_cif *cif
*** 1027,1036 ****
            /* The size of a pointer depends on the ABI */
            if (type == FFI_TYPE_POINTER)
              type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
! 	      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32;
  
  	  if (soft_float && type ==  FFI_TYPE_FLOAT)
! 	    type = FFI_TYPE_UINT32;
  
            switch (type)
              {
--- 1210,1219 ----
            /* The size of a pointer depends on the ABI */
            if (type == FFI_TYPE_POINTER)
              type = (cif->abi == FFI_N64 || cif->abi == FFI_N64_SOFT_FLOAT)
! 	      ? FFI_TYPE_SINT64 : FFI_TYPE_UINT32;
  
  	  if (soft_float && type ==  FFI_TYPE_FLOAT)
! 	    type = FFI_TYPE_SINT32;
  
            switch (type)
              {
diff -Nrcpad gcc-17-20260517/libffi/src/mips/ffitarget.h gcc-17-20260524/libffi/src/mips/ffitarget.h
*** gcc-17-20260517/libffi/src/mips/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/mips/ffitarget.h	Sun May 24 22:32:13 2026
***************
*** 32,47 ****
  #error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
  #endif
  
! #ifdef __linux__
! # include <asm/sgidefs.h>
! #elif defined(__rtems__)
  /*
   * Subprogram calling convention - copied from sgidefs.h
   */
  #define _MIPS_SIM_ABI32		1
  #define _MIPS_SIM_NABI32	2
  #define _MIPS_SIM_ABI64		3
! #elif !defined(__OpenBSD__) && !defined(__FreeBSD__)
  # include <sgidefs.h>
  #endif
  
--- 32,45 ----
  #error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
  #endif
  
! #ifdef __rtems__
  /*
   * Subprogram calling convention - copied from sgidefs.h
   */
  #define _MIPS_SIM_ABI32		1
  #define _MIPS_SIM_NABI32	2
  #define _MIPS_SIM_ABI64		3
! #elif !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__linux__)
  # include <sgidefs.h>
  #endif
  
***************
*** 80,85 ****
--- 78,84 ----
  #  endif
  #endif
  
+ #define FFI_TARGET_HAS_COMPLEX_TYPE 1
  #define FFI_FLAG_BITS 2
  
  /* SGI's strange assembler requires that we multiply by 4 rather 
***************
*** 111,116 ****
--- 110,121 ----
  #define FFI_TYPE_STRUCT_SMALL  93
  #define FFI_TYPE_STRUCT_SMALL2 109
  
+ #define FFI_TYPE_COMPLEX_SMALL    95
+ #define FFI_TYPE_COMPLEX_SMALL2   111
+ #define FFI_TYPE_COMPLEX_FF       47
+ #define FFI_TYPE_COMPLEX_DD       63
+ #define FFI_TYPE_COMPLEX_LDLD     79
+ 
  /* and for n32 soft float, add 16 * 2^4 */
  #define FFI_TYPE_STRUCT_D_SOFT      317
  #define FFI_TYPE_STRUCT_F_SOFT      301
diff -Nrcpad gcc-17-20260517/libffi/src/mips/n32.S gcc-17-20260524/libffi/src/mips/n32.S
*** gcc-17-20260517/libffi/src/mips/n32.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/mips/n32.S	Sun May 24 22:32:13 2026
*************** loadregs:
*** 114,119 ****
--- 114,129 ----
  
  	REG_L	t6, 3*FFI_SIZEOF_ARG($fp)  # load the flags word into t6.
  
+ 	# when retval is _Complex long double, $f12/$a0, $f13/$a1 will be skipped
+ 	# no idea why, but gcc does it.
+ 	SRL	t4, t6, 8*FFI_FLAG_BITS
+ 	move	t8, t6
+ 	bne	t4, FFI_TYPE_COMPLEX_LDLD, loadregs1
+ 
+ 	SLL	t8, t6, 2*FFI_FLAG_BITS
+ 
+ 
+ loadregs1:
  #ifdef __mips_soft_float
  	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
  	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
*************** loadregs:
*** 124,130 ****
  	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
  	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
  #else
! 	and	t4, t6, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg1_next
  	bne	t4, FFI_TYPE_FLOAT, arg1_doublep
--- 134,140 ----
  	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
  	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
  #else
! 	and	t4, t8, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a0, 0*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg1_next
  	bne	t4, FFI_TYPE_FLOAT, arg1_doublep
*************** arg1_doublep:
*** 134,140 ****
  	l.d	$f12, 0*FFI_SIZEOF_ARG(t9)
  arg1_next:	
  	
! 	SRL	t4, t6, 1*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg2_next
--- 144,150 ----
  	l.d	$f12, 0*FFI_SIZEOF_ARG(t9)
  arg1_next:	
  	
! 	SRL	t4, t8, 1*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a1, 1*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg2_next
*************** arg2_doublep:
*** 145,151 ****
  	l.d	$f13, 1*FFI_SIZEOF_ARG(t9)	
  arg2_next:	
  	
! 	SRL	t4, t6, 2*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a2, 2*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg3_next
--- 155,161 ----
  	l.d	$f13, 1*FFI_SIZEOF_ARG(t9)	
  arg2_next:	
  	
! 	SRL	t4, t8, 2*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a2, 2*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg3_next
*************** arg3_doublep:
*** 156,162 ****
  	l.d	$f14, 2*FFI_SIZEOF_ARG(t9)	
  arg3_next:	
  	
! 	SRL	t4, t6, 3*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a3, 3*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg4_next
--- 166,172 ----
  	l.d	$f14, 2*FFI_SIZEOF_ARG(t9)	
  arg3_next:	
  	
! 	SRL	t4, t8, 3*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a3, 3*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg4_next
*************** arg4_doublep:
*** 167,173 ****
  	l.d	$f15, 3*FFI_SIZEOF_ARG(t9)	
  arg4_next:	
  	
! 	SRL	t4, t6, 4*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a4, 4*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg5_next
--- 177,183 ----
  	l.d	$f15, 3*FFI_SIZEOF_ARG(t9)	
  arg4_next:	
  	
! 	SRL	t4, t8, 4*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a4, 4*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg5_next
*************** arg5_doublep:
*** 178,184 ****
  	l.d	$f16, 4*FFI_SIZEOF_ARG(t9)	
  arg5_next:	
  	
! 	SRL	t4, t6, 5*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a5, 5*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg6_next
--- 188,194 ----
  	l.d	$f16, 4*FFI_SIZEOF_ARG(t9)	
  arg5_next:	
  	
! 	SRL	t4, t8, 5*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a5, 5*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg6_next
*************** arg6_doublep:
*** 189,195 ****
  	l.d	$f17, 5*FFI_SIZEOF_ARG(t9)	
  arg6_next:	
  	
! 	SRL	t4, t6, 6*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg7_next
--- 199,205 ----
  	l.d	$f17, 5*FFI_SIZEOF_ARG(t9)	
  arg6_next:	
  	
! 	SRL	t4, t8, 6*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a6, 6*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg7_next
*************** arg7_doublep:
*** 200,206 ****
  	l.d	$f18, 6*FFI_SIZEOF_ARG(t9)	
  arg7_next:	
  	
! 	SRL	t4, t6, 7*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg8_next
--- 210,216 ----
  	l.d	$f18, 6*FFI_SIZEOF_ARG(t9)	
  arg7_next:	
  	
! 	SRL	t4, t8, 7*FFI_FLAG_BITS
  	and	t4, ((1<<FFI_FLAG_BITS)-1)
  	REG_L	a7, 7*FFI_SIZEOF_ARG(t9)
  	beqz	t4, arg8_next
*************** arg8_doublep:
*** 212,218 ****
  arg8_next:	
  #endif
  
! callit:		
  	# Load the function pointer
  	REG_L	t9, 5*FFI_SIZEOF_ARG($fp)
  
--- 222,228 ----
  arg8_next:	
  #endif
  
! callit:
  	# Load the function pointer
  	REG_L	t9, 5*FFI_SIZEOF_ARG($fp)
  
*************** callit:
*** 226,237 ****
  	# Shift the return type flag over
  	SRL	t6, 8*FFI_FLAG_BITS
  
! 	beq	t6, FFI_TYPE_SINT32, retint	
! 	bne     t6, FFI_TYPE_INT, retfloat
! retint:
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	REG_S	v0, 0(t4)
  	b	epilogue
  
  retfloat:
--- 236,289 ----
  	# Shift the return type flag over
  	SRL	t6, 8*FFI_FLAG_BITS
  
! 	bne     t6, FFI_TYPE_UINT64, retsint32
! 
! retuint64:
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	sd	v0, 0(t4)
! 	b	epilogue
! 
! retsint32:
! 	bne	t6, FFI_TYPE_SINT32, retuint16
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	sll	v0, v0, 0
! 	sd	v0, 0(t4)
! 	b	epilogue
! 
! retuint16:
! 	bne	t6, FFI_TYPE_UINT16, retsint16
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	andi	v0, v0, 0xffff
! 	sd	v0, 0(t4)
! 	b	epilogue
! 
! retsint16:
! 	bne	t6, FFI_TYPE_SINT16, retuint8
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	dsll	v0, v0, 48
! 	dsra	v0, v0, 48
! 	sd	v0, 0(t4)
! 	b	epilogue
! 
! retuint8:
! 	bne	t6, FFI_TYPE_UINT8, retsint8
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	andi	v0, v0, 0xff
! 	sd	v0, 0(t4)
! 	b	epilogue
! 
! retsint8:
! 	bne	t6, FFI_TYPE_SINT8, retfloat
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	sd	v0, 0(t4)
! 	dsll	v0, v0, 56
! 	dsra	v0, v0, 56
  	b	epilogue
  
  retfloat:
*************** retdouble:
*** 249,255 ****
  	s.d	$f0, 0(t4)
  	b	epilogue
  
! retstruct_d:	
  	bne	t6, FFI_TYPE_STRUCT_D, retstruct_f
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
--- 301,307 ----
  	s.d	$f0, 0(t4)
  	b	epilogue
  
! retstruct_d:
  	bne	t6, FFI_TYPE_STRUCT_D, retstruct_f
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
*************** retstruct_f:
*** 263,278 ****
  	s.s	$f0, 0(t4)
  	b	epilogue
  	
! retstruct_d_d:	
! 	bne	t6, FFI_TYPE_STRUCT_DD, retstruct_f_f
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	s.d	$f0, 0(t4)
  	s.d	$f2, 8(t4)
  	b	epilogue
  	
! retstruct_f_f:	
! 	bne	t6, FFI_TYPE_STRUCT_FF, retstruct_d_f
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	s.s	$f0, 0(t4)
--- 315,351 ----
  	s.s	$f0, 0(t4)
  	b	epilogue
  	
! retstruct_d_d:
! 	bne	t6, FFI_TYPE_STRUCT_DD, retcomplex_d_d
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	s.d	$f0, 0(t4)
  	s.d	$f2, 8(t4)
  	b	epilogue
+ 
+ retcomplex_d_d:
+ 	bne	t6, FFI_TYPE_COMPLEX_DD, retcomplex_ld_ld
+ 	jal	t9
+ 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
+ 	s.d	$f0, 0(t4)
+ 	s.d	$f2, 8(t4)
+ 	b	epilogue
+ 
+ retcomplex_ld_ld:
+ 	bne	t6, FFI_TYPE_COMPLEX_LDLD, retstruct_f_f
+ 	jal	t9
+ 	b	epilogue
  	
! retstruct_f_f:
! 	bne	t6, FFI_TYPE_STRUCT_FF, retcomplex_f_f
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	s.s	$f0, 0(t4)
! 	s.s	$f2, 4(t4)
! 	b	epilogue
! 
! retcomplex_f_f:
! 	bne	t6, FFI_TYPE_COMPLEX_FF, retstruct_d_f
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	s.s	$f0, 0(t4)
*************** retstruct_d_d_soft:
*** 315,321 ****
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	sd	v0, 0(t4)
! 	sd	v1, 8(t4)
  	b	epilogue
  	
  retstruct_f_f_soft:	
--- 388,394 ----
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	sd	v0, 0(t4)
! 	sd	a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
  	b	epilogue
  	
  retstruct_f_f_soft:	
*************** retstruct_f_d_soft:
*** 339,345 ****
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	sw	v0, 0(t4)
! 	sd	v1, 8(t4)
  	b	epilogue
  	
  retstruct_small:	
--- 412,418 ----
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	sw	v0, 0(t4)
! 	sd	a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
  	b	epilogue
  	
  retstruct_small:	
*************** retstruct_small:
*** 350,363 ****
  	b	epilogue
  	
  retstruct_small2:	
! 	bne	t6, FFI_TYPE_STRUCT_SMALL2, retstruct
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v0, 0(t4)
  	REG_S	v1, 8(t4)
  	b	epilogue
  	
! retstruct:	
  noretval:	
  	jal	t9
  	
--- 423,459 ----
  	b	epilogue
  	
  retstruct_small2:	
! 	bne	t6, FFI_TYPE_STRUCT_SMALL2, retlongdouble_soft
  	jal	t9
  	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v0, 0(t4)
  	REG_S	v1, 8(t4)
  	b	epilogue
  	
! retlongdouble_soft:
! 	bne	t6, FFI_TYPE_LONGDOUBLE, retcomplex_small
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	REG_S	v0, 0(t4)
! 	REG_S	a0, 8(t4) # not typo, it is a0, I have no idea, gcc does do it
! 	b	epilogue
! 
! retcomplex_small:
! 	bne	t6, FFI_TYPE_COMPLEX_SMALL, retcomplex_small2
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	REG_S	v0, 0(t4)
! 	b	epilogue
! 
! retcomplex_small2:
! 	bne	t6, FFI_TYPE_COMPLEX_SMALL2, retstruct
! 	jal	t9
! 	REG_L	t4, 4*FFI_SIZEOF_ARG($fp)
! 	REG_S	v0, 0(t4)
! 	REG_S	v1, 8(t4)
! 	b	epilogue
! 
! retstruct:
  noretval:	
  	jal	t9
  	
*************** epilogue:
*** 403,409 ****
  	 */
  
  #define SIZEOF_FRAME2	(20 * FFI_SIZEOF_ARG)
! 	
  #define A7_OFF2		(19 * FFI_SIZEOF_ARG)
  #define A6_OFF2		(18 * FFI_SIZEOF_ARG)
  #define A5_OFF2		(17 * FFI_SIZEOF_ARG)
--- 499,505 ----
  	 */
  
  #define SIZEOF_FRAME2	(20 * FFI_SIZEOF_ARG)
! 
  #define A7_OFF2		(19 * FFI_SIZEOF_ARG)
  #define A6_OFF2		(18 * FFI_SIZEOF_ARG)
  #define A5_OFF2		(17 * FFI_SIZEOF_ARG)
*************** ffi_go_closure_N32:
*** 451,458 ****
--- 547,559 ----
  
  	# Call ffi_closure_mips_inner_N32 to do the real work.
  	LA	t9, ffi_closure_mips_inner_N32
+ #if _MIPS_SIM==_ABIN32
+ 	lw	a0, 4($15)   # cif
+ 	lw	a1, 8($15) # fun
+ #else
  	REG_L	a0, 8($15)   # cif
  	REG_L	a1, 16($15) # fun
+ #endif
  	move	a2, t7                     # userdata=closure
  	ADDU	a3, $sp, V0_OFF2           # rvalue
  	ADDU	a4, $sp, A0_OFF2           # ar
*************** ffi_closure_N32:
*** 485,494 ****
--- 586,602 ----
  
  	# Call ffi_closure_mips_inner_N32 to do the real work.
  	LA	t9, ffi_closure_mips_inner_N32
+ #if _MIPS_SIM==_ABIN32
+ 	lw	a0, 20($12)   # cif
+ 	lw	a1, 24($12)   # fun
+ 	lw	a2, 28($12) # user_data
+ #else
  	REG_L	a0, 56($12)   # cif
  	REG_L	a1, 64($12)   # fun
  	REG_L	a2, 72($12) # user_data
+ #endif
  	ADDU	a3, $sp, V0_OFF2
+ 	# FIXME: a4 does work, while if ret is _Complex long double, it will overwrite Fn_OFF2
  	ADDU	a4, $sp, A0_OFF2
  	ADDU	a5, $sp, F12_OFF2
  
*************** $do_closure:
*** 512,525 ****
  
  	jalr	t9
  
  	# Return flags are in v0
! 	bne     v0, FFI_TYPE_SINT32, cls_retint
  	lw	v0, V0_OFF2($sp)
  	b	cls_epilogue
  
! cls_retint:
! 	bne     v0, FFI_TYPE_INT, cls_retfloat
! 	REG_L	v0, V0_OFF2($sp)
  	b	cls_epilogue
  
  cls_retfloat:
--- 620,654 ----
  
  	jalr	t9
  
+ cls_retuint64:
  	# Return flags are in v0
! 	bne     v0, FFI_TYPE_UINT64, cls_retsint32
! 	ld	v0, V0_OFF2($sp)
! 	b	cls_epilogue
! 
! cls_retsint32:
! 	bne     v0, FFI_TYPE_SINT32, cls_retsint16
  	lw	v0, V0_OFF2($sp)
  	b	cls_epilogue
  
! cls_retsint16:
! 	bne     v0, FFI_TYPE_SINT16, cls_retuint16
! 	lh	v0, V0_OFF2($sp)
! 	b	cls_epilogue
! 
! cls_retuint16:
! 	bne     v0, FFI_TYPE_UINT16, cls_retsint8
! 	lhu	v0, V0_OFF2($sp)
! 	b	cls_epilogue
! 
! cls_retsint8:
! 	bne     v0, FFI_TYPE_SINT8, cls_retuint8
! 	lb	v0, V0_OFF2($sp)
! 	b	cls_epilogue
! 
! cls_retuint8:
! 	bne     v0, FFI_TYPE_UINT8, cls_retfloat
! 	lbu	v0, V0_OFF2($sp)
  	b	cls_epilogue
  
  cls_retfloat:
*************** cls_retstruct_f:
*** 544,560 ****
  	b	cls_epilogue
  	
  cls_retstruct_d_d:	
! 	bne	v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f
  	l.d	$f0, V0_OFF2($sp)
  	l.d	$f2, V1_OFF2($sp)
  	b	cls_epilogue
  	
! cls_retstruct_f_f:	
! 	bne	v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f
  	l.s	$f0, V0_OFF2($sp)
  	l.s	$f2, V1_OFF2($sp)
  	b	cls_epilogue
  	
  cls_retstruct_d_f:	
  	bne	v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
  	l.d	$f0, V0_OFF2($sp)
--- 673,701 ----
  	b	cls_epilogue
  	
  cls_retstruct_d_d:	
! 	bne	v0, FFI_TYPE_STRUCT_DD, cls_retcomplex_d_d
! 	l.d	$f0, V0_OFF2($sp)
! 	l.d	$f2, V1_OFF2($sp)
! 	b	cls_epilogue
! 
! cls_retcomplex_d_d:
! 	bne	v0, FFI_TYPE_COMPLEX_DD, cls_retcomplex_f_f
  	l.d	$f0, V0_OFF2($sp)
  	l.d	$f2, V1_OFF2($sp)
  	b	cls_epilogue
  	
! cls_retstruct_f_f:
! 	bne	v0, FFI_TYPE_STRUCT_FF, cls_retcomplex_f_f
  	l.s	$f0, V0_OFF2($sp)
  	l.s	$f2, V1_OFF2($sp)
  	b	cls_epilogue
  	
+ cls_retcomplex_f_f:
+ 	bne	v0, FFI_TYPE_COMPLEX_FF, cls_retstruct_d_f
+ 	l.s	$f0, V0_OFF2($sp)
+ 	l.s	$f2, (V0_OFF2+4)($sp)
+ 	b	cls_epilogue
+ 
  cls_retstruct_d_f:	
  	bne	v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d
  	l.d	$f0, V0_OFF2($sp)
*************** cls_retstruct_d_f:
*** 562,573 ****
  	b	cls_epilogue
  	
  cls_retstruct_f_d:	
! 	bne	v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2
  	l.s	$f0, V0_OFF2($sp)
  	l.d	$f2, V1_OFF2($sp)
  	b	cls_epilogue
  #endif
! 	
  cls_retstruct_small2:	
  	REG_L	v0, V0_OFF2($sp)
  	REG_L	v1, V1_OFF2($sp)
--- 703,733 ----
  	b	cls_epilogue
  	
  cls_retstruct_f_d:	
! 	bne	v0, FFI_TYPE_STRUCT_FD, cls_retcomplex_ld_ld
  	l.s	$f0, V0_OFF2($sp)
  	l.d	$f2, V1_OFF2($sp)
  	b	cls_epilogue
+ #else
+ cls_longdouble_soft:
+ 	bne	v0, FFI_TYPE_LONGDOUBLE, cls_retcomplex_ld_ld
+ 	REG_L	v0, V0_OFF2($sp)
+ 	REG_L	a0, V1_OFF2($sp) # not typo, it is a0, I have no idea, gcc does do it
+ 	b	cls_epilogue
  #endif
! 
! cls_retcomplex_ld_ld:
! 	bne	v0, FFI_TYPE_COMPLEX_LDLD, cls_retstruct_small2
! 	REG_L	t8, A0_OFF2($sp)
! 	REG_L	t9, 16($sp)
! 	REG_S	t9, 0(t8)
! 	REG_L	t9, 24($sp)
! 	REG_S	t9, 8(t8)
! 	REG_L	t9, 32($sp)
! 	REG_S	t9, 16(t8)
! 	REG_L	t9, 40($sp)
! 	REG_S	t9, 24(t8)
! 	b	cls_epilogue
! 
  cls_retstruct_small2:	
  	REG_L	v0, V0_OFF2($sp)
  	REG_L	v1, V1_OFF2($sp)
*************** cls_epilogue:
*** 661,663 ****
--- 821,827 ----
  #endif /* __GNUC__ */	
  	
  #endif
+ 
+ #if defined __ELF__ && defined __linux__
+ 	.section .note.GNU-stack,"",%progbits
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/mips/o32.S gcc-17-20260524/libffi/src/mips/o32.S
*** gcc-17-20260517/libffi/src/mips/o32.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/mips/o32.S	Sun May 24 22:32:13 2026
*************** pass_f_d:
*** 133,138 ****
--- 133,139 ----
   #	bne	t0, FFI_ARGS_F_D, call_it
  	l.s	$f12, 0*FFI_SIZEOF_ARG($sp)	# load $fp regs from args
  	l.d	$f14, 2*FFI_SIZEOF_ARG($sp)	# passing double and float
+ 
  #endif
  
  call_it:	
*************** call_it:
*** 146,152 ****
  	REG_L	t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	beqz	t1, noretval
  
! 	bne     t2, FFI_TYPE_INT, retlonglong
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v0, 0(t0)
--- 147,154 ----
  	REG_L	t1, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	beqz	t1, noretval
  
! 	and     t1, t2, ((1<<4)-1)
! 	bne     t1, FFI_TYPE_INT, retlonglong
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v0, 0(t0)
*************** call_it:
*** 154,160 ****
  
  retlonglong:
  	# Really any 64-bit int, signed or not.
! 	bne	t2, FFI_TYPE_UINT64, retfloat
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v1, 4(t0)
--- 156,162 ----
  
  retlonglong:
  	# Really any 64-bit int, signed or not.
! 	bne	t1, FFI_TYPE_UINT64, retfloat
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  	REG_S	v1, 4(t0)
*************** retlonglong:
*** 162,168 ****
  	b	epilogue
  
  retfloat:
! 	bne     t2, FFI_TYPE_FLOAT, retdouble
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  #ifndef __mips_soft_float
--- 164,170 ----
  	b	epilogue
  
  retfloat:
! 	bne     t1, FFI_TYPE_FLOAT, retdouble
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  #ifndef __mips_soft_float
*************** retfloat:
*** 173,179 ****
  	b	epilogue
  
  retdouble:	
! 	bne	t2, FFI_TYPE_DOUBLE, noretval
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  #ifndef __mips_soft_float
--- 175,181 ----
  	b	epilogue
  
  retdouble:	
! 	bne	t1, FFI_TYPE_DOUBLE, retcomplex
  	jalr	t9
  	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
  #ifndef __mips_soft_float
*************** retdouble:
*** 184,189 ****
--- 186,233 ----
  #endif
  	b	epilogue
  	
+ retcomplex:
+ 	# mask out the complex elements type.
+ 	# the struct of flags (bits):
+ 	# 0-1: arg0
+ 	# 2-3: arg1
+ 	# 4-7: return type
+ 	# 8-11: rtype elements type: for complex
+ 	# Note here: t2 is flags>>4
+ 	bne	t1, FFI_TYPE_COMPLEX, noretval
+ 	jalr	t9
+ 	REG_L	t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp)
+ 	REG_L	t1, A3_OFF($fp)		# load the flags word
+ 	SRL	t1, t1, 8
+ 	li	t3, 3
+ 	beq	t1, t3, 3f # double
+ 	li	t3, 2
+ 	beq	t1, t3, 2f # float
+ 	# FIXME: long double
+ 	slti	t3, t1, 5
+ 	beqz	t3, 5f     # (u)int8/16/32/64
+ 2:
+ #ifndef __mips_soft_float
+ 	s.s	$f0, 0(t0)
+ 	s.s	$f2, 4(t0)
+ #else
+ 	# FIXME: do nothing can pass all of the testsuite
+ #endif
+ 	b	epilogue
+ 3:
+ #ifndef __mips_soft_float
+ 	s.d	$f0, 0(t0)
+ 	s.d	$f2, 8(t0)
+ #else
+ 	# FIXME: do nothing can pass all of the testsuite
+ #endif
+ 	b	epilogue
+ 
+ 5:
+ 	REG_S	v1, 4(t0)
+ 	REG_S	v0, 0(t0)
+ 	b	epilogue
+ 
  noretval:	
  	jalr	t9
  	
*************** $do_closure:
*** 378,383 ****
--- 422,440 ----
  	li	$9, FFI_TYPE_DOUBLE
  	l.d	$f0, V0_OFF2($fp)
  	beq	$8, $9, closure_done
+ 
+ 	li      $9, FFI_TYPE_COMPLEX
+ 	bne     $8, $9, 1f
+ 
+ 	li      $9, 8
+ 	l.s	$f0, V0_OFF2($fp)
+ 	l.s	$f2, V1_OFF2($fp)
+ 	beq     $3, $9, closure_done
+ 
+ 	li      $9, 16
+ 	l.d	$f0, V0_OFF2($fp)
+ 	l.d	$f2, (V0_OFF2+8)($fp)
+ 	beq     $3, $9, closure_done
  #endif
  1:	
  	REG_L	$3, V1_OFF2($fp)
*************** $LASFDE2:
*** 502,504 ****
--- 559,565 ----
  $LEFDE2:
  
  #endif
+ 
+ #if defined __ELF__ && defined __linux__
+ 	.section .note.GNU-stack,"",%progbits
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/moxie/ffi.c gcc-17-20260524/libffi/src/moxie/ffi.c
*** gcc-17-20260517/libffi/src/moxie/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/moxie/ffi.c	Sun May 24 22:32:13 2026
***************
*** 1,7 ****
  /* -----------------------------------------------------------------------
!    ffi.c - Copyright (C) 2012, 2013, 2018  Anthony Green
!    
!    Moxie Foreign Function Interface 
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
--- 1,7 ----
  /* -----------------------------------------------------------------------
!    ffi.c - Copyright (C) 2012, 2013, 2018, 2021, 2022  Anthony Green
! 
!    Moxie Foreign Function Interface
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
*************** void *ffi_prep_args(char *stack, extende
*** 54,67 ****
         i--, p_arg++)
      {
        size_t z;
!       
        z = (*p_arg)->size;
  
        if ((*p_arg)->type == FFI_TYPE_STRUCT)
  	{
  	  z = sizeof(void*);
  	  *(void **) argp = *p_argv;
! 	} 
        else if (z < sizeof(int))
  	{
  	  z = sizeof(int);
--- 54,67 ----
         i--, p_arg++)
      {
        size_t z;
! 
        z = (*p_arg)->size;
  
        if ((*p_arg)->type == FFI_TYPE_STRUCT)
  	{
  	  z = sizeof(void*);
  	  *(void **) argp = *p_argv;
! 	}
        else if (z < sizeof(int))
  	{
  	  z = sizeof(int);
*************** void *ffi_prep_args(char *stack, extende
*** 70,88 ****
  	    case FFI_TYPE_SINT8:
  	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  	      break;
! 	      
  	    case FFI_TYPE_UINT8:
  	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  	      break;
! 	      
  	    case FFI_TYPE_SINT16:
  	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  	      break;
! 		  
  	    case FFI_TYPE_UINT16:
  	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  	      break;
! 		  
  	    default:
  	      FFI_ASSERT(0);
  	    }
--- 70,88 ----
  	    case FFI_TYPE_SINT8:
  	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  	      break;
! 
  	    case FFI_TYPE_UINT8:
  	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  	      break;
! 
  	    case FFI_TYPE_SINT16:
  	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  	      break;
! 
  	    case FFI_TYPE_UINT16:
  	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  	      break;
! 
  	    default:
  	      FFI_ASSERT(0);
  	    }
*************** ffi_status ffi_prep_cif_machdep(ffi_cif
*** 116,141 ****
    return FFI_OK;
  }
  
! extern void ffi_call_EABI(void *(*)(char *, extended_cif *), 
! 			  extended_cif *, 
! 			  unsigned, unsigned, 
! 			  unsigned *, 
  			  void (*fn)(void));
  
! void ffi_call(ffi_cif *cif, 
! 	      void (*fn)(void), 
! 	      void *rvalue, 
  	      void **avalue)
  {
    extended_cif ecif;
  
    ecif.cif = cif;
    ecif.avalue = avalue;
!   
    /* If the return value is a struct and we don't have a return	*/
    /* value address then we need to make one		        */
  
!   if ((rvalue == NULL) && 
        (cif->rtype->type == FFI_TYPE_STRUCT))
      {
        ecif.rvalue = alloca(cif->rtype->size);
--- 116,143 ----
    return FFI_OK;
  }
  
! extern void ffi_call_EABI(void *(*)(char *, extended_cif *),
! 			  extended_cif *,
! 			  unsigned, unsigned,
! 			  unsigned *,
  			  void (*fn)(void));
  
! void ffi_call(ffi_cif *cif,
! 	      void (*fn)(void),
! 	      void *rvalue,
  	      void **avalue)
  {
    extended_cif ecif;
+   ffi_type **arg_types = cif->arg_types;
+   int i, nargs = cif->nargs;
  
    ecif.cif = cif;
    ecif.avalue = avalue;
! 
    /* If the return value is a struct and we don't have a return	*/
    /* value address then we need to make one		        */
  
!   if ((rvalue == NULL) &&
        (cif->rtype->type == FFI_TYPE_STRUCT))
      {
        ecif.rvalue = alloca(cif->rtype->size);
*************** void ffi_call(ffi_cif *cif,
*** 143,152 ****
    else
      ecif.rvalue = rvalue;
  
!   switch (cif->abi) 
      {
      case FFI_EABI:
!       ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes, 
  		    cif->flags, ecif.rvalue, fn);
        break;
      default:
--- 145,168 ----
    else
      ecif.rvalue = rvalue;
  
!   /* If we have any large structure arguments, make a copy so we are passing
!      by value.  */
!   for (i = 0; i < nargs; i++)
!     {
!       ffi_type *at = arg_types[i];
!       int size = at->size;
!       if (at->type == FFI_TYPE_STRUCT) /*  && size > 4) All struct args?? */
!         {
!           char *argcopy = alloca (size);
!           memcpy (argcopy, avalue[i], size);
!           avalue[i] = argcopy;
!         }
!     }
! 
!   switch (cif->abi)
      {
      case FFI_EABI:
!       ffi_call_EABI(ffi_prep_args, &ecif, cif->bytes,
  		    cif->flags, ecif.rvalue, fn);
        break;
      default:
*************** void ffi_closure_eabi (unsigned arg1, un
*** 172,178 ****
    void *struct_rvalue = (void *) arg1;
  
    /* 6 words reserved for register args + 3 words from jsr */
!   char *stack_args = frame_pointer + 9*4; 
  
    /* Lay the register arguments down in a continuous chunk of memory.  */
    unsigned register_args[6] =
--- 188,194 ----
    void *struct_rvalue = (void *) arg1;
  
    /* 6 words reserved for register args + 3 words from jsr */
!   char *stack_args = frame_pointer + 9*4;
  
    /* Lay the register arguments down in a continuous chunk of memory.  */
    unsigned register_args[6] =
*************** void ffi_closure_eabi (unsigned arg1, un
*** 211,217 ****
  	  avalue[i] = ptr;
  	  break;
  	case FFI_TYPE_STRUCT:
! 	  avalue[i] = *(void**)ptr;
  	  break;
  	default:
  	  /* This is an 8-byte value.  */
--- 227,242 ----
  	  avalue[i] = ptr;
  	  break;
  	case FFI_TYPE_STRUCT:
!           {
!             if (arg_types[i]->size > 4)
!               {
!                 void *copy = alloca(arg_types[i]->size);
!                 memcpy(copy, *(void**)ptr, arg_types[i]->size);
!                 avalue[i] = copy;
!               }
!             else
!               avalue[i] = *(void**)ptr;
!           }
  	  break;
  	default:
  	  /* This is an 8-byte value.  */
diff -Nrcpad gcc-17-20260517/libffi/src/or1k/ffi.c gcc-17-20260524/libffi/src/or1k/ffi.c
*** gcc-17-20260517/libffi/src/or1k/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/or1k/ffi.c	Sun May 24 22:32:13 2026
*************** void* ffi_prep_args(char *stack, extende
*** 37,43 ****
    ffi_type **arg;
    int count = 0;
    int nfixedargs;
!   
    nfixedargs = ecif->cif->nfixedargs;
    arg = ecif->cif->arg_types;
    void **argv = ecif->avalue;
--- 37,43 ----
    ffi_type **arg;
    int count = 0;
    int nfixedargs;
! 
    nfixedargs = ecif->cif->nfixedargs;
    arg = ecif->cif->arg_types;
    void **argv = ecif->avalue;
*************** void* ffi_prep_args(char *stack, extende
*** 47,53 ****
        *(void **) stack = ecif->rvalue;
        stack += 4;
        count = 4;
!     } 
    for(i=0; i<ecif->cif->nargs; i++)
    {
  
--- 47,53 ----
        *(void **) stack = ecif->rvalue;
        stack += 4;
        count = 4;
!     }
    for(i=0; i<ecif->cif->nargs; i++)
    {
  
*************** void* ffi_prep_args(char *stack, extende
*** 55,66 ****
      if ((nfixedargs == 0) && (count < 24))
        {
          count = 24;
!         stack = stacktemp + 24;        
        }
      nfixedargs--;
  
      s = 4;
!     switch((*arg)->type) 
        {
        case FFI_TYPE_STRUCT:
          *(void **)stack = *argv;
--- 55,66 ----
      if ((nfixedargs == 0) && (count < 24))
        {
          count = 24;
!         stack = stacktemp + 24;
        }
      nfixedargs--;
  
      s = 4;
!     switch((*arg)->type)
        {
        case FFI_TYPE_STRUCT:
          *(void **)stack = *argv;
*************** void* ffi_prep_args(char *stack, extende
*** 94,100 ****
            {
              stack += 4;
              count += 4;
!           }  
          s = (*arg)->size;
          memcpy(stack, *argv, s);
          break;
--- 94,100 ----
            {
              stack += 4;
              count += 4;
!           }
          s = (*arg)->size;
          memcpy(stack, *argv, s);
          break;
*************** void* ffi_prep_args(char *stack, extende
*** 110,116 ****
  
  extern void ffi_call_SYSV(unsigned,
                            extended_cif *,
!                           void *(*)(int *, extended_cif *),
                            unsigned *,
                            void (*fn)(void),
                            unsigned);
--- 110,116 ----
  
  extern void ffi_call_SYSV(unsigned,
                            extended_cif *,
!                           void *(*)(char *, extended_cif *),
                            unsigned *,
                            void (*fn)(void),
                            unsigned);
*************** void ffi_call(ffi_cif *cif, void (*fn)(v
*** 133,138 ****
--- 133,151 ----
          size += 4;
        else
          size += 8;
+ 
+       /* If we have any large structure arguments, make a copy so we are passing
+          by value.  */
+       {
+         ffi_type *at = cif->arg_types[i];
+         int size = at->size;
+         if (at->type == FFI_TYPE_STRUCT) /* && size > 4) All struct args? */
+           {
+             char *argcopy = alloca (size);
+             memcpy (argcopy, avalue[i], size);
+             avalue[i] = argcopy;
+           }
+       }
      }
  
    /* for variadic functions more space is needed on the stack */
*************** void ffi_call(ffi_cif *cif, void (*fn)(v
*** 148,154 ****
    ecif.avalue = avalue;
    ecif.rvalue = rvalue;
  
!   switch (cif->abi) 
    {
      case FFI_SYSV:
        ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags);
--- 161,167 ----
    ecif.avalue = avalue;
    ecif.rvalue = rvalue;
  
!   switch (cif->abi)
    {
      case FFI_SYSV:
        ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags);
*************** void ffi_call(ffi_cif *cif, void (*fn)(v
*** 160,173 ****
  }
  
  
! void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5, 
                        unsigned long r6, unsigned long r7, unsigned long r8)
  {
    register int *sp __asm__ ("r17");
    register int *r13 __asm__ ("r13");
  
    ffi_closure* closure = (ffi_closure*) r13;
!   char *stack_args = sp;
  
    /* Lay the register arguments down in a continuous chunk of memory.  */
    unsigned register_args[6] =
--- 173,186 ----
  }
  
  
! void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5,
                        unsigned long r6, unsigned long r7, unsigned long r8)
  {
    register int *sp __asm__ ("r17");
    register int *r13 __asm__ ("r13");
  
    ffi_closure* closure = (ffi_closure*) r13;
!   char *stack_args = (char*) sp;
  
    /* Lay the register arguments down in a continuous chunk of memory.  */
    unsigned register_args[6] =
*************** void ffi_closure_SYSV(unsigned long r3,
*** 186,192 ****
  
    /* preserve struct type return pointer passing */
  
!   if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) 
    {
      ptr += 4;
      count = 4;
--- 199,205 ----
  
    /* preserve struct type return pointer passing */
  
!   if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
    {
      ptr += 4;
      count = 4;
*************** void ffi_closure_SYSV(unsigned long r3,
*** 256,262 ****
        long long rvalue;
        (closure->fun) (cif, &rvalue, avalue, closure->user_data);
        if (cif->rtype)
!         asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue));      
      }
  }
  
--- 269,275 ----
        long long rvalue;
        (closure->fun) (cif, &rvalue, avalue, closure->user_data);
        if (cif->rtype)
!         asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue));
      }
  }
  
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 303,313 ****
  ffi_status ffi_prep_cif_machdep (ffi_cif *cif)
  {
    cif->flags = 0;
! 	
    /* structures are returned as pointers */
    if (cif->rtype->type == FFI_TYPE_STRUCT)
      cif->flags = FFI_TYPE_STRUCT;
!   else 
    if (cif->rtype->size > 4)
      cif->flags = FFI_TYPE_UINT64;
  
--- 316,326 ----
  ffi_status ffi_prep_cif_machdep (ffi_cif *cif)
  {
    cif->flags = 0;
! 
    /* structures are returned as pointers */
    if (cif->rtype->type == FFI_TYPE_STRUCT)
      cif->flags = FFI_TYPE_STRUCT;
!   else
    if (cif->rtype->size > 4)
      cif->flags = FFI_TYPE_UINT64;
  
*************** ffi_status ffi_prep_cif_machdep_var(ffi_
*** 325,328 ****
    status = ffi_prep_cif_machdep (cif);
    cif->nfixedargs = nfixedargs;
    return status;
! } 
--- 338,341 ----
    status = ffi_prep_cif_machdep (cif);
    cif->nfixedargs = nfixedargs;
    return status;
! }
diff -Nrcpad gcc-17-20260517/libffi/src/pa/ffi.c gcc-17-20260524/libffi/src/pa/ffi.c
*** gcc-17-20260517/libffi/src/pa/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/pa/ffi.c	Sun May 24 22:32:13 2026
*************** static inline int ffi_struct_type(ffi_ty
*** 56,82 ****
    size_t sz = t->size;
  
    /* Small structure results are passed in registers,
!      larger ones are passed by pointer.  Note that
!      small structures of size 2, 4 and 8 differ from
!      the corresponding integer types in that they have
!      different alignment requirements.  */
  
!   if (sz <= 1)
!     return FFI_TYPE_UINT8;
!   else if (sz == 2)
!     return FFI_TYPE_SMALL_STRUCT2;
!   else if (sz == 3)
!     return FFI_TYPE_SMALL_STRUCT3;
!   else if (sz == 4)
!     return FFI_TYPE_SMALL_STRUCT4;
!   else if (sz == 5)
!     return FFI_TYPE_SMALL_STRUCT5;
!   else if (sz == 6)
!     return FFI_TYPE_SMALL_STRUCT6;
!   else if (sz == 7)
!     return FFI_TYPE_SMALL_STRUCT7;
!   else if (sz <= 8)
!     return FFI_TYPE_SMALL_STRUCT8;
    else
      return FFI_TYPE_STRUCT; /* else, we pass it by pointer.  */
  }
--- 56,67 ----
    size_t sz = t->size;
  
    /* Small structure results are passed in registers,
!      larger ones are passed by pointer.  Note that small
!      structures differ from the corresponding integer
!      types in that they have different alignment requirements.  */
  
!   if (sz <= 8)
!     return -sz;
    else
      return FFI_TYPE_STRUCT; /* else, we pass it by pointer.  */
  }
*************** extern void ffi_call_pa32(void (*)(UINT3
*** 376,385 ****
--- 361,386 ----
  void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
  {
    extended_cif ecif;
+   size_t i, nargs = cif->nargs;
+   ffi_type **arg_types = cif->arg_types;
  
    ecif.cif = cif;
    ecif.avalue = avalue;
  
+   /* If we have any large structure arguments, make a copy so we are passing
+      by value.  */
+   for (i = 0; i < nargs; i++)
+     {
+       ffi_type *at = arg_types[i];
+       int size = at->size;
+       if (at->type == FFI_TYPE_STRUCT && size > 8)
+ 	{
+ 	  char *argcopy = alloca (size);
+ 	  memcpy (argcopy, avalue[i], size);
+ 	  avalue[i] = argcopy;
+ 	}
+     }
+ 
    /* If the return value is a struct and we don't have a return
       value address then we need to make one.  */
  
*************** ffi_status ffi_closure_inner_pa32(ffi_cl
*** 429,435 ****
    int i, avn;
    unsigned int slot = FIRST_ARG_SLOT;
    register UINT32 r28 asm("r28");
-   ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure);
  
    cif = closure->cif;
  
--- 430,435 ----
*************** ffi_status ffi_closure_inner_pa32(ffi_cl
*** 532,538 ****
      }
  
    /* Invoke the closure.  */
!   (c->fun) (cif, rvalue, avalue, c->user_data);
  
    debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", u.ret[0],
  	u.ret[1]);
--- 532,538 ----
      }
  
    /* Invoke the closure.  */
!   (closure->fun) (cif, rvalue, avalue, closure->user_data);
  
    debug(3, "after calling function, ret[0] = %08x, ret[1] = %08x\n", u.ret[0],
  	u.ret[1]);
*************** ffi_status ffi_closure_inner_pa32(ffi_cl
*** 541,556 ****
    switch (cif->flags)
      {
      case FFI_TYPE_UINT8:
!       *(stack - FIRST_ARG_SLOT) = (UINT8)(u.ret[0] >> 24);
        break;
      case FFI_TYPE_SINT8:
!       *(stack - FIRST_ARG_SLOT) = (SINT8)(u.ret[0] >> 24);
        break;
      case FFI_TYPE_UINT16:
!       *(stack - FIRST_ARG_SLOT) = (UINT16)(u.ret[0] >> 16);
        break;
      case FFI_TYPE_SINT16:
!       *(stack - FIRST_ARG_SLOT) = (SINT16)(u.ret[0] >> 16);
        break;
      case FFI_TYPE_INT:
      case FFI_TYPE_SINT32:
--- 541,556 ----
    switch (cif->flags)
      {
      case FFI_TYPE_UINT8:
!       *(stack - FIRST_ARG_SLOT) = (UINT8)u.ret[0];
        break;
      case FFI_TYPE_SINT8:
!       *(stack - FIRST_ARG_SLOT) = (SINT8)u.ret[0];
        break;
      case FFI_TYPE_UINT16:
!       *(stack - FIRST_ARG_SLOT) = (UINT16)u.ret[0];
        break;
      case FFI_TYPE_SINT16:
!       *(stack - FIRST_ARG_SLOT) = (SINT16)u.ret[0];
        break;
      case FFI_TYPE_INT:
      case FFI_TYPE_SINT32:
*************** ffi_status ffi_closure_inner_pa32(ffi_cl
*** 575,580 ****
--- 575,581 ----
        /* Don't need a return value, done by caller.  */
        break;
  
+     case FFI_TYPE_SMALL_STRUCT1:
      case FFI_TYPE_SMALL_STRUCT2:
      case FFI_TYPE_SMALL_STRUCT3:
      case FFI_TYPE_SMALL_STRUCT4:
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 633,640 ****
  		      void *user_data,
  		      void *codeloc)
  {
-   ffi_closure *c = (ffi_closure *)FFI_RESTORE_PTR (closure);
- 
    /* The layout of a function descriptor.  A function pointer with the PLABEL
       bit set points to a function descriptor.  */
    struct pa32_fd
--- 634,639 ----
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 660,673 ****
    fd = (struct pa32_fd *)((UINT32)ffi_closure_pa32 & ~3);
  
    /* Setup trampoline.  */
!   tramp = (struct ffi_pa32_trampoline_struct *)c->tramp;
    tramp->code_pointer = fd->code_pointer;
    tramp->fake_gp = (UINT32)codeloc & ~3;
    tramp->real_gp = fd->gp;
  
!   c->cif  = cif;
!   c->user_data = user_data;
!   c->fun  = fun;
  
    return FFI_OK;
  }
--- 659,672 ----
    fd = (struct pa32_fd *)((UINT32)ffi_closure_pa32 & ~3);
  
    /* Setup trampoline.  */
!   tramp = (struct ffi_pa32_trampoline_struct *)closure->tramp;
    tramp->code_pointer = fd->code_pointer;
    tramp->fake_gp = (UINT32)codeloc & ~3;
    tramp->real_gp = fd->gp;
  
!   closure->cif  = cif;
!   closure->user_data = user_data;
!   closure->fun  = fun;
  
    return FFI_OK;
  }
diff -Nrcpad gcc-17-20260517/libffi/src/pa/ffi64.c gcc-17-20260524/libffi/src/pa/ffi64.c
*** gcc-17-20260517/libffi/src/pa/ffi64.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/pa/ffi64.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,614 ----
+ /* -----------------------------------------------------------------------
+    ffi64.c - (c) 2022 John David Anglin <dave.anglin@bell.net>
+            
+    HPPA Foreign Function Interface
+    PA 64-Bit ABI support 
+ 
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    ``Software''), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
+ #include <ffi.h>
+ #include <ffi_common.h>
+ 
+ #include <stdlib.h>
+ #include <stdio.h>
+ 
+ #define ROUND_UP(v, a)  (((size_t)(v) + (a) - 1) & ~((a) - 1))
+ 
+ #define FIRST_ARG_SLOT  0
+ #define DEBUG_LEVEL   0
+ 
+ #define fldw(addr, fpreg) \
+   __asm__ volatile ("fldw 4(%0), %%" #fpreg "R" : : "r"(addr) : #fpreg)
+ #define fstw(fpreg, addr) \
+   __asm__ volatile ("fstw %%" #fpreg "R, 4(%0)" : : "r"(addr))
+ #define fldd(addr, fpreg) \
+   __asm__ volatile ("fldd 0(%0), %%" #fpreg "L" : : "r"(addr) : #fpreg)
+ #define fstd(fpreg, addr) \
+   __asm__ volatile ("fstd %%" #fpreg "L, 0(%0)" : : "r"(addr))
+ 
+ #define debug(lvl, x...) do { if (lvl <= DEBUG_LEVEL) { printf(x); } } while (0)
+ 
+ static inline int ffi_struct_type(ffi_type *t)
+ {
+   int sz = t->size;
+ 
+   /* Small structure results are returned in registers 28 and 29,
+      larger ones are in a buffer allocated by the callee.  The
+      address of the buffer is passed in r28.  The buffer is supposed
+      to be aligned on a 16-byte boundary.   Register return values are
+      padded on the right.  The pad bits on the right are undefined.  */
+ 
+   if (sz <= 16)
+     return -sz;
+   else
+     return FFI_TYPE_STRUCT;
+ }
+ 
+ /* PA has a downward growing stack, which looks like this.  Stack
+    arguments are offset from the argument ponter (AP) in r29.
+ 
+    Offset
+ 	[ Fixed args ]
+    AP-64                arg word 0 (r26, fr4)
+    AP-56                arg word 1 (r25, fr5)
+    AP-48                arg word 2 (r24, fr6)
+    AP-40                arg word 3 (r23, fr7)
+    AP-32                arg word 4 (r22, fr8)
+    AP-24                arg word 5 (r21, fr9)
+    AP-16                arg word 6 (r20, fr10)
+    AP-8	                arg word 7 (r19, fr11)
+ 	[ Variable args; AP = SP-16 if there are no variable args ]
+    AP			stack arg 0
+    AP+8			stack arg 1
+    ...
+ 	[ Frame marker ]
+    SP-16                RP
+    SP-8                 previous SP
+ 
+    The first eight argument words on the stack are reserved for use by
+    the callee.  Instead, the general and floating registers replace
+    the first four argument slots.  Non FP arguments are passed solely
+    in the general registers.  Single and double FP arguments are passed
+    in both general and floating registers when using libffi.
+ 
+    The registers are allocated in the same manner as stack slots.
+    This allows the callee to save its arguments on the stack if
+    necessary:
+ 
+    arg word 0 -> gr26 or fr4L or fr4R
+    arg word 1 -> gr25 or fr5L or fr5R
+    arg word 2 -> gr24 or fr6L or fr6R
+    arg word 3 -> gr23 or fr7L or fr7R
+    ...
+ 
+    Single Single-precision floating-point parameters, when passed in
+    floating-point registers, are passed in the right halves of the
+    floating point registers; the left halves are unused.
+ 
+    Quad-precision floating-point parameters within the first 64 bytes of
+    the parameter list are always passed in general registers.
+ 
+    The rest of the arguments are passed on the stack starting at AP.
+ 
+    This means we can have holes either in the register allocation,
+    or in the stack.  */
+ 
+ /* ffi_prep_args is called by the assembly routine once stack space
+    has been allocated for the function's arguments
+ 
+    The following code will put everything into the stack frame
+    (which was allocated by the asm routine), and on return
+    the asm routine will load the arguments that should be
+    passed by register into the appropriate registers
+ 
+    NOTE: We load floating point args in this function... that means we
+    assume gcc will not mess with fp regs in here.  */
+ 
+ void ffi_prep_args_pa64(UINT64 *stack, extended_cif *ecif, unsigned bytes)
+ {
+   register unsigned int i;
+   register ffi_type **p_arg;
+   register void **p_argv;
+   unsigned int slot = FIRST_ARG_SLOT;
+   size_t len;
+ 
+   debug(1, "%s: stack = %p, ecif = %p, bytes = %u\n", __FUNCTION__, stack,
+ 	ecif, bytes);
+ 
+   p_arg = ecif->cif->arg_types;
+   p_argv = ecif->avalue;
+ 
+   for (i = 0; i < ecif->cif->nargs; i++)
+     {
+       int type = (*p_arg)->type;
+ 
+       len = (*p_arg)->size;
+ 
+       switch (type)
+ 	{
+ 	case FFI_TYPE_SINT8:
+ 	  *(SINT64 *)(stack + slot) = *(SINT8 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_UINT8:
+ 	  *(UINT64 *)(stack + slot) = *(UINT8 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT16:
+ 	  *(SINT64 *)(stack + slot) = *(SINT16 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_UINT16:
+ 	  *(UINT64 *)(stack + slot) = *(UINT16 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT32:
+ 	  *(SINT64 *)(stack + slot) = *(SINT32 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_UINT32:
+ 	  *(UINT64 *)(stack + slot) = *(UINT32 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_UINT64:
+ 	case FFI_TYPE_SINT64:
+ 	case FFI_TYPE_POINTER:
+ 	  debug(3, "Storing UINT64 %lu in slot %u\n", *(UINT64 *)(*p_argv),
+ 		slot);
+ 	  *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
+ 	  break;
+ 
+ 	case FFI_TYPE_FLOAT:
+ 	  /* First 8 args go in fr4L - fr11L.  */
+ 	  debug(3, "Storing UINT32(float) in slot %u\n", slot);
+ 	  *(UINT64 *)(stack + slot) = *(UINT32 *)(*p_argv);
+ 	  switch (slot - FIRST_ARG_SLOT)
+ 	    {
+ 	    /* First 4 args go in fr4L - fr7L.  */
+ 	    case 0: fldw(stack + slot, fr4); break;
+ 	    case 1: fldw(stack + slot, fr5); break;
+ 	    case 2: fldw(stack + slot, fr6); break;
+ 	    case 3: fldw(stack + slot, fr7); break;
+ 	    case 4: fldw(stack + slot, fr8); break;
+ 	    case 5: fldw(stack + slot, fr9); break;
+ 	    case 6: fldw(stack + slot, fr10); break;
+ 	    case 7: fldw(stack + slot, fr11); break;
+ 	    }
+ 	  break;
+ 
+ 	case FFI_TYPE_DOUBLE:
+ 	  debug(3, "Storing UINT64(double) at slot %u\n", slot);
+ 	  *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
+ 	  switch (slot - FIRST_ARG_SLOT)
+ 	    {
+ 	    /* First 8 args go in fr4 to fr11.  */
+ 	    case 0: fldd(stack + slot, fr4); break;
+ 	    case 1: fldd(stack + slot, fr5); break;
+ 	    case 2: fldd(stack + slot, fr6); break;
+ 	    case 3: fldd(stack + slot, fr7); break;
+ 	    case 4: fldd(stack + slot, fr8); break;
+ 	    case 5: fldd(stack + slot, fr9); break;
+ 	    case 6: fldd(stack + slot, fr10); break;
+ 	    case 7: fldd(stack + slot, fr11); break;
+ 	    }
+ 	  break;
+ 
+ #ifdef PA64_HPUX
+ 	case FFI_TYPE_LONGDOUBLE:
+ 	  /* Align slot to a 16-byte boundary.  */
+ 	  slot += (slot & 1);
+ 	  *(UINT64 *)(stack + slot) = *(UINT64 *)(*p_argv);
+ 	  *(UINT64 *)(stack + slot + 1) = *(UINT64 *)(*p_argv + 8);
+ 	  break;
+ #endif
+ 
+ 	case FFI_TYPE_STRUCT:
+ 	  /* Structs larger than 8 bytes are aligned on a 16-byte boundary. */
+ 	  if (len > 8)
+ 	    slot += (slot & 1);
+ 	  memcpy((char *)(stack + slot), (char *)*p_argv, len);
+ 	  break;
+ 
+ 	default:
+ 	  FFI_ASSERT(0);
+ 	}
+ 
+       slot += ROUND_UP (len, 8) >> 3;
+       p_arg++;
+       p_argv++;
+     }
+ 
+   FFI_ASSERT(slot * 8 <= bytes);
+ 
+   return;
+ }
+ 
+ static void ffi_size_stack_pa64(ffi_cif *cif)
+ {
+   ffi_type **ptr;
+   int i;
+   int z = 0; /* # stack slots */
+ 
+   for (ptr = cif->arg_types, i = 0; i < cif->nargs; ptr++, i++)
+     {
+       int type = (*ptr)->type;
+       int size = (*ptr)->size;
+ 
+       switch (type)
+ 	{
+ #ifdef PA64_HPUX
+ 	case FFI_TYPE_LONGDOUBLE:
+ 	  z += 2 + (z & 1);
+ 	  break;
+ #endif
+ 
+ 	case FFI_TYPE_STRUCT:
+ 	  if (size > 8)
+ 	    z += (z & 1);
+ 	  z += ROUND_UP (size, 8) >> 3;
+ 	  break;
+ 
+ 	default: /* 64-bit values */
+ 	  z++;
+ 	}
+     }
+ 
+   /* We need a minimum of 8 argument slots.  Stack must be 16-byte
+      aligned.  */
+   if (z <= 8)
+     z = 8;
+   else
+     z += (z & 1);
+ 
+   /* Add 16 bytes for frame marker.  */
+   cif->bytes = z * 8 + 64;
+   debug(3, "Calculated stack size is %u bytes\n", cif->bytes);
+ }
+ 
+ /* Perform machine dependent cif processing.  */
+ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
+ {
+   /* Set the return type flag for jump table.  */
+   switch (cif->rtype->type)
+     {
+     case FFI_TYPE_COMPLEX:
+     case FFI_TYPE_STRUCT:
+       /* For the return type we have to check the size of the structures.
+ 	 If the size is smaller or equal 8 bytes, the result is given back
+ 	 in one register. If the size is smaller or equal 16 bytes than we
+ 	 return the result in two registers. If the size is bigger than
+ 	 16 bytes, the return is in a buffer allocated by the caller.  */
+       cif->flags = ffi_struct_type(cif->rtype);
+       break;
+ 
+     default:
+       cif->flags = (unsigned) cif->rtype->type;
+       break;
+     }
+ 
+   /* Lucky us, because of the unique PA ABI we get to do our
+      own stack sizing.  */
+   switch (cif->abi)
+     {
+     case FFI_PA64:
+       ffi_size_stack_pa64(cif);
+       break;
+ 
+     default:
+       FFI_ASSERT(0);
+       break;
+     }
+ 
+   return FFI_OK;
+ }
+ 
+ extern void ffi_call_pa64(void (*)(UINT64 *, extended_cif *, unsigned),
+ 			  extended_cif *, unsigned, unsigned, unsigned *,
+ 			  void (*fn)(void));
+ 
+ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
+ {
+   extended_cif ecif;
+ 
+   ecif.cif = cif;
+   ecif.avalue = avalue;
+ 
+   /* If the return value is a struct and we don't have a return
+      value address then we need to make one.  */
+ 
+   if (rvalue == NULL
+       && (cif->rtype->type == FFI_TYPE_STRUCT
+ 	  || cif->rtype->type == FFI_TYPE_COMPLEX)
+       && cif->rtype->size > 16)
+     ecif.rvalue = alloca(ROUND_UP (cif->rtype->size, 16));
+   else
+     ecif.rvalue = rvalue;
+ 
+ 
+   switch (cif->abi)
+     {
+     case FFI_PA64:
+       debug(3, "Calling ffi_call_pa64: ecif=%p, bytes=%u, flags=%u, rvalue=%p, fn=%p\n", &ecif, cif->bytes, cif->flags, ecif.rvalue, (void *)fn);
+       ffi_call_pa64(ffi_prep_args_pa64, &ecif, cif->bytes,
+ 		     cif->flags, ecif.rvalue, fn);
+       break;
+ 
+     default:
+       FFI_ASSERT(0);
+       break;
+     }
+ }
+ 
+ #if FFI_CLOSURES
+ /* This is more-or-less an inverse of ffi_call -- we have arguments on
+    the stack, and we need to fill them into a cif structure and invoke
+    the user function. This really ought to be in asm to make sure
+    the compiler doesn't do things we don't expect.  */
+ ffi_status ffi_closure_inner_pa64(ffi_closure *closure, UINT64 *stack)
+ {
+   ffi_cif *cif;
+   void **avalue;
+   void *rvalue;
+   /* Functions can return up to 128-bits in registers.  Return address
+      must be double word aligned.  */
+   union { long double rld; UINT64 ret[2]; } u;
+   ffi_type **p_arg;
+   char *tmp;
+   int i, avn;
+   unsigned int slot = FIRST_ARG_SLOT;
+   register UINT64 r28 asm("r28");
+ 
+   cif = closure->cif;
+ 
+   /* If returning via structure, callee will write to our pointer.  */
+   if (cif->flags == FFI_TYPE_STRUCT)
+     rvalue = (void *)r28;
+   else
+     rvalue = &u;
+ 
+   avalue = (void **)alloca(cif->nargs * FFI_SIZEOF_ARG);
+   avn = cif->nargs;
+   p_arg = cif->arg_types;
+ 
+   for (i = 0; i < avn; i++)
+     {
+       int type = (*p_arg)->type;
+ 
+       switch (type)
+ 	{
+ 	case FFI_TYPE_SINT8:
+ 	case FFI_TYPE_UINT8:
+ 	  avalue[i] = (void *)(stack + slot) + 7;
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT16:
+ 	case FFI_TYPE_UINT16:
+ 	  avalue[i] = (void *)(stack + slot) + 6;
+ 	  break;
+ 
+ 	case FFI_TYPE_SINT32:
+ 	case FFI_TYPE_UINT32:
+ 	  avalue[i] = (void *)(stack + slot) + 4;
+ 	  break;
+ 
+ 	case FFI_TYPE_POINTER:
+ 	case FFI_TYPE_SINT64:
+ 	case FFI_TYPE_UINT64:
+ 	  avalue[i] = (void *)(stack + slot);
+ 	  break;
+ 
+ 	case FFI_TYPE_FLOAT:
+ 	  /* The closure call is indirect.  In Linux, floating point
+ 	     arguments in indirect calls with a prototype are passed
+ 	     in the floating point registers instead of the general
+ 	     registers.  So, we need to replace what was previously
+ 	     stored in the current slot with the value in the
+ 	     corresponding floating point register.  */
+ 	  switch (slot + FIRST_ARG_SLOT)
+ 	    {
+ 	    case 0: fstw(fr4, (void *)(stack + slot)); break;
+ 	    case 1: fstw(fr5, (void *)(stack + slot)); break;
+ 	    case 2: fstw(fr6, (void *)(stack + slot)); break;
+ 	    case 3: fstw(fr7, (void *)(stack + slot)); break;
+ 	    case 4: fstw(fr8, (void *)(stack + slot)); break;
+ 	    case 5: fstw(fr9, (void *)(stack + slot)); break;
+ 	    case 6: fstw(fr10, (void *)(stack + slot)); break;
+ 	    case 7: fstw(fr11, (void *)(stack + slot)); break;
+ 	    }
+ 	  avalue[i] = (void *)(stack + slot) + 4;
+ 	  break;
+ 
+ 	case FFI_TYPE_DOUBLE:
+ 	  /* See previous comment for FFI_TYPE_FLOAT.  */
+ 	  switch (slot + FIRST_ARG_SLOT)
+ 	    {
+ 	    case 0: fstd(fr4, (void *)(stack + slot)); break;
+ 	    case 1: fstd(fr5, (void *)(stack + slot)); break;
+ 	    case 2: fstd(fr6, (void *)(stack + slot)); break;
+ 	    case 3: fstd(fr7, (void *)(stack + slot)); break;
+ 	    case 4: fstd(fr8, (void *)(stack + slot)); break;
+ 	    case 5: fstd(fr9, (void *)(stack + slot)); break;
+ 	    case 6: fstd(fr10, (void *)(stack + slot)); break;
+ 	    case 7: fstd(fr11, (void *)(stack + slot)); break;
+ 	    }
+ 	  avalue[i] = (void *)(stack + slot);
+ 	  break;
+ 
+ #ifdef PA64_HPUX
+ 	case FFI_TYPE_LONGDOUBLE:
+ 	  /* Long doubles are treated like a big structure.  */
+ 	  slot += (slot & 1);
+ 	  avalue[i] = (void *)(stack + slot);
+ 	  break;
+ #endif
+ 
+ 	case FFI_TYPE_STRUCT:
+ 	  /* All structs are passed in registers.  Structs larger
+ 	     than 8 bytes are aligned on a 16-byte boundary.  */
+ 	  if((*p_arg)->size > 8)
+ 	    slot += (slot & 1);
+ 	  avalue[i] = (void *) (stack + slot);
+ 	  break;
+ 
+ 	default:
+ 	  FFI_ASSERT(0);
+ 	}
+ 
+       slot += (ROUND_UP ((*p_arg)->size, 8) >> 3);
+       p_arg++;
+     }
+ 
+   /* Invoke the closure.  */
+   (closure->fun) (cif, rvalue, avalue, closure->user_data);
+ 
+   debug(3, "after calling function, ret[0] = %16lx, ret[1] = %16lx\n", u.ret[0],
+ 	u.ret[1]);
+ 
+   /* Store the result using the lower 2 bytes of the flags.  */
+   switch (cif->flags)
+     {
+     case FFI_TYPE_UINT8:
+       *(stack + FIRST_ARG_SLOT) = (UINT8)u.ret[0];
+       break;
+     case FFI_TYPE_SINT8:
+       *(stack + FIRST_ARG_SLOT) = (SINT8)u.ret[0];
+       break;
+     case FFI_TYPE_UINT16:
+       *(stack + FIRST_ARG_SLOT) = (UINT16)u.ret[0];
+       break;
+     case FFI_TYPE_SINT16:
+       *(stack + FIRST_ARG_SLOT) = (SINT16)u.ret[0];
+       break;
+     case FFI_TYPE_INT:
+     case FFI_TYPE_SINT32:
+       *(stack + FIRST_ARG_SLOT) = (SINT32)u.ret[0];
+       break;
+     case FFI_TYPE_UINT32:
+       *(stack - FIRST_ARG_SLOT) = (UINT32)u.ret[0];
+       break;
+     case FFI_TYPE_SINT64:
+     case FFI_TYPE_UINT64:
+     case FFI_TYPE_POINTER:
+       *(stack - FIRST_ARG_SLOT) = u.ret[0];
+       break;
+ 
+     case FFI_TYPE_LONGDOUBLE:
+       *(stack + FIRST_ARG_SLOT) = u.ret[0];
+       *(stack + FIRST_ARG_SLOT + 1) = u.ret[1];
+       break;
+ 
+     case FFI_TYPE_DOUBLE:
+       fldd(rvalue, fr4);
+       break;
+ 
+     case FFI_TYPE_FLOAT:
+       /* Adjust for address adjustment in fldw macro.  */
+       fldw(rvalue - 4, fr4);
+       break;
+ 
+     case FFI_TYPE_STRUCT:
+       /* Don't need a return value, done by caller.  */
+       break;
+ 
+     case -1:
+     case -2:
+     case -3:
+     case -4:
+     case -5:
+     case -6:
+     case -7:
+     case -8:
+     case -9:
+     case -10:
+     case -11:
+     case -12:
+     case -13:
+     case -14:
+     case -15:
+     case -16:
+       tmp = (void*)(stack + FIRST_ARG_SLOT);
+       memcpy((void*)tmp, &u, cif->rtype->size);
+       break;
+ 
+     case FFI_TYPE_VOID:
+       break;
+ 
+     default:
+       debug(0, "assert with cif->flags: %d\n",cif->flags);
+       FFI_ASSERT(0);
+       break;
+     }
+   return FFI_OK;
+ }
+ 
+ /* Fill in a closure to refer to the specified fun and user_data.
+    cif specifies the argument and result types for fun.
+    The cif must already be prep'ed.  */
+ 
+ extern void ffi_closure_pa64(void);
+ 
+ ffi_status
+ ffi_prep_closure_loc (ffi_closure* closure,
+ 		      ffi_cif* cif,
+ 		      void (*fun)(ffi_cif*,void*,void**,void*),
+ 		      void *user_data,
+ 		      void *codeloc)
+ {
+   /* The layout of a function descriptor.  */
+   struct pa64_fd
+   {
+     UINT64 tmp1;
+     UINT64 tmp2;
+     UINT64 code_pointer;
+     UINT64 gp;
+   };
+ 
+   struct ffi_pa64_trampoline_struct
+   {
+     UINT64 real_gp;             /* Real gp value.  */
+     UINT64 tmp2;
+     UINT64 code_pointer;        /* Pointer to ffi_closure_unix.  */
+     UINT64 fake_gp;             /* Pointer to closure, installed as gp.  */
+   };
+ 
+   struct ffi_pa64_trampoline_struct *tramp;
+   struct pa64_fd *fd;
+ 
+   if (cif->abi != FFI_PA64)
+     return FFI_BAD_ABI;
+ 
+   /* Get function descriptor address for ffi_closure_pa64.  */
+   fd = (struct pa64_fd *)((UINT64)ffi_closure_pa64);
+ 
+   /* Setup trampoline.  */
+   tramp = (struct ffi_pa64_trampoline_struct *)closure->tramp;
+   tramp->code_pointer = fd->code_pointer;
+   tramp->fake_gp = (UINT64)codeloc;
+   tramp->real_gp = fd->gp;
+ 
+   closure->cif  = cif;
+   closure->user_data = user_data;
+   closure->fun  = fun;
+ 
+   return FFI_OK;
+ }
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/pa/ffitarget.h gcc-17-20260524/libffi/src/pa/ffitarget.h
*** gcc-17-20260517/libffi/src/pa/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/pa/ffitarget.h	Sun May 24 22:32:13 2026
*************** typedef enum ffi_abi {
*** 54,60 ****
  #endif
  
  #ifdef PA64_HPUX
- #error "PA64_HPUX FFI is not yet implemented"
    FFI_PA64,
    FFI_LAST_ABI,
    FFI_DEFAULT_ABI = FFI_PA64
--- 54,59 ----
*************** typedef enum ffi_abi {
*** 68,80 ****
  
  #define FFI_CLOSURES 1
  #define FFI_NATIVE_RAW_API 0
  #define FFI_TRAMPOLINE_SIZE 12
  
- #define FFI_TYPE_SMALL_STRUCT2 -1
- #define FFI_TYPE_SMALL_STRUCT3 -2
- #define FFI_TYPE_SMALL_STRUCT4 -3
- #define FFI_TYPE_SMALL_STRUCT5 -4
- #define FFI_TYPE_SMALL_STRUCT6 -5
- #define FFI_TYPE_SMALL_STRUCT7 -6
- #define FFI_TYPE_SMALL_STRUCT8 -7
  #endif
--- 67,94 ----
  
  #define FFI_CLOSURES 1
  #define FFI_NATIVE_RAW_API 0
+ #if defined(PA64_HPUX)
+ #define FFI_TRAMPOLINE_SIZE 32
+ #else
  #define FFI_TRAMPOLINE_SIZE 12
+ #endif
+ 
+ #define FFI_TYPE_SMALL_STRUCT1 -1
+ #define FFI_TYPE_SMALL_STRUCT2 -2
+ #define FFI_TYPE_SMALL_STRUCT3 -3
+ #define FFI_TYPE_SMALL_STRUCT4 -4
+ #define FFI_TYPE_SMALL_STRUCT5 -5
+ #define FFI_TYPE_SMALL_STRUCT6 -6
+ #define FFI_TYPE_SMALL_STRUCT7 -7
+ #define FFI_TYPE_SMALL_STRUCT8 -8
+ 
+ /* linux.S and hpux32.S expect FFI_TYPE_COMPLEX is the last generic type.  */
+ #define FFI_PA_TYPE_LAST FFI_TYPE_COMPLEX
+ 
+ /* If new generic types are added, the jump tables in linux.S and hpux32.S
+    likely need updating.  */
+ #if FFI_TYPE_LAST != FFI_PA_TYPE_LAST
+ # error "You likely have broken jump tables"
+ #endif
  
  #endif
diff -Nrcpad gcc-17-20260517/libffi/src/pa/hpux32.S gcc-17-20260524/libffi/src/pa/hpux32.S
*** gcc-17-20260517/libffi/src/pa/hpux32.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/pa/hpux32.S	Sun May 24 22:32:13 2026
*************** L$CFI13
*** 109,160 ****
  
  	/* Prepare to store the result; we need to recover flags and rvalue.  */
  	ldw	-48(%r3), %r21		; r21 <- flags
- 	ldw	-52(%r3), %r20		; r20 <- rvalue
  
! 	/* Store the result according to the return type.  The most
! 	   likely types should come first.  */
  
! L$checkint
! 	comib,<>,n FFI_TYPE_INT, %r21, L$checkint8
! 	b	L$done
! 	stw	%ret0, 0(%r20)
  
! L$checkint8
! 	comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16
  	b	L$done
  	stb	%ret0, 0(%r20)
! 
! L$checkint16
! 	comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl
  	b	L$done
! 	sth	%ret0, 0(%r20)
! 
! L$checkdbl
! 	comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat
  	b	L$done
  	fstd	%fr4,0(%r20)
! 
! L$checkfloat
! 	comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll
  	b	L$done
! 	fstw	%fr4L,0(%r20)
  
! L$checkll
! 	comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2
  	stw	%ret0, 0(%r20)
  	b	L$done
  	stw	%ret1, 4(%r20)
  
! L$checksmst2
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3
  	/* 2-byte structs are returned in ret0 as ????xxyy.  */
  	extru	%ret0, 23, 8, %r22
  	stbs,ma	%r22, 1(%r20)
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$checksmst3
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4
  	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
  	extru	%ret0, 15, 8, %r22
  	stbs,ma	%r22, 1(%r20)
--- 109,212 ----
  
  	/* Prepare to store the result; we need to recover flags and rvalue.  */
  	ldw	-48(%r3), %r21		; r21 <- flags
  
! 	/* Adjust flags range from [-8, 15] to  [0, 23].  */
! 	addi	8, %r21, %r21
  
! 	blr	%r21, %r0
! 	ldw	-52(%r3), %r20		; r20 <- rvalue
  
! 	/* Giant jump table */
! 	/* 8-byte small struct */
! 	b,n	L$smst8
! 	nop
! 	/* 7-byte small struct */
! 	b,n	L$smst7
! 	nop
! 	/* 6-byte small struct */
! 	b,n	L$smst6
! 	nop
! 	/* 5-byte small struct */
! 	b,n	L$smst5
! 	nop
! 	/* 4-byte small struct */
! 	b,n	L$smst4
! 	nop
! 	/* 3-byte small struct */
! 	b,n	L$smst3
! 	nop
! 	/* 2-byte small struct */
! 	b,n	L$smst2
! 	nop
! 	/* 1-byte small struct */
  	b	L$done
  	stb	%ret0, 0(%r20)
! 	/* void */
! 	b,n	L$done
! 	nop
! 	/* int */
  	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* float */
! 	b	L$done
! 	fstw	%fr4L,0(%r20)
! 	/* double */
  	b	L$done
  	fstd	%fr4,0(%r20)
! 	/* long double */
! 	b,n	L$done
! 	nop
! 	/* unsigned int8 */
  	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* signed int8 */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int16 */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* signed int16 */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int32 */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* signed int32 */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int64 */
! 	b,n	L$uint64
! 	nop
! 	/* signed int64 */
! 	b,n	L$sint64
! 	nop
! 	/* large struct */
! 	b,n	L$done
! 	nop
! 	/* pointer */
! 	b	L$done
! 	stw	%ret0, 0(%r20)
! 	/* complex */
! 	b,n	L$done
! 	nop
  
! 	/* Store the result according to the return type.  The most
! 	   likely types should come first.  */
! 
! L$uint64
! L$sint64
  	stw	%ret0, 0(%r20)
  	b	L$done
  	stw	%ret1, 4(%r20)
  
! L$smst2
  	/* 2-byte structs are returned in ret0 as ????xxyy.  */
  	extru	%ret0, 23, 8, %r22
  	stbs,ma	%r22, 1(%r20)
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$smst3
  	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
  	extru	%ret0, 15, 8, %r22
  	stbs,ma	%r22, 1(%r20)
*************** L$checksmst3
*** 163,170 ****
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$checksmst4
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5
  	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
  	extru	%ret0, 7, 8, %r22
  	stbs,ma	%r22, 1(%r20)
--- 215,221 ----
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$smst4
  	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
  	extru	%ret0, 7, 8, %r22
  	stbs,ma	%r22, 1(%r20)
*************** L$checksmst4
*** 175,182 ****
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$checksmst5
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6
  	/* 5 byte values are returned right justified:
  	      ret0     ret1
  	   5: ??????aa bbccddee */
--- 226,232 ----
  	b	L$done
  	stb	%ret0, 0(%r20)
  
! L$smst5
  	/* 5 byte values are returned right justified:
  	      ret0     ret1
  	   5: ??????aa bbccddee */
*************** L$checksmst5
*** 190,197 ****
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$checksmst6
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7
  	/* 6 byte values are returned right justified:
  	      ret0     ret1
  	   6: ????aabb ccddeeff */
--- 240,246 ----
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$smst6
  	/* 6 byte values are returned right justified:
  	      ret0     ret1
  	   6: ????aabb ccddeeff */
*************** L$checksmst6
*** 207,214 ****
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$checksmst7
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8
  	/* 7 byte values are returned right justified:
  	      ret0     ret1
  	   7: ??aabbcc ddeeffgg */
--- 256,262 ----
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$smst7
  	/* 7 byte values are returned right justified:
  	      ret0     ret1
  	   7: ??aabbcc ddeeffgg */
*************** L$checksmst7
*** 226,233 ****
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$checksmst8
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done
  	/* 8 byte values are returned right justified:
  	      ret0     ret1
  	   8: aabbccdd eeffgghh */
--- 274,280 ----
  	b	L$done
  	stb	%ret1, 0(%r20)
  
! L$smst8
  	/* 8 byte values are returned right justified:
  	      ret0     ret1
  	   8: aabbccdd eeffgghh */
diff -Nrcpad gcc-17-20260517/libffi/src/pa/hpux64.S gcc-17-20260524/libffi/src/pa/hpux64.S
*** gcc-17-20260517/libffi/src/pa/hpux64.S	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/pa/hpux64.S	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,681 ----
+ /* -----------------------------------------------------------------------
+    hpux64.S - (c) 2005-2022 John David Anglin <dave.anglin@bell.net>
+ 
+    HPUX PA 64-Bit Foreign Function Interface
+ 
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    ``Software''), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
+    OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+    ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+    OTHER DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
+ #define LIBFFI_ASM
+ #include <fficonfig.h>
+ #include <ffi.h>
+ 
+ 	.LEVEL 2.0w
+ 	.text
+ 	.align	4
+ 
+ 	/* void ffi_call_pa64(void (*)(char *, extended_cif *),
+ 			       extended_cif *ecif,
+ 			       unsigned bytes,
+ 			       unsigned flags,
+ 			       unsigned *rvalue,
+ 			       void (*fn)());
+ 	 */
+ 
+ 	.export	ffi_call_pa64,code
+ 	.import	ffi_prep_args_pa64,code
+ 
+ 	.align	4
+ 
+ L$FB1
+ ffi_call_pa64
+ 	.proc
+ 	.callinfo	FRAME=48,CALLS,SAVE_RP,ENTRY_GR=4
+ 	.entry
+ 	std	%rp, -16(%sp)
+ 	copy	%r3, %r1
+ L$CFI11
+ 	copy	%sp, %r3
+ L$CFI12
+ 	std,ma	%r1, 48(%sp)
+ 
+ 	/* Setup the stack for calling prep_args...
+ 	   We want the stack to look like this:
+ 
+ 	   [ Previous stack                            ] <- %r3
+ 
+ 	   [ 48-byte register save area                ]
+ 
+ 	   [ Stack space for call arguments            ] <- %r4
+ 
+ 	   [ 16-byte rame marker                       ]
+ 
+ 	   [ 128-byte stack for calling prep_args      ] <- %sp
+ 	 */
+ 
+ 	std	%r4, 8(%r3)		; save r4
+ L$CFI13
+ 	std	%r23, 16(%r3)		; save flags we need it later
+ 	std	%r22, 24(%r3)		; save rvalue
+ 	std	%r21, 32(%r3)		; save fn pointer
+ 
+ 	copy	%sp, %r4
+ 	copy	%r4, %r26		; argument stack pointer
+ 	addl	%r24, %sp, %sp		; allocate argument space
+ 
+ 	ldo	112(%sp), %r29		; arg pointer for prep args
+ 
+ 	/* Call prep_args:
+ 	   %arg0(stack) -- set up above to point to call arguments
+ 	   %arg1(ecif) -- same as incoming param
+ 	   %arg2(bytes) -- same as incoming param */
+ 	bl	ffi_prep_args_pa64,%r2
+ 	ldo	128(%sp), %sp
+ 	ldo	-128(%sp), %sp
+ 
+ 	/* Load the arguments that should be passed in registers
+ 	   The fp args were loaded by the prep_args function.  */
+ 	ldd	0(%r4), %r26
+ 	ldd	8(%r4), %r25
+ 	ldd	16(%r4), %r24
+ 	ldd	24(%r4), %r23
+ 	ldd     32(%r4), %r22
+ 	ldd     40(%r4), %r21
+ 	ldd     48(%r4), %r20
+ 	ldd     56(%r4), %r19
+ 
+ 	ldd	24(%r3), %ret0		; %ret0 <- rvalue
+ 
+ 	ldd	32(%r3), %r1		; %r1 <- function pointer
+ 	ldd	16(%r1), %rp		; fn address
+ 	ldd	24(%r1), %dp		; New gp
+ 	bve,l	(%rp), %r2		; Call the user function
+ 	ldo	64(%r4), %r29		; Argument pointer
+ 
+ 	/* Prepare to store the result; recover flags and rvalue.  */
+ 	ldd	16(%r3), %r21		; r21 <- flags
+ 	extrd,s	%r21, 63, 32, %r21	; sign extend flags for blr
+ 
+ 	/* Adjust flags range from [-16, 15] to  [0, 31].  */
+ 	addi	16, %r21, %r21
+ 
+ 	blr	%r21, %r0
+ 	ldd	24(%r3), %r20		; r20 <- rvalue
+ 
+ 	/* Giant jump table */
+ 	/* 16-byte small struct */
+ 	b,n	L$smst16
+ 	nop
+ 	/* 15-byte small struct */
+ 	b,n	L$smst15
+ 	nop
+ 	/* 14-byte small struct */
+ 	b,n	L$smst14
+ 	nop
+ 	/* 13-byte small struct */
+ 	b,n	L$smst13
+ 	nop
+ 	/* 12-byte small struct */
+ 	b,n	L$smst12
+ 	nop
+ 	/* 11-byte small struct */
+ 	b,n	L$smst11
+ 	nop
+ 	/* 10-byte small struct */
+ 	b,n	L$smst10
+ 	nop
+ 	/* 9-byte small struct */
+ 	b,n	L$smst9
+ 	nop
+ 	/* 8-byte small struct */
+ 	b,n	L$smst8
+ 	nop
+ 	/* 7-byte small struct */
+ 	b,n	L$smst7
+ 	nop
+ 	/* 6-byte small struct */
+ 	b,n	L$smst6
+ 	nop
+ 	/* 5-byte small struct */
+ 	b,n	L$smst5
+ 	nop
+ 	/* 4-byte small struct */
+ 	b,n	L$smst4
+ 	nop
+ 	/* 3-byte small struct */
+ 	b,n	L$smst3
+ 	nop
+ 	/* 2-byte small struct */
+ 	b,n	L$smst2
+ 	nop
+ 	/* 1-byte small struct */
+ 	b,n	L$smst1
+ 	nop
+ 	/* void */
+ 	b,n	L$done
+ 	nop
+ 	/* int */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* float */
+ 	b	L$done
+ 	fstw	%fr4R, 0(%r20)
+ 	/* double */
+ 	b	L$done
+ 	fstd	%fr4, 0(%r20)
+ 	/* long double */
+ 	b,n	L$longdouble
+ 	nop
+ 	/* unsigned int8 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* signed int8 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* unsigned int16 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* signed int16 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* unsigned int32 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* signed int32 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* unsigned int64 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* signed int64 */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* large struct */
+ 	b,n	L$done
+ 	nop
+ 	/* pointer */
+ 	b	L$done
+ 	std	%ret0, 0(%r20)
+ 	/* complex */
+ 	b,n	L$done
+ 	nop
+ 
+ L$longdouble
+ 	std	%ret0, 0(%r20)
+ 	b	L$done
+ 	std	%ret1, 8(%r20)
+ 
+ 	/* We need to copy byte-by-byte the exact number bytes
+ 	   in the struct to avoid clobbering other data.  */
+ L$smst1
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst2
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst3
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst4
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst5
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst6
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst7
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst8
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	b	L$done
+ 	stb	%ret0, 0(%r20)
+ 
+ L$smst9
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst10
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst11
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst12
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 31, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst13
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 39, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst14
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 47, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst15
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 55, 8, %r22
+ 	b	L$done
+ 	stb	%r22, 0(%r20)
+ 
+ L$smst16
+ 	extrd,u	%ret0, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret0, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb,ma	%ret0, 1(%r20)
+ 	extrd,u	%ret1, 7, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 15, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 23, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 31, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 39, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 47, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	extrd,u	%ret1, 55, 8, %r22
+ 	stb,ma	%r22, 1(%r20)
+ 	stb	%ret1, 0(%r20)
+ 
+ L$done
+ 	/* all done, restore registers and return */
+ 	copy	%r4, %sp
+ 	ldd	8(%r3), %r4
+ 	ldd	-16(%r3), %rp
+ 	bve	(%rp)
+ 	ldd,mb	-48(%sp), %r3
+ 	.exit
+ 	.procend
+ L$FE1
+ 	.size	ffi_call_pa64, .-ffi_call_pa64
+ 
+ 	/* void ffi_closure_pa64(void);
+ 	   Called with closure argument in %r21 */
+ 
+ 	.export ffi_closure_pa64,code
+ 	.import ffi_closure_inner_pa64,code
+ 	.align 4
+ L$FB2
+ ffi_closure_pa64
+ 	.proc
+ 	.callinfo FRAME=128,CALLS,SAVE_RP,ENTRY_GR=3
+ 	.entry
+ 
+ 	std	%rp, -16(%sp)
+ 	copy	%r3, %r1
+ L$CFI21
+ 	copy	%sp, %r3
+ L$CFI22
+ 	std,ma	%r1, 128(%sp)
+ L$CFI23
+ 
+ 	/* Put arguments onto the stack and call ffi_closure_inner.  */
+ 	std	%r26, -64(%r29)
+ 	std	%r25, -56(%r29)
+ 	std	%r24, -48(%r29)
+ 	std	%r23, -40(%r29)
+ 	std	%r22, -32(%r29)
+ 	std	%r21, -24(%r29)
+ 	std	%r20, -16(%r29)
+ 	std	%r19, -8(%r29)
+ 
+ 	/* Load and save start of argument stack.  */
+ 	ldo	-64(%r29), %r25
+ 	std	%r25, 8(%r3)
+ 
+ 	/* Setup arg pointer.  */
+ 	ldo	-16(%sp), %ret1
+ 
+ 	/* Retrieve closure pointer and real gp.  */
+ 	copy	%dp, %r26
+ 	bl	ffi_closure_inner_pa64, %r2
+ 	ldd	0(%dp), %dp
+ 
+ 	/* Retrieve start of argument stack.  */
+ 	ldd	8(%r3), %r1
+ 
+ 	/* Restore r3 and op stack.  */
+ 	ldd,mb	-128(%sp), %r3
+ 
+ 	/* Load return address.  */
+ 	ldd	-16(%sp), %rp
+ 
+ 	/* Load return values from first and second stack slots.  */
+ 	ldd	0(%r1), %ret0
+ 	bve	(%rp)
+ 	ldd	8(%r1), %ret1
+ 
+ 	.exit
+ 	.procend
+ 	.end
+ L$FE2:
+ 	.size	ffi_closure_pa64, .-ffi_closure_pa64
+ 
+ 	.section	.eh_frame,"aw",@progbits
+ L$frame1:
+ 	.word   L$ECIE1-L$SCIE1 ;# Length of Common Information Entry
+ L$SCIE1:
+ 	.word   0x0     ;# CIE Identifier Tag
+ 	.byte   0x3     ;# CIE Version
+ 	.stringz ""     ;# CIE Augmentation
+ 	.uleb128 0x1    ;# CIE Code Alignment Factor
+ 	.sleb128 8      ;# CIE Data Alignment Factor
+ 	.byte   0x2     ;# CIE RA Column
+ 	.byte   0xc     ;# DW_CFA_def_cfa
+ 	.uleb128 0x1e
+ 	.uleb128 0x0
+ 	.align 8
+ L$ECIE1:
+ L$SFDE1:
+ 	.word   L$EFDE1-L$ASFDE1        ;# FDE Length
+ L$ASFDE1:
+ 	.word   L$ASFDE1-L$frame1       ;# FDE CIE offset
+ 	.dword  L$FB1	;# FDE initial location
+ 	.dword  L$FE1-L$FB1	;# FDE address range
+ 
+ 	.byte   0x4	;# DW_CFA_advance_loc4
+ 	.word   L$CFI11-L$FB1
+ 	.byte	0x9	;# DW_CFA_register: r3 in r1
+ 	.uleb128 0x3
+ 	.uleb128 0x1
+ 	.byte   0x11    ;# DW_CFA_offset_extended_sf: r2 at cfa-16
+ 	.uleb128 0x2
+ 	.sleb128 -2
+ 	.byte   0x4     ;# DW_CFA_advance_loc4
+ 	.word   L$CFI12-L$CFI11
+ 	.byte   0xd     ;# DW_CFA_def_cfa_register: r3
+ 	.uleb128 0x3
+ 
+ 	.byte   0x4     ;# DW_CFA_advance_loc4
+ 	.word   L$CFI13-L$CFI12
+ 	.byte	0x83	;# DW_CFA_offset: r3 at cfa+0
+ 	.uleb128 0
+ 	.byte	0x84	;# DW_CFA_offset: r4 at cfa+8
+ 	.uleb128 1
+ 
+ 	.align 8
+ L$EFDE1:
+ 
+ L$SFDE2:
+ 	.word   L$EFDE2-L$ASFDE2        ;# FDE Length
+ L$ASFDE2:
+ 	.word   L$ASFDE2-L$frame1       ;# FDE CIE offset
+ 	.dword   L$FB2	;# FDE initial location
+ 	.dword   L$FE2-L$FB2     ;# FDE address range
+ 	.byte   0x4	;# DW_CFA_advance_loc4
+ 	.word   L$CFI21-L$FB2
+ 	.byte   0x9	;# DW_CFA_register: r3 in r1
+ 	.uleb128 0x3
+ 	.uleb128 0x1
+ 	.byte   0x11    ;# DW_CFA_offset_extended_sf: r2 at cfa-16
+ 	.uleb128 0x2
+ 	.sleb128 -2
+ 
+ 	.byte   0x4     ;# DW_CFA_advance_loc4
+ 	.word   L$CFI22-L$CFI21
+ 	.byte   0xd     ;# DW_CFA_def_cfa_register: r3
+ 	.uleb128 0x3
+ 
+ 	.byte   0x4     ;# DW_CFA_advance_loc4
+ 	.word   L$CFI23-L$CFI22
+ 	.byte	0x83	;# DW_CFA_offset: r3 at cfa+0
+ 	.uleb128 0
+ 
+ 	.align 8
+ L$EFDE2:
diff -Nrcpad gcc-17-20260517/libffi/src/pa/linux.S gcc-17-20260524/libffi/src/pa/linux.S
*** gcc-17-20260517/libffi/src/pa/linux.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/pa/linux.S	Sun May 24 22:32:13 2026
*************** ffi_call_pa32:
*** 103,153 ****
  
  	/* Prepare to store the result; we need to recover flags and rvalue.  */
  	ldw -48(%r3), %r21                      /* r21 <- flags */
- 	ldw -52(%r3), %r20                      /* r20 <- rvalue */
  
! 	/* Store the result according to the return type.  */
  
! .Lcheckint:
! 	comib,<>,n FFI_TYPE_INT, %r21, .Lcheckint8
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
  
! .Lcheckint8:
! 	comib,<>,n FFI_TYPE_UINT8, %r21, .Lcheckint16
  	b	.Ldone
  	stb	%ret0, 0(%r20)
! 
! .Lcheckint16:
! 	comib,<>,n FFI_TYPE_UINT16, %r21, .Lcheckdbl
  	b	.Ldone
! 	sth	%ret0, 0(%r20)
! 
! .Lcheckdbl:
! 	comib,<>,n FFI_TYPE_DOUBLE, %r21, .Lcheckfloat
  	b	.Ldone
  	fstd	%fr4,0(%r20)
! 
! .Lcheckfloat:
! 	comib,<>,n FFI_TYPE_FLOAT, %r21, .Lcheckll
  	b	.Ldone
! 	fstw	%fr4L,0(%r20)
  
! .Lcheckll:
! 	comib,<>,n FFI_TYPE_UINT64, %r21, .Lchecksmst2
  	stw	%ret0, 0(%r20)
  	b	.Ldone
  	stw	%ret1, 4(%r20)
  
! .Lchecksmst2:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, .Lchecksmst3
  	/* 2-byte structs are returned in ret0 as ????xxyy.  */
  	extru	%ret0, 23, 8, %r22
  	stbs,ma	%r22, 1(%r20)
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lchecksmst3:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, .Lchecksmst4
  	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
  	extru	%ret0, 15, 8, %r22
  	stbs,ma	%r22, 1(%r20)
--- 103,205 ----
  
  	/* Prepare to store the result; we need to recover flags and rvalue.  */
  	ldw -48(%r3), %r21                      /* r21 <- flags */
  
! 	/* Adjust flags range from [-8, 15] to  [0, 23].  */
! 	addi 8, %r21, %r21
  
! 	blr %r21, %r0
! 	ldw -52(%r3), %r20                      /* r20 <- rvalue */
  
! 	/* Giant jump table */
! 	/* 8-byte small struct */
! 	b,n	.Lsmst8
! 	nop
! 	/* 7-byte small struct */
! 	b,n	.Lsmst7
! 	nop
! 	/* 6-byte small struct */
! 	b,n	.Lsmst6
! 	nop
! 	/* 5-byte small struct */
! 	b,n	.Lsmst5
! 	nop
! 	/* 4-byte small struct */
! 	b,n	.Lsmst4
! 	nop
! 	/* 3-byte small struct */
! 	b,n	.Lsmst3
! 	nop
! 	/* 2-byte small struct */
! 	b,n	.Lsmst2
! 	nop
! 	/* 1-byte small struct */
  	b	.Ldone
  	stb	%ret0, 0(%r20)
! 	/* void */
! 	b,n	.Ldone
! 	nop
! 	/* int */
  	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* float */
! 	b	.Ldone
! 	fstw	%fr4L,0(%r20)
! 	/* double */
  	b	.Ldone
  	fstd	%fr4,0(%r20)
! 	/* long double */
  	b	.Ldone
! 	fstd	%fr4,0(%r20)
! 	/* unsigned int8 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* sint8 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int16 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* sint16 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int32 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* sint32 */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* unsigned int64 */
! 	b,n	.Luint64
! 	nop
! 	/* signed int64 */
! 	b,n	.Lsint64
! 	nop
! 	/* large struct */
! 	b,n	.Ldone
! 	nop
! 	/* pointer */
! 	b	.Ldone
! 	stw	%ret0, 0(%r20)
! 	/* complex */
! 	b,n	.Ldone
! 	nop
  
! 	/* Store the result according to the return type.  */
! 
! .Luint64:
! .Lsint64:
  	stw	%ret0, 0(%r20)
  	b	.Ldone
  	stw	%ret1, 4(%r20)
  
! .Lsmst2:
  	/* 2-byte structs are returned in ret0 as ????xxyy.  */
  	extru	%ret0, 23, 8, %r22
  	stbs,ma	%r22, 1(%r20)
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lsmst3:
  	/* 3-byte structs are returned in ret0 as ??xxyyzz.  */
  	extru	%ret0, 15, 8, %r22
  	stbs,ma	%r22, 1(%r20)
*************** ffi_call_pa32:
*** 156,163 ****
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lchecksmst4:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, .Lchecksmst5
  	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
  	extru	%ret0, 7, 8, %r22
  	stbs,ma	%r22, 1(%r20)
--- 208,214 ----
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lsmst4:
  	/* 4-byte structs are returned in ret0 as wwxxyyzz.  */
  	extru	%ret0, 7, 8, %r22
  	stbs,ma	%r22, 1(%r20)
*************** ffi_call_pa32:
*** 168,175 ****
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lchecksmst5:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, .Lchecksmst6
  	/* 5 byte values are returned right justified:
  	      ret0     ret1
  	   5: ??????aa bbccddee */
--- 219,225 ----
  	b	.Ldone
  	stb	%ret0, 0(%r20)
  
! .Lsmst5:
  	/* 5 byte values are returned right justified:
  	      ret0     ret1
  	   5: ??????aa bbccddee */
*************** ffi_call_pa32:
*** 183,190 ****
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lchecksmst6:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, .Lchecksmst7
  	/* 6 byte values are returned right justified:
  	      ret0     ret1
  	   6: ????aabb ccddeeff */
--- 233,239 ----
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lsmst6:
  	/* 6 byte values are returned right justified:
  	      ret0     ret1
  	   6: ????aabb ccddeeff */
*************** ffi_call_pa32:
*** 200,207 ****
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lchecksmst7:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, .Lchecksmst8
  	/* 7 byte values are returned right justified:
  	      ret0     ret1
  	   7: ??aabbcc ddeeffgg */
--- 249,255 ----
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lsmst7:
  	/* 7 byte values are returned right justified:
  	      ret0     ret1
  	   7: ??aabbcc ddeeffgg */
*************** ffi_call_pa32:
*** 219,226 ****
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lchecksmst8:
! 	comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, .Ldone
  	/* 8 byte values are returned right justified:
  	      ret0     ret1
  	   8: aabbccdd eeffgghh */
--- 267,273 ----
  	b	.Ldone
  	stb	%ret1, 0(%r20)
  
! .Lsmst8:
  	/* 8 byte values are returned right justified:
  	      ret0     ret1
  	   8: aabbccdd eeffgghh */
*************** ffi_closure_pa32:
*** 378,380 ****
--- 425,431 ----
  
  	.align 4
  .LEFDE2:
+ 
+ #if defined(__ELF__) && defined(__linux__)
+ .section .note.GNU-stack,"",%progbits
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/ffi.c gcc-17-20260524/libffi/src/powerpc/ffi.c
*** gcc-17-20260517/libffi/src/powerpc/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/ffi.c	Sun May 24 22:32:13 2026
***************
*** 31,36 ****
--- 31,38 ----
  #include "ffi.h"
  #include "ffi_common.h"
  #include "ffi_powerpc.h"
+ #include "internal.h"
+ #include <tramp.h>
  
  #if HAVE_LONG_DOUBLE_VARIANT
  /* Adjust ffi_type_longdouble.  */
*************** ffi_prep_go_closure (ffi_go_closure *clo
*** 173,175 ****
--- 175,194 ----
    closure->fun = fun;
    return FFI_OK;
  }
+ 
+ #ifdef FFI_EXEC_STATIC_TRAMP
+ void *
+ ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
+ {
+   extern void *trampoline_code_table;
+   *tramp_size = PPC_TRAMP_SIZE;
+   *map_size = PPC_TRAMP_MAP_SIZE;
+ #if defined (_CALL_AIX) || _CALL_ELF == 1
+   /* The caller wants the entry point address of the trampoline code,
+      not the address of the function descriptor.  */
+   return *(void **)trampoline_code_table;
+ #else
+   return &trampoline_code_table;
+ #endif
+ }
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/ffi_darwin.c gcc-17-20260524/libffi/src/powerpc/ffi_darwin.c
*** gcc-17-20260517/libffi/src/powerpc/ffi_darwin.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/ffi_darwin.c	Sun May 24 22:32:13 2026
*************** darwin_adjust_aggregate_sizes (ffi_type
*** 623,660 ****
  }
  
  /* Adjust the size of S to be correct for AIX.
!    Word-align double unless it is the first member of a structure.  */
  
! static void
! aix_adjust_aggregate_sizes (ffi_type *s)
  {
!   int i;
  
    if (s->type != FFI_TYPE_STRUCT)
!     return;
  
    s->size = 0;
    for (i = 0; s->elements[i] != NULL; i++)
      {
!       ffi_type *p;
        int align;
!       
!       p = s->elements[i];
!       aix_adjust_aggregate_sizes (p);
!       align = p->alignment;
!       if (i != 0 && p->type == FFI_TYPE_DOUBLE)
! 	align = 4;
!       s->size = FFI_ALIGN(s->size, align) + p->size;
      }
!   
!   s->size = FFI_ALIGN(s->size, s->alignment);
!   
!   if (s->elements[0]->type == FFI_TYPE_UINT64
!       || s->elements[0]->type == FFI_TYPE_SINT64
!       || s->elements[0]->type == FFI_TYPE_DOUBLE
!       || s->elements[0]->alignment == 8)
!     s->alignment = s->alignment > 8 ? s->alignment : 8;
!   /* Do not add additional tail padding.  */
  }
  
  /* Perform machine dependent cif processing.  */
--- 623,672 ----
  }
  
  /* Adjust the size of S to be correct for AIX.
!    Word-align double unless it is the first member of a structure recursively.
!    Return non-zero if we found a recursive first member aggregate of interest. */
  
! static int
! aix_adjust_aggregate_sizes (ffi_type *s, int outer_most_type_or_first_member)
  {
!   int i, nested_first_member=0, final_align, rc=0;
  
    if (s->type != FFI_TYPE_STRUCT)
!     return 0;
  
    s->size = 0;
    for (i = 0; s->elements[i] != NULL; i++)
      {
!       ffi_type p;
        int align;
! 
!       /* nested aggregates layout differently on AIX, so take a copy of the type */
!       p = *(s->elements[i]);
!       if (i == 0)
!         nested_first_member = aix_adjust_aggregate_sizes(&p, outer_most_type_or_first_member);
!       else
!         aix_adjust_aggregate_sizes(&p, 0);
!       align = p.alignment;
!       if (i != 0 && p.type == FFI_TYPE_DOUBLE)
!         align = 4;
!       s->size = FFI_ALIGN(s->size, align) + p.size;
      }
! 
!   final_align=s->alignment;
!   if ((s->elements[0]->type == FFI_TYPE_UINT64
!           || s->elements[0]->type == FFI_TYPE_SINT64
!           || s->elements[0]->type == FFI_TYPE_DOUBLE
!           || s->elements[0]->alignment == 8 || nested_first_member)) {
!       final_align = s->alignment > 8 ? s->alignment : 8;
!       rc=1;
!       /* still use the adjusted alignment to calculate tail padding, but don't adjust the types alignment if
!          we aren't in the recursive first position */
!       if (outer_most_type_or_first_member)
!         s->alignment=final_align;
!   }
! 
!   s->size = FFI_ALIGN(s->size, final_align);
!   return rc;
  }
  
  /* Perform machine dependent cif processing.  */
*************** ffi_prep_cif_machdep (ffi_cif *cif)
*** 682,690 ****
  
    if (cif->abi == FFI_AIX)
      {
!       aix_adjust_aggregate_sizes (cif->rtype);
        for (i = 0; i < cif->nargs; i++)
! 	aix_adjust_aggregate_sizes (cif->arg_types[i]);
      }
  
    /* Space for the frame pointer, callee's LR, CR, etc, and for
--- 694,702 ----
  
    if (cif->abi == FFI_AIX)
      {
!       aix_adjust_aggregate_sizes (cif->rtype, 1);
        for (i = 0; i < cif->nargs; i++)
! 	aix_adjust_aggregate_sizes (cif->arg_types[i], 1);
      }
  
    /* Space for the frame pointer, callee's LR, CR, etc, and for
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/ffi_linux64.c gcc-17-20260524/libffi/src/powerpc/ffi_linux64.c
*** gcc-17-20260517/libffi/src/powerpc/ffi_linux64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/ffi_linux64.c	Sun May 24 22:32:13 2026
***************
*** 29,34 ****
--- 29,35 ----
     ----------------------------------------------------------------------- */
  
  #include "ffi.h"
+ #include <tramp.h>
  
  #ifdef POWERPC64
  #include "ffi_common.h"
*************** ffi_prep_closure_loc_linux64 (ffi_closur
*** 820,851 ****
  			      void *user_data,
  			      void *codeloc)
  {
- #if _CALL_ELF == 2
-   unsigned int *tramp = (unsigned int *) &closure->tramp[0];
- 
    if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
      return FFI_BAD_ABI;
  
!   tramp[0] = 0xe96c0018;	/* 0:	ld	11,2f-0b(12)	*/
!   tramp[1] = 0xe98c0010;	/*	ld	12,1f-0b(12)	*/
!   tramp[2] = 0x7d8903a6;	/*	mtctr	12		*/
!   tramp[3] = 0x4e800420;	/*	bctr			*/
  				/* 1:	.quad	function_addr	*/
  				/* 2:	.quad	context		*/
!   *(void **) &tramp[4] = (void *) ffi_closure_LINUX64;
!   *(void **) &tramp[6] = codeloc;
!   flush_icache ((char *) tramp, (char *) codeloc, 4 * 4);
  #else
!   void **tramp = (void **) &closure->tramp[0];
! 
!   if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
!     return FFI_BAD_ABI;
! 
!   /* Copy function address and TOC from ffi_closure_LINUX64 OPD.  */
!   memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
!   tramp[1] = codeloc;
!   memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
  #endif
  
    closure->cif = cif;
    closure->fun = fun;
--- 821,858 ----
  			      void *user_data,
  			      void *codeloc)
  {
    if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
      return FFI_BAD_ABI;
  
! #ifdef FFI_EXEC_STATIC_TRAMP
!   if (ffi_tramp_is_present(closure))
!     {
!       /* Initialize the static trampoline's parameters. */
!       void (*dest)(void) = ffi_closure_LINUX64;
!       ffi_tramp_set_parms (closure->ftramp, dest, closure);
!     }
!   else
! #endif
!     {
! #if _CALL_ELF == 2
!       unsigned int *tramp = (unsigned int *) &closure->tramp[0];
!       tramp[0] = 0xe96c0018;	/* 0:	ld	11,2f-0b(12)	*/
!       tramp[1] = 0xe98c0010;	/*	ld	12,1f-0b(12)	*/
!       tramp[2] = 0x7d8903a6;	/*	mtctr	12		*/
!       tramp[3] = 0x4e800420;	/*	bctr			*/
  				/* 1:	.quad	function_addr	*/
  				/* 2:	.quad	context		*/
!       *(void **) &tramp[4] = (void *) ffi_closure_LINUX64;
!       *(void **) &tramp[6] = codeloc;
!       flush_icache ((char *) tramp, (char *) codeloc, 4 * 4);
  #else
!       /* Copy function address and TOC from ffi_closure_LINUX64 OPD.  */
!       void **tramp = (void **) &closure->tramp[0];
!       memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
!       tramp[1] = codeloc;
!       memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
  #endif
+     }
  
    closure->cif = cif;
    closure->fun = fun;
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/ffi_sysv.c gcc-17-20260524/libffi/src/powerpc/ffi_sysv.c
*** gcc-17-20260517/libffi/src/powerpc/ffi_sysv.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/ffi_sysv.c	Sun May 24 22:32:13 2026
***************
*** 29,34 ****
--- 29,35 ----
     ----------------------------------------------------------------------- */
  
  #include "ffi.h"
+ #include <tramp.h>
  
  #ifndef POWERPC64
  #include "ffi_common.h"
*************** ffi_prep_closure_loc_sysv (ffi_closure *
*** 636,660 ****
  			   void *user_data,
  			   void *codeloc)
  {
-   unsigned int *tramp;
- 
    if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI)
      return FFI_BAD_ABI;
  
!   tramp = (unsigned int *) &closure->tramp[0];
!   tramp[0] = 0x7c0802a6;  /*   mflr    r0 */
!   tramp[1] = 0x429f0005;  /*   bcl     20,31,.+4 */
!   tramp[2] = 0x7d6802a6;  /*   mflr    r11 */
!   tramp[3] = 0x7c0803a6;  /*   mtlr    r0 */
!   tramp[4] = 0x800b0018;  /*   lwz     r0,24(r11) */
!   tramp[5] = 0x816b001c;  /*   lwz     r11,28(r11) */
!   tramp[6] = 0x7c0903a6;  /*   mtctr   r0 */
!   tramp[7] = 0x4e800420;  /*   bctr */
!   *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */
!   *(void **) &tramp[9] = codeloc;                   /* context */
  
!   /* Flush the icache.  */
!   flush_icache ((char *)tramp, (char *)codeloc, 8 * 4);
  
    closure->cif = cif;
    closure->fun = fun;
--- 637,670 ----
  			   void *user_data,
  			   void *codeloc)
  {
    if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI)
      return FFI_BAD_ABI;
  
! #ifdef FFI_EXEC_STATIC_TRAMP
!   if (ffi_tramp_is_present(closure))
!     {
!       /* Initialize the static trampoline's parameters. */
!       void (*dest)(void) = ffi_closure_SYSV;
!       ffi_tramp_set_parms (closure->ftramp, dest, closure);
!     }
!   else
! #endif
!     {
!       unsigned int *tramp = (unsigned int *) &closure->tramp[0];
!       tramp[0] = 0x7c0802a6;  /*   mflr    r0 */
!       tramp[1] = 0x429f0005;  /*   bcl     20,31,.+4 */
!       tramp[2] = 0x7d6802a6;  /*   mflr    r11 */
!       tramp[3] = 0x7c0803a6;  /*   mtlr    r0 */
!       tramp[4] = 0x800b0018;  /*   lwz     r0,24(r11) */
!       tramp[5] = 0x816b001c;  /*   lwz     r11,28(r11) */
!       tramp[6] = 0x7c0903a6;  /*   mtctr   r0 */
!       tramp[7] = 0x4e800420;  /*   bctr */
!       *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */
!       *(void **) &tramp[9] = codeloc;			/* context */
  
!       /* Flush the icache.  */
!       flush_icache ((char *)tramp, (char *)codeloc, 8 * 4);
!     }
  
    closure->cif = cif;
    closure->fun = fun;
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/internal.h gcc-17-20260524/libffi/src/powerpc/internal.h
*** gcc-17-20260517/libffi/src/powerpc/internal.h	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/powerpc/internal.h	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,10 ----
+ #ifdef FFI_EXEC_STATIC_TRAMP
+ /* For the trampoline code table mapping, a mapping size of 64K is chosen.  */
+ #define PPC_TRAMP_MAP_SHIFT	16
+ #define PPC_TRAMP_MAP_SIZE	(1 << PPC_TRAMP_MAP_SHIFT)
+ # ifdef __PCREL__
+ #  define PPC_TRAMP_SIZE	24
+ # else
+ #  define PPC_TRAMP_SIZE	40
+ # endif /* __PCREL__ */
+ #endif /* FFI_EXEC_STATIC_TRAMP */
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/linux64_closure.S gcc-17-20260524/libffi/src/powerpc/linux64_closure.S
*** gcc-17-20260517/libffi/src/powerpc/linux64_closure.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/linux64_closure.S	Sun May 24 22:32:13 2026
***************
*** 27,32 ****
--- 27,33 ----
  #define LIBFFI_ASM
  #include <fficonfig.h>
  #include <ffi.h>
+ #include "internal.h"
  
  	.file	"linux64_closure.S"
  
*************** ffi_go_closure_linux64:
*** 559,565 ****
--- 560,612 ----
  	.size	.ffi_go_closure_linux64,.-.ffi_go_closure_linux64
  #  endif
  # endif
+ 
+ #ifdef FFI_EXEC_STATIC_TRAMP
+ 	.text
+ 	.align PPC_TRAMP_MAP_SHIFT
+ 	FFI_HIDDEN (trampoline_code_table)
+ 	.globl  trampoline_code_table
+ # if _CALL_ELF == 2
+ 	.type   trampoline_code_table,@function
+ trampoline_code_table:
+ 	.localentry trampoline_code_table,.-trampoline_code_table
+ # else
+ 	.section	".opd","aw"
+ 	.align  3
+ trampoline_code_table:
+ 	.quad   .L.trampoline_code_table,.TOC.@tocbase,0
+ 	.type   trampoline_code_table,@function
+ 	.text
+ .L.trampoline_code_table:
+ # endif
+ 	.rept	PPC_TRAMP_MAP_SIZE / PPC_TRAMP_SIZE
+ #ifdef __PCREL__
+ 	pla	%r2,PPC_TRAMP_MAP_SIZE
+ 	ld	%r11,0(%r2)
+ 	ld	%r12,8(%r2)
+ 	mtctr	%r12
+ 	bctr
+ #else
+ 	mflr	%r0
+ 	bcl	20,31,$+4
+ 	mflr	%r11
+ 	addis	%r11,%r11,PPC_TRAMP_MAP_SIZE@ha
+ 	mtlr	%r0
+ 	ld	%r12,(PPC_TRAMP_MAP_SIZE+0)@l(%r11)
+ 	mtctr	%r12
+ 	ld	%r11,(PPC_TRAMP_MAP_SIZE-8)@l(%r11)
+ 	bctr
+ 	nop
  #endif
+ 	.endr
+ 	.align PPC_TRAMP_MAP_SHIFT
+ #if _CALL_ELF == 2
+ 	.size	trampoline_code_table,.-trampoline_code_table
+ #else
+ 	.size	trampoline_code_table,.-.L.trampoline_code_table
+ #endif
+ #endif /* FFI_EXEC_STATIC_TRAMP */
+ #endif /* POWERPC64 */
  
  #if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
  	.section	.note.GNU-stack,"",@progbits
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/ppc_closure.S gcc-17-20260524/libffi/src/powerpc/ppc_closure.S
*** gcc-17-20260517/libffi/src/powerpc/ppc_closure.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/powerpc/ppc_closure.S	Sun May 24 22:32:13 2026
***************
*** 27,32 ****
--- 27,33 ----
  #define LIBFFI_ASM
  #include <fficonfig.h>
  #include <ffi.h>
+ #include "internal.h"
  #include <powerpc/asm.h>
  
  	.file   "ppc_closure.S"
*************** ENTRY(ffi_go_closure_sysv)
*** 391,396 ****
--- 392,420 ----
  	.cfi_endproc
  END(ffi_go_closure_sysv)
  
+ #ifdef FFI_EXEC_STATIC_TRAMP
+ 	.text
+ 	.align PPC_TRAMP_MAP_SHIFT
+ 	FFI_HIDDEN (trampoline_code_table)
+ 	.globl  trampoline_code_table
+ 	.type   trampoline_code_table,@function
+ trampoline_code_table:
+ 	.rept   PPC_TRAMP_MAP_SIZE / PPC_TRAMP_SIZE
+ 	mflr    %r0
+ 	bcl     20,31,$+4
+ 	mflr    %r11
+ 	addis   %r11,%r11,PPC_TRAMP_MAP_SIZE@ha
+ 	mtlr    %r0
+ 	lwz     %r0,(PPC_TRAMP_MAP_SIZE-4)@l(%r11)
+ 	mtctr   %r0
+ 	lwz     %r11,(PPC_TRAMP_MAP_SIZE-8)@l(%r11)
+ 	bctr
+ 	nop
+ 	.endr
+ 	.size   trampoline_code_table,.-trampoline_code_table
+ 	.align PPC_TRAMP_MAP_SHIFT
+ #endif /* FFI_EXEC_STATIC_TRAMP */
+ 
  #if defined __ELF__ && defined __linux__
  	.section	.note.GNU-stack,"",@progbits
  #endif
diff -Nrcpad gcc-17-20260517/libffi/src/powerpc/t-aix gcc-17-20260524/libffi/src/powerpc/t-aix
*** gcc-17-20260517/libffi/src/powerpc/t-aix	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/powerpc/t-aix	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,5 ----
+ # This file is needed by GCC in order to correctly build AIX FAT
+ # library for libffi.
+ # However, it has no sense to include this code here, as it depends
+ # on GCC multilib architecture.
+ # Thus, this file is a simple stub replaced in GCC repository.
diff -Nrcpad gcc-17-20260517/libffi/src/prep_cif.c gcc-17-20260524/libffi/src/prep_cif.c
*** gcc-17-20260517/libffi/src/prep_cif.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/prep_cif.c	Sun May 24 22:32:13 2026
***************
*** 1,6 ****
  /* -----------------------------------------------------------------------
!    prep_cif.c - Copyright (c) 2011, 2012, 2021  Anthony Green
                  Copyright (c) 1996, 1998, 2007  Red Hat, Inc.
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
--- 1,7 ----
  /* -----------------------------------------------------------------------
!    prep_cif.c - Copyright (c) 2011, 2012, 2021, 2025  Anthony Green
                  Copyright (c) 1996, 1998, 2007  Red Hat, Inc.
+                 Copyright (c) 2022 Oracle and/or its affiliates.
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
*************** ffi_status FFI_HIDDEN ffi_prep_cif_core(
*** 158,166 ****
  #ifdef XTENSA
        && (cif->rtype->size > 16)
  #endif
- #ifdef NIOS2
-       && (cif->rtype->size > 8)
- #endif
       )
      bytes = STACK_ARG_SIZE(sizeof(void*));
  #endif
--- 159,164 ----
*************** ffi_status ffi_prep_cif_var(ffi_cif *cif
*** 233,246 ****
  {
    ffi_status rc;
    size_t int_size = ffi_type_sint.size;
!   int i;
  
    rc = ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
  
    if (rc != FFI_OK)
      return rc;
  
!   for (i = 1; i < ntotalargs; i++)
      {
        ffi_type *arg_type = atypes[i];
        if (arg_type == &ffi_type_float
--- 231,244 ----
  {
    ffi_status rc;
    size_t int_size = ffi_type_sint.size;
!   unsigned int i;
  
    rc = ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes);
  
    if (rc != FFI_OK)
      return rc;
  
!   for (i = nfixedargs; i < ntotalargs; i++)
      {
        ffi_type *arg_type = atypes[i];
        if (arg_type == &ffi_type_float
diff -Nrcpad gcc-17-20260517/libffi/src/riscv/ffi.c gcc-17-20260524/libffi/src/riscv/ffi.c
*** gcc-17-20260517/libffi/src/riscv/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/riscv/ffi.c	Sun May 24 22:32:13 2026
*************** typedef struct call_builder
*** 61,66 ****
--- 61,67 ----
      int used_integer;
      int used_float;
      size_t *used_stack;
+     void *struct_stack;
  } call_builder;
  
  /* integer (not pointer) less than ABI XLEN */
*************** static void marshal(call_builder *cb, ff
*** 227,233 ****
  #endif
  
      if (type->size > 2 * __SIZEOF_POINTER__) {
!         /* pass by reference */
          marshal_atom(cb, FFI_TYPE_POINTER, &data);
      } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
          marshal_atom(cb, type->type, data);
--- 228,236 ----
  #endif
  
      if (type->size > 2 * __SIZEOF_POINTER__) {
!         /* copy to stack and pass by reference */
!         data = memcpy (cb->struct_stack, data, type->size);
!         cb->struct_stack = (size_t *) FFI_ALIGN ((char *) cb->struct_stack + type->size, __SIZEOF_POINTER__);
          marshal_atom(cb, FFI_TYPE_POINTER, &data);
      } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) {
          marshal_atom(cb, type->type, data);
*************** ffi_call_int (ffi_cif *cif, void (*fn) (
*** 335,344 ****
         that all remaining arguments are long long / __int128 */
      size_t arg_bytes = cif->nargs <= 3 ? 0 :
          FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN);
      size_t rval_bytes = 0;
      if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
          rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
!     size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context);
  
      /* the assembly code will deallocate all stack data at lower addresses
         than the argument region, so we need to allocate the frame and the
--- 338,349 ----
         that all remaining arguments are long long / __int128 */
      size_t arg_bytes = cif->nargs <= 3 ? 0 :
          FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN);
+     /* Allocate space for copies of big structures.  */
+     size_t struct_bytes = FFI_ALIGN (cif->bytes, STKALIGN);
      size_t rval_bytes = 0;
      if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__)
          rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN);
!     size_t alloc_size = arg_bytes + rval_bytes + struct_bytes + sizeof(call_context);
  
      /* the assembly code will deallocate all stack data at lower addresses
         than the argument region, so we need to allocate the frame and the
*************** ffi_call_int (ffi_cif *cif, void (*fn) (
*** 358,365 ****
  
      call_builder cb;
      cb.used_float = cb.used_integer = 0;
!     cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes);
      cb.used_stack = (void*)alloc_base;
  
      int return_by_ref = passed_by_ref(&cb, cif->rtype, 0);
      if (return_by_ref)
--- 363,371 ----
  
      call_builder cb;
      cb.used_float = cb.used_integer = 0;
!     cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes + struct_bytes);
      cb.used_stack = (void*)alloc_base;
+     cb.struct_stack = (void *) (alloc_base + arg_bytes + rval_bytes);
  
      int return_by_ref = passed_by_ref(&cb, cif->rtype, 0);
      if (return_by_ref)
*************** ffi_call_int (ffi_cif *cif, void (*fn) (
*** 373,379 ****
  
      cb.used_float = cb.used_integer = 0;
      if (!return_by_ref && rvalue)
!         unmarshal(&cb, cif->rtype, 0, rvalue);
  }
  
  void
--- 379,410 ----
  
      cb.used_float = cb.used_integer = 0;
      if (!return_by_ref && rvalue)
!       {
! 	if (IS_INT(cif->rtype->type)
! 	    && cif->rtype->size < sizeof (ffi_arg))
! 	  {
! 	    /* Integer types smaller than ffi_arg need to be extended.  */
! 	    switch (cif->rtype->type)
! 	      {
! 	      case FFI_TYPE_SINT8:
! 	      case FFI_TYPE_SINT16:
! 	      case FFI_TYPE_SINT32:
! 		unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
! 				      ? FFI_TYPE_SINT64 : FFI_TYPE_SINT32),
! 				rvalue);
! 		break;
! 	      case FFI_TYPE_UINT8:
! 	      case FFI_TYPE_UINT16:
! 	      case FFI_TYPE_UINT32:
! 		unmarshal_atom (&cb, (sizeof (ffi_arg) > 4
! 				      ? FFI_TYPE_UINT64 : FFI_TYPE_UINT32),
! 				rvalue);
! 		break;
! 	      }
! 	  }
! 	else
! 	  unmarshal(&cb, cif->rtype, 0, rvalue);
!       }
  }
  
  void
*************** ffi_status ffi_prep_closure_loc(ffi_clos
*** 417,423 ****
--- 448,456 ----
      closure->fun = fun;
      closure->user_data = user_data;
  
+ #if !defined(__FreeBSD__)
      __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE);
+ #endif
  
      return FFI_OK;
  }
diff -Nrcpad gcc-17-20260517/libffi/src/s390/ffi.c gcc-17-20260524/libffi/src/s390/ffi.c
*** gcc-17-20260517/libffi/src/s390/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/s390/ffi.c	Sun May 24 22:32:13 2026
***************
*** 32,37 ****
--- 32,38 ----
  #include <ffi_common.h>
  #include <stdint.h>
  #include "internal.h"
+ #include <tramp.h>
  
  /*====================== End of Includes =============================*/
  
*************** ffi_prep_closure_loc (ffi_closure *closu
*** 720,735 ****
  #endif
      0x07f1			/* br %r1 */
    };
! 
    unsigned long *tramp = (unsigned long *)&closure->tramp;
  
    if (cif->abi != FFI_SYSV)
      return FFI_BAD_ABI;
  
    memcpy (tramp, template, sizeof(template));
    tramp[2] = (unsigned long)codeloc;
    tramp[3] = (unsigned long)&ffi_closure_SYSV;
  
    closure->cif = cif;
    closure->fun = fun;
    closure->user_data = user_data;
--- 721,750 ----
  #endif
      0x07f1			/* br %r1 */
    };
!   void (*dest)(void);
    unsigned long *tramp = (unsigned long *)&closure->tramp;
  
    if (cif->abi != FFI_SYSV)
      return FFI_BAD_ABI;
  
+ 
+ #if defined(FFI_EXEC_STATIC_TRAMP)
+   if (ffi_tramp_is_present(closure))
+     {
+       /* Initialize the static trampoline's parameters. */
+       dest = ffi_closure_SYSV;
+       ffi_tramp_set_parms (closure->ftramp, dest, closure);
+       goto out;
+     }
+ #endif
+ 
    memcpy (tramp, template, sizeof(template));
    tramp[2] = (unsigned long)codeloc;
    tramp[3] = (unsigned long)&ffi_closure_SYSV;
  
+ #if defined(FFI_EXEC_STATIC_TRAMP)
+ out:
+ #endif
    closure->cif = cif;
    closure->fun = fun;
    closure->user_data = user_data;
*************** ffi_prep_go_closure (ffi_go_closure *clo
*** 754,756 ****
--- 769,783 ----
  
    return FFI_OK;
  }
+ 
+ #if defined(FFI_EXEC_STATIC_TRAMP)
+ void *
+ ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
+ {
+   extern void *trampoline_code_table;
+ 
+   *tramp_size = FFI390_TRAMP_SIZE;
+   *map_size = FFI390_TRAMP_MAP_SIZE;
+   return &trampoline_code_table;
+ }
+ #endif
\ No newline at end of file
diff -Nrcpad gcc-17-20260517/libffi/src/s390/internal.h gcc-17-20260524/libffi/src/s390/internal.h
*** gcc-17-20260517/libffi/src/s390/internal.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/s390/internal.h	Sun May 24 22:32:13 2026
***************
*** 9,11 ****
--- 9,22 ----
  #define FFI390_RET_IN_MEM	8
  
  #define FFI390_RET_STRUCT	(FFI390_RET_VOID | FFI390_RET_IN_MEM)
+ 
+ 
+ #if defined(FFI_EXEC_STATIC_TRAMP)
+ /*
+  * For the trampoline code table mapping, a mapping size of 4K is chosen.
+  */
+ #define FFI390_TRAMP_MAP_SHIFT	12
+ #define FFI390_TRAMP_MAP_SIZE	(1 << FFI390_TRAMP_MAP_SHIFT)
+ #define FFI390_TRAMP_SIZE	16
+ 
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/s390/sysv.S gcc-17-20260524/libffi/src/s390/sysv.S
*** gcc-17-20260517/libffi/src/s390/sysv.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/s390/sysv.S	Sun May 24 22:32:13 2026
***************
*** 28,33 ****
--- 28,34 ----
  #define LIBFFI_ASM
  #include <fficonfig.h>
  #include <ffi.h>
+ #include "internal.h"
  
  	.text
  
*************** ffi_closure_SYSV:
*** 318,323 ****
--- 319,361 ----
  	br	%r14
  	.cfi_endproc
  	.size	 ffi_closure_SYSV,.-ffi_closure_SYSV
+ 
+ 
+ #if defined(FFI_EXEC_STATIC_TRAMP)
+ /*
+  * Below is the definition of the trampoline code table. Each element in
+  * the code table is a trampoline.
+  */
+ /*
+  * The trampoline uses the volatile register r0 and r1. As the registers are
+  * marked volatile in the ABI, the original values are not saved.
+  *
+  * The trampoline has two parameters - target code to jump to and data for
+  * the target code. The trampoline extracts the parameters from its parameter
+  * block (see tramp_table_map()). The trampoline saves the data address in r0.
+  * Finally, it jumps to the target code.
+  */
+ 
+ 	.align	FFI390_TRAMP_MAP_SIZE
+ trampoline_code_table:
+ 	.rept	FFI390_TRAMP_MAP_SIZE / FFI390_TRAMP_SIZE
+ 	basr %r1,0              # load next instruction address to r1
+ 	lmg %r0,%r1,4094(%r1)   # load parameter block
+ 							# 		r0 -> data
+ 							# 		r1 -> code
+ 	br %r1                  # jump to r1/code
+ 	.balign	8
+ 	.endr
+ 
+ 	.globl trampoline_code_table
+ 	FFI_HIDDEN(trampoline_code_table)
+ #ifdef __ELF__
+ 	.type	trampoline_code_table, @function
+ 	.size	trampoline_code_table,.- trampoline_code_table
+ #endif
+ 	.align	FFI390_TRAMP_MAP_SIZE
+ #endif /* FFI_EXEC_STATIC_TRAMP */
+ 
  #endif /* !s390x */
  
  #if defined __ELF__ && defined __linux__
diff -Nrcpad gcc-17-20260517/libffi/src/sparc/ffi64.c gcc-17-20260524/libffi/src/sparc/ffi64.c
*** gcc-17-20260517/libffi/src/sparc/ffi64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/sparc/ffi64.c	Sun May 24 22:32:13 2026
*************** ffi_prep_args_v9(ffi_cif *cif, unsigned
*** 382,394 ****
  	  *argp++ = *(SINT32 *)a;
  	  break;
  	case FFI_TYPE_UINT32:
- 	case FFI_TYPE_FLOAT:
  	  *argp++ = *(UINT32 *)a;
  	  break;
  	case FFI_TYPE_SINT64:
  	case FFI_TYPE_UINT64:
  	case FFI_TYPE_POINTER:
  	case FFI_TYPE_DOUBLE:
  	  *argp++ = *(UINT64 *)a;
  	  break;
  
--- 382,400 ----
  	  *argp++ = *(SINT32 *)a;
  	  break;
  	case FFI_TYPE_UINT32:
  	  *argp++ = *(UINT32 *)a;
  	  break;
  	case FFI_TYPE_SINT64:
  	case FFI_TYPE_UINT64:
  	case FFI_TYPE_POINTER:
+ 	  *argp++ = *(UINT64 *)a;
+ 	  break;
+ 	case FFI_TYPE_FLOAT:
+ 	  flags |= SPARC_FLAG_FP_ARGS;
+ 	  *argp++ = *(UINT32 *)a;
+ 	  break;
  	case FFI_TYPE_DOUBLE:
+ 	  flags |= SPARC_FLAG_FP_ARGS;
  	  *argp++ = *(UINT64 *)a;
  	  break;
  
*************** ffi_call_int(ffi_cif *cif, void (*fn)(vo
*** 421,432 ****
--- 427,454 ----
  	     void **avalue, void *closure)
  {
    size_t bytes = cif->bytes;
+   size_t i, nargs = cif->nargs;
+   ffi_type **arg_types = cif->arg_types;
  
    FFI_ASSERT (cif->abi == FFI_V9);
  
    if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM))
      bytes += FFI_ALIGN (cif->rtype->size, 16);
  
+   /* If we have any large structure arguments, make a copy so we are passing
+      by value.  */
+   for (i = 0; i < nargs; i++)
+     {
+       ffi_type *at = arg_types[i];
+       int size = at->size;
+       if (at->type == FFI_TYPE_STRUCT && size > 4)
+         {
+           char *argcopy = alloca (size);
+           memcpy (argcopy, avalue[i], size);
+           avalue[i] = argcopy;
+         }
+     }  
+   
    ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure);
  }
  
diff -Nrcpad gcc-17-20260517/libffi/src/tramp.c gcc-17-20260524/libffi/src/tramp.c
*** gcc-17-20260517/libffi/src/tramp.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/tramp.c	Sun May 24 22:32:13 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* -----------------------------------------------------------------------
     tramp.c - Copyright (c) 2020 Madhavan T. Venkataraman
+              Copyright (c) 2022 Anthony Green
  
     API and support functions for managing statically defined closure
     trampolines.
***************
*** 31,43 ****
  
  /* -------------------------- Headers and Definitions ---------------------*/
  /*
!  * Add support for other OSes later. For now, it is just Linux.
   */
  
! #if defined __linux__
  #ifdef __linux__
  #define _GNU_SOURCE 1
  #endif
  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
--- 32,48 ----
  
  /* -------------------------- Headers and Definitions ---------------------*/
  /*
!  * Add support for other OSes later. For now, it is just Linux and Cygwin.
   */
  
! #if defined (__linux__) || defined (__CYGWIN__)
  #ifdef __linux__
  #define _GNU_SOURCE 1
  #endif
+ 
+ #include <ffi.h>
+ #include <ffi_common.h>
+ 
  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
***************
*** 50,56 ****
  #include <linux/limits.h>
  #include <linux/types.h>
  #endif
! #endif /* __linux__ */
  
  /*
   * Each architecture defines static code for a trampoline code table. The
--- 55,64 ----
  #include <linux/limits.h>
  #include <linux/types.h>
  #endif
! #ifdef __CYGWIN__
! #include <limits.h>
! #endif
! #endif
  
  /*
   * Each architecture defines static code for a trampoline code table. The
*************** static struct tramp_globals tramp_global
*** 191,197 ****
   */
  static int tramp_table_alloc (void);
  
! #if defined __linux__
  
  static int
  ffi_tramp_get_libffi (void)
--- 199,205 ----
   */
  static int tramp_table_alloc (void);
  
! #if defined (__linux__) || defined (__CYGWIN__)
  
  static int
  ffi_tramp_get_libffi (void)
*************** ffi_tramp_get_libffi (void)
*** 201,206 ****
--- 209,219 ----
    unsigned long start, end, offset, inode;
    uintptr_t addr = (uintptr_t) tramp_globals.text;
    int nfields, found;
+   int open_flags = O_RDONLY;
+ 
+ #ifdef O_CLOEXEC
+   open_flags |= O_CLOEXEC;
+ #endif
  
    snprintf (file, PATH_MAX, "/proc/%d/maps", getpid());
    fp = fopen (file, "r");
*************** ffi_tramp_get_libffi (void)
*** 228,234 ****
    if (!found)
      return 0;
  
!   tramp_globals.fd = open (file, O_RDONLY);
    if (tramp_globals.fd == -1)
      return 0;
  
--- 241,247 ----
    if (!found)
      return 0;
  
!   tramp_globals.fd = open (file, open_flags);
    if (tramp_globals.fd == -1)
      return 0;
  
*************** ffi_tramp_get_libffi (void)
*** 245,274 ****
    return 1;
  }
  
! #endif /* __linux__ */
! 
! #if defined __linux__
  
! #if defined HAVE_MKSTEMP
  
  static int
  ffi_tramp_get_temp_file (void)
  {
-   char template[12] = "/tmp/XXXXXX";
    ssize_t count;
  
    tramp_globals.offset = 0;
!   tramp_globals.fd = mkstemp (template);
!   if (tramp_globals.fd == -1)
!     return 0;
  
-   unlink (template);
    /*
     * Write the trampoline code table into the temporary file and allocate a
     * trampoline table to make sure that the temporary file can be mapped.
     */
    count = write(tramp_globals.fd, tramp_globals.text, tramp_globals.map_size);
!   if (count == tramp_globals.map_size && tramp_table_alloc ())
      return 1;
  
    close (tramp_globals.fd);
--- 258,281 ----
    return 1;
  }
  
! #endif /* defined (__linux__) || defined (__CYGWIN__) */
  
! #if defined (__linux__) || defined (__CYGWIN__)
  
  static int
  ffi_tramp_get_temp_file (void)
  {
    ssize_t count;
  
    tramp_globals.offset = 0;
!   tramp_globals.fd = open_temp_exec_file ();
  
    /*
     * Write the trampoline code table into the temporary file and allocate a
     * trampoline table to make sure that the temporary file can be mapped.
     */
    count = write(tramp_globals.fd, tramp_globals.text, tramp_globals.map_size);
!   if (count >=0 && (size_t)count == tramp_globals.map_size && tramp_table_alloc ())
      return 1;
  
    close (tramp_globals.fd);
*************** ffi_tramp_get_temp_file (void)
*** 276,304 ****
    return 0;
  }
  
! #else /* !defined HAVE_MKSTEMP */
! 
! /*
!  * TODO:
!  * src/closures.c contains code for finding temp file that has EXEC
!  * permissions. May be, some of that code can be shared with static
!  * trampolines.
!  */
! static int
! ffi_tramp_get_temp_file (void)
! {
!   tramp_globals.offset = 0;
!   tramp_globals.fd = -1;
!   return 0;
! }
! 
! #endif /* defined HAVE_MKSTEMP */
! 
! #endif /* __linux__ */
  
  /* ------------------------ OS-specific Initialization ----------------------*/
  
! #if defined __linux__
  
  static int
  ffi_tramp_init_os (void)
--- 283,293 ----
    return 0;
  }
  
! #endif /* defined (__linux__) || defined (__CYGWIN__) */
  
  /* ------------------------ OS-specific Initialization ----------------------*/
  
! #if defined (__linux__) || defined (__CYGWIN__)
  
  static int
  ffi_tramp_init_os (void)
*************** ffi_tramp_init_os (void)
*** 308,318 ****
    return ffi_tramp_get_temp_file ();
  }
  
! #endif /* __linux__ */
  
  /* --------------------------- OS-specific Locking -------------------------*/
  
! #if defined __linux__
  
  static pthread_mutex_t tramp_globals_mutex = PTHREAD_MUTEX_INITIALIZER;
  
--- 297,307 ----
    return ffi_tramp_get_temp_file ();
  }
  
! #endif /* defined (__linux__) || defined (__CYGWIN__) */
  
  /* --------------------------- OS-specific Locking -------------------------*/
  
! #if defined (__linux__) || defined (__CYGWIN__)
  
  static pthread_mutex_t tramp_globals_mutex = PTHREAD_MUTEX_INITIALIZER;
  
*************** ffi_tramp_lock(void)
*** 323,334 ****
  }
  
  static void
! ffi_tramp_unlock()
  {
    pthread_mutex_unlock (&tramp_globals_mutex);
  }
  
! #endif /* __linux__ */
  
  /* ------------------------ OS-specific Memory Mapping ----------------------*/
  
--- 312,323 ----
  }
  
  static void
! ffi_tramp_unlock(void)
  {
    pthread_mutex_unlock (&tramp_globals_mutex);
  }
  
! #endif /* defined (__linux__) || defined (__CYGWIN__) */
  
  /* ------------------------ OS-specific Memory Mapping ----------------------*/
  
*************** ffi_tramp_unlock()
*** 347,353 ****
   * sizeof (struct tramp_parm) cannot exceed the size of a parameter block.
   */
  
! #if defined __linux__
  
  static int
  tramp_table_map (struct tramp_table *table)
--- 336,342 ----
   * sizeof (struct tramp_parm) cannot exceed the size of a parameter block.
   */
  
! #if defined (__linux__) || defined (__CYGWIN__)
  
  static int
  tramp_table_map (struct tramp_table *table)
*************** tramp_table_unmap (struct tramp_table *t
*** 384,390 ****
    (void) munmap (table->parm_table, tramp_globals.map_size);
  }
  
! #endif /* __linux__ */
  
  /* ------------------------ Trampoline Initialization ----------------------*/
  
--- 373,379 ----
    (void) munmap (table->parm_table, tramp_globals.map_size);
  }
  
! #endif /* defined (__linux__) || defined (__CYGWIN__) */
  
  /* ------------------------ Trampoline Initialization ----------------------*/
  
*************** tramp_table_unmap (struct tramp_table *t
*** 394,399 ****
--- 383,390 ----
  static int
  ffi_tramp_init (void)
  {
+   long page_size;
+ 
    if (tramp_globals.status == TRAMP_GLOBALS_PASSED)
      return 1;
  
*************** ffi_tramp_init (void)
*** 416,422 ****
      &tramp_globals.map_size);
    tramp_globals.ntramp = tramp_globals.map_size / tramp_globals.size;
  
!   if (sysconf (_SC_PAGESIZE) > tramp_globals.map_size)
      return 0;
  
    if (ffi_tramp_init_os ())
--- 407,414 ----
      &tramp_globals.map_size);
    tramp_globals.ntramp = tramp_globals.map_size / tramp_globals.size;
  
!   page_size = sysconf (_SC_PAGESIZE);
!   if (page_size >= 0 && (size_t)page_size > tramp_globals.map_size)
      return 0;
  
    if (ffi_tramp_init_os ())
diff -Nrcpad gcc-17-20260517/libffi/src/types.c gcc-17-20260524/libffi/src/types.c
*** gcc-17-20260517/libffi/src/types.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/types.c	Sun May 24 22:32:13 2026
***************
*** 1,6 ****
  /* -----------------------------------------------------------------------
!    types.c - Copyright (c) 1996, 1998  Red Hat, Inc.
!    
     Predefined ffi_types needed by libffi.
  
     Permission is hereby granted, free of charge, to any person obtaining
--- 1,6 ----
  /* -----------------------------------------------------------------------
!    types.c - Copyright (c) 1996, 1998, 2024, 2025  Red Hat, Inc.
! 
     Predefined ffi_types needed by libffi.
  
     Permission is hereby granted, free of charge, to any person obtaining
***************
*** 31,36 ****
--- 31,58 ----
  #include <ffi.h>
  #include <ffi_common.h>
  
+ /* Return a version string. */
+ const char *ffi_get_version (void)
+ {
+   return FFI_VERSION_STRING;
+ }
+ 
+ /* Return the version as an unsigned long value: (x * 10000 + y * 100 + z) */
+ unsigned long ffi_get_version_number (void)
+ {
+   return FFI_VERSION_NUMBER;
+ }
+ 
+ unsigned int ffi_get_default_abi (void)
+ {
+   return FFI_DEFAULT_ABI;
+ }
+ 
+ size_t ffi_get_closure_size (void)
+ {
+   return sizeof(ffi_closure);
+ }
+ 
  /* Type definitions */
  
  #define FFI_TYPEDEF(name, type, id, maybe_const)\
*************** FFI_TYPEDEF(double, double, FFI_TYPE_DOU
*** 87,93 ****
  #endif
  
  #ifdef __alpha__
! /* Even if we're not configured to default to 128-bit long double, 
     maintain binary compatibility, as -mlong-double-128 can be used
     at any time.  */
  /* Validate the hard-coded number below.  */
--- 109,115 ----
  #endif
  
  #ifdef __alpha__
! /* Even if we're not configured to default to 128-bit long double,
     maintain binary compatibility, as -mlong-double-128 can be used
     at any time.  */
  /* Validate the hard-coded number below.  */
*************** FFI_TYPEDEF(double, double, FFI_TYPE_DOU
*** 95,108 ****
  #  error FFI_TYPE_LONGDOUBLE out of date
  # endif
  const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
! #elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
  FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST);
  #endif
  
  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
  FFI_COMPLEX_TYPEDEF(float, float, const);
  FFI_COMPLEX_TYPEDEF(double, double, const);
- #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
  FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST);
  #endif
- #endif
--- 117,128 ----
  #  error FFI_TYPE_LONGDOUBLE out of date
  # endif
  const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
! #else
  FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST);
  #endif
  
  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
  FFI_COMPLEX_TYPEDEF(float, float, const);
  FFI_COMPLEX_TYPEDEF(double, double, const);
  FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST);
  #endif
diff -Nrcpad gcc-17-20260517/libffi/src/wasm/ffi.c gcc-17-20260524/libffi/src/wasm/ffi.c
*** gcc-17-20260517/libffi/src/wasm/ffi.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/wasm/ffi.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,798 ----
+ /* -----------------------------------------------------------------------
+    ffi.c - Copyright (c) 2018-2023  Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen, and others.
+ 
+    wasm32/emscripten Foreign Function Interface
+ 
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    ``Software''), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+    ----------------------------------------------------------------------- */
+ 
+ #include <ffi.h>
+ #include <ffi_common.h>
+ 
+ #include <stdlib.h>
+ #include <stdint.h>
+ 
+ #include <emscripten/emscripten.h>
+ 
+ #ifdef DEBUG_F
+ #define LOG_DEBUG(args...)  \
+   console.warn(`====LIBFFI(line __LINE__)`, args)
+ #else
+ #define LOG_DEBUG(args...) 0
+ #endif
+ 
+ #define EM_JS_MACROS(ret, name, args, body...) EM_JS(ret, name, args, body)
+ 
+ EM_JS_DEPS(libffi, "$getWasmTableEntry,$setWasmTableEntry,$getEmptyTableSlot,$convertJsFunctionToWasm");
+ 
+ #define DEREF_U8(addr, offset) HEAPU8[addr + offset]
+ #define DEREF_S8(addr, offset) HEAP8[addr + offset]
+ #define DEREF_U16(addr, offset) HEAPU16[(addr >> 1) + offset]
+ #define DEREF_S16(addr, offset) HEAP16[(addr >> 1) + offset]
+ #define DEREF_U32(addr, offset) HEAPU32[(addr >> 2) + offset]
+ #define DEREF_S32(addr, offset) HEAP32[(addr >> 2) + offset]
+ 
+ #define DEREF_F32(addr, offset) HEAPF32[(addr >> 2) + offset]
+ #define DEREF_F64(addr, offset) HEAPF64[(addr >> 3) + offset]
+ #define DEREF_U64(addr, offset) HEAPU64[(addr >> 3) + offset]
+ 
+ #define CHECK_FIELD_OFFSET(struct, field, offset)                                  \
+   _Static_assert(                                                                  \
+     offsetof(struct, field) == offset,                                             \
+     "Memory layout of '" #struct "' has changed: '" #field "' is in an unexpected location");
+ 
+ #if __SIZEOF_POINTER__ == 4
+ 
+ #define FFI_EMSCRIPTEN_ABI FFI_WASM32_EMSCRIPTEN
+ #define PTR_SIG 'i'
+ 
+ #define DEC_PTR(p) p
+ #define ENC_PTR(p) p
+ 
+ #define DEREF_PTR(addr, offset) DEREF_U32(addr, offset)
+ #define DEREF_PTR_NUMBER(addr, offset) DEREF_PTR(addr, offset)
+ 
+ CHECK_FIELD_OFFSET(ffi_cif, abi, 4*0);
+ CHECK_FIELD_OFFSET(ffi_cif, nargs, 4*1);
+ CHECK_FIELD_OFFSET(ffi_cif, arg_types, 4*2);
+ CHECK_FIELD_OFFSET(ffi_cif, rtype, 4*3);
+ CHECK_FIELD_OFFSET(ffi_cif, flags, 4*5);
+ CHECK_FIELD_OFFSET(ffi_cif, nfixedargs, 4*6);
+ 
+ #define CIF__ABI(addr) DEREF_U32(addr, 0)
+ #define CIF__NARGS(addr) DEREF_U32(addr, 1)
+ #define CIF__ARGTYPES(addr) DEREF_U32(addr, 2)
+ #define CIF__RTYPE(addr) DEREF_U32(addr, 3)
+ #define CIF__FLAGS(addr) DEREF_U32(addr, 5)
+ #define CIF__NFIXEDARGS(addr) DEREF_U32(addr, 6)
+ 
+ CHECK_FIELD_OFFSET(ffi_type, size, 0);
+ CHECK_FIELD_OFFSET(ffi_type, alignment, 4);
+ CHECK_FIELD_OFFSET(ffi_type, type, 6);
+ CHECK_FIELD_OFFSET(ffi_type, elements, 8);
+ 
+ #define FFI_TYPE__SIZE(addr) DEREF_U32(addr, 0)
+ #define FFI_TYPE__ALIGN(addr) DEREF_U16(addr + 4, 0)
+ #define FFI_TYPE__TYPEID(addr) DEREF_U16(addr + 6, 0)
+ #define FFI_TYPE__ELEMENTS(addr) DEREF_U32(addr + 8, 0)
+ 
+ #elif __SIZEOF_POINTER__ == 8
+ 
+ #define FFI_EMSCRIPTEN_ABI FFI_WASM64_EMSCRIPTEN
+ #define PTR_SIG 'j'
+ 
+ // DEC_PTR casts a pointer value (comming from Wasm) represented as BigInt (i64) to Number (i53).
+ // This should be used for a pointer that is expected to be within the i53 range. If the pointer
+ // value is outside the Number's range, the value will become NaN.
+ #define DEC_PTR(p) bigintToI53Checked(p)
+ // ENC_PTR casts a pointer value represented as Number to BigInt (i64)
+ #define ENC_PTR(p) BigInt(p)
+ 
+ #define DEREF_PTR(addr, offset) DEREF_U64(addr, offset)
+ #define DEREF_PTR_NUMBER(addr, offset) DEC_PTR(DEREF_PTR(addr, offset))
+ 
+ CHECK_FIELD_OFFSET(ffi_cif, abi, 0);
+ CHECK_FIELD_OFFSET(ffi_cif, nargs, 4);
+ CHECK_FIELD_OFFSET(ffi_cif, arg_types, 8);
+ CHECK_FIELD_OFFSET(ffi_cif, rtype, 16);
+ CHECK_FIELD_OFFSET(ffi_cif, flags, 28);
+ CHECK_FIELD_OFFSET(ffi_cif, nfixedargs, 32);
+ 
+ #define CIF__ABI(addr) DEREF_U32(addr, 0)
+ #define CIF__NARGS(addr) DEREF_U32(addr + 4,  0)
+ #define CIF__ARGTYPES(addr) DEREF_U64(addr + 8,  0)
+ #define CIF__RTYPE(addr) DEREF_U64(addr + 16, 0)
+ #define CIF__FLAGS(addr) DEREF_U32(addr + 28, 0)
+ #define CIF__NFIXEDARGS(addr) DEREF_U32(addr + 32, 0)
+ 
+ CHECK_FIELD_OFFSET(ffi_type, size, 0);
+ CHECK_FIELD_OFFSET(ffi_type, alignment, 8);
+ CHECK_FIELD_OFFSET(ffi_type, type, 10);
+ CHECK_FIELD_OFFSET(ffi_type, elements, 16);
+ 
+ #define FFI_TYPE__SIZE(addr) DEREF_U64(addr, 0)
+ #define FFI_TYPE__ALIGN(addr) DEREF_U16(addr + 8, 0)
+ #define FFI_TYPE__TYPEID(addr) DEREF_U16(addr + 10, 0)
+ #define FFI_TYPE__ELEMENTS(addr) DEREF_U64(addr + 16, 0)
+ 
+ #else
+ #error "Unknown pointer size"
+ #endif
+ 
+ #define ALIGN_ADDRESS(addr, align) (addr &= (~((align) - 1)))
+ #define STACK_ALLOC(stack, size, align) ((stack -= (size)), ALIGN_ADDRESS(stack, align))
+ 
+ // Most wasm runtimes support at most 1000 Js trampoline args.
+ #define MAX_ARGS 1000
+ 
+ #include <stddef.h>
+ 
+ #define VARARGS_FLAG 1
+ 
+ #define FFI_OK_MACRO 0
+ _Static_assert(FFI_OK_MACRO == FFI_OK, "FFI_OK must be 0");
+ 
+ #define FFI_BAD_TYPEDEF_MACRO 1
+ _Static_assert(FFI_BAD_TYPEDEF_MACRO == FFI_BAD_TYPEDEF, "FFI_BAD_TYPEDEF must be 1");
+ 
+ ffi_status FFI_HIDDEN
+ ffi_prep_cif_machdep(ffi_cif *cif)
+ {
+   if (cif->abi != FFI_EMSCRIPTEN_ABI)
+     return FFI_BAD_ABI;
+   // This is called after ffi_prep_cif_machdep_var so we need to avoid
+   // overwriting cif->nfixedargs.
+   if (!(cif->flags & VARARGS_FLAG))
+     cif->nfixedargs = cif->nargs;
+   if (cif->nargs > MAX_ARGS)
+     return FFI_BAD_TYPEDEF;
+   if (cif->rtype->type == FFI_TYPE_COMPLEX)
+     return FFI_BAD_TYPEDEF;
+   // If they put the COMPLEX type into a struct we won't notice, but whatever.
+   for (int i = 0; i < cif->nargs; i++)
+     if (cif->arg_types[i]->type == FFI_TYPE_COMPLEX)
+       return FFI_BAD_TYPEDEF;
+   return FFI_OK;
+ }
+ 
+ ffi_status FFI_HIDDEN
+ ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned nfixedargs, unsigned ntotalargs)
+ {
+   cif->flags |= VARARGS_FLAG;
+   cif->nfixedargs = nfixedargs;
+   // The varargs takes up one extra argument
+   if (cif->nfixedargs + 1 > MAX_ARGS)
+     return FFI_BAD_TYPEDEF;
+   return FFI_OK;
+ }
+ 
+ /**
+  * A Javascript helper function. This takes an argument typ which is a wasm
+  * pointer to an ffi_type object. It returns a pair a type and a type id.
+  *
+  *    - If it is not a struct, return its type and its typeid field.
+  *    - If it is a struct of size >= 2, return the type and its typeid (which
+  *      will be FFI_TYPE_STRUCT)
+  *    - If it is a struct of size 0, return FFI_TYPE_VOID (????? this is broken)
+  *    - If it is a struct of size 1, replace it with the single field and apply
+  *      the same logic again to that.
+  *
+  * By always unboxing structs up front, we can avoid messy casework later.
+  */
+ EM_JS_MACROS(
+ void,
+ unbox_small_structs, (ffi_type type_ptr), {
+   type_ptr = DEC_PTR(type_ptr);
+   var type_id = FFI_TYPE__TYPEID(type_ptr);
+   while (type_id === FFI_TYPE_STRUCT) {
+     // Don't unbox single element structs if they are bigger than 16 bytes. This
+     // is a work around for the fact that Python will give incorrect values for
+     // the size of the field in these cases: it says that the struct has pointer
+     // size and alignment and are of type pointer, even though it is more
+     // accurately a struct and has a larger size. Keeping it as a struct here
+     // will let us get the ABI right (which is in fact that the true argument is
+     // a pointer to the stack... so maybe Python issn't so wrong??)
+     //
+     // See the Python comment here:
+     // https://github.com/python/cpython/blob/a16a9f978f42b8a09297c1efbf33877f6388c403/Modules/_ctypes/stgdict.c#L718-L779
+     if (DEC_PTR(FFI_TYPE__SIZE(type_ptr)) > 16) {
+       break;
+     }
+     var elements = DEC_PTR(FFI_TYPE__ELEMENTS(type_ptr));
+     var first_element = DEREF_PTR_NUMBER(elements, 0);
+     if (first_element === 0) {
+       type_id = FFI_TYPE_VOID;
+       break;
+     } else if (DEREF_PTR_NUMBER(elements, 1) === 0) {
+       type_ptr = first_element;
+       type_id = FFI_TYPE__TYPEID(first_element);
+     } else {
+       break;
+     }
+   }
+   return [type_ptr, type_id];
+ })
+ 
+ EM_JS_MACROS(
+ void,
+ ffi_call_js, (ffi_cif *cif, ffi_fp fn, void *rvalue, void **avalue),
+ {
+   cif = DEC_PTR(cif);
+   fn = DEC_PTR(fn);
+   rvalue = DEC_PTR(rvalue);
+   avalue = DEC_PTR(avalue);
+   var abi = CIF__ABI(cif);
+   var nargs = CIF__NARGS(cif);
+   var nfixedargs = CIF__NFIXEDARGS(cif);
+   var arg_types_ptr = DEC_PTR(CIF__ARGTYPES(cif));
+   var flags = CIF__FLAGS(cif);
+   var rtype_unboxed = unbox_small_structs(CIF__RTYPE(cif));
+   var rtype_ptr = rtype_unboxed[0];
+   var rtype_id = rtype_unboxed[1];
+   var orig_stack_ptr = stackSave();
+   var cur_stack_ptr = orig_stack_ptr;
+ 
+   var args = [];
+   // Does our onwards call return by argument or normally? We return by argument
+   // no matter what.
+   var ret_by_arg = false;
+ 
+   if (rtype_id === FFI_TYPE_COMPLEX) {
+     throw new Error('complex ret marshalling nyi');
+   }
+   if (rtype_id < 0 || rtype_id > FFI_TYPE_LAST) {
+     throw new Error('Unexpected rtype ' + rtype_id);
+   }
+   // If the return type is a struct with multiple entries or a long double, the
+   // function takes an extra first argument which is a pointer to return value.
+   // Conveniently, we've already received a pointer to return value, so we can
+   // just use this. We also mark a flag that we don't need to convert the return
+   // value of the dynamic call back to C.
+   if (rtype_id === FFI_TYPE_LONGDOUBLE || rtype_id === FFI_TYPE_STRUCT) {
+     args.push(ENC_PTR(rvalue));
+     ret_by_arg = true;
+   }
+ 
+   // Accumulate a Javascript list of arguments for the Javascript wrapper for
+   // the wasm function. The Javascript wrapper does a type conversion from
+   // Javascript to C automatically, here we manually do the inverse conversion
+   // from C to Javascript.
+   for (var i = 0; i < nfixedargs; i++) {
+     var arg_ptr = DEREF_PTR_NUMBER(avalue, i);
+     var arg_unboxed = unbox_small_structs(DEREF_PTR(arg_types_ptr, i));
+     var arg_type_ptr = arg_unboxed[0];
+     var arg_type_id = arg_unboxed[1];
+ 
+     // It's okay here to always use unsigned integers as long as the size is 32
+     // or 64 bits. Smaller sizes get extended to 32 bits differently according
+     // to whether they are signed or unsigned.
+     switch (arg_type_id) {
+     case FFI_TYPE_INT:
+     case FFI_TYPE_SINT32:
+     case FFI_TYPE_UINT32:
+       args.push(DEREF_U32(arg_ptr, 0));
+       break;
+     case FFI_TYPE_FLOAT:
+       args.push(DEREF_F32(arg_ptr, 0));
+       break;
+     case FFI_TYPE_DOUBLE:
+       args.push(DEREF_F64(arg_ptr, 0));
+       break;
+     case FFI_TYPE_UINT8:
+       args.push(DEREF_U8(arg_ptr, 0));
+       break;
+     case FFI_TYPE_SINT8:
+       args.push(DEREF_S8(arg_ptr, 0));
+       break;
+     case FFI_TYPE_UINT16:
+       args.push(DEREF_U16(arg_ptr, 0));
+       break;
+     case FFI_TYPE_SINT16:
+       args.push(DEREF_S16(arg_ptr, 0));
+       break;
+     case FFI_TYPE_UINT64:
+     case FFI_TYPE_SINT64:
+       args.push(DEREF_U64(arg_ptr, 0));
+       break;
+     case FFI_TYPE_LONGDOUBLE:
+       // long double is passed as a pair of BigInts.
+       args.push(DEREF_U64(arg_ptr, 0));
+       args.push(DEREF_U64(arg_ptr, 1));
+       break;
+     case FFI_TYPE_STRUCT:
+       // Nontrivial structs are passed by pointer.
+       // Have to copy the struct onto the stack though because C ABI says it's
+       // call by value.
+       var size = DEC_PTR(FFI_TYPE__SIZE(arg_type_ptr));
+       var align = FFI_TYPE__ALIGN(arg_type_ptr);
+       STACK_ALLOC(cur_stack_ptr, size, align);
+       HEAP8.subarray(cur_stack_ptr, cur_stack_ptr+size).set(HEAP8.subarray(arg_ptr, arg_ptr + size));
+       args.push(ENC_PTR(cur_stack_ptr));
+       break;
+     case FFI_TYPE_POINTER:
+       args.push(DEREF_PTR(arg_ptr, 0));
+       break;
+     case FFI_TYPE_COMPLEX:
+       throw new Error('complex marshalling nyi');
+     default:
+       throw new Error('Unexpected type ' + arg_type_id);
+     }
+   }
+ 
+   // Wasm functions can't directly manipulate the callstack, so varargs
+   // arguments have to go on a separate stack. A varags function takes one extra
+   // argument which is a pointer to where on the separate stack the args are
+   // located. Because stacks are allocated backwards, we have to loop over the
+   // varargs backwards.
+   //
+   // We don't have any way of knowing how many args were actually passed, so we
+   // just always copy extra nonsense past the end. The ownwards call will know
+   // not to look at it.
+   if (flags & VARARGS_FLAG) {
+     var struct_arg_info = [];
+     for (var i = nargs - 1;  i >= nfixedargs; i--) {
+       var arg_ptr = DEREF_PTR_NUMBER(avalue, i);
+       var arg_unboxed = unbox_small_structs(DEREF_PTR(arg_types_ptr, i));
+       var arg_type_ptr = arg_unboxed[0];
+       var arg_type_id = arg_unboxed[1];
+       switch (arg_type_id) {
+       case FFI_TYPE_UINT8:
+       case FFI_TYPE_SINT8:
+         STACK_ALLOC(cur_stack_ptr, 1, 1);
+         DEREF_U8(cur_stack_ptr, 0) = DEREF_U8(arg_ptr, 0);
+         break;
+       case FFI_TYPE_UINT16:
+       case FFI_TYPE_SINT16:
+         STACK_ALLOC(cur_stack_ptr, 2, 2);
+         DEREF_U16(cur_stack_ptr, 0) = DEREF_U16(arg_ptr, 0);
+         break;
+       case FFI_TYPE_INT:
+       case FFI_TYPE_UINT32:
+       case FFI_TYPE_SINT32:
+       case FFI_TYPE_FLOAT:
+         STACK_ALLOC(cur_stack_ptr, 4, 4);
+         DEREF_U32(cur_stack_ptr, 0) = DEREF_U32(arg_ptr, 0);
+         break;
+       case FFI_TYPE_DOUBLE:
+       case FFI_TYPE_UINT64:
+       case FFI_TYPE_SINT64:
+         STACK_ALLOC(cur_stack_ptr, 8, 8);
+         DEREF_U32(cur_stack_ptr, 0) = DEREF_U32(arg_ptr, 0);
+         DEREF_U32(cur_stack_ptr, 1) = DEREF_U32(arg_ptr, 1);
+         break;
+       case FFI_TYPE_LONGDOUBLE:
+         STACK_ALLOC(cur_stack_ptr, 16, 8);
+         DEREF_U32(cur_stack_ptr, 0) = DEREF_U32(arg_ptr, 0);
+         DEREF_U32(cur_stack_ptr, 1) = DEREF_U32(arg_ptr, 1);
+         DEREF_U32(cur_stack_ptr, 2) = DEREF_U32(arg_ptr, 2);
+         DEREF_U32(cur_stack_ptr, 3) = DEREF_U32(arg_ptr, 3);
+         break;
+       case FFI_TYPE_STRUCT:
+         // Again, struct must be passed by pointer.
+         // But ABI is by value, so have to copy struct onto stack.
+         // Currently arguments are going onto stack so we can't put it there now. Come back for this.
+         STACK_ALLOC(cur_stack_ptr, __SIZEOF_POINTER__, __SIZEOF_POINTER__);
+         struct_arg_info.push([cur_stack_ptr, arg_ptr, DEC_PTR(FFI_TYPE__SIZE(arg_type_ptr)), FFI_TYPE__ALIGN(arg_type_ptr)]);
+         break;
+       case FFI_TYPE_POINTER:
+         STACK_ALLOC(cur_stack_ptr, __SIZEOF_POINTER__, __SIZEOF_POINTER__);
+         DEREF_PTR(cur_stack_ptr, 0) = DEREF_PTR(arg_ptr, 0);
+         break;
+       case FFI_TYPE_COMPLEX:
+         throw new Error('complex arg marshalling nyi');
+       default:
+         throw new Error('Unexpected argtype ' + arg_type_id);
+       }
+     }
+     // extra normal argument which is the pointer to the varargs.
+     args.push(ENC_PTR(cur_stack_ptr));
+     // Now allocate variable struct args on stack too.
+     for (var i = 0; i < struct_arg_info.length; i++) {
+       var struct_info = struct_arg_info[i];
+       var arg_target = struct_info[0];
+       var arg_ptr = struct_info[1];
+       var size = struct_info[2];
+       var align = struct_info[3];
+       STACK_ALLOC(cur_stack_ptr, size, align);
+       HEAP8.subarray(cur_stack_ptr, cur_stack_ptr+size).set(HEAP8.subarray(arg_ptr, arg_ptr + size));
+       DEREF_PTR(arg_target, 0) = ENC_PTR(cur_stack_ptr);
+     }
+   }
+   stackRestore(cur_stack_ptr);
+   stackAlloc(0); // stackAlloc enforces alignment invariants on the stack pointer
+   LOG_DEBUG("CALL_FUNC_PTR", "fn:", fn, "args:", args);
+   var result = getWasmTableEntry(fn).apply(null, args);
+   // Put the stack pointer back (we moved it if there were any struct args or we
+   // made a varargs call)
+   stackRestore(orig_stack_ptr);
+ 
+   // We need to return by argument. If return value was a nontrivial struct or
+   // long double, the onwards call already put the return value in rvalue
+   if (ret_by_arg) {
+     return;
+   }
+ 
+   // Otherwise the result was automatically converted from C into Javascript and
+   // we need to manually convert it back to C.
+   switch (rtype_id) {
+   case FFI_TYPE_VOID:
+     break;
+   case FFI_TYPE_INT:
+   case FFI_TYPE_UINT32:
+   case FFI_TYPE_SINT32:
+     DEREF_U32(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_FLOAT:
+     DEREF_F32(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_DOUBLE:
+     DEREF_F64(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_UINT8:
+   case FFI_TYPE_SINT8:
+     DEREF_U8(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_UINT16:
+   case FFI_TYPE_SINT16:
+     DEREF_U16(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_UINT64:
+   case FFI_TYPE_SINT64:
+     DEREF_U64(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_POINTER:
+     DEREF_PTR(rvalue, 0) = result;
+     break;
+   case FFI_TYPE_COMPLEX:
+     throw new Error('complex ret marshalling nyi');
+   default:
+     throw new Error('Unexpected rtype ' + rtype_id);
+   }
+ });
+ 
+ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) {
+   ffi_call_js(cif, fn, rvalue, avalue);
+ }
+ 
+ #if __SIZEOF_POINTER__ == 4
+ 
+ CHECK_FIELD_OFFSET(ffi_closure, ftramp, 4*0);
+ CHECK_FIELD_OFFSET(ffi_closure, cif, 4*1);
+ CHECK_FIELD_OFFSET(ffi_closure, fun, 4*2);
+ CHECK_FIELD_OFFSET(ffi_closure, user_data, 4*3);
+ 
+ #define CLOSURE__wrapper(addr) DEREF_U32(addr, 0)
+ #define CLOSURE__cif(addr) DEREF_U32(addr, 1)
+ #define CLOSURE__fun(addr) DEREF_U32(addr, 2)
+ #define CLOSURE__user_data(addr) DEREF_U32(addr, 3)
+ 
+ #elif __SIZEOF_POINTER__ == 8
+ 
+ CHECK_FIELD_OFFSET(ffi_closure, ftramp, 0);
+ CHECK_FIELD_OFFSET(ffi_closure, cif, 8);
+ CHECK_FIELD_OFFSET(ffi_closure, fun, 16);
+ CHECK_FIELD_OFFSET(ffi_closure, user_data, 24);
+ 
+ #define CLOSURE__wrapper(addr) DEREF_U64(addr, 0)
+ #define CLOSURE__cif(addr) DEREF_U64(addr, 1)
+ #define CLOSURE__fun(addr) DEREF_U64(addr, 2)
+ #define CLOSURE__user_data(addr) DEREF_U64(addr, 3)
+ 
+ #else
+ #error "Unknown pointer size"
+ #endif
+ 
+ EM_JS_MACROS(void *, ffi_closure_alloc_js, (size_t size, void **code), {
+   size = DEC_PTR(size);
+   code = DEC_PTR(code);
+   var closure = _malloc(size);
+   var index = getEmptyTableSlot();
+   DEREF_PTR(code, 0) = ENC_PTR(index);
+   CLOSURE__wrapper(closure) = ENC_PTR(index);
+   return ENC_PTR(closure);
+ })
+ 
+ void * __attribute__ ((visibility ("default")))
+ ffi_closure_alloc(size_t size, void **code) {
+   return ffi_closure_alloc_js(size, code);
+ }
+ 
+ EM_JS_MACROS(void, ffi_closure_free_js, (void *closure), {
+   closure = DEC_PTR(closure);
+   var index = DEC_PTR(CLOSURE__wrapper(closure));
+   freeTableIndexes.push(index);
+   _free(closure);
+ })
+ 
+ void __attribute__ ((visibility ("default")))
+ ffi_closure_free(void *closure) {
+   return ffi_closure_free_js(closure);
+ }
+ 
+ EM_JS_MACROS(
+ ffi_status,
+ ffi_prep_closure_loc_js,
+ (ffi_closure *closure, ffi_cif *cif, void *fun, void *user_data, void *codeloc),
+ {
+   closure = DEC_PTR(closure);
+   cif = DEC_PTR(cif);
+   fun = DEC_PTR(fun);
+   user_data = DEC_PTR(user_data);
+   codeloc = DEC_PTR(codeloc);
+   var abi = CIF__ABI(cif);
+   var nargs = CIF__NARGS(cif);
+   var nfixedargs = CIF__NFIXEDARGS(cif);
+   var arg_types_ptr = DEC_PTR(CIF__ARGTYPES(cif));
+   var rtype_unboxed = unbox_small_structs(CIF__RTYPE(cif));
+   var rtype_ptr = rtype_unboxed[0];
+   var rtype_id = rtype_unboxed[1];
+ 
+   // First construct the signature of the javascript trampoline we are going to create.
+   // Important: this is the signature for calling us, the onward call always has sig viiii.
+   var sig;
+   var ret_by_arg = false;
+   switch (rtype_id) {
+   case FFI_TYPE_VOID:
+     sig = 'v';
+     break;
+   case FFI_TYPE_STRUCT:
+   case FFI_TYPE_LONGDOUBLE:
+     // Return via a first pointer argument.
+     sig = 'v' + PTR_SIG;
+     ret_by_arg = true;
+     break;
+   case FFI_TYPE_INT:
+   case FFI_TYPE_UINT8:
+   case FFI_TYPE_SINT8:
+   case FFI_TYPE_UINT16:
+   case FFI_TYPE_SINT16:
+   case FFI_TYPE_UINT32:
+   case FFI_TYPE_SINT32:
+     sig = 'i';
+     break;
+   case FFI_TYPE_FLOAT:
+     sig = 'f';
+     break;
+   case FFI_TYPE_DOUBLE:
+     sig = 'd';
+     break;
+   case FFI_TYPE_UINT64:
+   case FFI_TYPE_SINT64:
+     sig = 'j';
+     break;
+   case FFI_TYPE_POINTER:
+     sig = PTR_SIG;
+     break;
+   case FFI_TYPE_COMPLEX:
+     throw new Error('complex ret marshalling nyi');
+   default:
+     throw new Error('Unexpected rtype ' + rtype_id);
+   }
+   var unboxed_arg_type_id_list = [];
+   var unboxed_arg_type_info_list = [];
+   for (var i = 0; i < nargs; i++) {
+     var arg_unboxed = unbox_small_structs(DEREF_PTR(arg_types_ptr, i));
+     var arg_type_ptr = arg_unboxed[0];
+     var arg_type_id = arg_unboxed[1];
+     unboxed_arg_type_id_list.push(arg_type_id);
+     unboxed_arg_type_info_list.push([DEC_PTR(FFI_TYPE__SIZE(arg_type_ptr)), FFI_TYPE__ALIGN(arg_type_ptr)]);
+   }
+   for (var i = 0; i < nfixedargs; i++) {
+     switch (unboxed_arg_type_id_list[i]) {
+     case FFI_TYPE_INT:
+     case FFI_TYPE_UINT8:
+     case FFI_TYPE_SINT8:
+     case FFI_TYPE_UINT16:
+     case FFI_TYPE_SINT16:
+     case FFI_TYPE_UINT32:
+     case FFI_TYPE_SINT32:
+       sig += 'i';
+       break;
+     case FFI_TYPE_FLOAT:
+       sig += 'f';
+       break;
+     case FFI_TYPE_DOUBLE:
+       sig += 'd';
+       break;
+     case FFI_TYPE_LONGDOUBLE:
+       sig += 'jj';
+       break;
+     case FFI_TYPE_UINT64:
+     case FFI_TYPE_SINT64:
+       sig += 'j';
+       break;
+     case FFI_TYPE_STRUCT:
+     case FFI_TYPE_POINTER:
+       sig += PTR_SIG;
+       break;
+     case FFI_TYPE_COMPLEX:
+       throw new Error('complex marshalling nyi');
+     default:
+       throw new Error('Unexpected argtype ' + arg_type_id);
+     }
+   }
+   if (nfixedargs < nargs) {
+     // extra pointer to varargs stack
+     sig += PTR_SIG;
+   }
+   LOG_DEBUG("CREATE_CLOSURE", "sig:", sig);
+   function trampoline() {
+     var args = Array.prototype.slice.call(arguments);
+     var size = 0;
+     var orig_stack_ptr = stackSave();
+     var cur_ptr = orig_stack_ptr;
+     var ret_ptr;
+     var jsarg_idx = 0;
+     // Should we return by argument or not? The onwards call returns by argument
+     // no matter what. (Warning: ret_by_arg means the opposite in ffi_call)
+     if (ret_by_arg) {
+       ret_ptr = args[jsarg_idx++];
+     } else {
+       // We might return 4 bytes or 8 bytes, allocate 8 just in case.
+       STACK_ALLOC(cur_ptr, 8, 8);
+       ret_ptr = cur_ptr;
+     }
+     cur_ptr -= __SIZEOF_POINTER__ * nargs;
+     var args_ptr = cur_ptr;
+     var carg_idx = 0;
+     // Here we either have the actual argument, or a pair of BigInts for long
+     // double, or a pointer to struct. We have to store into args_ptr[i] a
+     // pointer to the ith argument. If the argument is a struct, just store the
+     // pointer. Otherwise allocate stack space and copy the js argument onto the
+     // stack.
+     for (; carg_idx < nfixedargs; carg_idx++) {
+       // jsarg_idx might start out as 0 or 1 depending on ret_by_arg
+       // it advances an extra time for long double
+       var cur_arg = args[jsarg_idx++];
+       var arg_type_info = unboxed_arg_type_info_list[carg_idx];
+       var arg_size = arg_type_info[0];
+       var arg_align = arg_type_info[1];
+       var arg_type_id = unboxed_arg_type_id_list[carg_idx];
+       switch (arg_type_id) {
+       case FFI_TYPE_UINT8:
+       case FFI_TYPE_SINT8:
+         // Bad things happen if we don't align to 4 here
+         STACK_ALLOC(cur_ptr, 1, 4);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_U8(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_UINT16:
+       case FFI_TYPE_SINT16:
+         // Bad things happen if we don't align to 4 here
+         STACK_ALLOC(cur_ptr, 2, 4);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_U16(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_INT:
+       case FFI_TYPE_UINT32:
+       case FFI_TYPE_SINT32:
+         STACK_ALLOC(cur_ptr, 4, 4);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_U32(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_STRUCT:
+         // cur_arg is already a pointer to struct
+         // copy it onto stack to pass by value
+         STACK_ALLOC(cur_ptr, arg_size, arg_align);
+         HEAP8.subarray(cur_ptr, cur_ptr + arg_size).set(HEAP8.subarray(DEC_PTR(cur_arg), DEC_PTR(cur_arg) + arg_size));
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         break;
+       case FFI_TYPE_FLOAT:
+         STACK_ALLOC(cur_ptr, 4, 4);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_F32(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_DOUBLE:
+         STACK_ALLOC(cur_ptr, 8, 8);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_F64(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_UINT64:
+       case FFI_TYPE_SINT64:
+         STACK_ALLOC(cur_ptr, 8, 8);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_U64(cur_ptr, 0) = cur_arg;
+         break;
+       case FFI_TYPE_LONGDOUBLE:
+         STACK_ALLOC(cur_ptr, 16, 8);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_U64(cur_ptr, 0) = cur_arg;
+         cur_arg = args[jsarg_idx++];
+         DEREF_U64(cur_ptr, 1) = cur_arg;
+         break;
+       case FFI_TYPE_POINTER:
+         STACK_ALLOC(cur_ptr, __SIZEOF_POINTER__, __SIZEOF_POINTER__);
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+         DEREF_PTR(cur_ptr, 0) = cur_arg;
+         break;
+       }
+     }
+     // If its a varargs call, last js argument is a pointer to the varargs.
+     var varargs = DEC_PTR(args[args.length - 1]);
+     // We have no way of knowing how many varargs were actually provided, this
+     // fills the rest of the stack space allocated with nonsense. The onward
+     // call will know to ignore the nonsense.
+ 
+     // We either have a pointer to the argument if the argument is not a struct
+     // or a pointer to pointer to struct. We need to store a pointer to the
+     // argument into args_ptr[i]
+     for (; carg_idx < nargs; carg_idx++) {
+       var arg_type_id = unboxed_arg_type_id_list[carg_idx];
+       var arg_type_info = unboxed_arg_type_info_list[carg_idx];
+       var arg_size = arg_type_info[0];
+       var arg_align = arg_type_info[1];
+       if (arg_type_id === FFI_TYPE_STRUCT) {
+         // In this case varargs is a pointer to pointer to struct so we need to
+         // deref once
+         var struct_ptr = DEREF_PTR_NUMBER(varargs, 0);
+         STACK_ALLOC(cur_ptr, arg_size, arg_align);
+         HEAP8.subarray(cur_ptr, cur_ptr + arg_size).set(HEAP8.subarray(struct_ptr, struct_ptr + arg_size));
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(cur_ptr);
+       } else {
+         DEREF_PTR(args_ptr, carg_idx) = ENC_PTR(varargs);
+       }
+       varargs += __SIZEOF_POINTER__;
+     }
+     stackRestore(cur_ptr);
+     stackAlloc(0); // stackAlloc enforces alignment invariants on the stack pointer
+     LOG_DEBUG("CALL_CLOSURE", "closure:", closure, "fptr", CLOSURE__fun(closure), "cif", CLOSURE__cif(closure));
+     getWasmTableEntry(CLOSURE__fun(closure))(
+         CLOSURE__cif(closure), ENC_PTR(ret_ptr), ENC_PTR(args_ptr),
+         CLOSURE__user_data(closure)
+     );
+     stackRestore(orig_stack_ptr);
+ 
+     // If we aren't supposed to return by argument, figure out what to return.
+     if (!ret_by_arg) {
+       switch (sig[0]) {
+       case 'i':
+         return DEREF_U32(ret_ptr, 0);
+       case 'j':
+         return DEREF_U64(ret_ptr, 0);
+       case 'd':
+         return DEREF_F64(ret_ptr, 0);
+       case 'f':
+         return DEREF_F32(ret_ptr, 0);
+       }
+     }
+   }
+   try {
+     var wasm_trampoline = convertJsFunctionToWasm(trampoline, sig);
+   } catch(e) {
+     return FFI_BAD_TYPEDEF_MACRO;
+   }
+   setWasmTableEntry(codeloc, wasm_trampoline);
+   CLOSURE__cif(closure) = ENC_PTR(cif);
+   CLOSURE__fun(closure) = ENC_PTR(fun);
+   CLOSURE__user_data(closure) = ENC_PTR(user_data);
+   return FFI_OK_MACRO;
+ })
+ 
+ // EM_JS does not correctly handle function pointer arguments, so we need a
+ // helper
+ ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif,
+                                 void (*fun)(ffi_cif *, void *, void **, void *),
+                                 void *user_data, void *codeloc) {
+   if (cif->abi != FFI_EMSCRIPTEN_ABI)
+     return FFI_BAD_ABI;
+   return ffi_prep_closure_loc_js(closure, cif, (void *)fun, user_data,
+                                      codeloc);
+ }
diff -Nrcpad gcc-17-20260517/libffi/src/wasm/ffitarget.h gcc-17-20260524/libffi/src/wasm/ffitarget.h
*** gcc-17-20260517/libffi/src/wasm/ffitarget.h	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/src/wasm/ffitarget.h	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,79 ----
+ /* -----------------------------------------------------------------*-C-*-
+    ffitarget.h - Copyright (c) 2018-2023  Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen, and others.
+ 
+    Target configuration macros for wasm32.
+ 
+    Permission is hereby granted, free of charge, to any person obtaining
+    a copy of this software and associated documentation files (the
+    ``Software''), to deal in the Software without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Software, and to
+    permit persons to whom the Software is furnished to do so, subject to
+    the following conditions:
+ 
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Software.
+ 
+    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+    DEALINGS IN THE SOFTWARE.
+ 
+    ----------------------------------------------------------------------- */
+ 
+ #ifndef LIBFFI_TARGET_H
+ #define LIBFFI_TARGET_H
+ 
+ #ifndef LIBFFI_H
+ #error "Please do not include ffitarget.h directly into your source.  Use ffi.h instead."
+ #endif
+ 
+ /* ---- Generic type definitions ----------------------------------------- */
+ 
+ typedef unsigned long ffi_arg;
+ typedef signed long ffi_sarg;
+ 
+ // TODO: https://github.com/emscripten-core/emscripten/issues/9868
+ typedef void (*ffi_fp)(void);
+ 
+ typedef enum ffi_abi {
+   FFI_FIRST_ABI = 0,
+ #if __SIZEOF_POINTER__ == 4
+   FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
+   FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
+ #elif __SIZEOF_POINTER__ == 8
+   FFI_WASM64,
+   FFI_WASM64_EMSCRIPTEN,
+ #else
+ #error "Unknown pointer size"
+ #endif
+   FFI_LAST_ABI,
+ #if __SIZEOF_POINTER__ == 4
+ #ifdef __EMSCRIPTEN__
+   FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
+ #else
+   FFI_DEFAULT_ABI = FFI_WASM32
+ #endif
+ #elif __SIZEOF_POINTER__ == 8
+ #ifdef __EMSCRIPTEN__
+   FFI_DEFAULT_ABI = FFI_WASM64_EMSCRIPTEN
+ #else
+   FFI_DEFAULT_ABI = FFI_WASM64
+ #endif
+ #else
+ #error "Unknown pointer size"
+ #endif
+ } ffi_abi;
+ 
+ #define FFI_CLOSURES 1
+ // #define FFI_GO_CLOSURES 0
+ #define FFI_TRAMPOLINE_SIZE 4
+ // #define FFI_NATIVE_RAW_API 0
+ #define FFI_TARGET_SPECIFIC_VARIADIC 1
+ #define FFI_EXTRA_CIF_FIELDS  unsigned int nfixedargs
+ 
+ #endif
diff -Nrcpad gcc-17-20260517/libffi/src/x86/ffi.c gcc-17-20260524/libffi/src/x86/ffi.c
*** gcc-17-20260517/libffi/src/x86/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/ffi.c	Sun May 24 22:32:13 2026
***************
*** 1,5 ****
  /* -----------------------------------------------------------------------
!    ffi.c - Copyright (c) 2017  Anthony Green
             Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008  Red Hat, Inc.
             Copyright (c) 2002  Ranjit Mathew
             Copyright (c) 2002  Bo Thorsen
--- 1,5 ----
  /* -----------------------------------------------------------------------
!    ffi.c - Copyright (c) 2017, 2022  Anthony Green
             Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008  Red Hat, Inc.
             Copyright (c) 2002  Ranjit Mathew
             Copyright (c) 2002  Bo Thorsen
*************** ffi_prep_cif_machdep(ffi_cif *cif)
*** 117,151 ****
        flags = X86_RET_INT64;
        break;
      case FFI_TYPE_STRUCT:
! #ifndef X86
!       /* ??? This should be a different ABI rather than an ifdef.  */
!       if (cif->rtype->size == 1)
! 	flags = X86_RET_STRUCT_1B;
!       else if (cif->rtype->size == 2)
! 	flags = X86_RET_STRUCT_2B;
!       else if (cif->rtype->size == 4)
! 	flags = X86_RET_INT32;
!       else if (cif->rtype->size == 8)
! 	flags = X86_RET_INT64;
!       else
  #endif
! 	{
! 	do_struct:
! 	  switch (cabi)
! 	    {
! 	    case FFI_THISCALL:
! 	    case FFI_FASTCALL:
! 	    case FFI_STDCALL:
! 	    case FFI_MS_CDECL:
! 	      flags = X86_RET_STRUCTARG;
! 	      break;
! 	    default:
! 	      flags = X86_RET_STRUCTPOP;
! 	      break;
! 	    }
! 	  /* Allocate space for return value pointer.  */
! 	  bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
! 	}
        break;
      case FFI_TYPE_COMPLEX:
        switch (cif->rtype->elements[0]->type)
--- 117,153 ----
        flags = X86_RET_INT64;
        break;
      case FFI_TYPE_STRUCT:
!       {
! #if defined(X86_WIN32) || defined(X86_DARWIN)
!         size_t size = cif->rtype->size;
!         if (size == 1)
!           flags = X86_RET_STRUCT_1B;
!         else if (size == 2)
!           flags = X86_RET_STRUCT_2B;
!         else if (size == 4)
!           flags = X86_RET_INT32;
!         else if (size == 8)
!           flags = X86_RET_INT64;
!         else
  #endif
!           {
!           do_struct:
!             switch (cabi)
!               {
!               case FFI_THISCALL:
!               case FFI_FASTCALL:
!               case FFI_STDCALL:
!               case FFI_MS_CDECL:
!                 flags = X86_RET_STRUCTARG;
!                 break;
!               default:
!                 flags = X86_RET_STRUCTPOP;
!                 break;
!               }
!             /* Allocate space for return value pointer.  */
!             bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG);
!           }
!       }
        break;
      case FFI_TYPE_COMPLEX:
        switch (cif->rtype->elements[0]->type)
*************** ffi_prep_cif_machdep(ffi_cif *cif)
*** 182,188 ****
      {
        ffi_type *t = cif->arg_types[i];
  
!       bytes = FFI_ALIGN (bytes, t->alignment);
        bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
      }
    cif->bytes = bytes;
--- 184,195 ----
      {
        ffi_type *t = cif->arg_types[i];
  
! #if defined(X86_WIN32)
!       if (cabi == FFI_STDCALL)
!         bytes = FFI_ALIGN (bytes, FFI_SIZEOF_ARG);
!       else
! #endif
!         bytes = FFI_ALIGN (bytes, t->alignment);
        bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG);
      }
    cif->bytes = bytes;
*************** extern void FFI_DECLARE_FASTCALL ffi_cal
*** 263,268 ****
--- 270,278 ----
  #if defined(_MSC_VER)
  #pragma runtime_checks("s", off)
  #endif
+ /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
+    _as its own stack_ - so we need to compile this function without ASAN */
+ FFI_ASAN_NO_SANITIZE
  static void
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
  	      void **avalue, void *closure)
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 378,384 ****
  	     cases.  */
  	  if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
  	    align = 16;
! 	    
  	  if (dir < 0)
  	    {
  	      /* ??? These reverse argument ABIs are probably too old
--- 388,394 ----
  	     cases.  */
  	  if (t == FFI_TYPE_STRUCT && ty->alignment >= 16)
  	    align = 16;
! 
  	  if (dir < 0)
  	    {
  	      /* ??? These reverse argument ABIs are probably too old
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 609,615 ****
--- 619,627 ----
    tramp[9] = 0xe9;
    *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14);
  
+ #if defined(FFI_EXEC_STATIC_TRAMP)
  out:
+ #endif
    closure->cif = cif;
    closure->fun = fun;
    closure->user_data = user_data;
diff -Nrcpad gcc-17-20260517/libffi/src/x86/ffi64.c gcc-17-20260524/libffi/src/x86/ffi64.c
*** gcc-17-20260517/libffi/src/x86/ffi64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/ffi64.c	Sun May 24 22:32:13 2026
***************
*** 1,5 ****
  /* -----------------------------------------------------------------------
!    ffi64.c - Copyright (c) 2011, 2018  Anthony Green
               Copyright (c) 2013  The Written Word, Inc.
               Copyright (c) 2008, 2010  Red Hat, Inc.
               Copyright (c) 2002, 2007  Bo Thorsen <bo@suse.de>
--- 1,5 ----
  /* -----------------------------------------------------------------------
!    ffi64.c - Copyright (c) 2011, 2018, 2022  Anthony Green
               Copyright (c) 2013  The Written Word, Inc.
               Copyright (c) 2008, 2010  Red Hat, Inc.
               Copyright (c) 2002, 2007  Bo Thorsen <bo@suse.de>
*************** ffi_prep_cif_machdep (ffi_cif *cif)
*** 557,562 ****
--- 557,565 ----
    return FFI_OK;
  }
  
+ /* n.b. ffi_call_unix64 will steal the alloca'd `stack` variable here for use
+    _as its own stack_ - so we need to compile this function without ASAN */
+ FFI_ASAN_NO_SANITIZE
  static void
  ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
  	      void **avalue, void *closure)
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 581,586 ****
--- 584,592 ----
  	flags = UNIX64_RET_VOID;
      }
  
+   arg_types = cif->arg_types;
+   avn = cif->nargs;
+ 
    /* Allocate the space for the arguments, plus 4 words of temp space.  */
    stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8);
    reg_args = (struct register_args *) stack;
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 595,603 ****
    if (flags & UNIX64_FLAG_RET_IN_MEM)
      reg_args->gpr[gprcount++] = (unsigned long) rvalue;
  
-   avn = cif->nargs;
-   arg_types = cif->arg_types;
- 
    for (i = 0; i < avn; ++i)
      {
        size_t n, size = arg_types[i]->size;
--- 601,606 ----
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 613,623 ****
  	  if (align < 8)
  	    align = 8;
  
! 	  /* Pass this argument in memory.  */
! 	  argp = (void *) FFI_ALIGN (argp, align);
! 	  memcpy (argp, avalue[i], size);
! 	  argp += size;
! 	}
        else
  	{
  	  /* The argument is passed entirely in registers.  */
--- 616,627 ----
  	  if (align < 8)
  	    align = 8;
  
!           /* Pass this argument in memory.  */
!           argp = (void *) FFI_ALIGN (argp, align);
!           memcpy (argp, avalue[i], size);
! 
!           argp += size;
!         }
        else
  	{
  	  /* The argument is passed entirely in registers.  */
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 650,656 ****
  		      break;
  		    default:
  		      reg_args->gpr[gprcount] = 0;
! 		      memcpy (&reg_args->gpr[gprcount], a, size);
  		    }
  		  gprcount++;
  		  break;
--- 654,660 ----
  		      break;
  		    default:
  		      reg_args->gpr[gprcount] = 0;
! 		      memcpy (&reg_args->gpr[gprcount], a, size <= 8 ? size : 8);
  		    }
  		  gprcount++;
  		  break;
*************** ffi_call_efi64(ffi_cif *cif, void (*fn)(
*** 681,686 ****
--- 685,708 ----
  void
  ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
  {
+   ffi_type **arg_types = cif->arg_types;
+   int i, nargs = cif->nargs;
+   const int max_reg_struct_size = cif->abi == FFI_GNUW64 ? 8 : 16;
+ 
+   /* If we have any large structure arguments, make a copy so we are passing
+      by value.  */
+   for (i = 0; i < nargs; i++)
+     {
+       ffi_type *at = arg_types[i];
+       int size = at->size;
+       if (at->type == FFI_TYPE_STRUCT && size > max_reg_struct_size)
+         {
+           char *argcopy = alloca (size);
+           memcpy (argcopy, avalue[i], size);
+           avalue[i] = argcopy;
+         }
+     }
+ 
  #ifndef __ILP32__
    if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64)
      {
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 780,786 ****
--- 802,810 ----
    memcpy (tramp, trampoline, sizeof(trampoline));
    *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest;
  
+ #if defined(FFI_EXEC_STATIC_TRAMP)
  out:
+ #endif
    closure->cif = cif;
    closure->fun = fun;
    closure->user_data = user_data;
diff -Nrcpad gcc-17-20260517/libffi/src/x86/ffitarget.h gcc-17-20260524/libffi/src/x86/ffitarget.h
*** gcc-17-20260517/libffi/src/x86/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/ffitarget.h	Sun May 24 22:32:13 2026
*************** typedef enum ffi_abi {
*** 85,93 ****
    FFI_LAST_ABI,
  #ifdef __GNUC__
    FFI_DEFAULT_ABI = FFI_GNUW64
! #else  
    FFI_DEFAULT_ABI = FFI_WIN64
! #endif  
  
  #elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
    FFI_FIRST_ABI = 1,
--- 85,93 ----
    FFI_LAST_ABI,
  #ifdef __GNUC__
    FFI_DEFAULT_ABI = FFI_GNUW64
! #else
    FFI_DEFAULT_ABI = FFI_WIN64
! #endif
  
  #elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
    FFI_FIRST_ABI = 1,
*************** typedef enum ffi_abi {
*** 159,162 ****
  #endif
  
  #endif
- 
--- 159,161 ----
diff -Nrcpad gcc-17-20260517/libffi/src/x86/ffiw64.c gcc-17-20260524/libffi/src/x86/ffiw64.c
*** gcc-17-20260517/libffi/src/x86/ffiw64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/ffiw64.c	Sun May 24 22:32:13 2026
*************** ffi_call_int (ffi_cif *cif, void (*fn)(v
*** 123,131 ****
--- 123,147 ----
    UINT64 *stack;
    size_t rsize;
    struct win64_call_frame *frame;
+   ffi_type **arg_types = cif->arg_types;
+   int nargs = cif->nargs;
  
    FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64);
  
+   /* If we have any large structure arguments, make a copy so we are passing
+      by value.  */
+   for (i = 0; i < nargs; i++)
+     {
+       ffi_type *at = arg_types[i];
+       int size = at->size;
+       if (at->type == FFI_TYPE_STRUCT && size > 8)
+         {
+           char *argcopy = alloca (size);
+           memcpy (argcopy, avalue[i], size);
+           avalue[i] = argcopy;
+         }
+     }
+ 
    flags = cif->flags;
    rsize = 0;
  
*************** EFI64(ffi_prep_closure_loc)(ffi_closure*
*** 211,217 ****
  		      ffi_cif* cif,
  		      void (*fun)(ffi_cif*, void*, void**, void*),
  		      void *user_data,
! 		      void *codeloc)
  {
    static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = {
      /* endbr64 */
--- 227,233 ----
  		      ffi_cif* cif,
  		      void (*fun)(ffi_cif*, void*, void**, void*),
  		      void *user_data,
! 		      void *codeloc MAYBE_UNUSED)
  {
    static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = {
      /* endbr64 */
*************** EFI64(ffi_prep_closure_loc)(ffi_closure*
*** 247,253 ****
--- 263,271 ----
    memcpy (tramp, trampoline, sizeof(trampoline));
    *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64;
  
+ #if defined(FFI_EXEC_STATIC_TRAMP)
  out:
+ #endif
    closure->cif = cif;
    closure->fun = fun;
    closure->user_data = user_data;
diff -Nrcpad gcc-17-20260517/libffi/src/x86/sysv_intel.S gcc-17-20260524/libffi/src/x86/sysv_intel.S
*** gcc-17-20260517/libffi/src/x86/sysv_intel.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/sysv_intel.S	Sun May 24 22:32:13 2026
***************
*** 1,9 ****
  /* -----------------------------------------------------------------------
!    sysv.S - Copyright (c) 2017  Anthony Green
            - Copyright (c) 2013  The Written Word, Inc.
            - Copyright (c) 1996,1998,2001-2003,2005,2008,2010  Red Hat, Inc.
!    
!    X86 Foreign Function Interface 
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
--- 1,9 ----
  /* -----------------------------------------------------------------------
!    sysv.S - Copyright (c) 2017, 2022  Anthony Green
            - Copyright (c) 2013  The Written Word, Inc.
            - Copyright (c) 1996,1998,2001-2003,2005,2008,2010  Red Hat, Inc.
! 
!    X86 Foreign Function Interface
  
     Permission is hereby granted, free of charge, to any person obtaining
     a copy of this software and associated documentation files (the
***************
*** 29,39 ****
  #ifndef __x86_64__
  #ifdef _MSC_VER
  
! #define LIBFFI_ASM	
  #include <fficonfig.h>
  #include <ffi.h>
  #include <ffi_cfi.h>
! #include "internal.h" 
  
  #define C2(X, Y)  X ## Y
  #define C1(X, Y)  C2(X, Y)
--- 29,39 ----
  #ifndef __x86_64__
  #ifdef _MSC_VER
  
! #define LIBFFI_ASM
  #include <fficonfig.h>
  #include <ffi.h>
  #include <ffi_cfi.h>
! #include "internal.h"
  
  #define C2(X, Y)  X ## Y
  #define C1(X, Y)  C2(X, Y)
*************** L(UW0):
*** 89,96 ****
  	   perspective of the unwind info, it hasn't moved.  */
  	mov 	ebp, ecx
  L(UW1):
! 	// cfi_def_cfa(%ebp, 8)
! 	// cfi_rel_offset(%ebp, 0)
  
  	mov 	esp, edx		/* set outgoing argument stack */
  	mov 	eax, [20+R_EAX*4+ebp]	/* set register arguments */
--- 89,96 ----
  	   perspective of the unwind info, it hasn't moved.  */
  	mov 	ebp, ecx
  L(UW1):
! 	/* cfi_def_cfa(%ebp, 8) */
! 	/* cfi_rel_offset(%ebp, 0) */
  
  	mov 	esp, edx		/* set outgoing argument stack */
  	mov 	eax, [20+R_EAX*4+ebp]	/* set register arguments */
*************** L(UW1):
*** 102,108 ****
  	mov	    ecx, [12+ebp]		/* load return type code */
  	mov 	[ebp+8], ebx		/* preserve %ebx */
  L(UW2):
! 	// cfi_rel_offset(%ebx, 8)
  
  	and 	ecx, X86_RET_TYPE_MASK
  	lea 	ebx, [L(store_table) + ecx * 8]
--- 102,108 ----
  	mov	    ecx, [12+ebp]		/* load return type code */
  	mov 	[ebp+8], ebx		/* preserve %ebx */
  L(UW2):
! 	/* cfi_rel_offset(%ebx, 8) */
  
  	and 	ecx, X86_RET_TYPE_MASK
  	lea 	ebx, [L(store_table) + ecx * 8]
*************** L(e1):
*** 148,160 ****
  	mov	    esp, ebp
  	pop 	ebp
  L(UW3):
! 	// cfi_remember_state
! 	// cfi_def_cfa(%esp, 4)
! 	// cfi_restore(%ebx)
! 	// cfi_restore(%ebp)
  	ret
  L(UW4):
! 	// cfi_restore_state
  
  E(L(store_table), X86_RET_STRUCTPOP)
  	jmp	    L(e1)
--- 148,160 ----
  	mov	    esp, ebp
  	pop 	ebp
  L(UW3):
! 	/* cfi_remember_state */
! 	/* cfi_def_cfa(%esp, 4) */
! 	/* cfi_restore(%ebx) */
! 	/* cfi_restore(%ebp) */
  	ret
  L(UW4):
! 	/* cfi_restore_state */
  
  E(L(store_table), X86_RET_STRUCTPOP)
  	jmp	    L(e1)
*************** E(L(store_table), X86_RET_UNUSED15)
*** 174,180 ****
  	int 3
  
  L(UW5):
! 	// cfi_endproc
  ENDF(@ffi_call_i386@8)
  
  /* The inner helper is declared as
--- 174,180 ----
  	int 3
  
  L(UW5):
! 	/* cfi_endproc */
  ENDF(@ffi_call_i386@8)
  
  /* The inner helper is declared as
*************** ALIGN 16
*** 242,251 ****
  PUBLIC ffi_go_closure_EAX
  ffi_go_closure_EAX PROC C
  L(UW6):
! 	// cfi_startproc
  	sub	esp, closure_FS
  L(UW7):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  	FFI_CLOSURE_SAVE_REGS
  	mov     edx, [eax+4]			/* copy cif */
  	mov 	ecx, [eax +8]			/* copy fun */
--- 242,251 ----
  PUBLIC ffi_go_closure_EAX
  ffi_go_closure_EAX PROC C
  L(UW6):
! 	/* cfi_startproc */
  	sub	esp, closure_FS
  L(UW7):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  	FFI_CLOSURE_SAVE_REGS
  	mov     edx, [eax+4]			/* copy cif */
  	mov 	ecx, [eax +8]			/* copy fun */
*************** L(UW7):
*** 254,270 ****
  	mov 	[esp+closure_CF+36], eax	/* closure is user_data */
  	jmp	L(do_closure_i386)
  L(UW8):
! 	// cfi_endproc
  ENDF(ffi_go_closure_EAX)
  
  ALIGN 16
  PUBLIC ffi_go_closure_ECX
  ffi_go_closure_ECX PROC C
  L(UW9):
! 	// cfi_startproc
  	sub 	esp, closure_FS
  L(UW10):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  	FFI_CLOSURE_SAVE_REGS
  	mov 	edx, [ecx+4]			/* copy cif */
  	mov 	eax, [ecx+8]			/* copy fun */
--- 254,270 ----
  	mov 	[esp+closure_CF+36], eax	/* closure is user_data */
  	jmp	L(do_closure_i386)
  L(UW8):
! 	/* cfi_endproc */
  ENDF(ffi_go_closure_EAX)
  
  ALIGN 16
  PUBLIC ffi_go_closure_ECX
  ffi_go_closure_ECX PROC C
  L(UW9):
! 	/* cfi_startproc */
  	sub 	esp, closure_FS
  L(UW10):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  	FFI_CLOSURE_SAVE_REGS
  	mov 	edx, [ecx+4]			/* copy cif */
  	mov 	eax, [ecx+8]			/* copy fun */
*************** L(UW10):
*** 273,279 ****
  	mov 	[esp+closure_CF+36], ecx	/* closure is user_data */
  	jmp	L(do_closure_i386)
  L(UW11):
! 	// cfi_endproc
  ENDF(ffi_go_closure_ECX)
  
  /* The closure entry points are reached from the ffi_closure trampoline.
--- 273,279 ----
  	mov 	[esp+closure_CF+36], ecx	/* closure is user_data */
  	jmp	L(do_closure_i386)
  L(UW11):
! 	/* cfi_endproc */
  ENDF(ffi_go_closure_ECX)
  
  /* The closure entry points are reached from the ffi_closure trampoline.
*************** ALIGN 16
*** 283,292 ****
  PUBLIC ffi_closure_i386
  ffi_closure_i386 PROC C
  L(UW12):
! 	// cfi_startproc
  	sub	    esp, closure_FS
  L(UW13):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  
  	FFI_CLOSURE_SAVE_REGS
  	FFI_CLOSURE_COPY_TRAMP_DATA
--- 283,292 ----
  PUBLIC ffi_closure_i386
  ffi_closure_i386 PROC C
  L(UW12):
! 	/* cfi_startproc */
  	sub	    esp, closure_FS
  L(UW13):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  
  	FFI_CLOSURE_SAVE_REGS
  	FFI_CLOSURE_COPY_TRAMP_DATA
*************** E(L(load_table2), X86_RET_VOID)
*** 331,347 ****
  L(e2):
  	add 	esp, closure_FS
  L(UW16):
! 	// cfi_adjust_cfa_offset(-closure_FS)
  	ret
  L(UW17):
! 	// cfi_adjust_cfa_offset(closure_FS)
  E(L(load_table2), X86_RET_STRUCTPOP)
  	add 	esp, closure_FS
  L(UW18):
! 	// cfi_adjust_cfa_offset(-closure_FS)
  	ret	4
  L(UW19):
! 	// cfi_adjust_cfa_offset(closure_FS)
  E(L(load_table2), X86_RET_STRUCTARG)
  	jmp	L(e2)
  E(L(load_table2), X86_RET_STRUCT_1B)
--- 331,347 ----
  L(e2):
  	add 	esp, closure_FS
  L(UW16):
! 	/* cfi_adjust_cfa_offset(-closure_FS) */
  	ret
  L(UW17):
! 	/* cfi_adjust_cfa_offset(closure_FS) */
  E(L(load_table2), X86_RET_STRUCTPOP)
  	add 	esp, closure_FS
  L(UW18):
! 	/* cfi_adjust_cfa_offset(-closure_FS) */
  	ret	4
  L(UW19):
! 	/* cfi_adjust_cfa_offset(closure_FS) */
  E(L(load_table2), X86_RET_STRUCTARG)
  	jmp	L(e2)
  E(L(load_table2), X86_RET_STRUCT_1B)
*************** E(L(load_table2), X86_RET_UNUSED15)
*** 358,374 ****
  	int 3
  
  L(UW20):
! 	// cfi_endproc
  ENDF(ffi_closure_i386)
  
  ALIGN 16
  PUBLIC	ffi_go_closure_STDCALL
  ffi_go_closure_STDCALL PROC C
  L(UW21):
! 	// cfi_startproc
  	sub 	esp, closure_FS
  L(UW22):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  	FFI_CLOSURE_SAVE_REGS
  	mov 	edx, [ecx+4]			/* copy cif */
  	mov 	eax, [ecx+8]			/* copy fun */
--- 358,374 ----
  	int 3
  
  L(UW20):
! 	/* cfi_endproc */
  ENDF(ffi_closure_i386)
  
  ALIGN 16
  PUBLIC	ffi_go_closure_STDCALL
  ffi_go_closure_STDCALL PROC C
  L(UW21):
! 	/* cfi_startproc */
  	sub 	esp, closure_FS
  L(UW22):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  	FFI_CLOSURE_SAVE_REGS
  	mov 	edx, [ecx+4]			/* copy cif */
  	mov 	eax, [ecx+8]			/* copy fun */
*************** L(UW22):
*** 377,383 ****
  	mov 	[esp+closure_CF+36], ecx	/* closure is user_data */
  	jmp	L(do_closure_STDCALL)
  L(UW23):
! 	// cfi_endproc
  ENDF(ffi_go_closure_STDCALL)
  
  /* For REGISTER, we have no available parameter registers, and so we
--- 377,383 ----
  	mov 	[esp+closure_CF+36], ecx	/* closure is user_data */
  	jmp	L(do_closure_STDCALL)
  L(UW23):
! 	/* cfi_endproc */
  ENDF(ffi_go_closure_STDCALL)
  
  /* For REGISTER, we have no available parameter registers, and so we
*************** ALIGN 16
*** 387,405 ****
  PUBLIC ffi_closure_REGISTER
  ffi_closure_REGISTER PROC C
  L(UW24):
! 	// cfi_startproc
! 	// cfi_def_cfa(%esp, 8)
! 	// cfi_offset(%eip, -8)
  	sub 	esp, closure_FS-4
  L(UW25):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  	FFI_CLOSURE_SAVE_REGS
  	mov	ecx, [esp+closure_FS-4] 	/* load retaddr */
  	mov	eax, [esp+closure_FS]		/* load closure */
  	mov	[esp+closure_FS], ecx		/* move retaddr */
  	jmp	L(do_closure_REGISTER)
  L(UW26):
! 	// cfi_endproc
  ENDF(ffi_closure_REGISTER)
  
  /* For STDCALL (and others), we need to pop N bytes of arguments off
--- 387,405 ----
  PUBLIC ffi_closure_REGISTER
  ffi_closure_REGISTER PROC C
  L(UW24):
! 	/* cfi_startproc */
! 	/* cfi_def_cfa(%esp, 8) */
! 	/* cfi_offset(%eip, -8) */
  	sub 	esp, closure_FS-4
  L(UW25):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  	FFI_CLOSURE_SAVE_REGS
  	mov	ecx, [esp+closure_FS-4] 	/* load retaddr */
  	mov	eax, [esp+closure_FS]		/* load closure */
  	mov	[esp+closure_FS], ecx		/* move retaddr */
  	jmp	L(do_closure_REGISTER)
  L(UW26):
! 	/* cfi_endproc */
  ENDF(ffi_closure_REGISTER)
  
  /* For STDCALL (and others), we need to pop N bytes of arguments off
*************** ALIGN 16
*** 410,419 ****
  PUBLIC ffi_closure_STDCALL
  ffi_closure_STDCALL PROC C
  L(UW27):
! 	// cfi_startproc
  	sub 	esp, closure_FS
  L(UW28):
! 	// cfi_def_cfa_offset(closure_FS + 4)
  
  	FFI_CLOSURE_SAVE_REGS
  
--- 410,419 ----
  PUBLIC ffi_closure_STDCALL
  ffi_closure_STDCALL PROC C
  L(UW27):
! 	/* cfi_startproc */
  	sub 	esp, closure_FS
  L(UW28):
! 	/* cfi_def_cfa_offset(closure_FS + 4) */
  
  	FFI_CLOSURE_SAVE_REGS
  
*************** E(L(load_table3), X86_RET_UNUSED15)
*** 504,510 ****
  	int 3
  
  L(UW31):
! 	// cfi_endproc
  ENDF(ffi_closure_STDCALL)
  
  #if !FFI_NO_RAW_API
--- 504,510 ----
  	int 3
  
  L(UW31):
! 	/* cfi_endproc */
  ENDF(ffi_closure_STDCALL)
  
  #if !FFI_NO_RAW_API
*************** ALIGN 16
*** 515,527 ****
  PUBLIC ffi_closure_raw_SYSV
  ffi_closure_raw_SYSV PROC C
  L(UW32):
! 	// cfi_startproc
  	sub 	esp, raw_closure_S_FS
  L(UW33):
! 	// cfi_def_cfa_offset(raw_closure_S_FS + 4)
  	mov 	[esp+raw_closure_S_FS-4], ebx
  L(UW34):
! 	// cfi_rel_offset(%ebx, raw_closure_S_FS-4)
  
  	mov 	edx, [eax+FFI_TRAMPOLINE_SIZE+8]	/* load cl->user_data */
  	mov 	[esp+12], edx
--- 515,527 ----
  PUBLIC ffi_closure_raw_SYSV
  ffi_closure_raw_SYSV PROC C
  L(UW32):
! 	/* cfi_startproc */
  	sub 	esp, raw_closure_S_FS
  L(UW33):
! 	/* cfi_def_cfa_offset(raw_closure_S_FS + 4) */
  	mov 	[esp+raw_closure_S_FS-4], ebx
  L(UW34):
! 	/* cfi_rel_offset(%ebx, raw_closure_S_FS-4) */
  
  	mov 	edx, [eax+FFI_TRAMPOLINE_SIZE+8]	/* load cl->user_data */
  	mov 	[esp+12], edx
*************** L(UW34):
*** 535,550 ****
  
  	mov 	eax, [ebx+20]			/* load cif->flags */
  	and 	eax, X86_RET_TYPE_MASK
! // #ifdef __PIC__
! // 	call	__x86.get_pc_thunk.bx
! // L(pc4):
! // 	lea 	ecx, L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx
! // #else
  	lea 	ecx, [L(load_table4)+eax+8]
! // #endif
  	mov 	ebx, [esp+raw_closure_S_FS-4]
  L(UW35):
! 	// cfi_restore(%ebx)
  	mov 	eax, [esp+16]				/* Optimistic load */
  	jmp	    dword ptr [ecx]
  
--- 535,550 ----
  
  	mov 	eax, [ebx+20]			/* load cif->flags */
  	and 	eax, X86_RET_TYPE_MASK
! /* #ifdef __PIC__ */
! /* 	call	__x86.get_pc_thunk.bx */
! /* L(pc4): */
! /* 	lea 	ecx, L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx */
! /* #else */
  	lea 	ecx, [L(load_table4)+eax+8]
! /* #endif */
  	mov 	ebx, [esp+raw_closure_S_FS-4]
  L(UW35):
! 	/* cfi_restore(%ebx) */
  	mov 	eax, [esp+16]				/* Optimistic load */
  	jmp	    dword ptr [ecx]
  
*************** E(L(load_table4), X86_RET_VOID)
*** 581,597 ****
  L(e4):
  	add 	esp, raw_closure_S_FS
  L(UW36):
! 	// cfi_adjust_cfa_offset(-raw_closure_S_FS)
  	ret
  L(UW37):
! 	// cfi_adjust_cfa_offset(raw_closure_S_FS)
  E(L(load_table4), X86_RET_STRUCTPOP)
  	add 	esp, raw_closure_S_FS
  L(UW38):
! 	// cfi_adjust_cfa_offset(-raw_closure_S_FS)
  	ret	4
  L(UW39):
! 	// cfi_adjust_cfa_offset(raw_closure_S_FS)
  E(L(load_table4), X86_RET_STRUCTARG)
  	jmp	L(e4)
  E(L(load_table4), X86_RET_STRUCT_1B)
--- 581,597 ----
  L(e4):
  	add 	esp, raw_closure_S_FS
  L(UW36):
! 	/* cfi_adjust_cfa_offset(-raw_closure_S_FS) */
  	ret
  L(UW37):
! 	/* cfi_adjust_cfa_offset(raw_closure_S_FS) */
  E(L(load_table4), X86_RET_STRUCTPOP)
  	add 	esp, raw_closure_S_FS
  L(UW38):
! 	/* cfi_adjust_cfa_offset(-raw_closure_S_FS) */
  	ret	4
  L(UW39):
! 	/* cfi_adjust_cfa_offset(raw_closure_S_FS) */
  E(L(load_table4), X86_RET_STRUCTARG)
  	jmp	L(e4)
  E(L(load_table4), X86_RET_STRUCT_1B)
*************** E(L(load_table4), X86_RET_UNUSED15)
*** 608,614 ****
  	int 3
  
  L(UW40):
! 	// cfi_endproc
  ENDF(ffi_closure_raw_SYSV)
  
  #define raw_closure_T_FS	(16+16+8)
--- 608,614 ----
  	int 3
  
  L(UW40):
! 	/* cfi_endproc */
  ENDF(ffi_closure_raw_SYSV)
  
  #define raw_closure_T_FS	(16+16+8)
*************** ALIGN 16
*** 617,642 ****
  PUBLIC ffi_closure_raw_THISCALL
  ffi_closure_raw_THISCALL PROC C
  L(UW41):
! 	// cfi_startproc
  	/* Rearrange the stack such that %ecx is the first argument.
  	   This means moving the return address.  */
  	pop 	edx
  L(UW42):
! 	// cfi_def_cfa_offset(0)
! 	// cfi_register(%eip, %edx)
  	push	ecx
  L(UW43):
! 	// cfi_adjust_cfa_offset(4)
  	push 	edx
  L(UW44):
! 	// cfi_adjust_cfa_offset(4)
! 	// cfi_rel_offset(%eip, 0)
  	sub 	esp, raw_closure_T_FS
  L(UW45):
! 	// cfi_adjust_cfa_offset(raw_closure_T_FS)
  	mov 	[esp+raw_closure_T_FS-4], ebx
  L(UW46):
! 	// cfi_rel_offset(%ebx, raw_closure_T_FS-4)
  
  	mov 	edx, [eax+FFI_TRAMPOLINE_SIZE+8]	/* load cl->user_data */
  	mov 	[esp+12], edx
--- 617,642 ----
  PUBLIC ffi_closure_raw_THISCALL
  ffi_closure_raw_THISCALL PROC C
  L(UW41):
! 	/* cfi_startproc */
  	/* Rearrange the stack such that %ecx is the first argument.
  	   This means moving the return address.  */
  	pop 	edx
  L(UW42):
! 	/* cfi_def_cfa_offset(0) */
! 	/* cfi_register(%eip, %edx) */
  	push	ecx
  L(UW43):
! 	/* cfi_adjust_cfa_offset(4) */
  	push 	edx
  L(UW44):
! 	/* cfi_adjust_cfa_offset(4) */
! 	/* cfi_rel_offset(%eip, 0) */
  	sub 	esp, raw_closure_T_FS
  L(UW45):
! 	/* cfi_adjust_cfa_offset(raw_closure_T_FS) */
  	mov 	[esp+raw_closure_T_FS-4], ebx
  L(UW46):
! 	/* cfi_rel_offset(%ebx, raw_closure_T_FS-4) */
  
  	mov 	edx, [eax+FFI_TRAMPOLINE_SIZE+8]	/* load cl->user_data */
  	mov 	[esp+12], edx
*************** L(UW46):
*** 650,665 ****
  
  	mov 	eax, [ebx+20]				/* load cif->flags */
  	and 	eax, X86_RET_TYPE_MASK
! // #ifdef __PIC__
! // 	call	__x86.get_pc_thunk.bx
! // L(pc5):
! // 	leal	L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx
! // #else
  	lea 	ecx, [L(load_table5)+eax*8]
! //#endif
  	mov 	ebx, [esp+raw_closure_T_FS-4]
  L(UW47):
! 	// cfi_restore(%ebx)
  	mov 	eax, [esp+16]				/* Optimistic load */
  	jmp	    DWORD PTR [ecx]
  
--- 650,665 ----
  
  	mov 	eax, [ebx+20]				/* load cif->flags */
  	and 	eax, X86_RET_TYPE_MASK
! /* #ifdef __PIC__ */
! /* 	call	__x86.get_pc_thunk.bx */
! /* L(pc5): */
! /* 	leal	L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx */
! /* #else */
  	lea 	ecx, [L(load_table5)+eax*8]
! /*#endif */
  	mov 	ebx, [esp+raw_closure_T_FS-4]
  L(UW47):
! 	/* cfi_restore(%ebx) */
  	mov 	eax, [esp+16]				/* Optimistic load */
  	jmp	    DWORD PTR [ecx]
  
*************** E(L(load_table5), X86_RET_VOID)
*** 696,713 ****
  L(e5):
  	add 	esp, raw_closure_T_FS
  L(UW48):
! 	// cfi_adjust_cfa_offset(-raw_closure_T_FS)
  	/* Remove the extra %ecx argument we pushed.  */
  	ret	4
  L(UW49):
! 	// cfi_adjust_cfa_offset(raw_closure_T_FS)
  E(L(load_table5), X86_RET_STRUCTPOP)
  	add 	esp, raw_closure_T_FS
  L(UW50):
! 	// cfi_adjust_cfa_offset(-raw_closure_T_FS)
  	ret	8
  L(UW51):
! 	// cfi_adjust_cfa_offset(raw_closure_T_FS)
  E(L(load_table5), X86_RET_STRUCTARG)
  	jmp	L(e5)
  E(L(load_table5), X86_RET_STRUCT_1B)
--- 696,713 ----
  L(e5):
  	add 	esp, raw_closure_T_FS
  L(UW48):
! 	/* cfi_adjust_cfa_offset(-raw_closure_T_FS) */
  	/* Remove the extra %ecx argument we pushed.  */
  	ret	4
  L(UW49):
! 	/* cfi_adjust_cfa_offset(raw_closure_T_FS) */
  E(L(load_table5), X86_RET_STRUCTPOP)
  	add 	esp, raw_closure_T_FS
  L(UW50):
! 	/* cfi_adjust_cfa_offset(-raw_closure_T_FS) */
  	ret	8
  L(UW51):
! 	/* cfi_adjust_cfa_offset(raw_closure_T_FS) */
  E(L(load_table5), X86_RET_STRUCTARG)
  	jmp	L(e5)
  E(L(load_table5), X86_RET_STRUCT_1B)
*************** E(L(load_table5), X86_RET_UNUSED15)
*** 724,730 ****
  	int 3
  
  L(UW52):
! 	// cfi_endproc
  ENDF(ffi_closure_raw_THISCALL)
  
  #endif /* !FFI_NO_RAW_API */
--- 724,730 ----
  	int 3
  
  L(UW52):
! 	/* cfi_endproc */
  ENDF(ffi_closure_raw_THISCALL)
  
  #endif /* !FFI_NO_RAW_API */
*************** ENDF(ffi_closure_raw_THISCALL)
*** 743,762 ****
  # define COMDAT(X)
  #endif
  
! // #if defined(__PIC__)
! // 	COMDAT(C(__x86.get_pc_thunk.bx))
! // C(__x86.get_pc_thunk.bx):
! // 	movl	(%esp), %ebx
! // 	ret
! // ENDF(C(__x86.get_pc_thunk.bx))
! // # if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
! // 	COMDAT(C(__x86.get_pc_thunk.dx))
! // C(__x86.get_pc_thunk.dx):
! // 	movl	(%esp), %edx
! // 	ret
! // ENDF(C(__x86.get_pc_thunk.dx))
! // #endif /* DARWIN || HIDDEN */
! // #endif /* __PIC__ */
  
  #if 0
  /* Sadly, OSX cctools-as doesn't understand .cfi directives at all.  */
--- 743,765 ----
  # define COMDAT(X)
  #endif
  
! #if 0
! #if defined(__PIC__)
! 	COMDAT(C(__x86.get_pc_thunk.bx))
! C(__x86.get_pc_thunk.bx):
! 	movl	(%esp), %ebx
! 	ret
! ENDF(C(__x86.get_pc_thunk.bx))
! # if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
! 	COMDAT(C(__x86.get_pc_thunk.dx))
! C(__x86.get_pc_thunk.dx):
! 	movl	(%esp), %edx
! 	ret
! ENDF(C(__x86.get_pc_thunk.dx))
! #endif /* DARWIN || HIDDEN */
! #endif /* __PIC__ */
! #endif
! 
  
  #if 0
  /* Sadly, OSX cctools-as doesn't understand .cfi directives at all.  */
*************** L(EFDE9):
*** 992,995 ****
  #endif
  #endif
  
! END
\ No newline at end of file
--- 995,998 ----
  #endif
  #endif
  
! END
diff -Nrcpad gcc-17-20260517/libffi/src/x86/unix64.S gcc-17-20260524/libffi/src/x86/unix64.S
*** gcc-17-20260517/libffi/src/x86/unix64.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/x86/unix64.S	Sun May 24 22:32:13 2026
***************
*** 39,52 ****
     actual table.  The entry points into the table are all 8 bytes.
     The use of ORG asserts that we're at the correct location.  */
  /* ??? The clang assembler doesn't handle .org with symbolic expressions.  */
! #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
  # define E(BASE, X)	.balign 8
  #else
! # ifdef __CET__
! #  define E(BASE, X)	.balign 8; .org BASE + X * 16
! # else
! #  define E(BASE, X)	.balign 8; .org BASE + X * 8
! # endif
  #endif
  
  /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
--- 39,51 ----
     actual table.  The entry points into the table are all 8 bytes.
     The use of ORG asserts that we're at the correct location.  */
  /* ??? The clang assembler doesn't handle .org with symbolic expressions.  */
! #ifdef __CET__
! /* Double slot size to 16 byte to add 4 bytes of ENDBR64.  */
! # define E(BASE, X)	.balign 8; .org BASE + X * 16
! #elif defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
  # define E(BASE, X)	.balign 8
  #else
! # define E(BASE, X)	.balign 8; .org BASE + X * 8
  #endif
  
  /* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags,
*************** C(ffi_closure_unix64_alt):
*** 505,515 ****
   * - restore the stack pointer to what it was when the trampoline was invoked.
   */
  #ifdef ENDBR_PRESENT
! #define X86_DATA_OFFSET		4077
! #define X86_CODE_OFFSET		4073
  #else
! #define X86_DATA_OFFSET		4081
! #define X86_CODE_OFFSET		4077
  #endif
  
  	.align	UNIX64_TRAMP_MAP_SIZE
--- 504,522 ----
   * - restore the stack pointer to what it was when the trampoline was invoked.
   */
  #ifdef ENDBR_PRESENT
! # define X86_DATA_OFFSET	4077
! # ifdef __ILP32__
! #  define X86_CODE_OFFSET	4069
! # else
! #  define X86_CODE_OFFSET	4073
! # endif
  #else
! # define X86_DATA_OFFSET	4081
! # ifdef __ILP32__
! #  define X86_CODE_OFFSET	4073
! # else
! #  define X86_CODE_OFFSET	4077
! # endif
  #endif
  
  	.align	UNIX64_TRAMP_MAP_SIZE
*************** C(trampoline_code_table):
*** 521,529 ****
--- 528,544 ----
  	_CET_ENDBR
  	subq	$16, %rsp			/* Make space on the stack */
  	movq	%r10, (%rsp)			/* Save %r10 on stack */
+ #ifdef __ILP32__
+ 	movl	X86_DATA_OFFSET(%rip), %r10d	/* Copy data into %r10 */
+ #else
  	movq	X86_DATA_OFFSET(%rip), %r10	/* Copy data into %r10 */
+ #endif
  	movq	%r10, 8(%rsp)			/* Save data on stack */
+ #ifdef __ILP32__
+ 	movl	X86_CODE_OFFSET(%rip), %r10d	/* Copy code into %r10 */
+ #else
  	movq	X86_CODE_OFFSET(%rip), %r10	/* Copy code into %r10 */
+ #endif
  	jmp	*%r10				/* Jump to code */
  	.align	8
  	.endr
diff -Nrcpad gcc-17-20260517/libffi/src/xtensa/ffi.c gcc-17-20260524/libffi/src/xtensa/ffi.c
*** gcc-17-20260517/libffi/src/xtensa/ffi.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/xtensa/ffi.c	Sun May 24 22:32:13 2026
*************** ffi_status ffi_prep_cif_machdep(ffi_cif
*** 86,96 ****
        break;
    }
  
!   /* Round the stack up to a full 4 register frame, just in case
!      (we use this size in movsp). This way, it's also a  multiple of
!      8 bytes for 64-bit arguments.  */
!   cif->bytes = FFI_ALIGN(cif->bytes, 16);
! 
    return FFI_OK;
  }
  
--- 86,101 ----
        break;
    }
  
!   /* Round up stack size needed for arguments.
!      Allocate FFI_REGISTER_ARGS_SPACE bytes when there are only arguments
!      passed in registers, round space reserved for arguments passed on stack
!      up to ABI-specified alignment.  */
!   if (cif->bytes < FFI_REGISTER_NARGS * 4)
!     cif->bytes = FFI_REGISTER_ARGS_SPACE;
!   else
!     cif->bytes = FFI_REGISTER_ARGS_SPACE +
! 	    FFI_ALIGN(cif->bytes - FFI_REGISTER_NARGS * 4,
! 		      XTENSA_STACK_ALIGNMENT);
    return FFI_OK;
  }
  
*************** ffi_prep_closure_loc (ffi_closure* closu
*** 232,237 ****
--- 237,245 ----
                        void *user_data,
                        void *codeloc)
  {
+   if (cif->abi != FFI_SYSV)
+     return FFI_BAD_ABI;
+ 
    /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */
    memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE);
    *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV;
*************** ffi_closure_SYSV_inner(ffi_closure *clos
*** 277,291 ****
      if (arg_types[i]->alignment == 8 && (areg & 1) != 0)
        areg++;
  
!     // skip the entry 16,a1 framework, add 16 bytes (4 registers)
      if (areg == FFI_REGISTER_NARGS)
!       areg += 4;
  
      if (arg_types[i]->type == FFI_TYPE_STRUCT)
      {
        int numregs = ((arg_types[i]->size + 3) & ~3) / 4;
        if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS)
!         areg = FFI_REGISTER_NARGS + 4;
      }
  
      avalue[i] = &values[areg];
--- 285,299 ----
      if (arg_types[i]->alignment == 8 && (areg & 1) != 0)
        areg++;
  
!     // skip the entry a1, * framework, see ffi_trampoline
      if (areg == FFI_REGISTER_NARGS)
!       areg = (FFI_REGISTER_ARGS_SPACE + 32) / 4;
  
      if (arg_types[i]->type == FFI_TYPE_STRUCT)
      {
        int numregs = ((arg_types[i]->size + 3) & ~3) / 4;
        if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS)
!         areg = (FFI_REGISTER_ARGS_SPACE + 32) / 4;
      }
  
      avalue[i] = &values[areg];
diff -Nrcpad gcc-17-20260517/libffi/src/xtensa/ffitarget.h gcc-17-20260524/libffi/src/xtensa/ffitarget.h
*** gcc-17-20260517/libffi/src/xtensa/ffitarget.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/xtensa/ffitarget.h	Sun May 24 22:32:13 2026
*************** typedef enum ffi_abi {
*** 43,48 ****
--- 43,52 ----
  #endif
  
  #define FFI_REGISTER_NARGS	6
+ #define XTENSA_STACK_ALIGNMENT	16
+ #define FFI_REGISTER_ARGS_SPACE ((FFI_REGISTER_NARGS * 4 + \
+ 				  XTENSA_STACK_ALIGNMENT - 1) & \
+ 				  -XTENSA_STACK_ALIGNMENT)
  
  /* ---- Definitions for closures ----------------------------------------- */
  
diff -Nrcpad gcc-17-20260517/libffi/src/xtensa/sysv.S gcc-17-20260524/libffi/src/xtensa/sysv.S
*** gcc-17-20260517/libffi/src/xtensa/sysv.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/src/xtensa/sysv.S	Sun May 24 22:32:13 2026
***************
*** 43,48 ****
--- 43,51 ----
  #error "xtensa/sysv.S out of sync with ffi.h"
  #endif
  
+ #define FFI_REGISTER_ARGS_OFFSET ((XTENSA_STACK_ALIGNMENT - \
+ 				   FFI_REGISTER_NARGS * 4) & \
+ 				   (XTENSA_STACK_ALIGNMENT - 1))
  
  /* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif)
        void *rvalue;            a2
*************** ENTRY(ffi_call_SYSV)
*** 62,89 ****
  	mov	a7, a1              # fp
  	movsp	a1, a11             # set new sp = old_sp - bytes
  
  	movi	a8, ffi_prep_args
  	callx8	a8                  # ffi_prep_args(ecif, stack)
  
! 	# prepare to move stack pointer back up to 6 arguments
! 	# note that 'bytes' is already aligned
! 
! 	movi	a10, 6*4 
! 	sub	a11, a6, a10
! 	movgez	a6, a10, a11
! 	add	a6, a1, a6
  
  	
  	# we can pass up to 6 arguments in registers
  	# for simplicity, just load 6 arguments
- 	# (the stack size is at least 32 bytes, so no risk to cross boundaries)
  
! 	l32i	a10, a1, 0
! 	l32i	a11, a1, 4
! 	l32i	a12, a1, 8
! 	l32i	a13, a1, 12
! 	l32i	a14, a1, 16
! 	l32i	a15, a1, 20
  
  	# move stack pointer
  
--- 65,92 ----
  	mov	a7, a1              # fp
  	movsp	a1, a11             # set new sp = old_sp - bytes
  
+ 	# align ffi_prep_args stack argument so that arguments
+ 	# passed on stack if any start on 16-byte aligned boundary
+ 
+ 	addi	a11, a11, FFI_REGISTER_ARGS_OFFSET
+ 
  	movi	a8, ffi_prep_args
  	callx8	a8                  # ffi_prep_args(ecif, stack)
  
! 	# prepare to move stack pointer back
! 	# to point to arguments passed on stack
  
+ 	addi	a6, a1, FFI_REGISTER_ARGS_SPACE
  	
  	# we can pass up to 6 arguments in registers
  	# for simplicity, just load 6 arguments
  
! 	l32i	a10, a1, FFI_REGISTER_ARGS_OFFSET + 0
! 	l32i	a11, a1, FFI_REGISTER_ARGS_OFFSET + 4
! 	l32i	a12, a1, FFI_REGISTER_ARGS_OFFSET + 8
! 	l32i	a13, a1, FFI_REGISTER_ARGS_OFFSET + 12
! 	l32i	a14, a1, FFI_REGISTER_ARGS_OFFSET + 16
! 	l32i	a15, a1, FFI_REGISTER_ARGS_OFFSET + 20
  
  	# move stack pointer
  
*************** END(ffi_call_SYSV)
*** 167,173 ****
  
  ENTRY(ffi_cacheflush)
  
! 	entry	a1, 16
  
  1:	
  #if XCHAL_DCACHE_SIZE
--- 170,176 ----
  
  ENTRY(ffi_cacheflush)
  
! 	entry	a1, 32
  
  1:	
  #if XCHAL_DCACHE_SIZE
*************** END(ffi_cacheflush)
*** 187,193 ****
  
  ENTRY(ffi_trampoline)
  
! 	entry	a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4)   # [ 0]
  	j	2f                                # [ 3]
  	.align	4                                 # [ 6]
  1:	.long	0                                 # [ 8]
--- 190,203 ----
  
  ENTRY(ffi_trampoline)
  
! 	/* 32 bytes for spill + spill overflow area of a frame that uses
! 	   call8,
! 	   FFI_REGISTER_NARGS * 4 bytes for arguments passed in registers,
! 	   aligned up to 4 to maintain 16 byte stack alignment,
! 	   4 * 4 bytes for the result.
! 	   This size must be in sync with ffi_closure_SYSV_inner logic.
! 	 */
! 	entry	a1, 32 + FFI_REGISTER_ARGS_SPACE + (4 * 4)   # [ 0]
  	j	2f                                # [ 3]
  	.align	4                                 # [ 6]
  1:	.long	0                                 # [ 8]
diff -Nrcpad gcc-17-20260517/libffi/testsuite/Makefile.am gcc-17-20260524/libffi/testsuite/Makefile.am
*** gcc-17-20260517/libffi/testsuite/Makefile.am	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/Makefile.am	Sun May 24 22:32:13 2026
*************** EXTRA_DEJAGNU_SITE_CONFIG=../local.exp
*** 6,126 ****
  
  CLEANFILES = *.exe core* *.log *.sum
  
! EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \
! libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \
! libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \
! libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \
! libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \
! libffi.call/return_sc.c libffi.call/va_struct1.c \
! libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \
! libffi.call/va_2.c libffi.call/va_struct2.c libffi.call/return_fl2.c \
! libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \
! libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \
! libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \
! libffi.call/return_ll1.c libffi.call/return_dbl2.c \
! libffi.call/negint.c libffi.closures/nested_struct3.c \
! libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \
! libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \
! libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \
! libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \
! libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \
! libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \
! libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \
! libffi.call/return_ll.c libffi.call/promotion.c \
! libffi.complex/complex_defs_longdouble.inc \
! libffi.complex/cls_align_complex_float.c \
! libffi.complex/cls_complex_va_float.c \
! libffi.complex/cls_complex_struct_float.c \
! libffi.complex/return_complex2_longdouble.c \
! libffi.complex/cls_complex_float.c \
! libffi.complex/return_complex_longdouble.c \
! libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \
! libffi.complex/cls_complex_va_longdouble.c \
! libffi.complex/return_complex_double.c \
! libffi.complex/return_complex.inc libffi.complex/many_complex.inc \
! libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \
! libffi.complex/return_complex2_double.c \
! libffi.complex/many_complex_float.c libffi.complex/ffitest.h \
! libffi.complex/return_complex1_double.c \
! libffi.complex/cls_complex_struct_longdouble.c \
! libffi.complex/complex_defs_double.inc \
! libffi.complex/cls_complex_va_double.c \
! libffi.complex/many_complex_double.c \
! libffi.complex/return_complex2.inc \
! libffi.complex/return_complex1_float.c \
! libffi.complex/complex_longdouble.c \
! libffi.complex/complex_defs_float.inc \
! libffi.complex/cls_complex_double.c \
! libffi.complex/cls_align_complex_double.c \
! libffi.complex/cls_align_complex_longdouble.c \
! libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \
! libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \
! libffi.complex/return_complex1_longdouble.c \
! libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \
! libffi.complex/cls_complex_struct_double.c \
! libffi.complex/return_complex1.inc libffi.complex/complex.exp \
! libffi.complex/cls_complex_struct.inc \
! libffi.complex/return_complex_float.c libffi.go/closure1.c \
! libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \
! libffi.go/static-chain.h libffi.bhaible/bhaible.exp \
! libffi.bhaible/test-call.c libffi.bhaible/alignof.h \
! libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \
! libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \
! libffi.closures/cls_multi_sshort.c \
! libffi.closures/cls_align_longdouble_split2.c \
! libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \
! libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \
! libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \
! libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \
! libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \
! libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \
! libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \
! libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \
! libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \
! libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \
! libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \
! libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \
! libffi.closures/closure.exp libffi.closures/cls_schar.c \
! libffi.closures/closure_fn4.c \
! libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \
! libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \
! libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \
! libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \
! libffi.closures/unwindtest_ffi_call.cc \
! libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \
! libffi.closures/ffitest.h libffi.closures/nested_struct8.c \
! libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \
! libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \
! libffi.closures/cls_align_longdouble_split.c \
! libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \
! libffi.closures/cls_float.c libffi.closures/stret_medium2.c \
! libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \
! libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \
! libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \
! libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \
! libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \
! libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \
! libffi.closures/nested_struct11.c \
! libffi.closures/nested_struct12.c \
! libffi.closures/nested_struct13.c \
! libffi.closures/cls_multi_sshortchar.c \
! libffi.closures/cls_align_longdouble.c \
! libffi.closures/cls_dbls_struct.c \
! libffi.closures/cls_many_mixed_float_double.c \
! libffi.closures/stret_large.c libffi.closures/stret_large2.c \
! libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \
! libffi.closures/nested_struct4.c libffi.closures/problem1.c \
! libffi.closures/testclosure.c libffi.closures/nested_struct6.c \
! libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \
! libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \
! libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \
! libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \
! libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \
! libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \
! libffi.closures/cls_double.c libffi.closures/cls_7byte.c \
! libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \
! libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \
! libffi.closures/err_bad_abi.c \
! libffi.closures/single_entry_structs1.c \
! libffi.closures/single_entry_structs2.c \
! libffi.closures/single_entry_structs3.c
--- 6,89 ----
  
  CLEANFILES = *.exe core* *.log *.sum
  
! EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
! 	emscripten/node-tests.sh emscripten/test.html emscripten/test_libffi.py \
! 	emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
! 	lib/wrapper.exp libffi.bhaible/Makefile libffi.bhaible/README \
! 	libffi.bhaible/alignof.h libffi.bhaible/bhaible.exp libffi.bhaible/test-call.c \
! 	libffi.bhaible/test-callback.c libffi.bhaible/testcases.c libffi.call/align_mixed.c \
! 	libffi.call/align_stdcall.c libffi.call/bpo_38748.c libffi.call/call.exp \
! 	libffi.call/err_bad_typedef.c libffi.call/ffitest.h libffi.call/float.c \
! 	libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
! 	libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
! 	libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
! 	libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
! 	libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
! 	libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
! 	libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
! 	libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
! 	libffi.call/return_sc.c libffi.call/return_sl.c libffi.call/return_uc.c \
! 	libffi.call/return_ul.c libffi.call/s55.c libffi.call/strlen.c \
! 	libffi.call/strlen2.c libffi.call/strlen3.c libffi.call/strlen4.c \
! 	libffi.call/struct1.c libffi.call/struct10.c libffi.call/struct2.c \
! 	libffi.call/struct3.c libffi.call/struct4.c libffi.call/struct5.c \
! 	libffi.call/struct6.c libffi.call/struct7.c libffi.call/struct8.c \
! 	libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
! 	libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
! 	libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
! 	libffi.call/struct_int_float.c libffi.call/longjmp.c \
! 	libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
! 	libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
! 	libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
! 	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
! 	libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
! 	libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
! 	libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
! 	libffi.closures/closure_simple.c libffi.closures/cls_12byte.c libffi.closures/cls_16byte.c \
! 	libffi.closures/cls_18byte.c libffi.closures/cls_19byte.c libffi.closures/cls_1_1byte.c \
! 	libffi.closures/cls_20byte.c libffi.closures/cls_20byte1.c libffi.closures/cls_24byte.c \
! 	libffi.closures/cls_2byte.c libffi.closures/cls_3_1byte.c libffi.closures/cls_3byte1.c \
! 	libffi.closures/cls_3byte2.c libffi.closures/cls_3float.c libffi.closures/cls_4_1byte.c \
! 	libffi.closures/cls_4byte.c libffi.closures/cls_5_1_byte.c libffi.closures/cls_5byte.c \
! 	libffi.closures/cls_64byte.c libffi.closures/cls_6_1_byte.c libffi.closures/cls_6byte.c \
! 	libffi.closures/cls_7_1_byte.c libffi.closures/cls_7byte.c libffi.closures/cls_8byte.c \
! 	libffi.closures/cls_9byte1.c libffi.closures/cls_9byte2.c libffi.closures/cls_align_double.c \
! 	libffi.closures/cls_align_float.c libffi.closures/cls_align_longdouble.c libffi.closures/cls_align_longdouble_split.c \
! 	libffi.closures/cls_align_longdouble_split2.c libffi.closures/cls_align_pointer.c libffi.closures/cls_align_sint16.c \
! 	libffi.closures/cls_align_sint32.c libffi.closures/cls_align_sint64.c libffi.closures/cls_align_uint16.c \
! 	libffi.closures/cls_align_uint32.c libffi.closures/cls_align_uint64.c libffi.closures/cls_dbls_struct.c \
! 	libffi.closures/cls_double.c libffi.closures/cls_double_va.c libffi.closures/cls_float.c \
! 	libffi.closures/cls_longdouble.c libffi.closures/cls_longdouble_va.c libffi.closures/cls_many_mixed_args.c \
! 	libffi.closures/cls_many_mixed_float_double.c libffi.closures/cls_multi_schar.c libffi.closures/cls_multi_sshort.c \
! 	libffi.closures/cls_multi_sshortchar.c libffi.closures/cls_multi_uchar.c libffi.closures/cls_multi_ushort.c \
! 	libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_pointer.c libffi.closures/cls_pointer_stack.c \
! 	libffi.closures/cls_schar.c libffi.closures/cls_sint.c libffi.closures/cls_sshort.c \
! 	libffi.closures/cls_struct_va1.c libffi.closures/cls_uchar.c libffi.closures/cls_uint.c \
! 	libffi.closures/cls_uint_va.c libffi.closures/cls_ulong_va.c libffi.closures/cls_ulonglong.c \
! 	libffi.closures/cls_ushort.c libffi.closures/err_bad_abi.c libffi.closures/ffitest.h \
! 	libffi.closures/huge_struct.c libffi.closures/nested_struct.c libffi.closures/nested_struct1.c \
! 	libffi.closures/nested_struct10.c libffi.closures/nested_struct11.c libffi.closures/nested_struct12.c \
! 	libffi.closures/nested_struct13.c libffi.closures/nested_struct2.c libffi.closures/nested_struct3.c \
! 	libffi.closures/nested_struct4.c libffi.closures/nested_struct5.c libffi.closures/nested_struct6.c \
! 	libffi.closures/nested_struct7.c libffi.closures/nested_struct8.c libffi.closures/nested_struct9.c \
! 	libffi.closures/problem1.c libffi.closures/single_entry_structs1.c libffi.closures/single_entry_structs2.c \
! 	libffi.closures/single_entry_structs3.c libffi.closures/stret_large.c libffi.closures/stret_large2.c \
! 	libffi.closures/stret_medium.c libffi.closures/stret_medium2.c libffi.closures/testclosure.c \
! 	libffi.closures/unwindtest.cc libffi.closures/unwindtest_ffi_call.cc libffi.complex/cls_align_complex.inc \
! 	libffi.complex/cls_align_complex_double.c libffi.complex/cls_align_complex_float.c libffi.complex/cls_align_complex_longdouble.c \
! 	libffi.complex/cls_complex.inc libffi.complex/cls_complex_double.c libffi.complex/cls_complex_float.c \
! 	libffi.complex/cls_complex_longdouble.c libffi.complex/cls_complex_struct.inc libffi.complex/cls_complex_struct_double.c \
! 	libffi.complex/cls_complex_struct_float.c libffi.complex/cls_complex_struct_longdouble.c libffi.complex/cls_complex_va.inc \
! 	libffi.complex/cls_complex_va_double.c libffi.complex/cls_complex_va_float.c libffi.complex/cls_complex_va_longdouble.c \
! 	libffi.complex/complex.exp libffi.complex/complex.inc libffi.complex/complex_defs_double.inc \
! 	libffi.complex/complex_defs_float.inc libffi.complex/complex_defs_longdouble.inc libffi.complex/complex_double.c \
! 	libffi.complex/complex_float.c libffi.complex/complex_int.c libffi.complex/complex_longdouble.c \
! 	libffi.complex/ffitest.h libffi.complex/many_complex.inc libffi.complex/many_complex_double.c \
! 	libffi.complex/many_complex_float.c libffi.complex/many_complex_longdouble.c libffi.complex/return_complex.inc \
! 	libffi.complex/return_complex1.inc libffi.complex/return_complex1_double.c libffi.complex/return_complex1_float.c \
! 	libffi.complex/return_complex1_longdouble.c libffi.complex/return_complex2.inc libffi.complex/return_complex2_double.c \
! 	libffi.complex/return_complex2_float.c libffi.complex/return_complex2_longdouble.c libffi.complex/return_complex_double.c \
! 	libffi.complex/return_complex_float.c libffi.complex/return_complex_longdouble.c libffi.go/aa-direct.c \
! 	libffi.go/closure1.c libffi.go/ffitest.h libffi.go/go.exp \
! 	libffi.go/static-chain.h Makefile.am Makefile.in \
! 	libffi.threads/ffitest.h libffi.threads/threads.exp libffi.threads/tsan.c
diff -Nrcpad gcc-17-20260517/libffi/testsuite/Makefile.in gcc-17-20260524/libffi/testsuite/Makefile.in
*** gcc-17-20260517/libffi/testsuite/Makefile.in	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/Makefile.in	Sun May 24 22:32:13 2026
*************** RUNTESTDEFAULTFLAGS = --tool $$tool --sr
*** 136,142 ****
  EXPECT = expect
  RUNTEST = runtest
  ACLOCAL = @ACLOCAL@
- ALLOCA = @ALLOCA@
  AMTAR = @AMTAR@
  AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
  AM_LTLDFLAGS = @AM_LTLDFLAGS@
--- 136,141 ----
*************** ECHO_T = @ECHO_T@
*** 170,175 ****
--- 169,176 ----
  EGREP = @EGREP@
  EXEEXT = @EXEEXT@
  FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
+ FFI_VERSION_NUMBER = @FFI_VERSION_NUMBER@
+ FFI_VERSION_STRING = @FFI_VERSION_STRING@
  FGREP = @FGREP@
  GREP = @GREP@
  HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
*************** TARGET = @TARGET@
*** 218,223 ****
--- 219,225 ----
  TARGETDIR = @TARGETDIR@
  TARGET_OBJ = @TARGET_OBJ@
  VERSION = @VERSION@
+ WASM64_MEMORY64 = @WASM64_MEMORY64@
  abs_builddir = @abs_builddir@
  abs_srcdir = @abs_srcdir@
  abs_top_builddir = @abs_top_builddir@
*************** abs_top_srcdir = @abs_top_srcdir@
*** 225,230 ****
--- 227,233 ----
  ac_ct_CC = @ac_ct_CC@
  ac_ct_CXX = @ac_ct_CXX@
  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ ac_ct_READELF = @ac_ct_READELF@
  am__include = @am__include@
  am__leading_dot = @am__leading_dot@
  am__quote = @am__quote@
*************** target_alias = @target_alias@
*** 273,278 ****
--- 276,282 ----
  target_cpu = @target_cpu@
  target_os = @target_os@
  target_vendor = @target_vendor@
+ tmake_file = @tmake_file@
  toolexecdir = @toolexecdir@
  toolexeclibdir = @toolexeclibdir@
  top_build_prefix = @top_build_prefix@
*************** top_srcdir = @top_srcdir@
*** 281,404 ****
  AUTOMAKE_OPTIONS = foreign dejagnu
  EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp
  CLEANFILES = *.exe core* *.log *.sum
! EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \
! libffi.call/strlen4.c libffi.call/struct10.c libffi.call/many_mixed.c \
! libffi.call/float.c libffi.call/struct5.c libffi.call/return_fl3.c \
! libffi.call/return_fl1.c libffi.call/call.exp libffi.call/pyobjc-tc.c \
! libffi.call/float_va.c libffi.call/struct8.c libffi.call/pr1172638.c \
! libffi.call/return_sc.c libffi.call/va_struct1.c \
! libffi.call/align_stdcall.c libffi.call/struct9.c libffi.call/va_1.c \
! libffi.call/va_2.c libffi.call/va_struct2.c libffi.call/return_fl2.c \
! libffi.call/align_mixed.c libffi.call/ffitest.h libffi.call/struct4.c \
! libffi.call/return_ldl.c libffi.call/float3.c libffi.call/return_sl.c \
! libffi.call/return_dbl1.c libffi.call/err_bad_typedef.c \
! libffi.call/return_ll1.c libffi.call/return_dbl2.c \
! libffi.call/negint.c libffi.closures/nested_struct3.c \
! libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \
! libffi.call/offsets.c libffi.call/struct7.c libffi.call/va_struct3.c \
! libffi.call/float1.c libffi.call/uninitialized.c libffi.call/many2.c \
! libffi.call/struct6.c libffi.call/strlen2.c libffi.call/float2.c \
! libffi.call/return_ul.c libffi.call/struct1.c libffi.call/strlen3.c \
! libffi.call/return_dbl.c libffi.call/float4.c libffi.call/many.c \
! libffi.call/strlen.c libffi.call/return_uc.c libffi.call/many_double.c \
! libffi.call/return_ll.c libffi.call/promotion.c \
! libffi.complex/complex_defs_longdouble.inc \
! libffi.complex/cls_align_complex_float.c \
! libffi.complex/cls_complex_va_float.c \
! libffi.complex/cls_complex_struct_float.c \
! libffi.complex/return_complex2_longdouble.c \
! libffi.complex/cls_complex_float.c \
! libffi.complex/return_complex_longdouble.c \
! libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \
! libffi.complex/cls_complex_va_longdouble.c \
! libffi.complex/return_complex_double.c \
! libffi.complex/return_complex.inc libffi.complex/many_complex.inc \
! libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \
! libffi.complex/return_complex2_double.c \
! libffi.complex/many_complex_float.c libffi.complex/ffitest.h \
! libffi.complex/return_complex1_double.c \
! libffi.complex/cls_complex_struct_longdouble.c \
! libffi.complex/complex_defs_double.inc \
! libffi.complex/cls_complex_va_double.c \
! libffi.complex/many_complex_double.c \
! libffi.complex/return_complex2.inc \
! libffi.complex/return_complex1_float.c \
! libffi.complex/complex_longdouble.c \
! libffi.complex/complex_defs_float.inc \
! libffi.complex/cls_complex_double.c \
! libffi.complex/cls_align_complex_double.c \
! libffi.complex/cls_align_complex_longdouble.c \
! libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \
! libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \
! libffi.complex/return_complex1_longdouble.c \
! libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \
! libffi.complex/cls_complex_struct_double.c \
! libffi.complex/return_complex1.inc libffi.complex/complex.exp \
! libffi.complex/cls_complex_struct.inc \
! libffi.complex/return_complex_float.c libffi.go/closure1.c \
! libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \
! libffi.go/static-chain.h libffi.bhaible/bhaible.exp \
! libffi.bhaible/test-call.c libffi.bhaible/alignof.h \
! libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \
! libffi.bhaible/Makefile libffi.bhaible/README config/default.exp \
! libffi.closures/cls_multi_sshort.c \
! libffi.closures/cls_align_longdouble_split2.c \
! libffi.closures/cls_1_1byte.c libffi.closures/cls_uint_va.c \
! libffi.closures/cls_3_1byte.c libffi.closures/cls_many_mixed_args.c \
! libffi.closures/cls_20byte1.c libffi.closures/cls_pointer_stack.c \
! libffi.closures/cls_align_float.c libffi.closures/cls_5_1_byte.c \
! libffi.closures/cls_9byte1.c libffi.closures/cls_align_uint32.c \
! libffi.closures/stret_medium.c libffi.closures/cls_3byte1.c \
! libffi.closures/cls_align_uint64.c libffi.closures/cls_longdouble_va.c \
! libffi.closures/cls_align_pointer.c libffi.closures/cls_19byte.c \
! libffi.closures/cls_ushort.c libffi.closures/cls_align_sint32.c \
! libffi.closures/cls_ulonglong.c libffi.closures/cls_struct_va1.c \
! libffi.closures/cls_9byte2.c libffi.closures/closure_fn5.c \
! libffi.closures/cls_5byte.c libffi.closures/cls_3float.c \
! libffi.closures/closure.exp libffi.closures/cls_schar.c \
! libffi.closures/closure_fn4.c \
! libffi.closures/closure_fn0.c libffi.closures/huge_struct.c \
! libffi.closures/cls_64byte.c libffi.closures/cls_longdouble.c \
! libffi.closures/cls_ulong_va.c libffi.closures/cls_6_1_byte.c \
! libffi.closures/cls_align_uint16.c libffi.closures/closure_fn2.c \
! libffi.closures/unwindtest_ffi_call.cc \
! libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_8byte.c \
! libffi.closures/ffitest.h libffi.closures/nested_struct8.c \
! libffi.closures/cls_pointer.c libffi.closures/nested_struct2.c \
! libffi.closures/nested_struct.c libffi.closures/cls_multi_schar.c \
! libffi.closures/cls_align_longdouble_split.c \
! libffi.closures/cls_uchar.c libffi.closures/nested_struct9.c \
! libffi.closures/cls_float.c libffi.closures/stret_medium2.c \
! libffi.closures/closure_loc_fn0.c libffi.closures/cls_6byte.c \
! libffi.closures/closure_simple.c libffi.closures/cls_align_double.c \
! libffi.closures/cls_multi_uchar.c libffi.closures/cls_4_1byte.c \
! libffi.closures/closure_fn3.c libffi.closures/cls_align_sint64.c \
! libffi.closures/nested_struct1.c libffi.closures/unwindtest.cc \
! libffi.closures/nested_struct5.c libffi.closures/cls_multi_ushort.c \
! libffi.closures/nested_struct11.c \
! libffi.closures/nested_struct12.c \
! libffi.closures/nested_struct13.c \
! libffi.closures/cls_multi_sshortchar.c \
! libffi.closures/cls_align_longdouble.c \
! libffi.closures/cls_dbls_struct.c \
! libffi.closures/cls_many_mixed_float_double.c \
! libffi.closures/stret_large.c libffi.closures/stret_large2.c \
! libffi.closures/cls_align_sint16.c libffi.closures/cls_2byte.c \
! libffi.closures/nested_struct4.c libffi.closures/problem1.c \
! libffi.closures/testclosure.c libffi.closures/nested_struct6.c \
! libffi.closures/cls_4byte.c libffi.closures/cls_24byte.c \
! libffi.closures/nested_struct10.c libffi.closures/cls_uint.c \
! libffi.closures/cls_12byte.c libffi.closures/cls_sint.c \
! libffi.closures/cls_7_1_byte.c libffi.closures/cls_sshort.c \
! libffi.closures/cls_16byte.c libffi.closures/nested_struct7.c \
! libffi.closures/cls_double_va.c libffi.closures/cls_3byte2.c \
! libffi.closures/cls_double.c libffi.closures/cls_7byte.c \
! libffi.closures/closure_fn6.c libffi.closures/closure_fn1.c \
! libffi.closures/cls_20byte.c libffi.closures/cls_18byte.c \
! libffi.closures/err_bad_abi.c \
! libffi.closures/single_entry_structs1.c \
! libffi.closures/single_entry_structs2.c \
! libffi.closures/single_entry_structs3.c
  
  all: all-am
  
--- 285,371 ----
  AUTOMAKE_OPTIONS = foreign dejagnu
  EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp
  CLEANFILES = *.exe core* *.log *.sum
! EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
! 	emscripten/node-tests.sh emscripten/test.html emscripten/test_libffi.py \
! 	emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
! 	lib/wrapper.exp libffi.bhaible/Makefile libffi.bhaible/README \
! 	libffi.bhaible/alignof.h libffi.bhaible/bhaible.exp libffi.bhaible/test-call.c \
! 	libffi.bhaible/test-callback.c libffi.bhaible/testcases.c libffi.call/align_mixed.c \
! 	libffi.call/align_stdcall.c libffi.call/bpo_38748.c libffi.call/call.exp \
! 	libffi.call/err_bad_typedef.c libffi.call/ffitest.h libffi.call/float.c \
! 	libffi.call/float1.c libffi.call/float2.c libffi.call/float3.c \
! 	libffi.call/float4.c libffi.call/float_va.c libffi.call/many.c \
! 	libffi.call/many2.c libffi.call/many_double.c libffi.call/many_mixed.c \
! 	libffi.call/negint.c libffi.call/offsets.c libffi.call/overread.c \
! 	libffi.call/pr1172638.c libffi.call/promotion.c libffi.call/pyobjc_tc.c libffi.call/return_dbl.c \
! 	libffi.call/return_dbl1.c libffi.call/return_dbl2.c libffi.call/return_fl.c \
! 	libffi.call/return_fl1.c libffi.call/return_fl2.c libffi.call/return_fl3.c \
! 	libffi.call/return_ldl.c libffi.call/return_ll.c libffi.call/return_ll1.c \
! 	libffi.call/return_sc.c libffi.call/return_sl.c libffi.call/return_uc.c \
! 	libffi.call/return_ul.c libffi.call/s55.c libffi.call/strlen.c \
! 	libffi.call/strlen2.c libffi.call/strlen3.c libffi.call/strlen4.c \
! 	libffi.call/struct1.c libffi.call/struct10.c libffi.call/struct2.c \
! 	libffi.call/struct3.c libffi.call/struct4.c libffi.call/struct5.c \
! 	libffi.call/struct6.c libffi.call/struct7.c libffi.call/struct8.c \
! 	libffi.call/struct9.c libffi.call/struct_by_value_2.c libffi.call/struct_by_value_3.c \
! 	libffi.call/struct_by_value_3f.c libffi.call/struct_by_value_4.c libffi.call/struct_by_value_4f.c \
! 	libffi.call/struct_by_value_big.c libffi.call/struct_by_value_small.c libffi.call/struct_return_2H.c \
! 	libffi.call/struct_int_float.c libffi.call/longjmp.c \
! 	libffi.call/struct_return_8H.c libffi.call/uninitialized.c libffi.call/va_1.c \
! 	libffi.call/va_2.c libffi.call/va_3.c libffi.call/va_struct1.c \
! 	libffi.call/va_struct2.c libffi.call/va_struct3.c libffi.call/callback.c \
! 	libffi.call/callback2.c libffi.call/callback3.c libffi.call/callback4.c libffi.call/x32.c \
! 	libffi.closures/closure.exp libffi.closures/closure_fn0.c libffi.closures/closure_fn1.c \
! 	libffi.closures/closure_fn2.c libffi.closures/closure_fn3.c libffi.closures/closure_fn4.c \
! 	libffi.closures/closure_fn5.c libffi.closures/closure_fn6.c libffi.closures/closure_loc_fn0.c \
! 	libffi.closures/closure_simple.c libffi.closures/cls_12byte.c libffi.closures/cls_16byte.c \
! 	libffi.closures/cls_18byte.c libffi.closures/cls_19byte.c libffi.closures/cls_1_1byte.c \
! 	libffi.closures/cls_20byte.c libffi.closures/cls_20byte1.c libffi.closures/cls_24byte.c \
! 	libffi.closures/cls_2byte.c libffi.closures/cls_3_1byte.c libffi.closures/cls_3byte1.c \
! 	libffi.closures/cls_3byte2.c libffi.closures/cls_3float.c libffi.closures/cls_4_1byte.c \
! 	libffi.closures/cls_4byte.c libffi.closures/cls_5_1_byte.c libffi.closures/cls_5byte.c \
! 	libffi.closures/cls_64byte.c libffi.closures/cls_6_1_byte.c libffi.closures/cls_6byte.c \
! 	libffi.closures/cls_7_1_byte.c libffi.closures/cls_7byte.c libffi.closures/cls_8byte.c \
! 	libffi.closures/cls_9byte1.c libffi.closures/cls_9byte2.c libffi.closures/cls_align_double.c \
! 	libffi.closures/cls_align_float.c libffi.closures/cls_align_longdouble.c libffi.closures/cls_align_longdouble_split.c \
! 	libffi.closures/cls_align_longdouble_split2.c libffi.closures/cls_align_pointer.c libffi.closures/cls_align_sint16.c \
! 	libffi.closures/cls_align_sint32.c libffi.closures/cls_align_sint64.c libffi.closures/cls_align_uint16.c \
! 	libffi.closures/cls_align_uint32.c libffi.closures/cls_align_uint64.c libffi.closures/cls_dbls_struct.c \
! 	libffi.closures/cls_double.c libffi.closures/cls_double_va.c libffi.closures/cls_float.c \
! 	libffi.closures/cls_longdouble.c libffi.closures/cls_longdouble_va.c libffi.closures/cls_many_mixed_args.c \
! 	libffi.closures/cls_many_mixed_float_double.c libffi.closures/cls_multi_schar.c libffi.closures/cls_multi_sshort.c \
! 	libffi.closures/cls_multi_sshortchar.c libffi.closures/cls_multi_uchar.c libffi.closures/cls_multi_ushort.c \
! 	libffi.closures/cls_multi_ushortchar.c libffi.closures/cls_pointer.c libffi.closures/cls_pointer_stack.c \
! 	libffi.closures/cls_schar.c libffi.closures/cls_sint.c libffi.closures/cls_sshort.c \
! 	libffi.closures/cls_struct_va1.c libffi.closures/cls_uchar.c libffi.closures/cls_uint.c \
! 	libffi.closures/cls_uint_va.c libffi.closures/cls_ulong_va.c libffi.closures/cls_ulonglong.c \
! 	libffi.closures/cls_ushort.c libffi.closures/err_bad_abi.c libffi.closures/ffitest.h \
! 	libffi.closures/huge_struct.c libffi.closures/nested_struct.c libffi.closures/nested_struct1.c \
! 	libffi.closures/nested_struct10.c libffi.closures/nested_struct11.c libffi.closures/nested_struct12.c \
! 	libffi.closures/nested_struct13.c libffi.closures/nested_struct2.c libffi.closures/nested_struct3.c \
! 	libffi.closures/nested_struct4.c libffi.closures/nested_struct5.c libffi.closures/nested_struct6.c \
! 	libffi.closures/nested_struct7.c libffi.closures/nested_struct8.c libffi.closures/nested_struct9.c \
! 	libffi.closures/problem1.c libffi.closures/single_entry_structs1.c libffi.closures/single_entry_structs2.c \
! 	libffi.closures/single_entry_structs3.c libffi.closures/stret_large.c libffi.closures/stret_large2.c \
! 	libffi.closures/stret_medium.c libffi.closures/stret_medium2.c libffi.closures/testclosure.c \
! 	libffi.closures/unwindtest.cc libffi.closures/unwindtest_ffi_call.cc libffi.complex/cls_align_complex.inc \
! 	libffi.complex/cls_align_complex_double.c libffi.complex/cls_align_complex_float.c libffi.complex/cls_align_complex_longdouble.c \
! 	libffi.complex/cls_complex.inc libffi.complex/cls_complex_double.c libffi.complex/cls_complex_float.c \
! 	libffi.complex/cls_complex_longdouble.c libffi.complex/cls_complex_struct.inc libffi.complex/cls_complex_struct_double.c \
! 	libffi.complex/cls_complex_struct_float.c libffi.complex/cls_complex_struct_longdouble.c libffi.complex/cls_complex_va.inc \
! 	libffi.complex/cls_complex_va_double.c libffi.complex/cls_complex_va_float.c libffi.complex/cls_complex_va_longdouble.c \
! 	libffi.complex/complex.exp libffi.complex/complex.inc libffi.complex/complex_defs_double.inc \
! 	libffi.complex/complex_defs_float.inc libffi.complex/complex_defs_longdouble.inc libffi.complex/complex_double.c \
! 	libffi.complex/complex_float.c libffi.complex/complex_int.c libffi.complex/complex_longdouble.c \
! 	libffi.complex/ffitest.h libffi.complex/many_complex.inc libffi.complex/many_complex_double.c \
! 	libffi.complex/many_complex_float.c libffi.complex/many_complex_longdouble.c libffi.complex/return_complex.inc \
! 	libffi.complex/return_complex1.inc libffi.complex/return_complex1_double.c libffi.complex/return_complex1_float.c \
! 	libffi.complex/return_complex1_longdouble.c libffi.complex/return_complex2.inc libffi.complex/return_complex2_double.c \
! 	libffi.complex/return_complex2_float.c libffi.complex/return_complex2_longdouble.c libffi.complex/return_complex_double.c \
! 	libffi.complex/return_complex_float.c libffi.complex/return_complex_longdouble.c libffi.go/aa-direct.c \
! 	libffi.go/closure1.c libffi.go/ffitest.h libffi.go/go.exp \
! 	libffi.go/static-chain.h Makefile.am Makefile.in \
! 	libffi.threads/ffitest.h libffi.threads/threads.exp libffi.threads/tsan.c
  
  all: all-am
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/build-tests.sh gcc-17-20260524/libffi/testsuite/emscripten/build-tests.sh
*** gcc-17-20260517/libffi/testsuite/emscripten/build-tests.sh	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/build-tests.sh	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,34 ----
+ #!/usr/bin/env bash
+ 
+ if ! [ -x "$(command -v emcc)" ]; then
+   echo "Error: emcc could not be found." >&2
+   exit 1
+ fi
+ 
+ set -e
+ 
+ cd "$1"
+ shift
+ 
+ export CFLAGS="-fPIC -O2 -I../../target/include $EXTRA_CFLAGS"
+ export CXXFLAGS="$CFLAGS -sNO_DISABLE_EXCEPTION_CATCHING $EXTRA_CXXFLAGS"
+ export LDFLAGS=" \
+     -L../../target/lib/ -lffi \
+     -sEXPORT_ALL \
+     -sMODULARIZE \
+     -sMAIN_MODULE \
+     -sNO_DISABLE_EXCEPTION_CATCHING \
+     -sWASM_BIGINT \
+     $EXTRA_LD_FLAGS \
+ "
+ 
+ # Rename main functions to test__filename so we can link them together
+ ls *c | sed 's!\(.*\)\.c!sed -i "s/main/test__\1/g" \0!g' | bash
+ 
+ # Compile
+ ls *.c | sed 's/\(.*\)\.c/emcc $CFLAGS -c \1.c -o \1.o /g' | bash
+ ls *.cc | sed 's/\(.*\)\.cc/em++ $CXXFLAGS -c \1.cc -o \1.o /g' | bash
+ 
+ # Link
+ em++ $LDFLAGS *.o -o test.js
+ cp ../emscripten/test.html .
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/build.sh gcc-17-20260524/libffi/testsuite/emscripten/build.sh
*** gcc-17-20260517/libffi/testsuite/emscripten/build.sh	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/build.sh	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,46 ----
+ #!/usr/bin/env bash
+ 
+ if ! [ -x "$(command -v emcc)" ]; then
+   echo "Error: emcc could not be found." >&2
+   exit 1
+ fi
+ 
+ set -e
+ 
+ SOURCE_DIR=$PWD
+ 
+ # Working directories
+ TARGET=$SOURCE_DIR/target
+ mkdir -p "$TARGET"
+ 
+ # Define default arguments
+ DEBUG=false
+ 
+ # Parse arguments
+ while [ $# -gt 0 ]; do
+   case $1 in
+     --debug) DEBUG=true ;;
+     *) echo "ERROR: Unknown parameter: $1" >&2; exit 1 ;;
+   esac
+   shift
+ done
+ 
+ # Common compiler flags
+ export CFLAGS="-O3 -fPIC"
+ if [ "$DEBUG" = "true" ]; then export CFLAGS+=" -DDEBUG_F"; fi
+ export CXXFLAGS="$CFLAGS"
+ 
+ # Build paths
+ export CPATH="$TARGET/include"
+ export PKG_CONFIG_PATH="$TARGET/lib/pkgconfig"
+ export EM_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
+ 
+ # Specific variables for cross-compilation
+ export CHOST="${TARGET_HOST}-unknown-linux" # wasm32-unknown-emscripten
+ 
+ autoreconf -fiv
+ emconfigure ./configure --host=$CHOST --prefix="$TARGET" --enable-static --disable-shared --disable-dependency-tracking \
+   --disable-builddir --disable-multi-os-directory --disable-raw-api --disable-docs ${EXTRA_CONFIGURE_FLAGS}
+ make install
+ cp fficonfig.h target/include/
+ cp include/ffi_common.h target/include/
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/conftest.py gcc-17-20260524/libffi/testsuite/emscripten/conftest.py
*** gcc-17-20260517/libffi/testsuite/emscripten/conftest.py	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/conftest.py	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,86 ----
+ from pathlib import Path
+ from pytest import fixture
+ from pytest_pyodide.server import spawn_web_server
+ from pytest_pyodide import runner
+ 
+ import logging
+ 
+ TEST_PATH = Path(__file__).parents[1].resolve()
+ 
+ 
+ class BaseRunner(runner._BrowserBaseRunner):
+     def __init__(
+         self,
+         *args,
+         test_dir,
+         **kwargs,
+     ):
+         self.test_dir = test_dir
+         super().__init__(
+             *args,
+             **kwargs,
+             load_pyodide=False,
+         )
+ 
+     def prepare_driver(self):
+         self.base_url = (
+             f"http://{self.server_hostname}:{self.server_port}/{self.test_dir}/"
+         )
+         self.goto(f"{self.base_url}/test.html")
+ 
+     def javascript_setup(self):
+         self.run_js("globalThis.TestModule = await globalThis.Module();")
+ 
+ 
+ class FirefoxRunner(BaseRunner, runner.SeleniumFirefoxRunner):
+     pass
+ 
+ 
+ class ChromeRunner(BaseRunner, runner.SeleniumChromeRunner):
+     pass
+ 
+ 
+ # TODO: Figure out how to get NodeRunner to work.
+ 
+ RUNNER_DICT = {x.browser: x for x in [FirefoxRunner, ChromeRunner]}
+ 
+ 
+ @fixture(params=list(RUNNER_DICT), scope="class")
+ def selenium_class_scope(request, web_server_main):
+     server_hostname, server_port, server_log = web_server_main
+     assert request.param in RUNNER_DICT
+ 
+     logger = logging.getLogger('selenium')
+     logger.setLevel(logging.DEBUG)
+ 
+     cls = RUNNER_DICT[request.param]
+     selenium = cls(
+         test_dir=request.cls.TEST_BUILD_DIR,
+         server_port=server_port,
+         server_hostname=server_hostname,
+         server_log=server_log,
+     )
+     request.cls.call_number = 0
+     try:
+         yield selenium
+     finally:
+         print(selenium.logs)
+         selenium.driver.quit()
+ 
+ 
+ @fixture(scope="function")
+ def selenium(selenium_class_scope, request):
+     selenium = selenium_class_scope
+     request.cls.call_number += 1
+     # Refresh page every 50 calls to prevent firefox out of memory errors
+     if request.cls.call_number % 50 == 0:
+         selenium.driver.refresh()
+         selenium.javascript_setup()
+     selenium.clean_logs()
+     yield selenium
+ 
+ 
+ @fixture(scope="session")
+ def web_server_main(request):
+     with spawn_web_server(TEST_PATH) as output:
+         yield output
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/node-tests.sh gcc-17-20260524/libffi/testsuite/emscripten/node-tests.sh
*** gcc-17-20260517/libffi/testsuite/emscripten/node-tests.sh	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/node-tests.sh	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,23 ----
+ #!/bin/bash
+ 
+ if ! [ -x "$(command -v emcc)" ]; then
+   echo "Error: emcc could not be found." >&2
+   exit 1
+ fi
+ 
+ # Common compiler flags
+ export CFLAGS="-fPIC $EXTRA_CFLAGS"
+ export CXXFLAGS="$CFLAGS -sNO_DISABLE_EXCEPTION_CATCHING $EXTRA_CXXFLAGS"
+ export LDFLAGS="-sEXPORTED_FUNCTIONS=_main,_malloc,_free -sALLOW_TABLE_GROWTH -sASSERTIONS -sNO_DISABLE_EXCEPTION_CATCHING -sWASM_BIGINT -Wno-main"
+ 
+ # Specific variables for cross-compilation
+ export CHOST="${TARGET_HOST}-unknown-linux" # wasm32-unknown-emscripten
+ 
+ autoreconf -fiv
+ emconfigure ./configure --prefix="$(pwd)/target" --host=$CHOST --enable-static --disable-shared \
+   --disable-builddir --disable-multi-os-directory --disable-raw-api --disable-docs ${EXTRA_CONFIGURE_FLAGS} ||
+   (cat config.log && exit 1)
+ make
+ 
+ EMMAKEN_JUST_CONFIGURE=1 emmake make check \
+   RUNTESTFLAGS="LDFLAGS_FOR_TARGET='$LDFLAGS $EXTRA_TEST_LDFLAGS'" || (cat testsuite/libffi.log && exit 1)
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/test.html gcc-17-20260524/libffi/testsuite/emscripten/test.html
*** gcc-17-20260517/libffi/testsuite/emscripten/test.html	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/test.html	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,7 ----
+ <!DOCTYPE html>
+ <html>
+   <head>
+     <script src="test.js"></script>
+   </head>
+   <body></body>
+ </html>
diff -Nrcpad gcc-17-20260517/libffi/testsuite/emscripten/test_libffi.py gcc-17-20260524/libffi/testsuite/emscripten/test_libffi.py
*** gcc-17-20260517/libffi/testsuite/emscripten/test_libffi.py	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/emscripten/test_libffi.py	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,51 ----
+ import subprocess
+ import pathlib
+ import pytest
+ 
+ TEST_PATH = pathlib.Path(__file__).parents[1].resolve()
+ 
+ xfails = {}
+ 
+ 
+ def libffi_tests(self, selenium, libffi_test):
+     if libffi_test in xfails:
+         pytest.xfail(f'known failure with code "{xfails[libffi_test]}"')
+     res = selenium.run_js(
+         """
+         window.TestModule = await Module();
+         """
+     )
+     selenium.run_js(
+         f"""
+         try {{
+             TestModule._test__{libffi_test}();
+         }} catch(e){{
+             if(e.name !== "ExitStatus"){{
+                 throw e;
+             }}
+             if(e.status !== 0){{
+                 throw new Error(`Terminated with nonzero status code ${{e.status}}: ` + e.message);
+             }}
+         }}
+         """
+     )
+ 
+ 
+ class TestCall:
+     TEST_BUILD_DIR = "libffi.call.test"
+     test_call = libffi_tests
+ 
+ 
+ class TestClosures:
+     TEST_BUILD_DIR = "libffi.closures.test"
+     test_closures = libffi_tests
+ 
+ 
+ def pytest_generate_tests(metafunc):
+     test_build_dir = metafunc.cls.TEST_BUILD_DIR
+     test_names = [x.stem for x in (TEST_PATH / test_build_dir).glob("*.o")]
+     metafunc.parametrize("libffi_test", test_names)
+ 
+ 
+ if __name__ == "__main__":
+     subprocess.call(["build-tests.sh", "libffi.call"])
diff -Nrcpad gcc-17-20260517/libffi/testsuite/lib/libffi.exp gcc-17-20260524/libffi/testsuite/lib/libffi.exp
*** gcc-17-20260517/libffi/testsuite/lib/libffi.exp	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/lib/libffi.exp	Sun May 24 22:32:13 2026
***************
*** 1,4 ****
! #   Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019 Free Software Foundation, Inc.
  
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
--- 1,4 ----
! #   Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014, 2019, 2022, 2025 Free Software Foundation, Inc.
  
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
*************** proc is-effective-target { arg } {
*** 41,54 ****
      global et_index
      set selected 0
      if { ![info exists et_index] } {
! 	# Initialize the effective target index that is used in some
! 	# check_effective_target_* procs.
! 	set et_index 0
      }
      if { [info procs check_effective_target_${arg}] != [list] } {
! 	set selected [check_effective_target_${arg}]
      } else {
! 	error "unknown effective target keyword `$arg'" 
      }
      verbose "is-effective-target: $arg $selected" 2
      return $selected
--- 41,54 ----
      global et_index
      set selected 0
      if { ![info exists et_index] } {
!         # Initialize the effective target index that is used in some
!         # check_effective_target_* procs.
!         set et_index 0
      }
      if { [info procs check_effective_target_${arg}] != [list] } {
!         set selected [check_effective_target_${arg}]
      } else {
!         error "unknown effective target keyword `$arg'"
      }
      verbose "is-effective-target: $arg $selected" 2
      return $selected
*************** proc is-effective-target { arg } {
*** 56,64 ****
  
  proc is-effective-target-keyword { arg } {
      if { [info procs check_effective_target_${arg}] != [list] } {
! 	return 1
      } else {
! 	return 0
      }
  }
  
--- 56,64 ----
  
  proc is-effective-target-keyword { arg } {
      if { [info procs check_effective_target_${arg}] != [list] } {
!         return 1
      } else {
!         return 0
      }
  }
  
*************** if { [info procs saved-dg-process-target
*** 90,182 ****
  
      # Evaluate an operand within a selector expression.
      proc selector_opd { op } {
! 	set selector "target"
! 	lappend selector $op
! 	set answer [ expr { [dg-process-target $selector] == "S" } ]
! 	verbose "selector_opd: `$op' $answer" 2
! 	return $answer
      }
  
      # Evaluate a target triplet list within a selector expression.
      # Unlike other operands, this needs to be expanded from a list to
      # the same string as "target".
      proc selector_list { op } {
! 	set selector "target [join $op]"
! 	set answer [ expr { [dg-process-target $selector] == "S" } ]
! 	verbose "selector_list: `$op' $answer" 2
! 	return $answer
      }
  
      # Evaluate a selector expression.
      proc selector_expression { exp } {
! 	if { [llength $exp] == 2 } {
! 	    if [string match "!" [lindex $exp 0]] {
! 		set op1 [lindex $exp 1]
! 		set answer [expr { ! [selector_opd $op1] }]
! 	    } else {
! 		# Assume it's a list of target triplets.
! 		set answer [selector_list $exp]
! 	    }
! 	} elseif { [llength $exp] == 3 } {
! 	    set op1 [lindex $exp 0]
! 	    set opr [lindex $exp 1]
! 	    set op2 [lindex $exp 2]
! 	    if [string match "&&" $opr] {
! 		set answer [expr { [selector_opd $op1] && [selector_opd $op2] }]
! 	    } elseif [string match "||" $opr] {
! 		set answer [expr { [selector_opd $op1] || [selector_opd $op2] }]
! 	    } else {
! 		# Assume it's a list of target triplets.
! 		set answer [selector_list $exp]
! 	    }
! 	} else {
! 	    # Assume it's a list of target triplets.
! 	    set answer [selector_list $exp]
! 	}
  
! 	verbose "selector_expression: `$exp' $answer" 2
! 	return $answer
      }
  
      # Evaluate "target selector" or "xfail selector".
  
      proc dg-process-target-1 { args } {
! 	verbose "dg-process-target-1: `$args'" 2
  
! 	# Extract the 'what' keyword from the argument list.
! 	set selector [string trim [lindex $args 0]]
! 	if [regexp "^xfail " $selector] {
! 	    set what "xfail"
! 	} elseif [regexp "^target " $selector] {
! 	    set what "target"
! 	} else {
! 	    error "syntax error in target selector \"$selector\""
! 	}
  
! 	# Extract the rest of the list, which might be a keyword.
! 	regsub "^${what}" $selector "" rest
! 	set rest [string trim $rest]
  
! 	if [is-effective-target-keyword $rest] {
! 	    # The selector is an effective target keyword.
! 	    if [is-effective-target $rest] {
! 		return [expr { $what == "xfail" ? "F" : "S" }]
! 	    } else {
! 		return [expr { $what == "xfail" ? "P" : "N" }]
! 	    }
! 	}
  
! 	if [string match "{*}" $rest] {
! 	    if [selector_expression [lindex $rest 0]] {
! 		return [expr { $what == "xfail" ? "F" : "S" }]
! 	    } else {
! 		return [expr { $what == "xfail" ? "P" : "N" }]
! 	    }
! 	}
  
! 	# The selector is not an effective-target keyword, so process
! 	# the list of target triplets.
! 	return [saved-dg-process-target $selector]
      }
  
      # Intercept calls to the DejaGnu function.  In addition to
--- 90,182 ----
  
      # Evaluate an operand within a selector expression.
      proc selector_opd { op } {
!         set selector "target"
!         lappend selector $op
!         set answer [ expr { [dg-process-target $selector] == "S" } ]
!         verbose "selector_opd: `$op' $answer" 2
!         return $answer
      }
  
      # Evaluate a target triplet list within a selector expression.
      # Unlike other operands, this needs to be expanded from a list to
      # the same string as "target".
      proc selector_list { op } {
!         set selector "target [join $op]"
!         set answer [ expr { [dg-process-target $selector] == "S" } ]
!         verbose "selector_list: `$op' $answer" 2
!         return $answer
      }
  
      # Evaluate a selector expression.
      proc selector_expression { exp } {
!         if { [llength $exp] == 2 } {
!             if [string match "!" [lindex $exp 0]] {
!                 set op1 [lindex $exp 1]
!                 set answer [expr { ! [selector_opd $op1] }]
!             } else {
!                 # Assume it's a list of target triplets.
!                 set answer [selector_list $exp]
!             }
!         } elseif { [llength $exp] == 3 } {
!             set op1 [lindex $exp 0]
!             set opr [lindex $exp 1]
!             set op2 [lindex $exp 2]
!             if [string match "&&" $opr] {
!                 set answer [expr { [selector_opd $op1] && [selector_opd $op2] }]
!             } elseif [string match "||" $opr] {
!                 set answer [expr { [selector_opd $op1] || [selector_opd $op2] }]
!             } else {
!                 # Assume it's a list of target triplets.
!                 set answer [selector_list $exp]
!             }
!         } else {
!             # Assume it's a list of target triplets.
!             set answer [selector_list $exp]
!         }
  
!         verbose "selector_expression: `$exp' $answer" 2
!         return $answer
      }
  
      # Evaluate "target selector" or "xfail selector".
  
      proc dg-process-target-1 { args } {
!         verbose "dg-process-target-1: `$args'" 2
  
!         # Extract the 'what' keyword from the argument list.
!         set selector [string trim [lindex $args 0]]
!         if [regexp "^xfail " $selector] {
!             set what "xfail"
!         } elseif [regexp "^target " $selector] {
!             set what "target"
!         } else {
!             error "syntax error in target selector \"$selector\""
!         }
  
!         # Extract the rest of the list, which might be a keyword.
!         regsub "^${what}" $selector "" rest
!         set rest [string trim $rest]
  
!         if [is-effective-target-keyword $rest] {
!             # The selector is an effective target keyword.
!             if [is-effective-target $rest] {
!                 return [expr { $what == "xfail" ? "F" : "S" }]
!             } else {
!                 return [expr { $what == "xfail" ? "P" : "N" }]
!             }
!         }
  
!         if [string match "{*}" $rest] {
!             if [selector_expression [lindex $rest 0]] {
!                 return [expr { $what == "xfail" ? "F" : "S" }]
!             } else {
!                 return [expr { $what == "xfail" ? "P" : "N" }]
!             }
!         }
  
!         # The selector is not an effective-target keyword, so process
!         # the list of target triplets.
!         return [saved-dg-process-target $selector]
      }
  
      # Intercept calls to the DejaGnu function.  In addition to
*************** if { [info procs saved-dg-process-target
*** 184,207 ****
      # "target selector1 xfail selector2".
  
      proc dg-process-target { args } {
! 	verbose "replacement dg-process-target: `$args'" 2
  
! 	set selector [string trim [lindex $args 0]]
  
! 	# If the argument list contains both 'target' and 'xfail',
! 	# process 'target' and, if that succeeds, process 'xfail'.
! 	if [regexp "^target .* xfail .*" $selector] {
! 	    set xfail_index [string first "xfail" $selector]
! 	    set xfail_selector [string range $selector $xfail_index end]
! 	    set target_selector [string range $selector 0 [expr $xfail_index-1]]
! 	    set target_selector [string trim $target_selector]
! 	    if { [dg-process-target-1 $target_selector] == "N" } {
! 		return "N"
! 	    }
! 	    return [dg-process-target-1 $xfail_selector]
! 	    
! 	}
! 	return [dg-process-target-1 $selector]
      }
  }
  
--- 184,207 ----
      # "target selector1 xfail selector2".
  
      proc dg-process-target { args } {
!         verbose "replacement dg-process-target: `$args'" 2
  
!         set selector [string trim [lindex $args 0]]
  
!         # If the argument list contains both 'target' and 'xfail',
!         # process 'target' and, if that succeeds, process 'xfail'.
!         if [regexp "^target .* xfail .*" $selector] {
!             set xfail_index [string first "xfail" $selector]
!             set xfail_selector [string range $selector $xfail_index end]
!             set target_selector [string range $selector 0 [expr $xfail_index-1]]
!             set target_selector [string trim $target_selector]
!             if { [dg-process-target-1 $target_selector] == "N" } {
!                 return "N"
!             }
!             return [dg-process-target-1 $xfail_selector]
! 
!         }
!         return [dg-process-target-1 $selector]
      }
  }
  
*************** proc libffi-dg-test-1 { target_compile p
*** 220,261 ****
      upvar 2 dg-output-text output_match
  
      if { [llength $output_match] > 1 } {
! 	regsub -all "\n" [lindex $output_match 1] "\r?\n" x
! 	set output_match [lreplace $output_match 1 1 $x]
      }
  
      # Set up the compiler flags, based on what we're going to do.
  
      set options [list]
      switch $do_what {
! 	"compile" {
! 	    set compile_type "assembly"
! 	    set output_file "[file rootname [file tail $prog]].s"
! 	}
! 	"link" {
! 	    set compile_type "executable"
! 	    set output_file "[file rootname [file tail $prog]].exe"
! 	    # The following line is needed for targets like the i960 where
! 	    # the default output file is b.out.  Sigh.
! 	}
! 	"run" {
! 	    set compile_type "executable"
! 	    # FIXME: "./" is to cope with "." not being in $PATH.
! 	    # Should this be handled elsewhere?
! 	    # YES.
! 	    set output_file "./[file rootname [file tail $prog]].exe"
! 	    # This is the only place where we care if an executable was
! 	    # created or not.  If it was, dg.exp will try to run it.
! 	    remote_file build delete $output_file;
! 	}
! 	default {
! 	    perror "$do_what: not a valid dg-do keyword"
! 	    return ""
! 	}
      }
  
      if { $extra_tool_flags != "" } {
! 	lappend options "additional_flags=$extra_tool_flags"
      }
  
      set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options];
--- 220,268 ----
      upvar 2 dg-output-text output_match
  
      if { [llength $output_match] > 1 } {
!         regsub -all "\n" [lindex $output_match 1] "\r?\n" x
!         set output_match [lreplace $output_match 1 1 $x]
!     }
! 
!     if { [ istarget "wasm32-*-*" ] } {
!         # emscripten will get confused if told to build as .exe
!         set exec_suffix ""
!     } else {
!         set exec_suffix ".exe"
      }
  
      # Set up the compiler flags, based on what we're going to do.
  
      set options [list]
      switch $do_what {
!         "compile" {
!             set compile_type "assembly"
!             set output_file "[file rootname [file tail $prog]].s"
!         }
!         "link" {
!             set compile_type "executable"
!             set output_file "[file rootname [file tail $prog]]$exec_suffix"
!             # The following line is needed for targets like the i960 where
!             # the default output file is b.out.  Sigh.
!         }
!         "run" {
!             set compile_type "executable"
!             # FIXME: "./" is to cope with "." not being in $PATH.
!             # Should this be handled elsewhere?
!             # YES.
!             set output_file "./[file rootname [file tail $prog]]$exec_suffix"
!             # This is the only place where we care if an executable was
!             # created or not.  If it was, dg.exp will try to run it.
!             remote_file build delete $output_file;
!         }
!         default {
!             perror "$do_what: not a valid dg-do keyword"
!             return ""
!         }
      }
  
      if { $extra_tool_flags != "" } {
!         lappend options "additional_flags=$extra_tool_flags"
      }
  
      set comp_output [libffi_target_compile "$prog" "$output_file" "$compile_type" $options];
*************** proc libffi-dg-test { prog do_what extra
*** 272,277 ****
--- 279,288 ----
  proc libffi-dg-prune { target_triplet text } {
      # We get this with some qemu emulated systems (eg. ppc64le-linux-gnu)
      regsub -all "(^|\n)\[^\n\]*unable to perform all requested operations" $text "" text
+     # We get this from sparc64 linux systems
+     regsub -all "(^|\n)\[^\n\]*warning: .* has a LOAD segment with RWX permissions" $text "" text
+     # Ignore Emscripten INFO messages
+     regsub -all "(^|\n)(cache|shared):INFO:\[^\n\]*" $text "" text
      return $text
  }
  
*************** proc libffi-init { args } {
*** 299,305 ****
      if { [string match $compiler_vendor "gnu"] } {
          set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
          if {$gccdir != ""} {
! 	    set gccdir [file dirname $gccdir]
          }
          verbose "gccdir $gccdir"
  
--- 310,316 ----
      if { [string match $compiler_vendor "gnu"] } {
          set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
          if {$gccdir != ""} {
!             set gccdir [file dirname $gccdir]
          }
          verbose "gccdir $gccdir"
  
*************** proc libffi-init { args } {
*** 308,324 ****
  
          set compiler "${gccdir}/xgcc"
          if { [is_remote host] == 0 && [which $compiler] != 0 } {
! 	    foreach i "[exec $compiler --print-multi-lib]" {
! 	        set mldir ""
! 	        regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
! 	        set mldir [string trimright $mldir "\;@"]
! 	        if { "$mldir" == "." } {
! 		    continue
! 	        }
! 	        if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
! 		    append ld_library_path ":${gccdir}/${mldir}"
! 	        }
! 	    }
          }
      }
  
--- 319,335 ----
  
          set compiler "${gccdir}/xgcc"
          if { [is_remote host] == 0 && [which $compiler] != 0 } {
!             foreach i "[exec $compiler --print-multi-lib]" {
!                 set mldir ""
!                 regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
!                 set mldir [string trimright $mldir "\;@"]
!                 if { "$mldir" == "." } {
!                     continue
!                 }
!                 if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
!                     append ld_library_path ":${gccdir}/${mldir}"
!                 }
!             }
          }
      }
  
*************** proc libffi-init { args } {
*** 336,344 ****
      set libffi_dir  "${blddirffi}/.libs"
      verbose "libffi_dir $libffi_dir"
      if { $libffi_dir != "" } {
! 	set libffi_dir [file dirname ${libffi_dir}]
!         if [istarget *-*-darwin*] {
!             set libffi_link_flags "-B${libffi_dir}/.libs"
  	    lappend libffi_link_flags "-B${blddircxx}/src/.libs"
  	} else {
  	    set libffi_link_flags "-L${libffi_dir}/.libs"
--- 347,355 ----
      set libffi_dir  "${blddirffi}/.libs"
      verbose "libffi_dir $libffi_dir"
      if { $libffi_dir != "" } {
!         set libffi_dir [file dirname ${libffi_dir}]
! 	if [istarget *-*-darwin*] {
! 	    set libffi_link_flags "-B${libffi_dir}/.libs"
  	    lappend libffi_link_flags "-B${blddircxx}/src/.libs"
  	} else {
  	    set libffi_link_flags "-L${libffi_dir}/.libs"
*************** proc libffi_exit { } {
*** 354,361 ****
      global gluefile;
  
      if [info exists gluefile] {
! 	file_on_build delete $gluefile;
! 	unset gluefile;
      }
  }
  
--- 365,372 ----
      global gluefile;
  
      if [info exists gluefile] {
!         file_on_build delete $gluefile;
!         unset gluefile;
      }
  }
  
*************** proc libffi_target_compile { source dest
*** 370,377 ****
      global compiler_vendor
  
      if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
! 	lappend options "libs=${gluefile}"
! 	lappend options "ldflags=$wrap_flags"
      }
  
      if { $blddirffi != "" } {
--- 381,388 ----
      global compiler_vendor
  
      if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
!         lappend options "libs=${gluefile}"
!         lappend options "ldflags=$wrap_flags"
      }
  
      if { $blddirffi != "" } {
*************** proc libffi_target_compile { source dest
*** 384,429 ****
      # TOOL_OPTIONS must come first, so that it doesn't override testcase
      # specific options.
      if [info exists TOOL_OPTIONS] {
! 	lappend  options "additional_flags=$TOOL_OPTIONS"
      }
  
      # search for ffi_mips.h in srcdir, too
!     lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include  -I${libffi_include}/.."
!     lappend options "additional_flags=${libffi_link_flags}"
  
!     # Darwin needs a stack execution allowed flag.
  
!     if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
! 	 || [istarget "x86_64-*-darwin2*"] } {
! 	lappend options "additional_flags=-Wl,-allow_stack_execute"
! 	lappend options "additional_flags=-Wl,-search_paths_first"
!     }
  
!     # If you're building the compiler with --prefix set to a place
!     # where it's not yet installed, then the linker won't be able to
!     # find the libgcc used by libffi.dylib.  We could pass the
!     # -dylib_file option, but that's complicated, and it's much easier
!     # to just make the linker find libgcc using -L options.
!     if { [string match "*-*-darwin*" $target_triplet] } {
! 	lappend options "libs= -shared-libgcc"
!     }
  
!     if { [string match "*-*-openbsd*" $target_triplet] } {
! 	lappend options "libs= -lpthread"
!     }
  
!     lappend options "libs= -lffi"
  
!     if { [string match "aarch64*-*-linux*" $target_triplet] } {
! 	lappend options "libs= -lpthread"
!     }
  
!     if { [string match "*.cc" $source] } {
! 	lappend options "ldflags=-shared-libgcc -lstdc++"
      }
  
!     if { [string match "arc*-*-linux*" $target_triplet] } {
! 	lappend options "libs= -lpthread"
      }
  
      verbose "options: $options"
--- 395,453 ----
      # TOOL_OPTIONS must come first, so that it doesn't override testcase
      # specific options.
      if [info exists TOOL_OPTIONS] {
!         lappend  options "additional_flags=$TOOL_OPTIONS"
      }
  
      # search for ffi_mips.h in srcdir, too
!     # lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include  -I${libffi_include}/.."
!     lappend options "additional_flags=-I ../include -I ${srcdir}/../include  -I .."
!     if { [string match $type "executable"] } {
  
!         lappend options "additional_flags=${libffi_link_flags}"
  
!         # Darwin needs a stack execution allowed flag.
!         if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
!              || [istarget "*-*-darwin2*"] } {
!             # lappend options "additional_flags=-Wl,-allow_stack_execute"
!             lappend options "additional_flags=-Wno-unused-command-line-argument"
!             lappend options "additional_flags=-Wl,-search_paths_first"
!         }
  
!         # If you're building the compiler with --prefix set to a place
!         # where it's not yet installed, then the linker won't be able to
!         # find the libgcc used by libffi.dylib.  We could pass the
!         # -dylib_file option, but that's complicated, and it's much easier
!         # to just make the linker find libgcc using -L options.
!         if { [string match "*-*-darwin*" $target_triplet] } {
!             lappend options "libs= -shared-libgcc"
!         }
  
!         if { [string match "*-*-openbsd*" $target_triplet] } {
!             lappend options "libs= -lpthread"
!         }
  
!         lappend options "libs= -lffi"
  
!         if { [string match "aarch64*-*-linux*" $target_triplet] } {
!             if { ! [string match "*android*" $target_triplet] } {
!                 lappend options "libs= -lpthread"
!             }
!         }
  
!         if { [string match "*.cc" $source] } {
!             lappend options "ldflags=-shared-libgcc -lstdc++"
!         }
! 
!         if { [string match "arc*-*-linux*" $target_triplet] } {
!             lappend options "libs= -lpthread"
!         }
      }
  
!     # emscripten emits this warning while building the feature test
!     # which causes it to be seen as unsupported.
!     if { [string match "wasm32-*" $target_triplet] } {
!         lappend options "additional_flags=-Wno-unused-command-line-argument"
!         lappend options "libs= -lpthread"
      }
  
      verbose "options: $options"
*************** proc libffi_feature_test { test } {
*** 441,450 ****
      puts $f "#else"
      puts $f "# error Failed $test"
      puts $f "#endif"
      close $f
  
!     set lines [libffi_target_compile $src /dev/null assembly ""]
      file delete $src
  
      return [string match "" $lines]
  }
--- 465,476 ----
      puts $f "#else"
      puts $f "# error Failed $test"
      puts $f "#endif"
+     puts $f "int main() {return 0;}"
      close $f
  
!     set lines [libffi_target_compile $src $src.i preprocess ""]
      file delete $src
+     file delete $src.i
  
      return [string match "" $lines]
  }
*************** proc libffi_feature_test { test } {
*** 457,466 ****
  proc search_for { file pattern } {
      set fd [open $file r]
      while { [gets $fd cur_line]>=0 } {
! 	if [string match "*$pattern*" $cur_line] then {
! 	    close $fd
! 	    return 1
! 	}
      }
      close $fd
      return 0
--- 483,492 ----
  proc search_for { file pattern } {
      set fd [open $file r]
      while { [gets $fd cur_line]>=0 } {
!         if [string match "*$pattern*" $cur_line] then {
!             close $fd
!             return 1
!         }
      }
      close $fd
      return 0
*************** proc libffi-dg-runtest { testcases defau
*** 472,498 ****
      global runtests
  
      foreach test $testcases {
! 	# If we're only testing specific files and this isn't one of
! 	# them, skip it.
! 	if ![runtest_file_p $runtests $test] {
! 	    continue
! 	}
  
! 	# Look for a loop within the source code - if we don't find one,
! 	# don't pass -funroll[-all]-loops.
! 	global torture_with_loops torture_without_loops
! 	if [expr [search_for $test "for*("]+[search_for $test "while*("]] {
! 	    set option_list $torture_with_loops
! 	} else {
! 	    set option_list $torture_without_loops
! 	}
  
! 	set nshort [file tail [file dirname $test]]/[file tail $test]
  
! 	foreach flags $option_list {
! 	    verbose "Testing $nshort, $flags" 1
! 	    dg-test $test $flags ${default-extra-flags}
! 	}
      }
  }
  
--- 498,524 ----
      global runtests
  
      foreach test $testcases {
!         # If we're only testing specific files and this isn't one of
!         # them, skip it.
!         if ![runtest_file_p $runtests $test] {
!             continue
!         }
  
!         # Look for a loop within the source code - if we don't find one,
!         # don't pass -funroll[-all]-loops.
!         global torture_with_loops torture_without_loops
!         if [expr [search_for $test "for*("]+[search_for $test "while*("]] {
!             set option_list $torture_with_loops
!         } else {
!             set option_list $torture_without_loops
!         }
  
!         set nshort [file tail [file dirname $test]]/[file tail $test]
  
!         foreach flags $option_list {
!             verbose "Testing $nshort, $flags" 1
!             dg-test $test $flags ${default-extra-flags}
!         }
      }
  }
  
*************** proc run-many-tests { testcases extra_fl
*** 501,531 ****
      global has_gccbug
      global env
      switch $compiler_vendor {
!       "clang" {
!         set common "-W -Wall"
!         if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
! 	  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!         } else { 
!           set optimizations { "-O0" "-O2" }
          }
!       }
!       "gnu" {
!         set common "-W -Wall -Wno-psabi"
!         if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
! 	  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!         } else { 
!           set optimizations { "-O0" "-O2" }
          }
!       }
!       default {
!         # Assume we are using the vendor compiler.
!         set common ""
!         if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
! 	  set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!         } else { 
!           set optimizations { "" }
          }
-       }
      }
  
      info exists env(LD_LIBRARY_PATH)
--- 527,557 ----
      global has_gccbug
      global env
      switch $compiler_vendor {
!         "clang" {
!             set common "-W -Wall"
!             if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
!                 set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!             } else {
!                 set optimizations { "-O0" "-O2" }
!             }
          }
!         "gnu" {
!             set common "-W -Wall -Wno-psabi -fno-diagnostics-color"
!             if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
!                 set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!             } else {
!                 set optimizations { "-O0" "-O2" }
!             }
          }
!         default {
!             # Assume we are using the vendor compiler.
!             set common ""
!             if [info exists env(LIBFFI_TEST_OPTIMIZATION)] {
!                 set optimizations [ list $env(LIBFFI_TEST_OPTIMIZATION) ]
!             } else {
!                 set optimizations { "" }
!             }
          }
      }
  
      info exists env(LD_LIBRARY_PATH)
*************** proc run-many-tests { testcases extra_fl
*** 540,546 ****
                  "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__"
              }
          } elseif { [istarget "x86_64-*-*"] \
! 		   && [libffi_feature_test "#if !defined __ILP32__  \
  						&& !defined __i386__"] } {
              set targetabis {
                  ""
--- 566,572 ----
                  "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__"
              }
          } elseif { [istarget "x86_64-*-*"] \
!                        && [libffi_feature_test "#if !defined __ILP32__  \
  						&& !defined __i386__"] } {
              set targetabis {
                  ""
*************** proc run-many-tests { testcases extra_fl
*** 560,581 ****
          foreach opt $optimizations {
              foreach abi $abis {
                  set options [concat $common $opt $abi]
! 		set has_gccbug false;
! 		if { [string match $compiler_vendor "gnu"] \
! 			 && [string match "*MSABI*" $abi] \
! 			 && ( ( [string match "*DGTEST=57 *" $common] \
! 				    && [string match "*call.c*" $testname] ) \
! 				  || ( [string match "*DGTEST=54 *" $common] \
! 					   && [string match "*callback*" $testname] ) \
! 				  || [string match "*DGTEST=55 *" $common] \
! 				  || [string match "*DGTEST=56 *" $common] ) } then {
! 		    if [libffi_feature_test "#if (__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3))"] {
! 			set has_gccbug true;
! 		    }
! 		}
! 		verbose "Testing $testname, $options" 1
! 		verbose "has_gccbug = $has_gccbug" 1
! 		dg-test $test $options ""
              }
          }
      }
--- 586,607 ----
          foreach opt $optimizations {
              foreach abi $abis {
                  set options [concat $common $opt $abi]
!                 set has_gccbug false;
!                 if { [string match $compiler_vendor "gnu"] \
!                          && [string match "*MSABI*" $abi] \
!                          && ( ( [string match "*DGTEST=57 *" $common] \
!                                     && [string match "*call.c*" $testname] ) \
!                                   || ( [string match "*DGTEST=54 *" $common] \
!                                            && [string match "*callback*" $testname] ) \
!                                   || [string match "*DGTEST=55 *" $common] \
!                                   || [string match "*DGTEST=56 *" $common] ) } then {
!                     if [libffi_feature_test "#if (__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3))"] {
!                         set has_gccbug true;
!                     }
!                 }
!                 verbose "Testing $testname, $options" 1
!                 verbose "has_gccbug = $has_gccbug" 1
!                 dg-test $test $options ""
              }
          }
      }
*************** proc dg-xfail-if { args } {
*** 587,594 ****
      set args [lreplace $args 0 0]
      set selector "target [join [lindex $args 1]]"
      if { [dg-process-target $selector] == "S" } {
! 	global compiler_conditional_xfail_data
! 	set compiler_conditional_xfail_data $args
      }
  }
  
--- 613,620 ----
      set args [lreplace $args 0 0]
      set selector "target [join [lindex $args 1]]"
      if { [dg-process-target $selector] == "S" } {
!         global compiler_conditional_xfail_data
!         set compiler_conditional_xfail_data $args
      }
  }
  
*************** proc check-flags { args } {
*** 600,621 ****
      # The next two arguments are optional.  If they were not specified,
      # use the defaults.
      if { [llength $args] == 2 } {
! 	lappend $args [list "*"]
      }
      if { [llength $args] == 3 } {
! 	lappend $args [list ""]
      }
  
      # If the option strings are the defaults, or the same as the
      # defaults, there is no need to call check_conditional_xfail to
      # compare them to the actual options.
      if { [string compare [lindex $args 2] "*"] == 0
! 	 && [string compare [lindex $args 3] "" ] == 0 } {
! 	set result 1    
      } else {
! 	# The target list might be an effective-target keyword, so replace
! 	# the original list with "*-*-*", since we already know it matches.
! 	set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]]
      }
  
      return $result
--- 626,647 ----
      # The next two arguments are optional.  If they were not specified,
      # use the defaults.
      if { [llength $args] == 2 } {
!         lappend $args [list "*"]
      }
      if { [llength $args] == 3 } {
!         lappend $args [list ""]
      }
  
      # If the option strings are the defaults, or the same as the
      # defaults, there is no need to call check_conditional_xfail to
      # compare them to the actual options.
      if { [string compare [lindex $args 2] "*"] == 0
!          && [string compare [lindex $args 3] "" ] == 0 } {
!         set result 1
      } else {
!         # The target list might be an effective-target keyword, so replace
!         # the original list with "*-*-*", since we already know it matches.
!         set result [check_conditional_xfail [lreplace $args 1 1 "*-*-*"]]
      }
  
      return $result
*************** proc dg-skip-if { args } {
*** 631,637 ****
      # Don't bother if we're already skipping the test.
      upvar dg-do-what dg-do-what
      if { [lindex ${dg-do-what} 1] == "N" } {
!       return
      }
  
      set selector [list target [lindex $args 1]]
--- 657,663 ----
      # Don't bother if we're already skipping the test.
      upvar dg-do-what dg-do-what
      if { [lindex ${dg-do-what} 1] == "N" } {
!         return
      }
  
      set selector [list target [lindex $args 1]]
*************** if { [info procs saved-dg-test] == [list
*** 656,673 ****
      rename dg-test saved-dg-test
  
      proc dg-test { args } {
! 	global additional_files
! 	global additional_sources
! 	global errorInfo
  
! 	if { [ catch { eval saved-dg-test $args } errmsg ] } {
! 	    set saved_info $errorInfo
! 	    set additional_files ""
! 	    set additional_sources ""
! 	    error $errmsg $saved_info
! 	}
! 	set additional_files ""
! 	set additional_sources ""
      }
  }
  
--- 682,699 ----
      rename dg-test saved-dg-test
  
      proc dg-test { args } {
!         global additional_files
!         global additional_sources
!         global errorInfo
  
!         if { [ catch { eval saved-dg-test $args } errmsg ] } {
!             set saved_info $errorInfo
!             set additional_files ""
!             set additional_sources ""
!             error $errmsg $saved_info
!         }
!         set additional_files ""
!         set additional_sources ""
      }
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/lib/target-libpath.exp gcc-17-20260524/libffi/testsuite/lib/target-libpath.exp
*** gcc-17-20260517/libffi/testsuite/lib/target-libpath.exp	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/lib/target-libpath.exp	Sun May 24 22:32:13 2026
*************** proc set_ld_library_path_env_vars { } {
*** 175,181 ****
    } else {
      setenv DYLD_LIBRARY_PATH "$ld_library_path"
    }
!   if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
      if { $orig_path_saved } {
        setenv PATH "$ld_library_path:$orig_path"
      } else {
--- 175,181 ----
    } else {
      setenv DYLD_LIBRARY_PATH "$ld_library_path"
    }
!   if { [istarget *-*-cygwin*] || [ istarget *-*-msys* ] || [istarget *-*-mingw*] } {
      if { $orig_path_saved } {
        setenv PATH "$ld_library_path:$orig_path"
      } else {
*************** proc get_shlib_extension { } {
*** 271,277 ****
  
      if { [ istarget *-*-darwin* ] } {
  	set shlib_ext "dylib"
!     } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-mingw* ] } {
  	set shlib_ext "dll"
      } elseif { [ istarget hppa*-*-hpux* ] } {
  	set shlib_ext "sl"
--- 271,277 ----
  
      if { [ istarget *-*-darwin* ] } {
  	set shlib_ext "dylib"
!     } elseif { [ istarget *-*-cygwin* ] || [ istarget *-*-msys* ] || [ istarget *-*-mingw* ] } {
  	set shlib_ext "dll"
      } elseif { [ istarget hppa*-*-hpux* ] } {
  	set shlib_ext "sl"
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.bhaible/test-call.c gcc-17-20260524/libffi/testsuite/libffi.bhaible/test-call.c
*** gcc-17-20260517/libffi/testsuite/libffi.bhaible/test-call.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.bhaible/test-call.c	Sun May 24 22:32:13 2026
*************** int _fprintf(FILE *stream, const char *f
*** 50,55 ****
--- 50,56 ----
      case 3:
        vsprintf(&rbuf2[strlen(rbuf2)], format, args);
        printf("%s", rbuf2);
+       fflush (stdout);
        if (strcmp (rbuf1, rbuf2)) abort();
        break;
      }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.bhaible/testcases.c gcc-17-20260524/libffi/testsuite/libffi.bhaible/testcases.c
*** gcc-17-20260517/libffi/testsuite/libffi.bhaible/testcases.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.bhaible/testcases.c	Sun May 24 22:32:13 2026
***************
*** 21,27 ****
  
  #include <stdio.h>
  
! FILE* out;
  
  #define uchar unsigned char
  #define ushort unsigned short
--- 21,27 ----
  
  #include <stdio.h>
  
! FILE* out = NULL;
  
  #define uchar unsigned char
  #define ushort unsigned short
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/bpo_38748.c gcc-17-20260524/libffi/testsuite/libffi.call/bpo_38748.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/bpo_38748.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/bpo_38748.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,41 ----
+ /* Area:	bpo-38748
+    Purpose:	test for stdcall alignment problem
+    Source:      github.com/python/cpython/pull/26204 */
+ 
+ /* { dg-do run } */
+ 
+ #include "ffitest.h"
+ #include "ffi_common.h"
+ 
+ static UINT32 ABI_ATTR align_arguments(UINT32 l1,
+ 				       UINT64 l2)
+ {
+   return l1 + (UINT32) l2;
+ }
+ 
+ int main(void)
+ {
+   ffi_cif cif;
+   ffi_type *args[4] = {
+     &ffi_type_uint32,
+     &ffi_type_uint64
+   };
+   ffi_arg lr1, lr2;
+   UINT32 l1 = 1;
+   UINT64 l2 = 2;
+   void *values[2] = {&l1, &l2};
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2,
+ 		     &ffi_type_uint32, args) == FFI_OK);
+ 
+   lr1 = align_arguments(l1, l2);
+ 
+   ffi_call(&cif, FFI_FN(align_arguments), &lr2, values);
+ 
+   if (lr1 == lr2)
+     printf("bpo-38748 arguments tests ok!\n");
+   else
+     CHECK(0);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/callback.c gcc-17-20260524/libffi/testsuite/libffi.call/callback.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/callback.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/callback.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,99 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures with array and callback.
+    Limitations:	none.
+    PR:		none.
+    Originator:	David Tenty <daltenty@ibm.com>  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ static int i=5;
+ 
+ static void callback(void) { i++; }
+ 
+ typedef struct
+ {
+   unsigned char c1;
+   double s[2];
+   unsigned char c2;
+ } test_structure_12;
+ 
+ static test_structure_12 ABI_ATTR struct12 (test_structure_12 ts, void (*func)(void))
+ {
+   ts.c1 += 1;
+   ts.c2 += 1;
+   ts.s[0] += 1;
+   ts.s[1] += 1;
+ 
+   func();
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts12_type,ts12a_type;
+   ffi_type *ts12_type_elements[4];
+   ffi_type *ts12a_type_elements[3];
+ 
+   test_structure_12 ts12_arg;
+   void (*ptr)(void)=&callback;
+ 
+   test_structure_12 *ts12_result =
+     (test_structure_12 *) malloc (sizeof(test_structure_12));
+ 
+   ts12a_type.size = 0;
+   ts12a_type.alignment = 0;
+   ts12a_type.type = FFI_TYPE_STRUCT;
+   ts12a_type.elements = ts12a_type_elements;
+   ts12a_type_elements[0] = &ffi_type_double;
+   ts12a_type_elements[1] = &ffi_type_double;
+   ts12a_type_elements[2] = NULL;
+ 
+   ts12_type.size = 0;
+   ts12_type.alignment = 0;
+   ts12_type.type = FFI_TYPE_STRUCT;
+   ts12_type.elements = ts12_type_elements;
+   ts12_type_elements[0] = &ffi_type_uchar;
+   ts12_type_elements[1] = &ts12a_type;
+   ts12_type_elements[2] = &ffi_type_uchar;
+   ts12_type_elements[3] = NULL;
+ 
+ 
+   args[0] = &ts12_type;
+   args[1] = &ffi_type_pointer;
+   values[0] = &ts12_arg;
+   values[1] = &ptr;
+ 
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts12_type, args) == FFI_OK);
+ 
+   ts12_arg.c1 = 5;
+   ts12_arg.c2 = 6;
+   ts12_arg.s[0] = 7.77;
+   ts12_arg.s[1] = 8.88;
+ 
+   printf ("%u\n", ts12_arg.c1);
+   printf ("%u\n", ts12_arg.c2);
+   printf ("%g\n", ts12_arg.s[0]);
+   printf ("%g\n", ts12_arg.s[1]);
+   printf ("%d\n", i);
+ 
+   ffi_call(&cif, FFI_FN(struct12), ts12_result, values);
+ 
+   printf ("%u\n", ts12_result->c1);
+   printf ("%u\n", ts12_result->c2);
+   printf ("%g\n", ts12_result->s[0]);
+   printf ("%g\n", ts12_result->s[1]);
+   printf ("%d\n", i);
+   CHECK(ts12_result->c1 == 5 + 1);
+   CHECK(ts12_result->c2 == 6 + 1);
+   CHECK(ts12_result->s[0] == 7.77 + 1);
+   CHECK(ts12_result->s[1] == 8.88 + 1);
+   CHECK(i == 5 + 1);
+   CHECK(ts12_type.size == sizeof(test_structure_12));
+ 
+   free (ts12_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/callback2.c gcc-17-20260524/libffi/testsuite/libffi.call/callback2.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/callback2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/callback2.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,108 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures with nested array and callback.
+    Limitations:	none.
+    PR:		none.
+    Originator:	David Tenty <daltenty@ibm.com>  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ static int i=5;
+ 
+ static void callback(void) { i++; }
+ 
+ typedef struct
+ {
+   struct { double d; } s1;
+   double s[2];
+   unsigned char c2;
+ } test_structure_12;
+ 
+ static test_structure_12 ABI_ATTR struct12 (test_structure_12 ts, void (*func)(void))
+ {
+   ts.s1.d += 1;
+   ts.c2 += 1;
+   ts.s[0] += 1;
+   ts.s[1] += 1;
+ 
+   func();
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts12_type,ts12a_type, ts12b_type;
+   ffi_type *ts12_type_elements[4];
+   ffi_type *ts12a_type_elements[2];
+   ffi_type *ts12b_type_elements[3];
+ 
+ 
+   test_structure_12 ts12_arg;
+   void (*ptr)(void)=&callback;
+ 
+   test_structure_12 *ts12_result =
+     (test_structure_12 *) malloc (sizeof(test_structure_12));
+ 
+   ts12a_type.size = 0;
+   ts12a_type.alignment = 0;
+   ts12a_type.type = FFI_TYPE_STRUCT;
+   ts12a_type.elements = ts12a_type_elements;
+   ts12a_type_elements[0] = &ffi_type_double;
+   ts12a_type_elements[1] = NULL;
+ 
+   ts12b_type.size = 0;
+   ts12b_type.alignment = 0;
+   ts12b_type.type = FFI_TYPE_STRUCT;
+   ts12b_type.elements = ts12b_type_elements;
+   ts12b_type_elements[0] = &ffi_type_double;
+   ts12b_type_elements[1] = &ffi_type_double;
+   ts12b_type_elements[2] = NULL;
+ 
+   ts12_type.size = 0;
+   ts12_type.alignment = 0;
+   ts12_type.type = FFI_TYPE_STRUCT;
+   ts12_type.elements = ts12_type_elements;
+   ts12_type_elements[0] = &ts12a_type;
+   ts12_type_elements[1] = &ts12b_type;
+   ts12_type_elements[2] = &ffi_type_uchar;
+   ts12_type_elements[3] = NULL;
+ 
+ 
+   args[0] = &ts12_type;
+   args[1] = &ffi_type_pointer;
+   values[0] = &ts12_arg;
+   values[1] = &ptr;
+ 
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts12_type, args) == FFI_OK);
+ 
+   ts12_arg.s1.d = 5.55;
+   ts12_arg.c2 = 6;
+   ts12_arg.s[0] = 7.77;
+   ts12_arg.s[1] = 8.88;
+ 
+   printf ("%g\n", ts12_arg.s1.d);
+   printf ("%u\n", ts12_arg.c2);
+   printf ("%g\n", ts12_arg.s[0]);
+   printf ("%g\n", ts12_arg.s[1]);
+   printf ("%d\n", i);
+ 
+   ffi_call(&cif, FFI_FN(struct12), ts12_result, values);
+ 
+   printf ("%g\n", ts12_result->s1.d);
+   printf ("%u\n", ts12_result->c2);
+   printf ("%g\n", ts12_result->s[0]);
+   printf ("%g\n", ts12_result->s[1]);
+   printf ("%d\n", i);
+   CHECK(ts12_result->s1.d == 5.55 + 1);
+   CHECK(ts12_result->c2 == 6 + 1);
+   CHECK(ts12_result->s[0] == 7.77 + 1);
+   CHECK(ts12_result->s[1] == 8.88 + 1);
+   CHECK(i == 5 + 1);
+   CHECK(ts12_type.size == sizeof(test_structure_12));
+ 
+   free (ts12_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/callback3.c gcc-17-20260524/libffi/testsuite/libffi.call/callback3.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/callback3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/callback3.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,114 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures with array and callback.
+    Limitations:	none.
+    PR:		none.
+    Originator:	David Tenty <daltenty@ibm.com>  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ static int i=5;
+ 
+ static void callback(void) { i++; }
+ 
+ 
+ typedef struct
+ {
+   struct { unsigned char c; double d; } s1;
+   double s[2];
+   unsigned char c2;
+ } test_structure_12;
+ 
+ static test_structure_12 ABI_ATTR struct12 (test_structure_12 ts, void (*func)(void))
+ {
+   ts.s1.c += 1;
+   ts.s1.d += 1;
+   ts.c2 += 1;
+   ts.s[0] += 1;
+   ts.s[1] += 1;
+ 
+   func();
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts12_type,ts12b_type, ts12a_type;
+   ffi_type *ts12_type_elements[4];
+   ffi_type *ts12b_type_elements[3];
+   ffi_type *ts12a_type_elements[3];
+ 
+   test_structure_12 ts12_arg;
+   void (*ptr)(void)=&callback;
+ 
+   test_structure_12 *ts12_result =
+     (test_structure_12 *) malloc (sizeof(test_structure_12));
+ 
+   ts12a_type.size = 0;
+   ts12a_type.alignment = 0;
+   ts12a_type.type = FFI_TYPE_STRUCT;
+   ts12a_type.elements = ts12a_type_elements;
+   ts12a_type_elements[0] = &ffi_type_uchar;
+   ts12a_type_elements[1] = &ffi_type_double;
+   ts12a_type_elements[2] = NULL;
+ 
+   ts12b_type.size = 0;
+   ts12b_type.alignment = 0;
+   ts12b_type.type = FFI_TYPE_STRUCT;
+   ts12b_type.elements = ts12b_type_elements;
+   ts12b_type_elements[0] = &ffi_type_double;
+   ts12b_type_elements[1] = &ffi_type_double;
+   ts12b_type_elements[2] = NULL;
+ 
+   ts12_type.size = 0;
+   ts12_type.alignment = 0;
+   ts12_type.type = FFI_TYPE_STRUCT;
+   ts12_type.elements = ts12_type_elements;
+   ts12_type_elements[0] = &ts12a_type;
+   ts12_type_elements[1] = &ts12b_type;
+   ts12_type_elements[2] = &ffi_type_uchar;
+   ts12_type_elements[3] = NULL;
+ 
+ 
+   args[0] = &ts12_type;
+   args[1] = &ffi_type_pointer;
+   values[0] = &ts12_arg;
+   values[1] = &ptr;
+ 
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts12_type, args) == FFI_OK);
+ 
+   ts12_arg.s1.c = 5;
+   ts12_arg.s1.d = 5.55;
+   ts12_arg.c2 = 6;
+   ts12_arg.s[0] = 7.77;
+   ts12_arg.s[1] = 8.88;
+ 
+   printf ("%d\n", ts12_arg.s1.c);
+   printf ("%g\n", ts12_arg.s1.d);
+   printf ("%u\n", ts12_arg.c2);
+   printf ("%g\n", ts12_arg.s[0]);
+   printf ("%g\n", ts12_arg.s[1]);
+   printf ("%d\n", i);
+ 
+   ffi_call(&cif, FFI_FN(struct12), ts12_result, values);
+ 
+   printf ("%d\n", ts12_result->s1.c);
+   printf ("%g\n", ts12_result->s1.d);
+   printf ("%u\n", ts12_result->c2);
+   printf ("%g\n", ts12_result->s[0]);
+   printf ("%g\n", ts12_result->s[1]);
+   printf ("%d\n", i);
+   CHECK(ts12_result->s1.c == 5 + 1);
+   CHECK(ts12_result->s1.d == 5.55 + 1);
+   CHECK(ts12_result->c2 == 6 + 1);
+   CHECK(ts12_result->s[0] == 7.77 + 1);
+   CHECK(ts12_result->s[1] == 8.88 + 1);
+   CHECK(i == 5 + 1);
+   CHECK(ts12_type.size == sizeof(test_structure_12));
+ 
+   free (ts12_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/callback4.c gcc-17-20260524/libffi/testsuite/libffi.call/callback4.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/callback4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/callback4.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,119 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures with array and callback.
+    Limitations:	none.
+    PR:		none.
+    Originator:	David Tenty <daltenty@ibm.com>  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ static int i=5;
+ 
+ static void callback(void) { i++; }
+ 
+ 
+ typedef struct
+ {
+   unsigned char c1;
+   struct { double d; unsigned char c; } s[2];
+   unsigned char c2;
+ } test_structure_12;
+ 
+ static test_structure_12 ABI_ATTR struct12 (test_structure_12 ts, void (*func)(void))
+ {
+   ts.c1 += 1;
+   ts.s[0].d += 1;
+   ts.s[0].c += 1;
+   ts.s[1].d += 1;
+   ts.s[1].c += 1;
+   ts.c2 += 1;
+ 
+   func();
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts12_type,ts12b_type, ts12a_type;
+   ffi_type *ts12_type_elements[4];
+   ffi_type *ts12b_type_elements[3];
+   ffi_type *ts12a_type_elements[3];
+ 
+   test_structure_12 ts12_arg;
+   void (*ptr)(void)=&callback;
+ 
+   test_structure_12 *ts12_result =
+     (test_structure_12 *) malloc (sizeof(test_structure_12));
+ 
+   ts12a_type.size = 0;
+   ts12a_type.alignment = 0;
+   ts12a_type.type = FFI_TYPE_STRUCT;
+   ts12a_type.elements = ts12a_type_elements;
+   ts12a_type_elements[0] = &ffi_type_double;
+   ts12a_type_elements[1] = &ffi_type_uchar;
+   ts12a_type_elements[2] = NULL;
+ 
+   ts12b_type.size = 0;
+   ts12b_type.alignment = 0;
+   ts12b_type.type = FFI_TYPE_STRUCT;
+   ts12b_type.elements = ts12b_type_elements;
+   ts12b_type_elements[0] = &ts12a_type;
+   ts12b_type_elements[1] = &ts12a_type;
+   ts12b_type_elements[2] = NULL;
+ 
+   ts12_type.size = 0;
+   ts12_type.alignment = 0;
+   ts12_type.type = FFI_TYPE_STRUCT;
+   ts12_type.elements = ts12_type_elements;
+   ts12_type_elements[0] = &ffi_type_uchar;
+   ts12_type_elements[1] = &ts12b_type;
+   ts12_type_elements[2] = &ffi_type_uchar;
+   ts12_type_elements[3] = NULL;
+ 
+ 
+   args[0] = &ts12_type;
+   args[1] = &ffi_type_pointer;
+   values[0] = &ts12_arg;
+   values[1] = &ptr;
+ 
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &ts12_type, args) == FFI_OK);
+ 
+   ts12_arg.c1 = 5;
+   ts12_arg.s[0].d = 5.55;
+   ts12_arg.s[0].c = 6;
+   ts12_arg.s[1].d = 7.77;
+   ts12_arg.s[1].c = 8;
+   ts12_arg.c2 = 9;
+ 
+   printf ("%u\n", ts12_arg.c1);
+   printf ("%g\n", ts12_arg.s[0].d);
+   printf ("%u\n", ts12_arg.s[0].c);
+   printf ("%g\n", ts12_arg.s[1].d);
+   printf ("%u\n", ts12_arg.s[1].c);
+   printf ("%u\n", ts12_arg.c2);
+   printf ("%d\n", i);
+ 
+   ffi_call(&cif, FFI_FN(struct12), ts12_result, values);
+ 
+   printf ("%u\n", ts12_result->c1);
+   printf ("%g\n", ts12_result->s[0].d);
+   printf ("%u\n", ts12_result->s[0].c);
+   printf ("%g\n", ts12_result->s[1].d);
+   printf ("%u\n", ts12_result->s[1].c);
+   printf ("%u\n", ts12_result->c2);
+   printf ("%d\n", i);
+   CHECK(ts12_result->c1 == 5 + 1);
+   CHECK(ts12_result->s[0].d == 5.55 + 1);
+   CHECK(ts12_result->s[0].c == 6 + 1);
+   CHECK(ts12_result->s[1].d == 7.77 + 1);
+   CHECK(ts12_result->s[1].c == 8 + 1);
+   CHECK(ts12_result->c2 == 9 + 1);
+   CHECK(i == 5 + 1);
+   CHECK(ts12_type.size == sizeof(test_structure_12));
+ 
+   free (ts12_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/ffitest.h gcc-17-20260524/libffi/testsuite/libffi.call/ffitest.h
*** gcc-17-20260517/libffi/testsuite/libffi.call/ffitest.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/ffitest.h	Sun May 24 22:32:13 2026
***************
*** 1,3 ****
--- 1,6 ----
+ #undef __USE_MINGW_ANSI_STDIO
+ #define __USE_MINGW_ANSI_STDIO 1
+ 
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
***************
*** 5,10 ****
--- 8,16 ----
  #include <ffi.h>
  #include "fficonfig.h"
  
+ #include <float.h>
+ #include <math.h>
+ 
  #if defined HAVE_STDINT_H
  #include <stdint.h>
  #endif
***************
*** 23,28 ****
--- 29,50 ----
        } \
     } while(0)
  
+ #define CHECK_FLOAT_EQ(x, y) \
+    do { \
+       if(fabs((x) - (y)) > FLT_EPSILON){ \
+          printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
+          abort(); \
+       } \
+    } while(0)
+ 
+ #define CHECK_DOUBLE_EQ(x, y) \
+    do { \
+       if(fabs((x) - (y)) > DBL_EPSILON){ \
+          printf("Check failed CHECK_FLOAT_EQ(%s, %s)\n", #x, #y); \
+          abort(); \
+       } \
+    } while(0)
+ 
  /* Define macros so that compilers other than gcc can run the tests.  */
  #undef __UNUSED__
  #if defined(__GNUC__)
***************
*** 69,76 ****
  
  #endif
  
! /* MinGW kludge.  */
! #if defined(_WIN64) | defined(_WIN32)
  #define PRIdLL "I64d"
  #define PRIuLL "I64u"
  #else
--- 91,98 ----
  
  #endif
  
! /* msvc kludge.  */
! #if defined(_MSC_VER)
  #define PRIdLL "I64d"
  #define PRIuLL "I64u"
  #else
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/float_va.c gcc-17-20260524/libffi/testsuite/libffi.call/float_va.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/float_va.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/float_va.c	Sun May 24 22:32:13 2026
*************** int main (void)
*** 74,79 ****
--- 74,80 ----
    /* { dg-output "\n0: 2.0 : total: 2.0" } */
    printf("ffi: %.1f\n", resfp);
    /* { dg-output "\nffi: 2.0" } */
+   CHECK_DOUBLE_EQ(resfp, 2);
  
    /* Second test, float_va_fn(2,2.0,3.0,4.0), now with variadic params */
    /* Call it statically and then via ffi */
*************** int main (void)
*** 81,86 ****
--- 82,88 ----
    /* { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" } */
    printf("compiled: %.1f\n", resfp);
    /* { dg-output "\ncompiled: 11.0" } */
+   CHECK_DOUBLE_EQ(resfp, 11);
  
    arg_types[0] = &ffi_type_uint;
    arg_types[1] = &ffi_type_double;
*************** int main (void)
*** 102,107 ****
--- 104,110 ----
    /* { dg-output "\n2: 2.0 : 0:3.0  1:4.0  total: 11.0" } */
    printf("ffi: %.1f\n", resfp);
    /* { dg-output "\nffi: 11.0" } */
+   CHECK_DOUBLE_EQ(resfp, 11);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/longjmp.c gcc-17-20260524/libffi/testsuite/libffi.call/longjmp.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/longjmp.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/longjmp.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,60 ----
+ /* Area:	ffi_call
+    Purpose:	Test longjmp over ffi_call frames */
+ 
+ /* Test code adapted from Lars Kanis' bug report:
+    https://github.com/libffi/libffi/issues/905 */
+ 
+ /* { dg-do run } */
+ 
+ #include "ffitest.h"
+ #include "ffi_common.h"
+ 
+ #include <setjmp.h>
+ 
+ static jmp_buf buf;
+ 
+ static void ABI_ATTR lev2(const char *str) {
+   printf("lev2 %s\n", str);
+   // jumps back to where setjmp was called - making setjmp now return 1
+   longjmp(buf, 1);
+ }
+ 
+ static void ABI_ATTR lev1(const char *str) {
+   lev2(str);
+ 
+   // will not be reached
+   printf("lev1 %s\n", str);
+ }
+ 
+ int main()
+ {
+   ffi_cif cif;
+   ffi_type *args[1];
+   void *values[1];
+   char *s;
+   ffi_arg rc;
+   /* Initialize the argument info vectors */
+   args[0] = &ffi_type_pointer;
+   values[0] = &s;
+   /* Initialize the cif */
+   if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
+     &ffi_type_sint, args) == FFI_OK)
+   {
+     s = "direct call";
+     if (!setjmp(buf)){
+       // works on x64 and arm64
+       lev1(s);
+     } else {
+       printf("back to main\n");
+     }
+ 
+     s = "through libffi";
+     if (!setjmp(buf)){
+       // works on x64 but segfaults on arm64
+       ffi_call(&cif, (void (*)(void))lev1, &rc, values);
+     } else {
+       printf("back to main\n");
+     }
+   }
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/overread.c gcc-17-20260524/libffi/testsuite/libffi.call/overread.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/overread.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/overread.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,54 ----
+ /* Area:        ffi_call
+    Purpose:     Tests if ffi_call reads data beyond end.
+    Limitations: needs mmap.
+    PR:          887
+    Originator:  Mikulas Patocka <mikulas@twibright.com>  */
+ 
+ /* { dg-do run } */
+ 
+ #include "ffitest.h"
+ 
+ #ifdef __linux__
+ #include <sys/mman.h>
+ #include <unistd.h>
+ 
+ static int ABI_ATTR fn(unsigned char a, unsigned short b, unsigned int c, unsigned long d)
+ {
+ 	return (int)(a + b + c + d);
+ }
+ #endif
+ 
+ int main(void)
+ {
+ #ifdef __linux__
+ 	ffi_cif cif;
+ 	ffi_type *args[MAX_ARGS];
+ 	void *values[MAX_ARGS];
+ 	ffi_arg rint;
+ 	char *m;
+ 	int ps;
+ 	args[0] = &ffi_type_uchar;
+ 	args[1] = &ffi_type_ushort;
+ 	args[2] = &ffi_type_uint;
+ 	args[3] = &ffi_type_ulong;
+ 	CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, &ffi_type_sint, args) == FFI_OK);
+ 	ps = getpagesize();
+ 	m = mmap(NULL, ps * 3, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ 	CHECK(m != MAP_FAILED);
+ 	CHECK(mprotect(m, ps, PROT_NONE) == 0);
+ 	CHECK(mprotect(m + ps * 2, ps, PROT_NONE) == 0);
+ 	values[0] = m + ps * 2 - sizeof(unsigned char);
+ 	values[1] = m + ps * 2 - sizeof(unsigned short);
+ 	values[2] = m + ps * 2 - sizeof(unsigned int);
+ 	values[3] = m + ps * 2 - sizeof(unsigned long);
+ 	ffi_call(&cif, FFI_FN(fn), &rint, values);
+ 	CHECK((int)rint == 0);
+ 	values[0] = m + ps;
+ 	values[1] = m + ps;
+ 	values[2] = m + ps;
+ 	values[3] = m + ps;
+ 	ffi_call(&cif, FFI_FN(fn), &rint, values);
+ 	CHECK((int)rint == 0);
+ #endif
+ 	exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/pyobjc_tc.c gcc-17-20260524/libffi/testsuite/libffi.call/pyobjc_tc.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/pyobjc_tc.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/pyobjc_tc.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,114 ----
+ /* Area:	ffi_call
+    Purpose:	Check different structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	Ronald Oussoren <oussoren@cistron.nl> 20030824	*/
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct Point {
+ 	float x;
+ 	float y;
+ } Point;
+ 
+ typedef struct Size {
+ 	float h;
+ 	float w;
+ } Size;
+ 
+ typedef struct Rect {
+ 	Point o;
+ 	Size  s;
+ } Rect;
+ 
+ int doit(int o, char* s, Point p, Rect r, int last)
+ {
+ 	printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
+ 		o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last);
+ 	return 42;
+ }
+ 
+ 
+ int main(void)
+ {
+ 	ffi_type point_type;
+ 	ffi_type size_type;
+ 	ffi_type rect_type;
+ 	ffi_cif cif;
+ 	ffi_type* arglist[6];
+ 	void* values[6];
+ 	int r;
+ 
+ 	/*
+ 	 *  First set up FFI types for the 3 struct types
+ 	 */
+ 
+ 	point_type.size = 0; /*sizeof(Point);*/
+ 	point_type.alignment = 0; /*__alignof__(Point);*/
+ 	point_type.type = FFI_TYPE_STRUCT;
+ 	point_type.elements = malloc(3 * sizeof(ffi_type*));
+ 	point_type.elements[0] = &ffi_type_float;
+ 	point_type.elements[1] = &ffi_type_float;
+ 	point_type.elements[2] = NULL;
+ 
+ 	size_type.size = 0;/* sizeof(Size);*/
+ 	size_type.alignment = 0;/* __alignof__(Size);*/
+ 	size_type.type = FFI_TYPE_STRUCT;
+ 	size_type.elements = malloc(3 * sizeof(ffi_type*));
+ 	size_type.elements[0] = &ffi_type_float;
+ 	size_type.elements[1] = &ffi_type_float;
+ 	size_type.elements[2] = NULL;
+ 
+ 	rect_type.size = 0;/*sizeof(Rect);*/
+ 	rect_type.alignment =0;/* __alignof__(Rect);*/
+ 	rect_type.type = FFI_TYPE_STRUCT;
+ 	rect_type.elements = malloc(3 * sizeof(ffi_type*));
+ 	rect_type.elements[0] = &point_type;
+ 	rect_type.elements[1] = &size_type;
+ 	rect_type.elements[2] = NULL;
+ 
+ 	/*
+ 	 * Create a CIF
+ 	 */
+ 	arglist[0] = &ffi_type_sint;
+ 	arglist[1] = &ffi_type_pointer;
+ 	arglist[2] = &point_type;
+ 	arglist[3] = &rect_type;
+ 	arglist[4] = &ffi_type_sint;
+ 	arglist[5] = NULL;
+ 
+ 	r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
+ 			5, &ffi_type_sint, arglist);
+ 	if (r != FFI_OK) {
+ 		abort();
+ 	}
+ 
+ 
+ 	/* And call the function through the CIF */
+ 
+ 	{
+ 	Point p = { 1.0, 2.0 };
+ 	Rect  r = { { 9.0, 10.0}, { -1.0, -2.0 } };
+ 	int   o = 0;
+ 	int   l = 42;
+ 	char* m = "myMethod";
+ 	ffi_arg result;
+ 
+ 	values[0] = &o;
+ 	values[1] = &m;
+ 	values[2] = &p;
+ 	values[3] = &r;
+ 	values[4] = &l;
+ 	values[5] = NULL;
+ 
+ 	printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
+ 		o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l);
+ 
+ 	ffi_call(&cif, FFI_FN(doit), &result, values);
+ 
+ 	printf ("The result is %d\n", (int)result);
+ 
+ 	}
+ 	exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/return_ll1.c gcc-17-20260524/libffi/testsuite/libffi.call/return_ll1.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/return_ll1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/return_ll1.c	Sun May 24 22:32:13 2026
***************
*** 9,14 ****
--- 9,17 ----
  #include "ffitest.h"
  static long long return_ll(int ll0, long long ll1, int ll2)
  {
+   CHECK(ll0 == 11111111);
+   CHECK(ll1 == 11111111111000LL);
+   CHECK(ll2 == 11111111);
    return ll0 + ll1 + ll2;
  }
  
*************** int main (void)
*** 39,43 ****
--- 42,48 ----
    ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
    printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
    /* { dg-output "res: 11111133333222, 11111133333222" } */
+   CHECK(rlonglong == 11111133333222);
+   CHECK(ll0 + ll1 + ll2 == 11111133333222);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/return_sl.c gcc-17-20260524/libffi/testsuite/libffi.call/return_sl.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/return_sl.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/return_sl.c	Sun May 24 22:32:13 2026
***************
*** 8,13 ****
--- 8,15 ----
  #include "ffitest.h"
  static long return_sl(long l1, long l2)
  {
+   CHECK(l1 == 1073741823L);
+   CHECK(l2 == 1073741824L);
    return l1 - l2;
  }
  
*************** int main (void)
*** 33,38 ****
--- 35,42 ----
    ffi_call(&cif, FFI_FN(return_sl), &res, values);
    printf("res: %ld, %ld\n", (long)res, l1 - l2);
    /* { dg-output "res: -1, -1" } */
+   CHECK((long)res == -1);
+   CHECK(l1 + 1 == l2);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/return_ul.c gcc-17-20260524/libffi/testsuite/libffi.call/return_ul.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/return_ul.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/return_ul.c	Sun May 24 22:32:13 2026
***************
*** 8,13 ****
--- 8,15 ----
  #include "ffitest.h"
  static unsigned long return_ul(unsigned long ul1, unsigned long ul2)
  {
+   CHECK(ul1 == 1073741823L);
+   CHECK(ul2 == 1073741824L);
    return ul1 + ul2;
  }
  
*************** int main (void)
*** 33,38 ****
--- 35,42 ----
    ffi_call(&cif, FFI_FN(return_ul), &res, values);
    printf("res: %lu, %lu\n", (unsigned long)res, ul1 + ul2);
    /* { dg-output "res: 2147483647, 2147483647" } */
+   CHECK(res == 2147483647L);
+   CHECK(ul1 + ul2 == 2147483647L);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/s55.c gcc-17-20260524/libffi/testsuite/libffi.call/s55.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/s55.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/s55.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,60 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   float f;
+ } s55;
+ 
+ static s55 ABI_ATTR f55(s55 ts, float f)
+ {
+   s55 r;
+   r.f = ts.f + f;
+   printf ("f55>> %g + %g = %g\n", ts.f, f, r.f);
+   return r;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   s55 F, Fr;
+   float f;
+   void *values[] = { &F, &f };
+   ffi_type s55_type;
+   ffi_type *args[] = { &s55_type, &ffi_type_float };
+   ffi_type *s55_type_elements[] = { &ffi_type_float, NULL };
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   s55 *s55_result =
+     (s55 *) malloc (sizeof(s55));
+ 
+   s55_type.size = 0;
+   s55_type.alignment = 0;
+   s55_type.type = FFI_TYPE_STRUCT;
+   s55_type.elements = s55_type_elements;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, &s55_type, args) == FFI_OK);
+ 
+   F.f = 1;
+   Fr = f55(F, 2.14);
+   printf ("%g\n", Fr.f);
+ 
+   F.f = 1;
+   f = 2.14;
+   ffi_call(&cif, FFI_FN(f55), s55_result, values);
+   printf ("%g\n", s55_result->f);
+ 
+   fflush(0);
+ 
+   CHECK(fabs(Fr.f - s55_result->f) < FLT_EPSILON);
+ 
+   free (s55_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/strlen.c gcc-17-20260524/libffi/testsuite/libffi.call/strlen.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/strlen.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/strlen.c	Sun May 24 22:32:13 2026
***************
*** 7,15 ****
  /* { dg-do run } */
  #include "ffitest.h"
  
! static size_t ABI_ATTR my_strlen(char *s)
  {
!   return (strlen(s));
  }
  
  int main (void)
--- 7,15 ----
  /* { dg-do run } */
  #include "ffitest.h"
  
! static unsigned int ABI_ATTR my_strlen(char *s)
  {
!   return (unsigned int) (strlen(s));
  }
  
  int main (void)
*************** int main (void)
*** 22,44 ****
  
    args[0] = &ffi_type_pointer;
    values[0] = (void*) &s;
!   
    /* Initialize the cif */
    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
! 		     &ffi_type_sint, args) == FFI_OK);
!   
    s = "a";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 1);
!   
    s = "1234567";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 7);
!   
    s = "1234567890123456789012345";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 25);
!   
    exit (0);
  }
-   
--- 22,43 ----
  
    args[0] = &ffi_type_pointer;
    values[0] = (void*) &s;
! 
    /* Initialize the cif */
    CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
! 		     &ffi_type_uint, args) == FFI_OK);
! 
    s = "a";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 1);
! 
    s = "1234567";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 7);
! 
    s = "1234567890123456789012345";
    ffi_call(&cif, FFI_FN(my_strlen), &rint, values);
    CHECK(rint == 25);
! 
    exit (0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/strlen2.c gcc-17-20260524/libffi/testsuite/libffi.call/strlen2.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/strlen2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/strlen2.c	Sun May 24 22:32:13 2026
***************
*** 8,16 ****
  
  #include "ffitest.h"
  
! static size_t ABI_ATTR my_f(char *s, float a)
  {
!   return (size_t) ((int) strlen(s) + (int) a);
  }
  
  int main (void)
--- 8,16 ----
  
  #include "ffitest.h"
  
! static int ABI_ATTR my_f(char *s, float a)
  {
!   return (int) strlen(s) + (int) a;
  }
  
  int main (void)
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/strlen3.c gcc-17-20260524/libffi/testsuite/libffi.call/strlen3.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/strlen3.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/strlen3.c	Sun May 24 22:32:13 2026
***************
*** 8,16 ****
  
  #include "ffitest.h"
  
! static size_t ABI_ATTR my_f(float a, char *s)
  {
!   return (size_t) ((int) strlen(s) + (int) a);
  }
  
  int main (void)
--- 8,16 ----
  
  #include "ffitest.h"
  
! static int ABI_ATTR my_f(float a, char *s)
  {
!   return (int) strlen(s) + (int) a;
  }
  
  int main (void)
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/strlen4.c gcc-17-20260524/libffi/testsuite/libffi.call/strlen4.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/strlen4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/strlen4.c	Sun May 24 22:32:13 2026
***************
*** 8,16 ****
  
  #include "ffitest.h"
  
! static size_t ABI_ATTR my_f(float a, char *s, int i)
  {
!   return (size_t) ((int) strlen(s) + (int) a + i);
  }
  
  int main (void)
--- 8,16 ----
  
  #include "ffitest.h"
  
! static int ABI_ATTR my_f(float a, char *s, int i)
  {
!   return (int) strlen(s) + (int) a + i;
  }
  
  int main (void)
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct10.c gcc-17-20260524/libffi/testsuite/libffi.call/struct10.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct10.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct10.c	Sun May 24 22:32:13 2026
*************** struct s {
*** 16,22 ****
    signed char s8;
  };
  
! struct s make_s(void) {
    struct s r;
    r.s32 = 0x1234;
    r.f32 = 7.0;
--- 16,22 ----
    signed char s8;
  };
  
! struct s ABI_ATTR make_s(void) {
    struct s r;
    r.s32 = 0x1234;
    r.f32 = 7.0;
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_2.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_2.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_2.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,63 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned int ui01;
+   unsigned int ui02;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.ui02++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[3];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_uint;
+   ts1_type_elements[1] = &ffi_type_uint;
+   ts1_type_elements[2] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.ui02 = 555;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(ts1_result->ui02 == 556);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(ts1_arg.ui02 == 555);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_3.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_3.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_3.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,65 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned int ui01;
+   unsigned int ui02;
+   unsigned int ui03;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.ui03++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[4];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_uint;
+   ts1_type_elements[1] = &ffi_type_uint;
+   ts1_type_elements[2] = &ffi_type_uint;
+   ts1_type_elements[3] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.ui03 = 555;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(ts1_result->ui03 == 556);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(ts1_arg.ui03 == 555);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_3f.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_3f.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_3f.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_3f.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,65 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   float f01;
+   float f02;
+   float f03;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.f03++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[5];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_float;
+   ts1_type_elements[1] = &ffi_type_float;
+   ts1_type_elements[2] = &ffi_type_float;
+   ts1_type_elements[3] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.f03 = 555.5;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(fabs(ts1_result->f03 - 556.5) < FLT_EPSILON);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(fabs(ts1_arg.f03 - 555.5) < FLT_EPSILON);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_4.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_4.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_4.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,67 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned int ui01;
+   unsigned int ui02;
+   unsigned int ui03;
+   unsigned int ui04;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.ui04++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[5];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_uint;
+   ts1_type_elements[1] = &ffi_type_uint;
+   ts1_type_elements[2] = &ffi_type_uint;
+   ts1_type_elements[3] = &ffi_type_uint;
+   ts1_type_elements[4] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.ui04 = 555;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(ts1_result->ui04 == 556);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(ts1_arg.ui04 == 555);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_4f.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_4f.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_4f.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_4f.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,67 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   float f01;
+   float f02;
+   float f03;
+   float f04;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.f04++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[5];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_float;
+   ts1_type_elements[1] = &ffi_type_float;
+   ts1_type_elements[2] = &ffi_type_float;
+   ts1_type_elements[3] = &ffi_type_float;
+   ts1_type_elements[4] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.f04 = 555.5;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(fabs(ts1_result->f04 - 556.5) < FLT_EPSILON);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(fabs(ts1_arg.f04 - 555.5) < FLT_EPSILON);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_big.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_big.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_big.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_big.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,93 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned int ui01;
+   unsigned int ui02;
+   unsigned int ui03;
+   unsigned int ui04;
+   unsigned int ui05;
+   unsigned int ui06;
+   unsigned int ui07;
+   unsigned int ui08;
+   unsigned int ui09;
+   unsigned int ui10;
+   unsigned int ui11;
+   unsigned int ui12;
+   unsigned int ui13;
+   unsigned int ui14;
+   unsigned int ui15;
+   unsigned int ui16;
+   unsigned int ui17;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.ui17++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[18];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_uint;
+   ts1_type_elements[1] = &ffi_type_uint;
+   ts1_type_elements[2] = &ffi_type_uint;
+   ts1_type_elements[3] = &ffi_type_uint;
+   ts1_type_elements[4] = &ffi_type_uint;
+   ts1_type_elements[5] = &ffi_type_uint;
+   ts1_type_elements[6] = &ffi_type_uint;
+   ts1_type_elements[7] = &ffi_type_uint;
+   ts1_type_elements[8] = &ffi_type_uint;
+   ts1_type_elements[9] = &ffi_type_uint;
+   ts1_type_elements[10] = &ffi_type_uint;
+   ts1_type_elements[11] = &ffi_type_uint;
+   ts1_type_elements[12] = &ffi_type_uint;
+   ts1_type_elements[13] = &ffi_type_uint;
+   ts1_type_elements[14] = &ffi_type_uint;
+   ts1_type_elements[15] = &ffi_type_uint;
+   ts1_type_elements[16] = &ffi_type_uint;
+   ts1_type_elements[17] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.ui17 = 555;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(ts1_result->ui17 == 556);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(ts1_arg.ui17 == 555);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_small.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_small.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_by_value_small.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_by_value_small.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,61 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned int ui17;
+ } test_structure_1;
+ 
+ static test_structure_1 ABI_ATTR struct1(test_structure_1 ts)
+ {
+   ts.ui17++;
+ 
+   return ts;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts1_type;
+   ffi_type *ts1_type_elements[2];
+ 
+   test_structure_1 ts1_arg;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_1 *ts1_result =
+     (test_structure_1 *) malloc (sizeof(test_structure_1));
+ 
+   ts1_type.size = 0;
+   ts1_type.alignment = 0;
+   ts1_type.type = FFI_TYPE_STRUCT;
+   ts1_type.elements = ts1_type_elements;
+   ts1_type_elements[0] = &ffi_type_uint;
+   ts1_type_elements[1] = NULL;
+ 
+   args[0] = &ts1_type;
+   values[0] = &ts1_arg;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1,
+ 		     &ts1_type, args) == FFI_OK);
+ 
+   ts1_arg.ui17 = 555;
+ 
+   ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
+ 
+   CHECK(ts1_result->ui17 == 556);
+ 
+   /* This will fail if ffi_call isn't passing the struct by value. */
+   CHECK(ts1_arg.ui17 == 555);
+ 
+   free (ts1_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_int_float.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_int_float.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_int_float.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_int_float.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,88 ----
+ /* Area:	ffi_call
+    Purpose:	Demonstrate structures with integers corrupting earlier floats
+    Limitations:	none.
+    PR:		#848
+    Originator:	kellda  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ 
+ typedef struct
+ {
+   unsigned long i;
+   float f;
+ } test_structure_int_float;
+ 
+ static float ABI_ATTR struct_int_float(test_structure_int_float ts1,
+                                        test_structure_int_float ts2 __UNUSED__,
+                                        test_structure_int_float ts3 __UNUSED__,
+                                        test_structure_int_float ts4 __UNUSED__,
+                                        test_structure_int_float ts5 __UNUSED__,
+                                        test_structure_int_float ts6 __UNUSED__)
+ {
+   return ts1.f;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts_type;
+   ffi_type *ts_type_elements[3];
+   float rfloat;
+ 
+   test_structure_int_float ts_arg[6];
+ 
+   ts_type.size = 0;
+   ts_type.alignment = 0;
+   ts_type.type = FFI_TYPE_STRUCT;
+   ts_type.elements = ts_type_elements;
+   ts_type_elements[0] = &ffi_type_ulong;
+   ts_type_elements[1] = &ffi_type_float;
+   ts_type_elements[2] = NULL;
+ 
+   args[0] = &ts_type;
+   values[0] = &ts_arg[0];
+   args[1] = &ts_type;
+   values[1] = &ts_arg[1];
+   args[2] = &ts_type;
+   values[2] = &ts_arg[2];
+   args[3] = &ts_type;
+   values[3] = &ts_arg[3];
+   args[4] = &ts_type;
+   values[4] = &ts_arg[4];
+   args[5] = &ts_type;
+   values[5] = &ts_arg[5];
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 6, &ffi_type_float, args) == FFI_OK);
+ 
+   ts_arg[0].i = 1;
+   ts_arg[0].f = 11.11f;
+   ts_arg[1].i = 2;
+   ts_arg[1].f = 22.22f;
+   ts_arg[2].i = 3;
+   ts_arg[2].f = 33.33f;
+   ts_arg[3].i = 4;
+   ts_arg[3].f = 44.44f;
+   ts_arg[4].i = 5;
+   ts_arg[4].f = 55.55f;
+   ts_arg[5].i = 6;
+   ts_arg[5].f = 66.66f;
+ 
+   printf ("%g\n", ts_arg[0].f);
+   printf ("%g\n", ts_arg[1].f);
+   printf ("%g\n", ts_arg[2].f);
+   printf ("%g\n", ts_arg[3].f);
+   printf ("%g\n", ts_arg[4].f);
+   printf ("%g\n", ts_arg[5].f);
+ 
+   ffi_call(&cif, FFI_FN(struct_int_float), &rfloat, values);
+ 
+   printf ("%g\n", rfloat);
+ 
+   CHECK(fabs(rfloat - 11.11) < 3 * FLT_EPSILON);
+ 
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_return_2H.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_return_2H.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_return_2H.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_return_2H.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,63 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ typedef struct
+ {
+   short x;
+   short y;
+ } test_structure_5;
+ 
+ static test_structure_5 ABI_ATTR struct5(test_structure_5 inp)
+ {
+   inp.x *= 2;
+   inp.y *= 3;
+ 
+   return inp;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts5_type;
+   ffi_type *ts5_type_elements[3];
+ 
+   test_structure_5 ts5_arg1;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_5 *ts5_result =
+     (test_structure_5 *) malloc (sizeof(test_structure_5));
+ 
+   ts5_type.size = 0;
+   ts5_type.alignment = 0;
+   ts5_type.type = FFI_TYPE_STRUCT;
+   ts5_type.elements = ts5_type_elements;
+   ts5_type_elements[0] = &ffi_type_sshort;
+   ts5_type_elements[1] = &ffi_type_sshort;
+   ts5_type_elements[2] = NULL;
+ 
+   args[0] = &ts5_type;
+   values[0] = &ts5_arg1;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts5_type, args) == FFI_OK);
+ 
+   ts5_arg1.x = 99;
+   ts5_arg1.y = 88;
+ 
+   ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
+ 
+   CHECK(ts5_result->x == 99*2);
+   CHECK(ts5_result->y == 88*3);
+   CHECK(ts5_arg1.x == 99);
+   CHECK(ts5_arg1.y == 88);
+ 
+   free (ts5_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/struct_return_8H.c gcc-17-20260524/libffi/testsuite/libffi.call/struct_return_8H.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/struct_return_8H.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/struct_return_8H.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,90 ----
+ /* Area:	ffi_call
+    Purpose:	Check structures.
+    Limitations:	none.
+    PR:		none.
+    Originator:	From the original ffitest.c  */
+ 
+ /* { dg-do run } */
+ #include "ffitest.h"
+ typedef struct
+ {
+   int a;
+   int b;
+   int c;
+   int d;
+   int e;
+   int f;
+   int g;
+   int h;
+ } test_structure_5;
+ 
+ static test_structure_5 ABI_ATTR struct5(test_structure_5 inp)
+ {
+   inp.a *= 2;
+   inp.b *= 3;
+   inp.c *= 4;
+   inp.d *= 5;
+   inp.e *= 6;
+   inp.f *= 7;
+   inp.g *= 8;
+   inp.h *= 9;
+   return inp;
+ }
+ 
+ int main (void)
+ {
+   ffi_cif cif;
+   ffi_type *args[MAX_ARGS];
+   void *values[MAX_ARGS];
+   ffi_type ts5_type;
+   ffi_type *ts5_type_elements[9];
+ 
+   test_structure_5 ts5_arg1;
+ 
+   /* This is a hack to get a properly aligned result buffer */
+   test_structure_5 *ts5_result =
+     (test_structure_5 *) malloc (sizeof(test_structure_5));
+ 
+   ts5_type.size = 0;
+   ts5_type.alignment = 0;
+   ts5_type.type = FFI_TYPE_STRUCT;
+   ts5_type.elements = ts5_type_elements;
+   ts5_type_elements[0] = &ffi_type_sint;
+   ts5_type_elements[1] = &ffi_type_sint;
+   ts5_type_elements[2] = &ffi_type_sint;
+   ts5_type_elements[3] = &ffi_type_sint;
+   ts5_type_elements[4] = &ffi_type_sint;
+   ts5_type_elements[5] = &ffi_type_sint;
+   ts5_type_elements[6] = &ffi_type_sint;
+   ts5_type_elements[7] = &ffi_type_sint;
+   ts5_type_elements[8] = NULL;
+ 
+   args[0] = &ts5_type;
+   values[0] = &ts5_arg1;
+ 
+   /* Initialize the cif */
+   CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ts5_type, args) == FFI_OK);
+ 
+   ts5_arg1.a = 9;
+   ts5_arg1.b = 8;
+   ts5_arg1.c = 7;
+   ts5_arg1.d = 6;
+   ts5_arg1.e = 5;
+   ts5_arg1.f = 4;
+   ts5_arg1.g = 3;
+   ts5_arg1.h = 2;
+ 
+   ffi_call (&cif, FFI_FN(struct5), ts5_result, values);
+ 
+   CHECK(ts5_result->a == 9*2);
+   CHECK(ts5_result->b == 8*3);
+   CHECK(ts5_result->c == 7*4);
+   CHECK(ts5_result->d == 6*5);
+   CHECK(ts5_result->e == 5*6);
+   CHECK(ts5_result->f == 4*7);
+   CHECK(ts5_result->g == 3*8);
+   CHECK(ts5_result->h == 2*9);
+ 
+   free (ts5_result);
+   exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/va_2.c gcc-17-20260524/libffi/testsuite/libffi.call/va_2.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/va_2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/va_2.c	Sun May 24 22:32:13 2026
***************
*** 5,11 ****
     Originator:	        ARM Ltd. */
  
  /* { dg-do run } */
! /* { dg-output "" { xfail avr32*-*-* m68k-*-* alpha-*-* } } */
  
  #include "ffitest.h"
  #include <stdarg.h>
--- 5,11 ----
     Originator:	        ARM Ltd. */
  
  /* { dg-do run } */
! /* { dg-output "" { xfail avr32*-*-* m68k-*-* } } */
  
  #include "ffitest.h"
  #include <stdarg.h>
*************** struct large_tag
*** 25,30 ****
--- 25,31 ----
    unsigned e;
  };
  
+ 
  static int
  test_fn (int n, ...)
  {
*************** test_fn (int n, ...)
*** 72,78 ****
--- 73,101 ----
  	  ui, si,
  	  ul, sl,
  	  f, d);
+ 
    va_end (ap);
+ 
+   CHECK(s1.a == 5);
+   CHECK(s1.b == 6);
+   CHECK(l.a == 10);
+   CHECK(l.b == 11);
+   CHECK(l.c == 12);
+   CHECK(l.d == 13);
+   CHECK(l.e == 14);
+   CHECK(s2.a == 7);
+   CHECK(s2.b == 8);
+   CHECK(uc == 9);
+   CHECK(sc == 10);
+   CHECK(us == 11);
+   CHECK(ss == 12);
+   CHECK(ui == 13);
+   CHECK(si == 14);
+   CHECK(ul == 15);
+   CHECK(sl == 16);
+   CHECK((int)f == 2);
+   CHECK((int)d == 3);
+ 
    return n + 1;
  }
  
*************** main (void)
*** 191,196 ****
--- 214,220 ----
    /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */
    printf("res: %d\n", (int) res);
    /* { dg-output "\nres: 42" } */
+   CHECK(res == 42);
  
    return 0;
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/va_3.c gcc-17-20260524/libffi/testsuite/libffi.call/va_3.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/va_3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/va_3.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,154 ----
+ /* Area:		ffi_call
+    Purpose:		Test function with multiple fixed args and variable argument list.
+    Limitations:	none.
+    PR:			none.
+    Originator:	        ARM Ltd., Oracle */
+ 
+ /* { dg-do run } */
+ /* { dg-output "" { xfail avr32*-*-* m68k-*-* } } */
+ 
+ #include "ffitest.h"
+ #include <stdarg.h>
+ 
+ /*
+  * This is a modified version of va_2.c that has fixed arguments with "small" types that
+  * are not allowed as variable arguments, but they should be still allowed as fixed args.
+  */
+ 
+ static int
+ test_fn (char a1, float a2, int n, ...)
+ {
+   va_list ap;
+   unsigned char uc;
+   signed char sc;
+   unsigned short us;
+   signed short ss;
+   unsigned int ui;
+   signed int si;
+   unsigned long ul;
+   signed long sl;
+   float f;
+   double d;
+ 
+   va_start (ap, n);
+ 
+   uc = va_arg (ap, unsigned);
+   sc = va_arg (ap, signed);
+ 
+   us = va_arg (ap, unsigned);
+   ss = va_arg (ap, signed);
+ 
+   ui = va_arg (ap, unsigned int);
+   si = va_arg (ap, signed int);
+ 
+   ul = va_arg (ap, unsigned long);
+   sl = va_arg (ap, signed long);
+ 
+   f = va_arg (ap, double);	/* C standard promotes float->double
+ 				   when anonymous */
+   d = va_arg (ap, double);
+ 
+   printf ("%d %f uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n",
+ 	  a1, a2,
+ 	  uc, sc,
+ 	  us, ss,
+ 	  ui, si,
+ 	  ul, sl,
+ 	  f, d);
+ 
+   va_end (ap);
+ 
+   CHECK(a1 == 1);
+   CHECK((int)a2 == 2);
+   CHECK(uc == 9);
+   CHECK(sc == 10);
+   CHECK(us == 11);
+   CHECK(ss == 12);
+   CHECK(ui == 13);
+   CHECK(si == 14);
+   CHECK(ul == 15);
+   CHECK(sl == 16);
+   CHECK((int)f == 2);
+   CHECK((int)d == 3);
+ 
+   return n + 1;
+ }
+ 
+ int
+ main (void)
+ {
+   ffi_cif cif;
+   void* args[14];
+   ffi_type* arg_types[14];
+ 
+   char a1;
+   float a2;
+   int n;
+   ffi_arg res;
+ 
+   unsigned int uc;
+   signed int sc;
+   unsigned int us;
+   signed int ss;
+   unsigned int ui;
+   signed int si;
+   unsigned long ul;
+   signed long sl;
+   double d1;
+   double f1;
+ 
+   arg_types[0] = &ffi_type_schar;
+   arg_types[1] = &ffi_type_float;
+   arg_types[2] = &ffi_type_sint;
+   arg_types[3] = &ffi_type_uint;
+   arg_types[4] = &ffi_type_sint;
+   arg_types[5] = &ffi_type_uint;
+   arg_types[6] = &ffi_type_sint;
+   arg_types[7] = &ffi_type_uint;
+   arg_types[8] = &ffi_type_sint;
+   arg_types[9] = &ffi_type_ulong;
+   arg_types[10] = &ffi_type_slong;
+   arg_types[11] = &ffi_type_double;
+   arg_types[12] = &ffi_type_double;
+   arg_types[13] = NULL;
+ 
+   CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 3, 13, &ffi_type_sint, arg_types) == FFI_OK);
+ 
+   a1 = 1;
+   a2 = 2.0f;
+   n = 41;
+ 
+   uc = 9;
+   sc = 10;
+   us = 11;
+   ss = 12;
+   ui = 13;
+   si = 14;
+   ul = 15;
+   sl = 16;
+   f1 = 2.12;
+   d1 = 3.13;
+ 
+   args[0] = &a1;
+   args[1] = &a2;
+   args[2] = &n;
+   args[3] = &uc;
+   args[4] = &sc;
+   args[5] = &us;
+   args[6] = &ss;
+   args[7] = &ui;
+   args[8] = &si;
+   args[9] = &ul;
+   args[10] = &sl;
+   args[11] = &f1;
+   args[12] = &d1;
+   args[13] = NULL;
+ 
+   ffi_call(&cif, FFI_FN(test_fn), &res, args);
+   /* { dg-output "1 2.000000 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */
+   printf("res: %d\n", (int) res);
+   /* { dg-output "\nres: 42" } */
+   CHECK(res == 42);
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/va_struct1.c gcc-17-20260524/libffi/testsuite/libffi.call/va_struct1.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/va_struct1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/va_struct1.c	Sun May 24 22:32:13 2026
*************** test_fn (int n, ...)
*** 40,45 ****
--- 40,57 ----
    printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
  	  s2.a, s2.b);
    va_end (ap);
+ 
+   CHECK(s1.a == 5);
+   CHECK(s1.b == 6);
+ 
+   CHECK(l.a == 10);
+   CHECK(l.b == 11);
+   CHECK(l.c == 12);
+   CHECK(l.d == 13);
+   CHECK(l.e == 14);
+ 
+   CHECK(s2.a == 7);
+   CHECK(s2.b == 8);
    return n + 1;
  }
  
*************** main (void)
*** 116,121 ****
--- 128,134 ----
    /* { dg-output "5 6 10 11 12 13 14 7 8" } */
    printf("res: %d\n", (int) res);
    /* { dg-output "\nres: 42" } */
+   CHECK(res == 42);
  
    return 0;
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/va_struct2.c gcc-17-20260524/libffi/testsuite/libffi.call/va_struct2.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/va_struct2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/va_struct2.c	Sun May 24 22:32:13 2026
*************** test_fn (int n, ...)
*** 40,45 ****
--- 40,54 ----
    s2 = va_arg (ap, struct small_tag);
    printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
  	  s2.a, s2.b);
+   CHECK(s1.a == 5);
+   CHECK(s1.b == 6);
+   CHECK(l.a == 10);
+   CHECK(l.b == 11);
+   CHECK(l.c == 12);
+   CHECK(l.d == 13);
+   CHECK(l.e == 14);
+   CHECK(s2.a == 7);
+   CHECK(s2.b == 8);
    va_end (ap);
    s1.a += s2.a;
    s1.b += s2.b;
*************** main (void)
*** 119,124 ****
--- 128,135 ----
    /* { dg-output "5 6 10 11 12 13 14 7 8" } */
    printf("res: %d %d\n", res.a, res.b);
    /* { dg-output "\nres: 12 14" } */
+   CHECK(res.a == 12);
+   CHECK(res.b == 14);
  
    return 0;
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/va_struct3.c gcc-17-20260524/libffi/testsuite/libffi.call/va_struct3.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/va_struct3.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.call/va_struct3.c	Sun May 24 22:32:13 2026
*************** test_fn (int n, ...)
*** 40,45 ****
--- 40,55 ----
    s2 = va_arg (ap, struct small_tag);
    printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e,
  	  s2.a, s2.b);
+ 
+   CHECK(s1.a == 5);
+   CHECK(s1.b == 6);
+   CHECK(l.a == 10);
+   CHECK(l.b == 11);
+   CHECK(l.c == 12);
+   CHECK(l.d == 13);
+   CHECK(l.e == 14);
+   CHECK(s2.a == 7);
+   CHECK(s2.b == 8);
    va_end (ap);
    l.a += s1.a;
    l.b += s1.b;
*************** main (void)
*** 121,126 ****
--- 131,141 ----
    /* { dg-output "5 6 10 11 12 13 14 7 8" } */
    printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e);
    /* { dg-output "\nres: 15 17 19 21 14" } */
+   CHECK(res.a == 15);
+   CHECK(res.b == 17);
+   CHECK(res.c == 19);
+   CHECK(res.d == 21);
+   CHECK(res.e == 14);
  
    return 0;
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.call/x32.c gcc-17-20260524/libffi/testsuite/libffi.call/x32.c
*** gcc-17-20260517/libffi/testsuite/libffi.call/x32.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.call/x32.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,31 ----
+ /* Area:        ffi_call
+    Purpose:     Check zero-extension of pointers on x32.
+    Limitations: none.
+    PR:          887
+    Originator:  Mikulas Patocka <mikulas@twibright.com>  */
+ 
+ /* { dg-do run } */
+ 
+ #include "ffitest.h"
+ 
+ static int ABI_ATTR fn(int *a)
+ {
+ 	if (a)
+ 		return *a;
+ 	return -1;
+ }
+ 
+ int main(void)
+ {
+ 	ffi_cif cif;
+ 	ffi_type *args[MAX_ARGS];
+ 	void *values[MAX_ARGS];
+ 	void *z[2] = { (void *)0, (void *)1 };
+ 	ffi_arg rint;
+ 	args[0] = &ffi_type_pointer;
+ 	values[0] = z;
+ 	CHECK(ffi_prep_cif(&cif, ABI_NUM, 1, &ffi_type_sint, args) == FFI_OK);
+ 	ffi_call(&cif, FFI_FN(fn), &rint, values);
+ 	CHECK((int)rint == -1);
+ 	exit(0);
+ }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn0.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn0.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn0.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn0.c	Sun May 24 22:32:13 2026
*************** closure_test_fn0(ffi_cif* cif __UNUSED__
*** 38,44 ****
  	 (int)*(int *)args[12], (int)(*(int *)args[13]),
  	 (int)(*(int *)args[14]),*(int *)args[15],
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
! 
  }
  
  typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long,
--- 38,44 ----
  	 (int)*(int *)args[12], (int)(*(int *)args[13]),
  	 (int)(*(int *)args[14]),*(int *)args[15],
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
!   CHECK((int)*(ffi_arg *)resp == 680);
  }
  
  typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long,
*************** int main (void)
*** 85,89 ****
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
!      exit(0);
  }
--- 85,90 ----
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
!   CHECK(res == 680);
!   exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn1.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn1.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn1.c	Sun May 24 22:32:13 2026
*************** static void closure_test_fn1(ffi_cif* ci
*** 33,38 ****
--- 33,39 ----
  	 (int)*(int *)args[12], (int)(*(int *)args[13]),
  	 (int)(*(int *)args[14]), *(int *)args[15],
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+   CHECK((int)*(ffi_arg *)resp == 255);
  }
  
  typedef int (*closure_test_type1)(float, float, float, float, signed short,
*************** int main (void)
*** 77,81 ****
--- 78,83 ----
    /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 255" } */
+   CHECK(res == 255);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn2.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn2.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn2.c	Sun May 24 22:32:13 2026
*************** static void closure_test_fn2(ffi_cif* ci
*** 32,37 ****
--- 32,38 ----
  	 (int)*(int *)args[12], (int)(*(float *)args[13]),
  	 (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
  	 (int)*(ffi_arg *)resp);
+   CHECK((int)*(ffi_arg *)resp == 255);
  }
  
  typedef int (*closure_test_type2)(double, double, double, double, signed short,
*************** int main (void)
*** 77,81 ****
--- 78,83 ----
    /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 255" } */
+   CHECK(res == 255);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn3.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn3.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn3.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn3.c	Sun May 24 22:32:13 2026
*************** static void closure_test_fn3(ffi_cif* ci
*** 31,38 ****
  	  (int)(*(float *)args[10]), (int)(*(float *)args[11]),
  	  (int)*(int *)args[12], (int)(*(float *)args[13]),
  	  (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
! 	  (int)*(ffi_arg *)resp);
  
   }
  
  typedef int (*closure_test_type3)(float, float, float, float, float, float,
--- 31,57 ----
  	  (int)(*(float *)args[10]), (int)(*(float *)args[11]),
  	  (int)*(int *)args[12], (int)(*(float *)args[13]),
  	  (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
!     (int)*(ffi_arg *)resp);
! 
!     CHECK((int)*(float *)args[0] == 1);
!     CHECK((int)(*(float *)args[1]) == 2);
!     CHECK((int)(*(float *)args[2]) == 3);
!     CHECK((int)(*(float *)args[3]) == 4);
!     CHECK((int)(*(float *)args[4]) == 5);
!     CHECK((int)(*(float *)args[5]) == 6);
!     CHECK((int)*(float *)args[6] == 7);
!     CHECK((int)(*(float *)args[7]) == 8);
!     CHECK((int)(*(double *)args[8]) == 9);
!     CHECK((int)*(int *)args[9] == 10);
!     CHECK((int)(*(float *)args[10]) == 11);
!     CHECK((int)(*(float *)args[11]) == 12);
!     CHECK((int)*(int *)args[12] == 13);
!     CHECK((int)(*(float *)args[13]) == 19);
!     CHECK((int)(*(float *)args[14]) == 21);
!     CHECK(*(int *)args[15] == 1);
!     CHECK((int)(intptr_t)userdata == 3);
  
+     CHECK((int)*(ffi_arg *)resp == 135);
   }
  
  typedef int (*closure_test_type3)(float, float, float, float, float, float,
*************** int main (void)
*** 78,82 ****
--- 97,102 ----
    /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 135" } */
+   CHECK(res == 135);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn4.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn4.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn4.c	Sun May 24 22:32:13 2026
*************** closure_test_fn0(ffi_cif* cif __UNUSED__
*** 45,50 ****
--- 45,51 ----
  	 (int)*(unsigned long long *)args[14],
  	 *(int *)args[15],
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+   CHECK((int)*(ffi_arg *)resp == 680);
  
  }
  
*************** int main (void)
*** 84,89 ****
--- 85,91 ----
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
+   CHECK(res == 680);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn5.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn5.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn5.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn5.c	Sun May 24 22:32:13 2026
*************** closure_test_fn5(ffi_cif* cif __UNUSED__
*** 44,49 ****
--- 44,50 ----
  	 (int)*(unsigned long long *)args[14],
  	 *(int *)args[15],
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+   CHECK((int)*(ffi_arg *)resp == 680);
  
  }
  
*************** int main (void)
*** 87,92 ****
--- 88,94 ----
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
+   CHECK(res == 680);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn6.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn6.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_fn6.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_fn6.c	Sun May 24 22:32:13 2026
*************** closure_test_fn0(ffi_cif* cif __UNUSED__
*** 37,42 ****
--- 37,43 ----
  	 (int)*(int *)args[12], (int)(*(int *)args[13]),
  	 (int)(*(double *)args[14]), (int)(*(double *)args[15]),
  	 (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
+   CHECK((int)*(ffi_arg *)resp == 680);
  
  }
  
*************** int main (void)
*** 86,90 ****
--- 87,92 ----
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
+   CHECK(res == 680);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_loc_fn0.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_loc_fn0.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_loc_fn0.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_loc_fn0.c	Sun May 24 22:32:13 2026
***************
*** 7,15 ****
     Originator:	<andreast@gcc.gnu.org> 20030828	 */
  
  
- 
- 
- /* { dg-do run } */
  #include "ffitest.h"
  
  static void
--- 7,12 ----
*************** int main (void)
*** 82,91 ****
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0,
  			 (void *) 3 /* userdata */, codeloc) == FFI_OK);
!   
! #ifndef FFI_EXEC_STATIC_TRAMP
    /* With static trampolines, the codeloc does not point to closure */
!   CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0);
  #endif
  
    res = (*((closure_loc_test_type0)codeloc))
--- 79,88 ----
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0,
  			 (void *) 3 /* userdata */, codeloc) == FFI_OK);
! 
! #if !defined(FFI_EXEC_STATIC_TRAMP) && !defined(__EMSCRIPTEN__)
    /* With static trampolines, the codeloc does not point to closure */
!   CHECK(memcmp(pcl, FFI_CL(codeloc), sizeof(*pcl)) == 0);
  #endif
  
    res = (*((closure_loc_test_type0)codeloc))
*************** int main (void)
*** 94,98 ****
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
!      exit(0);
  }
--- 91,96 ----
    /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 680" } */
!   CHECK(res == 680);
!   exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/closure_simple.c gcc-17-20260524/libffi/testsuite/libffi.closures/closure_simple.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/closure_simple.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/closure_simple.c	Sun May 24 22:32:13 2026
*************** closure_test(ffi_cif* cif __UNUSED__, vo
*** 20,25 ****
--- 20,30 ----
  	 (int)(*(int *)args[2]), (int)(*(int *)args[3]),
           (int)*(ffi_arg *)resp);
  
+   CHECK((int)*(int *)args[0] == 0);
+   CHECK((int)*(int *)args[1] == 1);
+   CHECK((int)*(int *)args[2] == 2);
+   CHECK((int)*(int *)args[3] == 3);
+   CHECK((int)*(ffi_arg *)resp == 9);
  }
  
  typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int);
*************** int main (void)
*** 50,55 ****
--- 55,61 ----
  
    printf("res: %d\n",res);
    /* { dg-output "\nres: 9" } */
+   CHECK(res == 9);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_12byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_12byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_12byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_12byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_12byte cls_struct_12byte_fn(s
*** 25,30 ****
--- 25,41 ----
    printf("%d %d %d %d %d %d: %d %d %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
  	 result.a, result.b, result.c);
  
+   CHECK(b1.a == 7);
+   CHECK(b1.b == 4);
+   CHECK(b1.c == 9);
+ 
+   CHECK(b2.a == 1);
+   CHECK(b2.b == 5);
+   CHECK(b2.c == 3);
+ 
+   CHECK(result.a == 8);
+   CHECK(result.b == 9);
+   CHECK(result.c == 12);
    return result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 89,97 ----
    /* { dg-output "7 4 9 1 5 3: 8 9 12" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 8 9 12" } */
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 9);
+   CHECK(res_dbl.c == 12);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 87,94 ****
--- 101,112 ----
  
    res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl);
    /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */
+ 
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 8 9 12" } */
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 9);
+   CHECK(res_dbl.c == 12);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_16byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_16byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_16byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_16byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_16byte cls_struct_16byte_fn(s
*** 26,31 ****
--- 26,44 ----
    printf("%d %g %d %d %g %d: %d %g %d\n", b1.a, b1.b, b1.c, b2.a, b2.b, b2.c,
  	 result.a, result.b, result.c);
  
+   CHECK(b1.a == 7);
+   CHECK(b1.b == 8);
+   CHECK(b1.c == 9);
+ 
+   CHECK(b2.a == 1);
+   CHECK(b2.b == 9);
+   CHECK(b2.c == 3);
+ 
+   CHECK(result.a == 8);
+   CHECK(result.b == 17);
+   CHECK(result.c == 12);
+ 
+ 
    return result;
  }
  
*************** int main (void)
*** 80,85 ****
--- 93,102 ----
    printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 8 17 12" } */
  
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 17);
+   CHECK(res_dbl.c == 12);
+ 
    res_dbl.a = 0;
    res_dbl.b = 0.0;
    res_dbl.c = 0;
*************** int main (void)
*** 91,95 ****
--- 108,117 ----
    printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 8 17 12" } */
  
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 17);
+   CHECK(res_dbl.c == 12);
+ 
+ 
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_18byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_18byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_18byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_18byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_18byte cls_struct_18byte_fn(s
*** 29,34 ****
--- 29,50 ----
    printf("%g %d %d %g %g %d %d %g: %g %d %d %g\n", a1.a, a1.b, a1.c, a1.d,
  	 a2.a, a2.b, a2.c, a2.d,
  	 result.a, result.b, result.c, result.d);
+ 
+   CHECK(a1.a == 1);
+   CHECK(a1.b == 127);
+   CHECK(a1.c == 126);
+   CHECK(a1.d == 3);
+ 
+   CHECK(a2.a == 4);
+   CHECK(a2.b == 125);
+   CHECK(a2.c == 124);
+   CHECK(a2.d == 5);
+ 
+   CHECK(result.a == 5);
+   CHECK(result.b == 252);
+   CHECK(result.c == 250);
+   CHECK(result.d == 8);
+ 
    return result;
  }
  
*************** int main (void)
*** 84,89 ****
--- 100,109 ----
    /* { dg-output "1 127 126 3 4 125 124 5: 5 252 250 8" } */
    printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 5 252 250 8" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 252);
+   CHECK(res_dbl.c == 250);
+   CHECK(res_dbl.d == 8);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 91,96 ****
--- 111,120 ----
    /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */
    printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 5 252 250 8" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 252);
+   CHECK(res_dbl.c == 250);
+   CHECK(res_dbl.d == 8);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_19byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_19byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_19byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_19byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_19byte cls_struct_19byte_fn(s
*** 32,37 ****
--- 32,56 ----
  	 a1.a, a1.b, a1.c, a1.d, a1.e,
  	 a2.a, a2.b, a2.c, a2.d, a2.e,
  	 result.a, result.b, result.c, result.d, result.e);
+ 
+   CHECK(a1.a == 1);
+   CHECK(a1.b == 127);
+   CHECK(a1.c == 126);
+   CHECK(a1.d == 3);
+   CHECK(a1.e == 120);
+ 
+   CHECK(a2.a == 4);
+   CHECK(a2.b == 125);
+   CHECK(a2.c == 124);
+   CHECK(a2.d == 5);
+   CHECK(a2.e == 119);
+ 
+   CHECK(result.a == 5);
+   CHECK(result.b == 252);
+   CHECK(result.c == 250);
+   CHECK(result.d == 8);
+   CHECK(result.e == 239);
+ 
    return result;
  }
  
*************** int main (void)
*** 89,94 ****
--- 108,118 ----
    printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e);
    /* { dg-output "\nres: 5 252 250 8 239" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 252);
+   CHECK(res_dbl.c == 250);
+   CHECK(res_dbl.d == 8);
+   CHECK(res_dbl.e == 239);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 97,102 ****
--- 121,131 ----
    printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e);
    /* { dg-output "\nres: 5 252 250 8 239" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 252);
+   CHECK(res_dbl.c == 250);
+   CHECK(res_dbl.d == 8);
+   CHECK(res_dbl.e == 239);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_1_1byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_1_1byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_1_1byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_1_1byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_1_1byte cls_struct_1_1byte_fn
*** 23,28 ****
--- 23,31 ----
    result.a = a1.a + a2.a;
  
    printf("%d %d: %d\n", a1.a, a2.a, result.a);
+   CHECK(a1.a == 12);
+   CHECK(a2.a == 178);
+   CHECK(result.a == 190);
  
    return  result;
  }
*************** int main (void)
*** 84,89 ****
--- 87,93 ----
    /* { dg-output "\n12 178: 190" } */
    printf("res: %d\n", res_dbl.a);
    /* { dg-output "\nres: 190" } */
+   CHECK(res_dbl.a == 190);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_20byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_20byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_20byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_20byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_20byte cls_struct_20by
*** 25,30 ****
--- 25,42 ----
  
    printf("%g %g %d %g %g %d: %g %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
  	 result.a, result.b, result.c);
+ 
+   CHECK(a1.a == 1);
+   CHECK(a1.b == 2);
+   CHECK(a1.c == 3);
+ 
+   CHECK(a2.a == 4);
+   CHECK(a2.b == 5);
+   CHECK(a2.c == 7);
+ 
+   CHECK(result.a == 5);
+   CHECK(result.b == 7);
+   CHECK(result.c == 10);
    return result;
  }
  
*************** int main (void)
*** 79,84 ****
--- 91,99 ----
    /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
    printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 5 7 10" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 7);
+   CHECK(res_dbl.c == 10);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 101,109 ----
    /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
    printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 5 7 10" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 7);
+   CHECK(res_dbl.c == 10);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_20byte1.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_20byte1.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_20byte1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_20byte1.c	Sun May 24 22:32:13 2026
*************** static cls_struct_20byte cls_struct_20by
*** 27,32 ****
--- 27,45 ----
  
    printf("%d %g %g %d %g %g: %d %g %g\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c,
  	 result.a, result.b, result.c);
+ 
+   CHECK(a1.a == 1);
+   CHECK(a1.b == 2);
+   CHECK(a1.c == 3);
+ 
+   CHECK(a2.a == 4);
+   CHECK(a2.b == 5);
+   CHECK(a2.c == 7);
+ 
+   CHECK(result.a == 5);
+   CHECK(result.b == 7);
+   CHECK(result.c == 10);
+ 
    return result;
  }
  
*************** int main (void)
*** 81,86 ****
--- 94,102 ----
    /* { dg-output "1 2 3 4 5 7: 5 7 10" } */
    printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 5 7 10" } */
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 7);
+   CHECK(res_dbl.c == 10);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 89,93 ****
--- 105,113 ----
    printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 5 7 10" } */
  
+   CHECK(res_dbl.a == 5);
+   CHECK(res_dbl.b == 7);
+   CHECK(res_dbl.c == 10);
+ 
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_24byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_24byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_24byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_24byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_24byte cls_struct_24byte_fn(s
*** 33,38 ****
--- 33,62 ----
  	 b2.a, b2.b, b2.c, b2.d,
  	 b3.a, b3.b, b3.c, b3.d,
  	 result.a, result.b, result.c, result.d);
+   CHECK_DOUBLE_EQ(b0.a, 9);
+   CHECK_DOUBLE_EQ(b0.b, 2);
+   CHECK(b0.c == 6);
+   CHECK_FLOAT_EQ(b0.d, 5);
+ 
+   CHECK_DOUBLE_EQ(b1.a, 1);
+   CHECK_DOUBLE_EQ(b1.b, 2);
+   CHECK(b1.c == 3);
+   CHECK_FLOAT_EQ(b1.d, 7);
+ 
+   CHECK_DOUBLE_EQ(b2.a, 4);
+   CHECK_DOUBLE_EQ(b2.b, 5);
+   CHECK(b2.c == 7);
+   CHECK_FLOAT_EQ(b2.d, 9);
+ 
+   CHECK_DOUBLE_EQ(b3.a, 8);
+   CHECK_DOUBLE_EQ(b3.b, 6);
+   CHECK(b3.c == 1);
+   CHECK_FLOAT_EQ(b3.d, 4);
+ 
+   CHECK_DOUBLE_EQ(result.a, 22);
+   CHECK_DOUBLE_EQ(result.b, 15);
+   CHECK(result.c == 17);
+   CHECK_FLOAT_EQ(result.d, 25);
  
    return result;
  }
*************** int main (void)
*** 97,102 ****
--- 121,130 ----
    /* { dg-output "9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 4: 22 15 17 25" } */
    printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 22 15 17 25" } */
+   CHECK_DOUBLE_EQ(res_dbl.a, 22);
+   CHECK_DOUBLE_EQ(res_dbl.b, 15);
+   CHECK(res_dbl.c == 17);
+   CHECK_FLOAT_EQ(res_dbl.d, 25);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 108,113 ****
--- 136,145 ----
    /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 4: 22 15 17 25" } */
    printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 22 15 17 25" } */
+   CHECK_DOUBLE_EQ(res_dbl.a, 22);
+   CHECK_DOUBLE_EQ(res_dbl.b, 15);
+   CHECK(res_dbl.c == 17);
+   CHECK_FLOAT_EQ(res_dbl.d, 25);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_2byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_2byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_2byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_2byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_2byte cls_struct_2byte_fn(str
*** 24,29 ****
--- 24,38 ----
  
    printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 87,94 ----
    /* { dg-output "12 127 1 13: 13 140" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 13 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 85,90 ****
--- 96,103 ----
    /* { dg-output "\n12 127 1 13: 13 140" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 13 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3_1byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3_1byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3_1byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3_1byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_3_1byte cls_struct_3_1byte_fn
*** 28,33 ****
--- 28,45 ----
  	 a2.a, a2.b, a2.c,
  	 result.a, result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 13);
+   CHECK(a1.c == 14);
+ 
+   CHECK(a2.a == 178);
+   CHECK(a2.b == 179);
+   CHECK(a2.c == 180);
+ 
+   CHECK(result.a == 190);
+   CHECK(result.b == 192);
+   CHECK(result.c == 194);
+ 
    return  result;
  }
  
*************** int main (void)
*** 83,88 ****
--- 95,103 ----
    /* { dg-output "12 13 14 178 179 180: 190 192 194" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 190 192 194" } */
+   CHECK(res_dbl.a == 190);
+   CHECK(res_dbl.b == 192);
+   CHECK(res_dbl.c == 194);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 91,95 ****
--- 106,114 ----
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 190 192 194" } */
  
+   CHECK(res_dbl.a == 190);
+   CHECK(res_dbl.b == 192);
+   CHECK(res_dbl.c == 194);
+ 
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3byte1.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3byte1.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3byte1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3byte1.c	Sun May 24 22:32:13 2026
*************** cls_struct_3byte cls_struct_3byte_fn(str
*** 24,29 ****
--- 24,38 ----
  
    printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 119);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 15);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 134);
+ 
    return  result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 87,94 ----
    /* { dg-output "12 119 1 15: 13 134" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 13 134" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 134);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 85,90 ****
--- 96,103 ----
    /* { dg-output "\n12 119 1 15: 13 134" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 13 134" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 134);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3byte2.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3byte2.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3byte2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3byte2.c	Sun May 24 22:32:13 2026
*************** cls_struct_3byte_1 cls_struct_3byte_fn1(
*** 24,29 ****
--- 24,38 ----
  
    printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
  
+   CHECK(a1.a == 15);
+   CHECK(a1.b == 125);
+ 
+   CHECK(a2.a == 9);
+   CHECK(a2.b == 19);
+ 
+   CHECK(result.a == 24);
+   CHECK(result.b == 144);
+ 
    return  result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 87,94 ----
    /* { dg-output "15 125 9 19: 24 144" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 24 144" } */
+   CHECK(res_dbl.a == 24);
+   CHECK(res_dbl.b == 144);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn1, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 85,90 ****
--- 96,103 ----
    /* { dg-output "\n15 125 9 19: 24 144" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 24 144" } */
+   CHECK(res_dbl.a == 24);
+   CHECK(res_dbl.b == 144);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3float.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3float.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_3float.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_3float.c	Sun May 24 22:32:13 2026
*************** cls_struct_3float cls_struct_3float_fn(s
*** 27,32 ****
--- 27,44 ----
    printf("%g %g %g %g %g %g: %g %g %g\n", a1.f, a1.g, a1.h,
  	 a2.f, a2.g, a2.h, result.f, result.g, result.h);
  
+   CHECK_FLOAT_EQ(a1.f, 1);
+   CHECK_FLOAT_EQ(a1.g, 2);
+   CHECK_FLOAT_EQ(a1.h, 3);
+ 
+   CHECK_FLOAT_EQ(a2.f, 1);
+   CHECK_FLOAT_EQ(a2.g, 2);
+   CHECK_FLOAT_EQ(a2.h, 3);
+ 
+   CHECK_FLOAT_EQ(result.f, 2);
+   CHECK_FLOAT_EQ(result.g, 4);
+   CHECK_FLOAT_EQ(result.h, 6);
+ 
    return result;
  }
  
*************** int main (void)
*** 81,86 ****
--- 93,101 ----
    /* { dg-output "1 2 3 1 2 3: 2 4 6" } */
    printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h);
    /* { dg-output "\nres: 2 4 6" } */
+   CHECK_FLOAT_EQ(res_dbl.f, 2);
+   CHECK_FLOAT_EQ(res_dbl.g, 4);
+   CHECK_FLOAT_EQ(res_dbl.h, 6);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3float_gn, NULL, code) ==
  	FFI_OK);
*************** int main (void)
*** 90,95 ****
--- 105,113 ----
    /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
    printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h);
    /* { dg-output "\nres: 2 4 6" } */
+   CHECK_FLOAT_EQ(res_dbl.f, 2);
+   CHECK_FLOAT_EQ(res_dbl.g, 4);
+   CHECK_FLOAT_EQ(res_dbl.h, 6);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_4_1byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_4_1byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_4_1byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_4_1byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_4_1byte cls_struct_4_1byte_fn
*** 30,35 ****
--- 30,49 ----
  	 a2.a, a2.b, a2.c, a2.d,
  	 result.a, result.b, result.c, result.d);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 13);
+   CHECK(a1.c == 14);
+   CHECK(a1.d == 15);
+ 
+   CHECK(a2.a == 178);
+   CHECK(a2.b == 179);
+   CHECK(a2.c == 180);
+   CHECK(a2.d == 181);
+ 
+   CHECK(result.a == 190);
+   CHECK(result.b == 192);
+   CHECK(result.c == 194);
+   CHECK(result.d == 196);
    return  result;
  }
  
*************** int main (void)
*** 86,91 ****
--- 100,109 ----
    /* { dg-output "12 13 14 15 178 179 180 181: 190 192 194 196" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 190 192 194 196" } */
+   CHECK(res_dbl.a == 190);
+   CHECK(res_dbl.b == 192);
+   CHECK(res_dbl.c == 194);
+   CHECK(res_dbl.d == 196);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4_1byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 93,98 ****
--- 111,120 ----
    /* { dg-output "\n12 13 14 15 178 179 180 181: 190 192 194 196" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 190 192 194 196" } */
+   CHECK(res_dbl.a == 190);
+   CHECK(res_dbl.b == 192);
+   CHECK(res_dbl.c == 194);
+   CHECK(res_dbl.d == 196);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_4byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_4byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_4byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_4byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_4byte cls_struct_4byte_fn(str
*** 24,29 ****
--- 24,38 ----
  
    printf("%d %d %d %d: %d %d\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+ 
    return  result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 87,94 ----
    /* { dg-output "127 120 12 128: 139 248" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 139 248" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_4byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 85,90 ****
--- 96,103 ----
    /* { dg-output "\n127 120 12 128: 139 248" } */
    printf("res: %d %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 139 248" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_5_1_byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_5_1_byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_5_1_byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_5_1_byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_5byte cls_struct_5byte
*** 32,37 ****
--- 32,55 ----
  	 a2.a, a2.b, a2.c, a2.d, a2.e,
  	 result.a, result.b, result.c, result.d, result.e);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+   CHECK(a1.d == 3);
+   CHECK(a1.e == 4);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+   CHECK(a2.d == 3);
+   CHECK(a2.e == 4);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+   CHECK(result.d == 6);
+   CHECK(result.e == 8);
+ 
    return  result;
  }
  
*************** int main (void)
*** 90,95 ****
--- 108,118 ----
    printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e);
    /* { dg-output "\nres: 139 248 10 6 8" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 6);
+   CHECK(res_dbl.e == 8);
  
    res_dbl.a = 0;
    res_dbl.b = 0;
*************** int main (void)
*** 104,109 ****
--- 127,137 ----
    printf("res: %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e);
    /* { dg-output "\nres: 139 248 10 6 8" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 6);
+   CHECK(res_dbl.e == 8);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_5byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_5byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_5byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_5byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_5byte cls_struct_5byte
*** 27,32 ****
--- 27,44 ----
  	 a2.a, a2.b, a2.c,
  	 result.a, result.b, result.c);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+ 
    return  result;
  }
  
*************** int main (void)
*** 82,87 ****
--- 94,102 ----
    /* { dg-output "127 120 1 12 128 9: 139 248 10" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 139 248 10" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
  
    res_dbl.a = 0;
    res_dbl.b = 0;
*************** int main (void)
*** 93,98 ****
--- 108,116 ----
    /* { dg-output "\n127 120 1 12 128 9: 139 248 10" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 139 248 10" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_64byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_64byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_64byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_64byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_64byte cls_struct_64byte_fn(s
*** 38,43 ****
--- 38,51 ----
  
    printf("%g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
  	 result.d, result.e, result.f, result.g, result.h);
+   CHECK(result.a == 22);
+   CHECK(result.b == 15);
+   CHECK(result.c == 17);
+   CHECK(result.d == 25);
+   CHECK(result.e == 6);
+   CHECK(result.f == 13);
+   CHECK(result.g == 19);
+   CHECK(result.h == 18);
  
    return result;
  }
*************** int main (void)
*** 107,112 ****
--- 115,128 ----
    printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
    /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
+   CHECK(res_dbl.a == 22);
+   CHECK(res_dbl.b == 15);
+   CHECK(res_dbl.c == 17);
+   CHECK(res_dbl.d == 25);
+   CHECK(res_dbl.e == 6);
+   CHECK(res_dbl.f == 13);
+   CHECK(res_dbl.g == 19);
+   CHECK(res_dbl.h == 18);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_64byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 119,124 ****
--- 135,148 ----
    printf("res: %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h);
    /* { dg-output "\nres: 22 15 17 25 6 13 19 18" } */
+   CHECK(res_dbl.a == 22);
+   CHECK(res_dbl.b == 15);
+   CHECK(res_dbl.c == 17);
+   CHECK(res_dbl.d == 25);
+   CHECK(res_dbl.e == 6);
+   CHECK(res_dbl.f == 13);
+   CHECK(res_dbl.g == 19);
+   CHECK(res_dbl.h == 18);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_6_1_byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_6_1_byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_6_1_byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_6_1_byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_6byte cls_struct_6byte
*** 34,39 ****
--- 34,60 ----
  	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f,
  	 result.a, result.b, result.c, result.d, result.e, result.f);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+   CHECK(a1.d == 3);
+   CHECK(a1.e == 4);
+   CHECK(a1.f == 5);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+   CHECK(a2.d == 3);
+   CHECK(a2.e == 4);
+   CHECK(a2.f == 5);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+   CHECK(result.d == 6);
+   CHECK(result.e == 8);
+   CHECK(result.f == 10);
+ 
    return  result;
  }
  
*************** int main (void)
*** 109,113 ****
--- 130,140 ----
  	 res_dbl.d, res_dbl.e, res_dbl.f);
    /* { dg-output "\nres: 139 248 10 6 8 10" } */
  
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 6);
+   CHECK(res_dbl.e == 8);
+   CHECK(res_dbl.f == 10);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_6byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_6byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_6byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_6byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_6byte cls_struct_6byte
*** 30,35 ****
--- 30,50 ----
  	 a2.a, a2.b, a2.c, a2.d,
  	 result.a, result.b, result.c, result.d);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+   CHECK(a1.d == 128);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+   CHECK(a2.d == 127);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+   CHECK(result.d == 255);
+ 
    return  result;
  }
  
*************** int main (void)
*** 86,91 ****
--- 101,110 ----
    /* { dg-output "127 120 1 128 12 128 9 127: 139 248 10 255" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 139 248 10 255" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 255);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_6byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 93,99 ****
    /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 139 248 10 255" } */
! 
  
    exit(0);
  }
--- 112,121 ----
    /* { dg-output "\n127 120 1 128 12 128 9 127: 139 248 10 255" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 139 248 10 255" } */
!   CHECK(res_dbl.a == 139);
!   CHECK(res_dbl.b == 248);
!   CHECK(res_dbl.c == 10);
!   CHECK(res_dbl.d == 255);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_7_1_byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_7_1_byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_7_1_byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_7_1_byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_7byte cls_struct_7byte
*** 36,41 ****
--- 36,65 ----
  	 a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
  	 result.a, result.b, result.c, result.d, result.e, result.f, result.g);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+   CHECK(a1.d == 3);
+   CHECK(a1.e == 4);
+   CHECK(a1.f == 5);
+   CHECK(a1.g == 6);
+ 
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+   CHECK(a2.d == 3);
+   CHECK(a2.e == 4);
+   CHECK(a2.f == 5);
+   CHECK(a2.g == 6);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+   CHECK(result.d == 6);
+   CHECK(result.e == 8);
+   CHECK(result.f == 10);
+   CHECK(result.g == 12);
+ 
    return  result;
  }
  
*************** int main (void)
*** 96,101 ****
--- 120,132 ----
    printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
    /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 6);
+   CHECK(res_dbl.e == 8);
+   CHECK(res_dbl.f == 10);
+   CHECK(res_dbl.g == 12);
  
    res_dbl.a = 0;
    res_dbl.b = 0;
*************** int main (void)
*** 112,117 ****
--- 143,155 ----
    printf("res: %d %d %d %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
  	 res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
    /* { dg-output "\nres: 139 248 10 6 8 10 12" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 6);
+   CHECK(res_dbl.e == 8);
+   CHECK(res_dbl.f == 10);
+   CHECK(res_dbl.g == 12);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_7byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_7byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_7byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_7byte.c	Sun May 24 22:32:13 2026
*************** static cls_struct_7byte cls_struct_7byte
*** 29,34 ****
--- 29,50 ----
  	 a2.a, a2.b, a2.c, a2.d,
  	 result.a, result.b, result.c, result.d);
  
+   CHECK(a1.a == 127);
+   CHECK(a1.b == 120);
+   CHECK(a1.c == 1);
+   CHECK(a1.d == 254);
+ 	
+   CHECK(a2.a == 12);
+   CHECK(a2.b == 128);
+   CHECK(a2.c == 9);
+   CHECK(a2.d == 255);
+ 
+   CHECK(result.a == 139);
+   CHECK(result.b == 248);
+   CHECK(result.c == 10);
+   CHECK(result.d == 509);
+ 
+ 
    return  result;
  }
  
*************** int main (void)
*** 85,90 ****
--- 101,110 ----
    /* { dg-output "127 120 1 254 12 128 9 255: 139 248 10 509" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 139 248 10 509" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 509);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_7byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 92,97 ****
--- 112,121 ----
    /* { dg-output "\n127 120 1 254 12 128 9 255: 139 248 10 509" } */
    printf("res: %d %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
    /* { dg-output "\nres: 139 248 10 509" } */
+   CHECK(res_dbl.a == 139);
+   CHECK(res_dbl.b == 248);
+   CHECK(res_dbl.c == 10);
+   CHECK(res_dbl.d == 509);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_8byte.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_8byte.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_8byte.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_8byte.c	Sun May 24 22:32:13 2026
*************** cls_struct_8byte cls_struct_8byte_fn(str
*** 23,28 ****
--- 23,37 ----
  
    printf("%d %g %d %g: %d %g\n", a1.a, a1.b, a2.a, a2.b, result.a, result.b);
  
+   CHECK(a1.a == 1);
+   CHECK_FLOAT_EQ(a1.b, 2);
+ 
+   CHECK(a2.a == 4);
+   CHECK_FLOAT_EQ(a2.b, 5);
+ 
+   CHECK(result.a == 5);
+   CHECK_FLOAT_EQ(result.b, 7);
+ 
    return  result;
  }
  
*************** int main (void)
*** 76,81 ****
--- 85,93 ----
    ffi_call(&cif, FFI_FN(cls_struct_8byte_fn), &res_dbl, args_dbl);
    /* { dg-output "1 2 4 5: 5 7" } */
    printf("res: %d %g\n", res_dbl.a, res_dbl.b);
+   CHECK(res_dbl.a == 5);
+   CHECK_FLOAT_EQ(res_dbl.b, 7);
+ 
    /* { dg-output "\nres: 5 7" } */
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_8byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 83,88 ****
--- 95,102 ----
    /* { dg-output "\n1 2 4 5: 5 7" } */
    printf("res: %d %g\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 5 7" } */
+   CHECK(res_dbl.a == 5);
+   CHECK_FLOAT_EQ(res_dbl.b, 7);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_9byte1.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_9byte1.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_9byte1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_9byte1.c	Sun May 24 22:32:13 2026
*************** static cls_struct_9byte cls_struct_9byte
*** 26,31 ****
--- 26,40 ----
    printf("%d %g %d %g: %d %g\n", b1.a, b1.b,  b2.a, b2.b,
  	 result.a, result.b);
  
+   CHECK(b1.a == 7);
+   CHECK(b1.b == 8);
+ 
+   CHECK(b2.a == 1);
+   CHECK(b2.b == 9);
+ 
+   CHECK(result.a == 8);
+   CHECK(result.b == 17);
+ 
    return result;
  }
  
*************** int main (void)
*** 78,83 ****
--- 87,94 ----
    /* { dg-output "7 8 1 9: 8 17" } */
    printf("res: %d %g\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 8 17" } */
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 17);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 85,90 ****
--- 96,103 ----
    /* { dg-output "\n7 8 1 9: 8 17" } */
    printf("res: %d %g\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 8 17" } */
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 17);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_9byte2.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_9byte2.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_9byte2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_9byte2.c	Sun May 24 22:32:13 2026
*************** static cls_struct_9byte cls_struct_9byte
*** 26,31 ****
--- 26,40 ----
    printf("%g %d %g %d: %g %d\n", b1.a, b1.b,  b2.a, b2.b,
  	 result.a, result.b);
  
+   CHECK(b1.a == 7);
+   CHECK(b1.b == 8);
+ 
+   CHECK(b2.a == 1);
+   CHECK(b2.b == 9);
+ 
+   CHECK(result.a == 8);
+   CHECK(result.b == 17);
+ 
    return result;
  }
  
*************** int main (void)
*** 78,84 ****
    /* { dg-output "7 8 1 9: 8 17" } */
    printf("res: %g %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 8 17" } */
! 
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
  
--- 87,94 ----
    /* { dg-output "7 8 1 9: 8 17" } */
    printf("res: %g %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 8 17" } */
!   CHECK(res_dbl.a == 8);
!   CHECK(res_dbl.b == 17);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_9byte_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 96,103 ----
    /* { dg-output "\n7 8 1 9: 8 17" } */
    printf("res: %g %d\n", res_dbl.a, res_dbl.b);
    /* { dg-output "\nres: 8 17" } */
+   CHECK(res_dbl.a == 8);
+   CHECK(res_dbl.b == 17);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_double.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_double.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_double.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_double.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 26,31 ****
--- 26,43 ----
  
    printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 81,86 ****
--- 93,101 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 88,93 ****
--- 103,111 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_float.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_float.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_float.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_float.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 24,29 ****
--- 24,41 ----
  
    printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK_FLOAT_EQ(a1.b, 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK_FLOAT_EQ(a2.b, 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK_FLOAT_EQ(result.b, 14271);
+   CHECK(result.c == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 79,84 ****
--- 91,99 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK_FLOAT_EQ(res_dbl.b, 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 101,109 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK_FLOAT_EQ(res_dbl.b, 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 25,30 ****
--- 25,42 ----
  
    printf("%d %g %d %d %g %d: %d %g %d\n", a1.a, (double)a1.b, a1.c, a2.a, (double)a2.b, a2.c, result.a, (double)result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 80,85 ****
--- 92,101 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
+ 
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 87,92 ****
--- 103,111 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %g %d\n", res_dbl.a, (double)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble_split.c	Sun May 24 22:32:13 2026
***************
*** 5,11 ****
     Originator:	<hos@tamanegi.org> 20031203	 */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
  
  #include "ffitest.h"
  
--- 5,11 ----
     Originator:	<hos@tamanegi.org> 20031203	 */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux-gnu* } } */
  
  #include "ffitest.h"
  
*************** static cls_struct_align cls_struct_align
*** 39,70 ****
  		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
  		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
  
! 	return r;
! }
! 
! cls_struct_align cls_struct_align_fn2(
! 	cls_struct_align	a1)
! {
! 	struct cls_struct_align r;
! 
! 	r.a = a1.a + 1;
! 	r.b = a1.b + 1;
! 	r.c = a1.c + 1;
! 	r.d = a1.d + 1;
! 	r.e = a1.e + 1;
! 	r.f = a1.f + 1;
! 	r.g = a1.g + 1;
  
! 	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
! 		"%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
! 		a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
! 		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
  
  	return r;
  }
  
  static void
! cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, 
  		    void* userdata __UNUSED__)
  {
  	struct cls_struct_align a1, a2;
--- 39,72 ----
  		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
  		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
  
! 	CHECK(a1.a == 1);
! 	CHECK(a1.b == 2);
! 	CHECK(a1.c == 3);
! 	CHECK(a1.d == 4);
! 	CHECK(a1.e == 5);
! 	CHECK(a1.f == 6);
! 	CHECK(a1.g == 7);
  
! 	CHECK(a2.a == 8);
! 	CHECK(a2.b == 9);
! 	CHECK(a2.c == 10);
! 	CHECK(a2.d == 11);
! 	CHECK(a2.e == 12);
! 	CHECK(a2.f == 13);
! 	CHECK(a2.g == 14);
  
+ 	CHECK(r.a == 9);
+ 	CHECK(r.b == 11);
+ 	CHECK(r.c == 13);
+ 	CHECK(r.d == 15);
+ 	CHECK(r.e == 17);
+ 	CHECK(r.f == 19);
+ 	CHECK(r.g == 21);
  	return r;
  }
  
  static void
! cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
  		    void* userdata __UNUSED__)
  {
  	struct cls_struct_align a1, a2;
*************** int main (void)
*** 119,124 ****
--- 121,133 ----
  	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+ 	CHECK(res_dbl.a == 9);
+ 	CHECK(res_dbl.b == 11);
+ 	CHECK(res_dbl.c == 13);
+ 	CHECK(res_dbl.d == 15);
+ 	CHECK(res_dbl.e == 17);
+ 	CHECK(res_dbl.f == 19);
+ 	CHECK(res_dbl.g == 21);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 127,132 ****
  	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
! 
    exit(0);
  }
--- 136,147 ----
  	printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
! 	CHECK(res_dbl.a == 9);
! 	CHECK(res_dbl.b == 11);
! 	CHECK(res_dbl.c == 13);
! 	CHECK(res_dbl.d == 15);
! 	CHECK(res_dbl.e == 17);
! 	CHECK(res_dbl.f == 19);
! 	CHECK(res_dbl.g == 21);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_longdouble_split2.c	Sun May 24 22:32:13 2026
***************
*** 6,12 ****
  */
  
  /* { dg-do run { xfail strongarm*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
  
  #include "ffitest.h"
  
--- 6,12 ----
  */
  
  /* { dg-do run { xfail strongarm*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux-gnu* } } */
  
  #include "ffitest.h"
  
*************** static cls_struct_align cls_struct_align
*** 40,45 ****
--- 40,69 ----
  		a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
  		r.a, r.b, r.c, r.d, r.e, r.f, r.g);
  
+ 	CHECK(a1.a == 1);
+ 	CHECK(a1.b == 2);
+ 	CHECK(a1.c == 3);
+ 	CHECK(a1.d == 4);
+ 	CHECK(a1.e == 5);
+ 	CHECK(a1.f == 6);
+ 	CHECK(a1.g == 7);
+ 
+ 	CHECK(a2.a == 8);
+ 	CHECK(a2.b == 9);
+ 	CHECK(a2.c == 10);
+ 	CHECK(a2.d == 11);
+ 	CHECK(a2.e == 12);
+ 	CHECK(a2.f == 13);
+ 	CHECK(a2.g == 14);
+ 
+ 	CHECK(r.a == 9);
+ 	CHECK(r.b == 11);
+ 	CHECK(r.c == 13);
+ 	CHECK(r.d == 15);
+ 	CHECK(r.e == 17);
+ 	CHECK(r.f == 19);
+ 	CHECK(r.g == 21);
+ 
  	return r;
  }
  
*************** int main (void)
*** 99,104 ****
--- 123,135 ----
  	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
+ 	CHECK(res_dbl.a == 9);
+ 	CHECK(res_dbl.b == 11);
+ 	CHECK(res_dbl.c == 13);
+ 	CHECK(res_dbl.d == 15);
+ 	CHECK(res_dbl.e == 17);
+ 	CHECK(res_dbl.f == 19);
+ 	CHECK(res_dbl.g == 21);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 107,113 ****
  	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
! 
    exit(0);
  }
  
--- 138,150 ----
  	printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
  		res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
  	/* { dg-output "\nres: 9 11 13 15 17 19 21" } */
! 	CHECK(res_dbl.a == 9);
! 	CHECK(res_dbl.b == 11);
! 	CHECK(res_dbl.c == 13);
! 	CHECK(res_dbl.d == 15);
! 	CHECK(res_dbl.e == 17);
! 	CHECK(res_dbl.f == 19);
! 	CHECK(res_dbl.g == 21);
    exit(0);
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_pointer.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_pointer.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_pointer.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_pointer.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 28,33 ****
--- 28,45 ----
           result.a, (uintptr_t)result.b,
  	 result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == (void *)4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == (void *)9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == (void *)14271);
+   CHECK(result.c == 140);
+ 
    return result;
  }
  
*************** int main (void)
*** 83,88 ****
--- 95,103 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == (void *)14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 90,95 ****
--- 105,113 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == (void *)14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint16.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint16.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint16.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint16.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 23,28 ****
--- 23,39 ----
    result.c = a1.c + a2.c;
  
    printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
  
    return  result;
  }
*************** int main (void)
*** 79,84 ****
--- 90,98 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 100,108 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint32.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint32.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint32.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint32.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 23,28 ****
--- 23,39 ----
    result.c = a1.c + a2.c;
  
    printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
  
    return  result;
  }
*************** int main (void)
*** 79,91 ****
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
! 
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
    res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
! 
    exit(0);
  }
--- 90,106 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
!   CHECK(res_dbl.a == 13);
!   CHECK(res_dbl.b == 14271);
!   CHECK(res_dbl.c == 140);
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
    res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
!   CHECK(res_dbl.a == 13);
!   CHECK(res_dbl.b == 14271);
!   CHECK(res_dbl.c == 140);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint64.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint64.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_sint64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_sint64.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 24,29 ****
--- 24,40 ----
    result.c = a1.c + a2.c;
  
    printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
  
    return  result;
  }
*************** int main (void)
*** 80,85 ****
--- 91,99 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 87,92 ****
--- 101,109 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint16.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint16.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint16.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint16.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 23,28 ****
--- 23,39 ----
    result.c = a1.c + a2.c;
  
    printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
  
    return  result;
  }
*************** int main (void)
*** 79,84 ****
--- 90,98 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 100,108 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint32.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint32.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint32.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint32.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 24,29 ****
--- 24,41 ----
  
    printf("%d %d %d %d %d %d: %d %d %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 79,84 ****
--- 91,99 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 101,109 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint64.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint64.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_align_uint64.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_align_uint64.c	Sun May 24 22:32:13 2026
*************** static cls_struct_align cls_struct_align
*** 26,31 ****
--- 26,43 ----
  
    printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
  
+   CHECK(a1.a == 12);
+   CHECK(a1.b == 4951);
+   CHECK(a1.c == 127);
+ 
+   CHECK(a2.a == 1);
+   CHECK(a2.b == 9320);
+   CHECK(a2.c == 13);
+ 
+   CHECK(result.a == 13);
+   CHECK(result.b == 14271);
+   CHECK(result.c == 140);
+ 
    return  result;
  }
  
*************** int main (void)
*** 81,86 ****
--- 93,101 ----
    /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 88,93 ****
--- 103,111 ----
    /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
    printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
    /* { dg-output "\nres: 13 14271 140" } */
+   CHECK(res_dbl.a == 13);
+   CHECK(res_dbl.b == 14271);
+   CHECK(res_dbl.c == 140);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_dbls_struct.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_dbls_struct.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_dbls_struct.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_dbls_struct.c	Sun May 24 22:32:13 2026
*************** void
*** 17,22 ****
--- 17,24 ----
  closure_test_fn(Dbls p)
  {
  	printf("%.1f %.1f\n", p.x, p.y);
+ 	CHECK(p.x == 1);
+ 	CHECK(p.y == 2);
  }
  
  void
*************** closure_test_gn(ffi_cif* cif __UNUSED__,
*** 26,32 ****
  	closure_test_fn(*(Dbls*)args[0]);
  }
  
! int main(int argc __UNUSED__, char** argv __UNUSED__)
  {
  	ffi_cif cif;
  
--- 28,34 ----
  	closure_test_fn(*(Dbls*)args[0]);
  }
  
! int main(void)
  {
  	ffi_cif cif;
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_double_va.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_double_va.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_double_va.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_double_va.c	Sun May 24 22:32:13 2026
***************
*** 10,23 ****
  
  #include "ffitest.h"
  
  static void
! cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
  		 void** args, void* userdata __UNUSED__)
  {
  	char*	format		= *(char**)args[0];
  	double	doubleValue	= *(double*)args[1];
  
  	*(ffi_arg*)resp = printf(format, doubleValue);
  }
  
  int main (void)
--- 10,29 ----
  
  #include "ffitest.h"
  
+ #define BUF_SIZE 50
+ static char buffer[BUF_SIZE];
+ 
  static void
! cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp,
  		 void** args, void* userdata __UNUSED__)
  {
  	char*	format		= *(char**)args[0];
  	double	doubleValue	= *(double*)args[1];
  
  	*(ffi_arg*)resp = printf(format, doubleValue);
+ 	CHECK(*(ffi_arg*)resp == 4);
+ 	snprintf(buffer, BUF_SIZE, format, doubleValue);
+ 	CHECK(strncmp(buffer, "7.0\n", 4) == 0);
  }
  
  int main (void)
*************** int main (void)
*** 48,53 ****
--- 54,60 ----
  	/* { dg-output "7.0" } */
  	printf("res: %d\n", (int) res);
  	/* { dg-output "\nres: 4" } */
+ 	CHECK(res == 4);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL,
  				   code) == FFI_OK);
*************** int main (void)
*** 56,61 ****
--- 63,69 ----
  	/* { dg-output "\n7.0" } */
  	printf("res: %d\n", (int) res);
  	/* { dg-output "\nres: 4" } */
+ 	CHECK(res == 4);
  
  	exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_float.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_float.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_float.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_float.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_float_fn(ffi_cif* ci
*** 14,19 ****
--- 14,22 ----
  
     printf("%g: %g\n",*(float *)args[0],
  	  *(float *)resp);
+ 
+    CHECK((int)(*(float *)args[0]) == -2122);
+    CHECK((int)(*(float *)resp) == -2122);
   }
  
  typedef float (*cls_ret_float)(float);
*************** int main (void)
*** 38,42 ****
--- 41,46 ----
    /* { dg-output "\\-2122.12: \\-2122.12" } */
    printf("res: %.6f\n", res);
    /* { dg-output "\nres: \-2122.120117" } */
+   CHECK((int)res == -2122);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_longdouble.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_longdouble.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_longdouble.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_longdouble.c	Sun May 24 22:32:13 2026
***************
*** 7,13 ****
  /* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have
     remove the xfail for arm*-*-* below, until we know more.  */
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
  
  #include "ffitest.h"
  
--- 7,13 ----
  /* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have
     remove the xfail for arm*-*-* below, until we know more.  */
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux-gnu* } } */
  
  #include "ffitest.h"
  
*************** long double cls_ldouble_fn(
*** 25,30 ****
--- 25,38 ----
  
  	printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n",
  		a1, a2, a3, a4, a5, a6, a7, a8, r);
+ 	CHECK(a1 == 1);
+ 	CHECK(a2 == 2);
+ 	CHECK(a3 == 3);
+ 	CHECK(a4 == 4);
+ 	CHECK(a5 == 5);
+ 	CHECK(a6 == 6);
+ 	CHECK(a7 == 7);
+ 	CHECK(a8 == 8);
  
  	return r;
  }
*************** int main(void)
*** 91,96 ****
--- 99,105 ----
  	/* { dg-output "1 2 3 4 5 6 7 8: 36" } */
  	printf("res: %Lg\n", res);
  	/* { dg-output "\nres: 36" } */
+ 	CHECK(res == 36);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK);
  
*************** int main(void)
*** 100,105 ****
--- 109,115 ----
  	/* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */
  	printf("res: %Lg\n", res);
  	/* { dg-output "\nres: 36" } */
+ 	CHECK(res == 36);
  
  	return 0;
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_longdouble_va.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_longdouble_va.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_longdouble_va.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_longdouble_va.c	Sun May 24 22:32:13 2026
***************
*** 5,23 ****
     Originator:	Blake Chaffin 6/6/2007	 */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */
  /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
  
  #include "ffitest.h"
  
  static void
! cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
  		     void** args, void* userdata __UNUSED__)
  {
  	char*		format	= *(char**)args[0];
  	long double	ldValue	= *(long double*)args[1];
  
  	*(ffi_arg*)resp = printf(format, ldValue);
  }
  
  int main (void)
--- 5,40 ----
     Originator:	Blake Chaffin 6/6/2007	 */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-output "" { xfail avr32*-*-* } } */
  /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
  
  #include "ffitest.h"
+ #include <stdarg.h>
+ 
+ #define BUF_SIZE 50
+ static char buffer[BUF_SIZE];
+ 
+ static int
+ wrap_printf(char* fmt, ...) {
+ 	va_list ap;
+ 	va_start(ap, fmt);
+ 	long double ldArg = va_arg(ap, long double);
+ 	va_end(ap);
+ 	CHECK((int)ldArg == 7);
+ 	return printf(fmt, ldArg);	
+ }
  
  static void
! cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp,
  		     void** args, void* userdata __UNUSED__)
  {
  	char*		format	= *(char**)args[0];
  	long double	ldValue	= *(long double*)args[1];
  
  	*(ffi_arg*)resp = printf(format, ldValue);
+ 	CHECK(*(ffi_arg*)resp == 4);
+ 	snprintf(buffer, BUF_SIZE, format, ldValue);
+ 	CHECK(strncmp(buffer, "7.0\n", BUF_SIZE) == 0);
  }
  
  int main (void)
*************** int main (void)
*** 44,53 ****
  	args[1] = &ldArg;
  	args[2] = NULL;
  
! 	ffi_call(&cif, FFI_FN(printf), &res, args);
  	/* { dg-output "7.0" } */
  	printf("res: %d\n", (int) res);
  	/* { dg-output "\nres: 4" } */
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL,
  				   code) == FFI_OK);
--- 61,71 ----
  	args[1] = &ldArg;
  	args[2] = NULL;
  
! 	ffi_call(&cif, FFI_FN(wrap_printf), &res, args);
  	/* { dg-output "7.0" } */
  	printf("res: %d\n", (int) res);
  	/* { dg-output "\nres: 4" } */
+ 	CHECK(res == 4);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL,
  				   code) == FFI_OK);
*************** int main (void)
*** 56,61 ****
--- 74,80 ----
  	/* { dg-output "\n7.0" } */
  	printf("res: %d\n", (int) res);
  	/* { dg-output "\nres: 4" } */
+ 	CHECK(res == 4);
  
  	exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_schar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_schar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_schar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_schar.c	Sun May 24 22:32:13 2026
*************** static void test_func_gn(ffi_cif *cif __
*** 26,31 ****
--- 26,33 ----
  
    a1 = *(signed char *)avals[0];
    a2 = *(signed char *)avals[1];
+   CHECK(a1 == 2);
+   CHECK(a2 == 125);
  
    *(ffi_arg *)rval = test_func_fn(a1, a2);
  
*************** int main (void)
*** 62,67 ****
--- 64,70 ----
    /* { dg-output "2 125: 127" } */
    printf("res: %d\n", (signed char)res_call);
    /* { dg-output "\nres: 127" } */
+   CHECK((signed char)res_call == 127);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
  
*************** int main (void)
*** 69,74 ****
--- 72,78 ----
    /* { dg-output "\n2 125: 127" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 127" } */
+   CHECK(res_closure == 127);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_sshort.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_sshort.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_sshort.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_sshort.c	Sun May 24 22:32:13 2026
*************** static signed short test_func_fn(signed
*** 14,19 ****
--- 14,22 ----
    result = a1 + a2;
  
    printf("%d %d: %d\n", a1, a2, result);
+   CHECK(a1 == 2);
+   CHECK(a2 == 32765);
+   CHECK(result == 32767);
  
    return result;
  
*************** int main (void)
*** 62,67 ****
--- 65,71 ----
    /* { dg-output "2 32765: 32767" } */
    printf("res: %d\n", (unsigned short)res_call);
    /* { dg-output "\nres: 32767" } */
+   CHECK((unsigned short)res_call == 32767);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
  
*************** int main (void)
*** 69,74 ****
--- 73,79 ----
    /* { dg-output "\n2 32765: 32767" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 32767" } */
+   CHECK(res_closure == 32767);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c	Sun May 24 22:32:13 2026
*************** static signed short test_func_fn(signed
*** 16,21 ****
--- 16,27 ----
  
    printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
  
+   CHECK(a1 == 1);
+   CHECK(a2 == 32765);
+   CHECK(a3 == 127);
+   CHECK(a4 == -128);
+   CHECK(result == 32765);
+ 
    return result;
  
  }
*************** int main (void)
*** 74,79 ****
--- 80,86 ----
    /* { dg-output "1 32765 127 -128: 32765" } */
    printf("res: %d\n", (signed short)res_call);
    /* { dg-output "\nres: 32765" } */
+   CHECK((signed short)res_call == 32765);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
  
*************** int main (void)
*** 81,86 ****
--- 88,94 ----
    /* { dg-output "\n1 32765 127 -128: 32765" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 32765" } */
+   CHECK(res_closure == 32765);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_uchar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_uchar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_uchar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_uchar.c	Sun May 24 22:32:13 2026
*************** static unsigned char test_func_fn(unsign
*** 16,21 ****
--- 16,27 ----
  
    printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
  
+   CHECK(a1 == 1);
+   CHECK(a2 == 2);
+   CHECK(a3 == 127);
+   CHECK(a4 == 125);
+   CHECK(result == 255);
+ 
    return result;
  
  }
*************** int main (void)
*** 79,84 ****
--- 85,91 ----
    /* { dg-output "1 2 127 125: 255" } */
    printf("res: %d\n", (unsigned char)res_call);
    /* { dg-output "\nres: 255" } */
+   CHECK((unsigned char)res_call == 255);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
  
*************** int main (void)
*** 86,91 ****
--- 93,99 ----
    /* { dg-output "\n1 2 127 125: 255" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 255" } */
+   CHECK(res_closure == 255);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_ushort.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_ushort.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_ushort.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_ushort.c	Sun May 24 22:32:13 2026
*************** static unsigned short test_func_fn(unsig
*** 15,22 ****
  
    printf("%d %d: %d\n", a1, a2, result);
  
!   return result;
  
  }
  
  static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
--- 15,25 ----
  
    printf("%d %d: %d\n", a1, a2, result);
  
!   CHECK(a1 == 2);
!   CHECK(a2 == 32765);
!   CHECK(result == 32767);
  
+   return result;
  }
  
  static void test_func_gn(ffi_cif *cif __UNUSED__, void *rval, void **avals,
*************** int main (void)
*** 69,74 ****
--- 72,78 ----
    /* { dg-output "\n2 32765: 32767" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 32767" } */
+   CHECK(res_closure == 32767);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c	Sun May 24 22:32:13 2026
*************** static unsigned short test_func_fn(unsig
*** 16,21 ****
--- 16,27 ----
  
    printf("%d %d %d %d: %d\n", a1, a2, a3, a4, result);
  
+   CHECK(a1 == 1);
+   CHECK(a2 == 2);
+   CHECK(a3 == 127);
+   CHECK(a4 == 128);
+   CHECK(result == 258);
+ 
    return result;
  
  }
*************** int main (void)
*** 74,79 ****
--- 80,86 ----
    /* { dg-output "1 2 127 128: 258" } */
    printf("res: %d\n", (unsigned short)res_call);
    /* { dg-output "\nres: 258" } */
+   CHECK((unsigned short)res_call == 258);
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, test_func_gn, NULL, code)  == FFI_OK);
  
*************** int main (void)
*** 81,86 ****
--- 88,94 ----
    /* { dg-output "\n1 2 127 128: 258" } */
    printf("res: %d\n", res_closure);
    /* { dg-output "\nres: 258" } */
+   CHECK(res_closure == 258);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_pointer.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_pointer.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_pointer.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_pointer.c	Sun May 24 22:32:13 2026
*************** void* cls_pointer_fn(void* a1, void* a2)
*** 16,21 ****
--- 16,25 ----
                 (unsigned int)(uintptr_t) a2,
                 (unsigned int)(uintptr_t) result);
  
+ 	CHECK((unsigned int)(uintptr_t) a1 == 0x12345678);
+ 	CHECK((unsigned int)(uintptr_t) a2 == 0x89abcdef);
+ 	CHECK((unsigned int)(uintptr_t) result == 0x9be02467);
+ 
  	return result;
  }
  
*************** int main (void)
*** 69,74 ****
--- 73,79 ----
  	/* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */
  	printf("res: 0x%08x\n", (unsigned int) res);
  	/* { dg-output "\nres: 0x9be02467" } */
+ 	CHECK(res == 0x9be02467);
  
  	exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_pointer_stack.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_pointer_stack.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_pointer_stack.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_pointer_stack.c	Sun May 24 22:32:13 2026
*************** void* cls_pointer_fn2(void* a1, void* a2
*** 40,45 ****
--- 40,49 ----
                 (unsigned int)(uintptr_t) a2,
                 (unsigned int)(uintptr_t) result);
  
+ 	CHECK((unsigned int)(uintptr_t) a1 == 0x8acf1356);
+ 	CHECK((unsigned int)(uintptr_t) a2 == 0x01234567);
+ 	CHECK((unsigned int)(uintptr_t) result == 0x8bf258bd);
+ 
  	return result;
  }
  
*************** void* cls_pointer_fn1(void* a1, void* a2
*** 65,70 ****
--- 69,78 ----
                 (unsigned int)(intptr_t) a2,
                 (unsigned int)(intptr_t) result);
  
+ 	CHECK((unsigned int)(uintptr_t) a1 == 0x01234567);
+ 	CHECK((unsigned int)(uintptr_t) a2 == 0x89abcdef);
+ 	CHECK((unsigned int)(uintptr_t) result == 0x8acf1356);
+ 
  	result	= cls_pointer_fn2(result, a1);
  
  	return result;
*************** int main (void)
*** 128,133 ****
--- 136,142 ----
  	/* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
  	/* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
  	/* { dg-output "\nres: 0x8bf258bd" } */
+ 	CHECK(res == 0x8bf258bd);
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 137,142 ****
--- 146,152 ----
  	/* { dg-output "\n0x01234567 0x89abcdef: 0x8acf1356" } */
  	/* { dg-output "\n0x8acf1356 0x01234567: 0x8bf258bd" } */
  	/* { dg-output "\nres: 0x8bf258bd" } */
+ 	CHECK(res == 0x8bf258bd);
  
  	exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_schar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_schar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_schar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_schar.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_schar_fn(ffi_cif* ci
*** 15,20 ****
--- 15,22 ----
    *(ffi_arg*)resp = *(signed char *)args[0];
    printf("%d: %d\n",*(signed char *)args[0],
  	 (int)*(ffi_arg *)(resp));
+   CHECK(*(signed char *)args[0] == 127);
+   CHECK((int)*(ffi_arg *)(resp) == 127);
  }
  typedef signed char (*cls_ret_schar)(signed char);
  
*************** int main (void)
*** 39,44 ****
--- 41,47 ----
    /* { dg-output "127: 127" } */
    printf("res: %d\n", res);
    /* { dg-output "\nres: 127" } */
+   CHECK(res == 127);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_sint.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_sint.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_sint.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_sint.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_sint_fn(ffi_cif* cif
*** 13,18 ****
--- 13,20 ----
    *(ffi_arg*)resp = *(signed int *)args[0];
    printf("%d: %d\n",*(signed int *)args[0],
  	 (int)*(ffi_arg *)(resp));
+   CHECK(*(signed int *)args[0] == 65534);
+   CHECK((int)*(ffi_arg *)(resp) == 65534);
  }
  typedef signed int (*cls_ret_sint)(signed int);
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_sshort.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_sshort.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_sshort.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_sshort.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_sshort_fn(ffi_cif* c
*** 13,18 ****
--- 13,20 ----
    *(ffi_arg*)resp = *(signed short *)args[0];
    printf("%d: %d\n",*(signed short *)args[0],
  	 (int)*(ffi_arg *)(resp));
+   CHECK(*(signed short *)args[0] == 255);
+   CHECK((int)*(ffi_arg *)(resp) == 255);
  }
  typedef signed short (*cls_ret_sshort)(signed short);
  
*************** int main (void)
*** 37,42 ****
--- 39,45 ----
    /* { dg-output "255: 255" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 255" } */
+   CHECK(res == 255);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_struct_va1.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_struct_va1.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_struct_va1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_struct_va1.c	Sun May 24 22:32:13 2026
*************** test_fn (ffi_cif* cif __UNUSED__, void*
*** 35,40 ****
--- 35,50 ----
    printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b,
  	  l1.a, l1.b, l1.c, l1.d, l1.e,
  	  s2.a, s2.b);
+   CHECK(n == 4);
+   CHECK(s1.a == 5);
+   CHECK(s1.b == 6);
+   CHECK(l1.a == 10);
+   CHECK(l1.b == 11);
+   CHECK(l1.c == 12);
+   CHECK(l1.d == 13);
+   CHECK(l1.e == 14);
+   CHECK(s2.a == 20);
+   CHECK(s2.b == 21);
    * (ffi_arg*) resp = 42;
  }
  
*************** main (void)
*** 109,114 ****
--- 119,125 ----
    /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */
    printf("res: %d\n", (int) res);
    /* { dg-output "\nres: 42" } */
+   CHECK(res == 42);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uchar.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uchar.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uchar.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uchar.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_uchar_fn(ffi_cif* ci
*** 13,18 ****
--- 13,20 ----
    *(ffi_arg*)resp = *(unsigned char *)args[0];
    printf("%d: %d\n",*(unsigned char *)args[0],
  	 (int)*(ffi_arg *)(resp));
+   CHECK(*(unsigned char *)args[0] == 127);
+   CHECK((int)*(ffi_arg *)(resp) == 127);
  }
  typedef unsigned char (*cls_ret_uchar)(unsigned char);
  
*************** int main (void)
*** 37,42 ****
--- 39,45 ----
    /* { dg-output "127: 127" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 127" } */
+   CHECK(res == 127);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uint.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uint.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uint.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uint.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_uint_fn(ffi_cif* cif
*** 14,19 ****
--- 14,22 ----
  
    printf("%d: %d\n",*(unsigned int *)args[0],
  	 (int)*(ffi_arg *)(resp));
+ 
+   CHECK(*(unsigned int *)args[0] == 2147483647);
+   CHECK((int)*(ffi_arg *)(resp) == 2147483647);
  }
  typedef unsigned int (*cls_ret_uint)(unsigned int);
  
*************** int main (void)
*** 38,43 ****
--- 41,47 ----
    /* { dg-output "2147483647: 2147483647" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 2147483647" } */
+   CHECK(res == 2147483647);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uint_va.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uint_va.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_uint_va.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_uint_va.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_T_fn(ffi_cif* cif __
*** 16,21 ****
--- 16,24 ----
     *(ffi_arg *)resp = *(T *)args[0];
  
     printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]);
+    CHECK(*(T *)args[0] == 67);
+    CHECK(*(T *)args[1] == 4);
+    CHECK((int)*(ffi_arg *)resp == 67);
   }
  
  typedef T (*cls_ret_T)(T, ...);
*************** int main (void)
*** 41,45 ****
--- 44,49 ----
    /* { dg-output "67: 67 4" } */
    printf("res: %d\n", res);
    /* { dg-output "\nres: 67" } */
+   CHECK(res == 67);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ulong_va.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ulong_va.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ulong_va.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ulong_va.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_T_fn(ffi_cif* cif __
*** 16,21 ****
--- 16,24 ----
     *(T *)resp = *(T *)args[0];
  
     printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]);
+    CHECK(*(T *)args[0] == 67);
+    CHECK(*(T *)args[1] == 4);
+    CHECK(*(T *)resp == 67);
   }
  
  typedef T (*cls_ret_T)(T, ...);
*************** int main (void)
*** 41,45 ****
--- 44,49 ----
    /* { dg-output "67: 67 4" } */
    printf("res: %ld\n", res);
    /* { dg-output "\nres: 67" } */
+   CHECK(res == 67);
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ulonglong.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ulonglong.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ulonglong.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ulonglong.c	Sun May 24 22:32:13 2026
*************** int main (void)
*** 37,47 ****
--- 37,49 ----
    /* { dg-output "214: 1152921504606846761" } */
    printf("res: %" PRIdLL "\n", res);
    /* { dg-output "\nres: 1152921504606846761" } */
+   CHECK(res == 1152921504606846761LL);
  
    res = (*((cls_ret_ulonglong)code))(9223372035854775808LL);
    /* { dg-output "\n9223372035854775808: 8070450533247928831" } */
    printf("res: %" PRIdLL "\n", res);
    /* { dg-output "\nres: 8070450533247928831" } */
+   CHECK(res == 8070450533247928831LL);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ushort.c gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ushort.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/cls_ushort.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/cls_ushort.c	Sun May 24 22:32:13 2026
*************** static void cls_ret_ushort_fn(ffi_cif* c
*** 14,19 ****
--- 14,21 ----
  
    printf("%d: %d\n",*(unsigned short *)args[0],
  	 (int)*(ffi_arg *)(resp));
+   CHECK(*(unsigned short *)args[0] == 65535);
+   CHECK((int)*(ffi_arg *)(resp) == 65535);
  }
  typedef unsigned short (*cls_ret_ushort)(unsigned short);
  
*************** int main (void)
*** 38,43 ****
--- 40,46 ----
    /* { dg-output "65535: 65535" } */
    printf("res: %d\n",res);
    /* { dg-output "\nres: 65535" } */
+   CHECK(res == 65535);
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/ffitest.h gcc-17-20260524/libffi/testsuite/libffi.closures/ffitest.h
*** gcc-17-20260517/libffi/testsuite/libffi.closures/ffitest.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/ffitest.h	Sun May 24 22:32:13 2026
***************
*** 1,144 ****
! #include <stdlib.h>
! #include <stdio.h>
! #include <string.h>
! #include <fcntl.h>
! #include <ffi.h>
! #include "fficonfig.h"
! 
! #if defined HAVE_STDINT_H
! #include <stdint.h>
! #endif
! 
! #if defined HAVE_INTTYPES_H
! #include <inttypes.h>
! #endif
! 
! #define MAX_ARGS 256
! 
! #define CHECK(x) \
!    do { \
!       if(!(x)){ \
!          printf("Check failed:\n%s\n", #x); \
!          abort(); \
!       } \
!    } while(0)
! 
! /* Define macros so that compilers other than gcc can run the tests.  */
! #undef __UNUSED__
! #if defined(__GNUC__)
! #define __UNUSED__ __attribute__((__unused__))
! #define __STDCALL__ __attribute__((stdcall))
! #define __THISCALL__ __attribute__((thiscall))
! #define __FASTCALL__ __attribute__((fastcall))
! #define __MSABI__ __attribute__((ms_abi))
! #else
! #define __UNUSED__
! #define __STDCALL__ __stdcall
! #define __THISCALL__ __thiscall
! #define __FASTCALL__ __fastcall
! #endif
! 
! #ifndef ABI_NUM
! #define ABI_NUM FFI_DEFAULT_ABI
! #define ABI_ATTR
! #endif
! 
! /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
!    file open.  */
! #ifdef HAVE_MMAP_ANON
! # undef HAVE_MMAP_DEV_ZERO
! 
! # include <sys/mman.h>
! # ifndef MAP_FAILED
! #  define MAP_FAILED -1
! # endif
! # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
! #  define MAP_ANONYMOUS MAP_ANON
! # endif
! # define USING_MMAP
! 
! #endif
! 
! #ifdef HAVE_MMAP_DEV_ZERO
! 
! # include <sys/mman.h>
! # ifndef MAP_FAILED
! #  define MAP_FAILED -1
! # endif
! # define USING_MMAP
! 
! #endif
! 
! /* MinGW kludge.  */
! #if defined(_WIN64) | defined(_WIN32)
! #define PRIdLL "I64d"
! #define PRIuLL "I64u"
! #else
! #define PRIdLL "lld"
! #define PRIuLL "llu"
! #endif
! 
! /* Tru64 UNIX kludge.  */
! #if defined(__alpha__) && defined(__osf__)
! /* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit.  */
! #undef PRIdLL
! #define PRIdLL "ld"
! #undef PRIuLL
! #define PRIuLL "lu"
! #define PRId8 "hd"
! #define PRIu8 "hu"
! #define PRId64 "ld"
! #define PRIu64 "lu"
! #define PRIuPTR "lu"
! #endif
! 
! /* PA HP-UX kludge.  */
! #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR)
! #define PRIuPTR "lu"
! #endif
! 
! /* IRIX kludge.  */
! #if defined(__sgi)
! /* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99
!    compilations.  */
! #define PRId8 "hhd"
! #define PRIu8 "hhu"
! #if (_MIPS_SZLONG == 32)
! #define PRId64 "lld"
! #define PRIu64 "llu"
! #endif
! /* This doesn't match <inttypes.h>, which always has "lld" here, but the
!    arguments are uint64_t, int64_t, which are unsigned long, long for
!    64-bit in <sgidefs.h>.  */
! #if (_MIPS_SZLONG == 64)
! #define PRId64 "ld"
! #define PRIu64 "lu"
! #endif
! /* This doesn't match <inttypes.h>, which has "u" here, but the arguments
!    are uintptr_t, which is always unsigned long.  */
! #define PRIuPTR "lu"
! #endif
! 
! /* Solaris < 10 kludge.  */
! #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR)
! #if defined(__arch64__) || defined (__x86_64__)
! #define PRIuPTR "lu"
! #else
! #define PRIuPTR "u"
! #endif
! #endif
! 
! /* MSVC kludge.  */
! #if defined _MSC_VER
! #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS)
! #define PRIuPTR "lu"
! #define PRIu8 "u"
! #define PRId8 "d"
! #define PRIu64 "I64u"
! #define PRId64 "I64d"
! #endif
! #endif
! 
! #ifndef PRIuPTR
! #define PRIuPTR "u"
! #endif
--- 1 ----
! #include "../libffi.call/ffitest.h"
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/huge_struct.c gcc-17-20260524/libffi/testsuite/libffi.closures/huge_struct.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/huge_struct.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/huge_struct.c	Sun May 24 22:32:13 2026
***************
*** 6,12 ****
  */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
  /* { dg-options -Wformat=0 { target moxie*-*-elf or1k-*-* } } */
  
  #include <inttypes.h>
--- 6,12 ----
  */
  
  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
! /* { dg-options -mlong-double-128 { target powerpc64*-*-linux-gnu* } } */
  /* { dg-options -Wformat=0 { target moxie*-*-elf or1k-*-* } } */
  
  #include <inttypes.h>
*************** test_large_fn(
*** 121,133 ****
  {
  	BigStruct	retVal	= {
  		ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1,
! 			ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1), 
  		ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2,
! 			ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2), 
  		ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3,
! 			ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3), 
  		ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4,
! 			ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4), 
  		ui8_5 + 5, si8_5 + 5};
  
  	printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
--- 121,133 ----
  {
  	BigStruct	retVal	= {
  		ui8_1 + 1, si8_1 + 1, ui16_1 + 1, si16_1 + 1, ui32_1 + 1, si32_1 + 1,
! 			ui64_1 + 1, si64_1 + 1, f_1 + 1, d_1 + 1, ld_1 + 1, (char*)((intptr_t)p_1 + 1),
  		ui8_2 + 2, si8_2 + 2, ui16_2 + 2, si16_2 + 2, ui32_2 + 2, si32_2 + 2,
! 			ui64_2 + 2, si64_2 + 2, f_2 + 2, d_2 + 2, ld_2 + 2, (char*)((intptr_t)p_2 + 2),
  		ui8_3 + 3, si8_3 + 3, ui16_3 + 3, si16_3 + 3, ui32_3 + 3, si32_3 + 3,
! 			ui64_3 + 3, si64_3 + 3, f_3 + 3, d_3 + 3, ld_3 + 3, (char*)((intptr_t)p_3 + 3),
  		ui8_4 + 4, si8_4 + 4, ui16_4 + 4, si16_4 + 4, ui32_4 + 4, si32_4 + 4,
! 			ui64_4 + 4, si64_4 + 4, f_4 + 4, d_4 + 4, ld_4 + 4, (char*)((intptr_t)p_4 + 4),
  		ui8_5 + 5, si8_5 + 5};
  
  	printf("%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
*************** test_large_fn(
*** 138,155 ****
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
! 	       ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (unsigned long)p_1,
! 		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (unsigned long)p_2,
! 		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (unsigned long)p_3,
! 		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (unsigned long)p_4, ui8_5, si8_5,
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
  
  	return	retVal;
  }
--- 138,155 ----
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
! 	       ui8_1, si8_1, ui16_1, si16_1, ui32_1, si32_1, ui64_1, si64_1, f_1, d_1, ld_1, (long)(intptr_t)p_1,
! 		ui8_2, si8_2, ui16_2, si16_2, ui32_2, si32_2, ui64_2, si64_2, f_2, d_2, ld_2, (long)(intptr_t)p_2,
! 		ui8_3, si8_3, ui16_3, si16_3, ui32_3, si32_3, ui64_3, si64_3, f_3, d_3, ld_3, (long)(intptr_t)p_3,
! 		ui8_4, si8_4, ui16_4, si16_4, ui32_4, si32_4, ui64_4, si64_4, f_4, d_4, ld_4, (long)(intptr_t)p_4, ui8_5, si8_5,
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (long)(intptr_t)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (long)(intptr_t)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (long)(intptr_t)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (long)(intptr_t)retVal.vv, retVal.ww, retVal.xx);
  
  	return	retVal;
  }
*************** cls_large_fn(ffi_cif* cif __UNUSED__, vo
*** 216,223 ****
  		ui8_5, si8_5);
  }
  
! int
! main(int argc __UNUSED__, const char** argv __UNUSED__)
  {
          void *code;
  	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
--- 216,222 ----
  		ui8_5, si8_5);
  }
  
! int main (void)
  {
          void *code;
  	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
*************** main(int argc __UNUSED__, const char** a
*** 302,314 ****
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
  	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK);
--- 301,313 ----
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (long)(intptr_t)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (long)(intptr_t)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (long)(intptr_t)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (long)(intptr_t)retVal.vv, retVal.ww, retVal.xx);
  	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
  
  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_large_fn, NULL, code) == FFI_OK);
*************** main(int argc __UNUSED__, const char** a
*** 330,342 ****
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (unsigned long)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (unsigned long)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (unsigned long)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (unsigned long)retVal.vv, retVal.ww, retVal.xx);
  	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
  
      return 0;
--- 329,341 ----
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx "
  		"%" PRIu8 " %" PRId8 " %hu %hd %u %d %" PRIu64 " %" PRId64 " %.0f %.0f %.0Lf %#lx %" PRIu8 " %" PRId8 "\n",
  		retVal.a, retVal.b, retVal.c, retVal.d, retVal.e, retVal.f,
! 	       retVal.g, retVal.h, retVal.i, retVal.j, retVal.k, (long)(intptr_t)retVal.l,
  		retVal.m, retVal.n, retVal.o, retVal.p, retVal.q, retVal.r,
! 	       retVal.s, retVal.t, retVal.u, retVal.v, retVal.w, (long)(intptr_t)retVal.x,
  		retVal.y, retVal.z, retVal.aa, retVal.bb, retVal.cc, retVal.dd,
! 	       retVal.ee, retVal.ff, retVal.gg, retVal.hh, retVal.ii, (long)(intptr_t)retVal.jj,
  		retVal.kk, retVal.ll, retVal.mm, retVal.nn, retVal.oo, retVal.pp,
! 	       retVal.qq, retVal.rr, retVal.ss, retVal.tt, retVal.uu, (long)(intptr_t)retVal.vv, retVal.ww, retVal.xx);
  	/* { dg-output "\nres: 2 3 4 5 6 7 8 9 10 11 12 0x12345679 3 4 5 6 7 8 9 10 11 12 13 0x1234567a 4 5 6 7 8 9 10 11 12 13 14 0x1234567b 5 6 7 8 9 10 11 12 13 14 15 0x1234567c 6 7" } */
  
      return 0;
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct.c	Sun May 24 22:32:13 2026
*************** static cls_struct_combined cls_struct_co
*** 46,51 ****
--- 46,74 ----
  	 result.d.a, result.d.b, result.d.c,
  	 result.e.ii, result.e.dd, result.e.ff);
  
+   CHECK_DOUBLE_EQ(b0.a, 9);
+   CHECK_FLOAT_EQ(b0.b, 2);
+   CHECK(b0.c == 6);
+ 
+   CHECK(b1.ii == 1);
+   CHECK_DOUBLE_EQ(b1.dd, 2);
+   CHECK_FLOAT_EQ(b1.ff, 3);
+ 
+   CHECK_DOUBLE_EQ(b2.d.a, 4);
+   CHECK_FLOAT_EQ(b2.d.b, 5);
+   CHECK(b2.d.c == 6);
+ 
+   CHECK(b2.e.ii == 3);
+   CHECK_DOUBLE_EQ(b2.e.dd, 1);
+   CHECK_FLOAT_EQ(b2.e.ff, 8);
+ 
+   CHECK_DOUBLE_EQ(result.d.a, 15);
+   CHECK_FLOAT_EQ(result.d.b, 10);
+   CHECK(result.d.c == 13);
+   CHECK(result.e.ii == 10);
+   CHECK_DOUBLE_EQ(result.e.dd, 12);
+   CHECK_FLOAT_EQ(result.e.ff, 13);
+ 
    return result;
  }
  
*************** int main (void)
*** 128,139 ****
  
    ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
    /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
!   CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
!   CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
    CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
    CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
!   CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
!   CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
  
--- 151,162 ----
  
    ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
    /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
!   CHECK_DOUBLE_EQ( res_dbl.d.a, (e_dbl.a + f_dbl.dd + g_dbl.d.a));
!   CHECK_FLOAT_EQ( res_dbl.d.b,  (e_dbl.b + f_dbl.ff + g_dbl.d.b));
    CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
    CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
!   CHECK_DOUBLE_EQ( res_dbl.e.dd, (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
!   CHECK_FLOAT_EQ( res_dbl.e.ff, (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_combined_gn, NULL, code) == FFI_OK);
  
*************** int main (void)
*** 142,152 ****
  				     cls_struct_combined))
  	     (code))(e_dbl, f_dbl, g_dbl);
    /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
!   CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
!   CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
    CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
    CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
!   CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
!   CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
    exit(0);
  }
--- 165,175 ----
  				     cls_struct_combined))
  	     (code))(e_dbl, f_dbl, g_dbl);
    /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
!   CHECK_DOUBLE_EQ( res_dbl.d.a, (e_dbl.a + f_dbl.dd + g_dbl.d.a));
!   CHECK_FLOAT_EQ( res_dbl.d.b,  (e_dbl.b + f_dbl.ff + g_dbl.d.b));
    CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
    CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
!   CHECK_DOUBLE_EQ( res_dbl.e.dd, (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
!   CHECK_FLOAT_EQ( res_dbl.e.ff, (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct10.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct10.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct10.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct10.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3,
*** 38,43 ****
--- 38,55 ----
  	 (int)b3.x.a, b3.x.b, b3.y, b3.z, (int)b4.d, b4.e,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK(b3.z == 255);
+   CHECK((int)b4.d == 2);
+   CHECK(b4.e == 9);
+   CHECK((int)result.x.a == 270);
+   CHECK(result.x.b == 242);
+   CHECK(result.y == 143);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct11.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct11.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct11.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct11.c	Sun May 24 22:32:13 2026
*************** static C C_fn (int x, int y, int z, C so
*** 35,40 ****
--- 35,47 ----
  
    printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k);
  
+   CHECK(x == 1);
+   CHECK(y == 1);
+   CHECK(z == 1);
+   CHECK(i == 1);
+   CHECK(j == 1);
+   CHECK(k == 1);
+ 
    printf ("%.1f, %.1f, %.1f, %.1f, "
  	  "%.1f, %.1f, %.1f, %.1f\n",
  	  source.a.a_x, source.a.a_y,
*************** static C C_fn (int x, int y, int z, C so
*** 42,47 ****
--- 49,63 ----
  	  result.a.a_x, result.a.a_y,
  	  result.b.b_x, result.b.b_y);
  
+     CHECK_FLOAT_EQ(source.a.a_x, 1.0);
+     CHECK_FLOAT_EQ(source.a.a_y, 2.0);
+     CHECK_FLOAT_EQ(source.b.b_x, 4.0);
+     CHECK_FLOAT_EQ(source.b.b_y, 8.0);
+     CHECK_FLOAT_EQ(result.a.a_x, 1.0);
+     CHECK_FLOAT_EQ(result.a.a_y, 2.0);
+     CHECK_FLOAT_EQ(result.b.b_x, 4.0);
+     CHECK_FLOAT_EQ(result.b.b_y, 8.0);
+ 
    return result;
  }
  
*************** int main (void)
*** 113,121 ****
    ffi_call (&cif, FFI_FN (C_fn), &result, args);
    /* { dg-output "1, 1, 1, 1, 1, 1\n" } */
    /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */
!   CHECK (result.a.a_x == source.a.a_x);
!   CHECK (result.a.a_y == source.a.a_y);
!   CHECK (result.b.b_x == source.b.b_x);
!   CHECK (result.b.b_y == source.b.b_y);
!   exit (0);
  }
--- 129,137 ----
    ffi_call (&cif, FFI_FN (C_fn), &result, args);
    /* { dg-output "1, 1, 1, 1, 1, 1\n" } */
    /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */
!   CHECK_FLOAT_EQ(result.a.a_x, source.a.a_x);
!   CHECK_FLOAT_EQ(result.a.a_y, source.a.a_y);
!   CHECK_FLOAT_EQ(result.b.b_x, source.b.b_x);
!   CHECK_FLOAT_EQ(result.b.b_y, source.b.b_y);
!   exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct12.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct12.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct12.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct12.c	Sun May 24 22:32:13 2026
*************** int main (void)
*** 75,81 ****
  
  	CHECK( ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, retType, args) == FFI_OK);
  	ffi_call(&cif, FFI_FN(testNestedFloatStruct), &ts12_result, values);
! 	CHECK(ts12_result == 138.2f);
  
  	free(struct_float1);
  	free(struct_float2);
--- 75,81 ----
  
  	CHECK( ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, retType, args) == FFI_OK);
  	ffi_call(&cif, FFI_FN(testNestedFloatStruct), &ts12_result, values);
! 	CHECK_FLOAT_EQ(ts12_result, 138.2f);
  
  	free(struct_float1);
  	free(struct_float2);
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct13.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct13.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct13.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct13.c	Sun May 24 22:32:13 2026
*************** B B_fn(float b0, struct B b1)
*** 27,32 ****
--- 27,40 ----
    printf("%g %g %g %g: %g %g %g\n", b0, b1.x, b1.y.a, b1.y.b,
          result.x, result.y.a, result.y.b);
  
+   CHECK_FLOAT_EQ(b0, 12.125);
+   CHECK_FLOAT_EQ(b1.x, 24.75);
+   CHECK_FLOAT_EQ(b1.y.a, 31.625);
+   CHECK_FLOAT_EQ(b1.y.b, 32.25);
+   CHECK_FLOAT_EQ(result.x, 36.875);
+   CHECK_FLOAT_EQ(result.y.a, 43.75);
+   CHECK_FLOAT_EQ(result.y.b, 44.375);
+ 
    return result;
  }
  
*************** int main (void)
*** 91,107 ****
  
    ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
    /* { dg-output "12.125 24.75 31.625 32.25: 36.875 43.75 44.375" } */
!   CHECK( res_dbl.x == (e_dbl + f_dbl.x));
!   CHECK( res_dbl.y.a == (e_dbl + f_dbl.y.a));
!   CHECK( res_dbl.y.b == (e_dbl + f_dbl.y.b));
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
  
    res_dbl = ((B(*)(float, B))(code))(e_dbl, f_dbl);
    /* { dg-output "\n12.125 24.75 31.625 32.25: 36.875 43.75 44.375" } */
!   CHECK( res_dbl.x == (e_dbl + f_dbl.x));
!   CHECK( res_dbl.y.a == (e_dbl + f_dbl.y.a));
!   CHECK( res_dbl.y.b == (e_dbl + f_dbl.y.b));
  
    exit(0);
  }
--- 99,115 ----
  
    ffi_call(&cif, FFI_FN(B_fn), &res_dbl, args_dbl);
    /* { dg-output "12.125 24.75 31.625 32.25: 36.875 43.75 44.375" } */
!   CHECK_FLOAT_EQ( res_dbl.x, (e_dbl + f_dbl.x));
!   CHECK_FLOAT_EQ( res_dbl.y.a, (e_dbl + f_dbl.y.a));
!   CHECK_FLOAT_EQ( res_dbl.y.b, (e_dbl + f_dbl.y.b));
  
    CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
  
    res_dbl = ((B(*)(float, B))(code))(e_dbl, f_dbl);
    /* { dg-output "\n12.125 24.75 31.625 32.25: 36.875 43.75 44.375" } */
!   CHECK_FLOAT_EQ( res_dbl.x, (e_dbl + f_dbl.x));
!   CHECK_FLOAT_EQ( res_dbl.y.a, (e_dbl + f_dbl.y.a));
!   CHECK_FLOAT_EQ( res_dbl.y.b, (e_dbl + f_dbl.y.b));
  
    exit(0);
  }
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct2.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct2.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct2.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b0, struct B b1)
*** 30,35 ****
--- 30,44 ----
    printf("%lu %d %lu %d %d: %lu %d %d\n", b0.a, b0.b, b1.x.a, b1.x.b, b1.y,
  	 result.x.a, result.x.b, result.y);
  
+   CHECK(b0.a == 1);
+   CHECK(b0.b == 7);
+   CHECK(b1.x.a == 12);
+   CHECK(b1.x.b == 127);
+   CHECK(b1.y == 99);
+   CHECK(result.x.a == 13);
+   CHECK(result.x.b == 233);
+   CHECK(result.y == 134);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct3.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct3.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct3.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct3.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b0, struct B b1)
*** 31,36 ****
--- 31,45 ----
  	 (int)b1.x.a, b1.x.b, b1.y,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b0.a == 1);
+   CHECK(b0.b == 7);
+   CHECK((int)b1.x.a == 12);
+   CHECK(b1.x.b == 127);
+   CHECK(b1.y == 99);
+   CHECK((int)result.x.a == 13);
+   CHECK(result.x.b == 233);
+   CHECK(result.y == 134);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct4.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct4.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct4.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3)
*** 31,36 ****
--- 31,45 ----
  	 (int)b3.x.a, b3.x.b, b3.y,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)result.x.a == 13);
+   CHECK(result.x.b == 233);
+   CHECK(result.y == 134);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct5.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct5.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct5.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct5.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3)
*** 31,36 ****
--- 31,45 ----
  	 (int)b3.x.a, b3.x.b, b3.y,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)result.x.a == 13);
+   CHECK(result.x.b == 233);
+   CHECK(result.y == 134);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct6.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct6.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct6.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct6.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3,
*** 36,41 ****
--- 36,52 ----
  	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)b4.d == 2);
+   CHECK(b4.e == 9);
+   CHECK((int)result.x.a == 15);
+   CHECK(result.x.b == 242);
+   CHECK(result.y == 143);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct7.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct7.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct7.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct7.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3)
*** 31,36 ****
--- 31,45 ----
  	 (int)b3.x.a, b3.x.b, b3.y,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)result.x.a == 13);
+   CHECK(result.x.b == 233);
+   CHECK(result.y == 134);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct8.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct8.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct8.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct8.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3,
*** 36,41 ****
--- 36,52 ----
  	 (int)b3.x.a, b3.x.b, b3.y, (int)b4.d, b4.e,
  	 (int)result.x.a, result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)b4.d == 2);
+   CHECK(b4.e == 9);
+   CHECK((int)result.x.a == 15);
+   CHECK(result.x.b == 242);
+   CHECK(result.y == 143);
+ 
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct9.c gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct9.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/nested_struct9.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/nested_struct9.c	Sun May 24 22:32:13 2026
*************** static B B_fn(struct A b2, struct B b3,
*** 36,41 ****
--- 36,52 ----
  	 b3.x.a, (int)b3.x.b, b3.y, (int)b4.d, b4.e,
  	 result.x.a, (int)result.x.b, result.y);
  
+   CHECK((int)b2.a == 1);
+   CHECK(b2.b == 7);
+   CHECK((int)b3.x.a == 12);
+   CHECK(b3.x.b == 127);
+   CHECK(b3.y == 99);
+   CHECK((int)b4.d == 2); 
+   CHECK(b4.e == 9);
+   CHECK((int)result.x.a == 15);
+   CHECK(result.x.b == 242);
+   CHECK(result.y == 143);
+   
    return result;
  }
  
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/testclosure.c gcc-17-20260524/libffi/testsuite/libffi.closures/testclosure.c
*** gcc-17-20260517/libffi/testsuite/libffi.closures/testclosure.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/testclosure.c	Sun May 24 22:32:13 2026
*************** static void cls_struct_combined_fn(struc
*** 20,25 ****
--- 20,30 ----
  	 arg.a, arg.b,
  	 arg.c, arg.d);
    fflush(stdout);
+ 
+   CHECK_FLOAT_EQ(arg.a, 4);
+   CHECK_FLOAT_EQ(arg.b, 5);
+   CHECK_FLOAT_EQ(arg.c, 1);
+   CHECK_FLOAT_EQ(arg.d, 8);
  }
  
  static void
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/unwindtest.cc gcc-17-20260524/libffi/testsuite/libffi.closures/unwindtest.cc
*** gcc-17-20260517/libffi/testsuite/libffi.closures/unwindtest.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/unwindtest.cc	Sun May 24 22:32:13 2026
***************
*** 4,10 ****
     PR:		none.
     Originator:	Jeff Sturm <jsturm@one-point.com>  */
  
! /* { dg-do run { xfail x86_64-apple-darwin* moxie*-*-* } } */
  
  #include "ffitest.h"
  
--- 4,10 ----
     PR:		none.
     Originator:	Jeff Sturm <jsturm@one-point.com>  */
  
! /* { dg-do run { xfail moxie*-*-* } } */
  
  #include "ffitest.h"
  
*************** typedef int (*closure_test_type1)(float,
*** 48,53 ****
--- 48,56 ----
  				  float, float, int, double, int, int, float,
  				  int, int, int, int);
  
+ #ifdef __EMSCRIPTEN__
+ extern "C"
+ #endif
  int main (void)
  {
    ffi_cif cif;
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc gcc-17-20260524/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc
*** gcc-17-20260517/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.closures/unwindtest_ffi_call.cc	Sun May 24 22:32:13 2026
*************** static int checking(int a __UNUSED__, sh
*** 14,19 ****
--- 14,22 ----
    throw 9;
  }
  
+ #ifdef __EMSCRIPTEN__
+ extern "C"
+ #endif
  int main (void)
  {
    ffi_cif cif;
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.complex/complex_int.c gcc-17-20260524/libffi/testsuite/libffi.complex/complex_int.c
*** gcc-17-20260517/libffi/testsuite/libffi.complex/complex_int.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libffi/testsuite/libffi.complex/complex_int.c	Sun May 24 22:32:13 2026
*************** int main (void)
*** 76,82 ****
  
    printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n",
  	  (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y);
!   /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */
    CHECK (creal (tc_result) == -2);
    CHECK (cimag (tc_result) == 8);
    CHECK (tc_int_arg_x == 1234);
--- 76,82 ----
  
    printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n",
  	  (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y);
!   /* { dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" } */
    CHECK (creal (tc_result) == -2);
    CHECK (cimag (tc_result) == 8);
    CHECK (tc_int_arg_x == 1234);
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.threads/ffitest.h gcc-17-20260524/libffi/testsuite/libffi.threads/ffitest.h
*** gcc-17-20260517/libffi/testsuite/libffi.threads/ffitest.h	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.threads/ffitest.h	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1 ----
+ #include "../libffi.call/ffitest.h"
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.threads/threads.exp gcc-17-20260524/libffi/testsuite/libffi.threads/threads.exp
*** gcc-17-20260517/libffi/testsuite/libffi.threads/threads.exp	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.threads/threads.exp	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,50 ----
+ # Copyright (C) 2003, 2006, 2009, 2010, 2014 Free Software Foundation, Inc.
+ 
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; see the file COPYING3.  If not see
+ # <http://www.gnu.org/licenses/>.
+ 
+ dg-init
+ libffi-init
+ 
+ global srcdir subdir
+ 
+ if { [string match $compiler_vendor "microsoft"] } {
+     # -wd4005  macro redefinition
+     # -wd4244  implicit conversion to type of smaller size
+     # -wd4305  truncation to smaller type
+     # -wd4477  printf %lu of uintptr_t
+     # -wd4312  implicit conversion to type of greater size
+     # -wd4311  pointer truncation to unsigned long
+     # -EHsc    C++ Exception Handling (no SEH exceptions)
+     set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc";
+ } else {
+     set additional_options "";
+ }
+ 
+ set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.c]]
+ 
+ # No pthreads for windows or wasm
+ if { [string match $compiler_vendor "microsoft"] || [istarget "wasm*-*-*"] } {
+     foreach test $tlist {
+         unsupported "$test"
+     }
+ } else {
+     run-many-tests $tlist $additional_options
+ }
+ 
+ dg-finish
+ 
+ # Local Variables:
+ # tcl-indent-level:4
+ # End:
diff -Nrcpad gcc-17-20260517/libffi/testsuite/libffi.threads/tsan.c gcc-17-20260524/libffi/testsuite/libffi.threads/tsan.c
*** gcc-17-20260517/libffi/testsuite/libffi.threads/tsan.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libffi/testsuite/libffi.threads/tsan.c	Sun May 24 22:32:13 2026
***************
*** 0 ****
--- 1,74 ----
+ /* { dg-do run } */
+ 
+ #include "ffitest.h"
+ 
+ #include <pthread.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ 
+ #define NUM_THREADS 20
+ 
+ #ifdef _POSIX_BARRIERS
+ pthread_barrier_t barrier;
+ #endif
+ 
+ typedef float (*callback_fn)(float, float);
+ 
+ void callback(ffi_cif *cif __UNUSED__, void *ret, void **args, void *userdata __UNUSED__) {
+     float a = *(float *)args[0];
+     float b = *(float *)args[1];
+     *(float *)ret = a / 2 + b / 2;
+ }
+ 
+ void *thread_func(void *arg) {
+ #ifdef _POSIX_BARRIERS
+     pthread_barrier_wait(&barrier);
+ #endif
+ 
+     ffi_cif cif;
+     ffi_type *args[2] = { &ffi_type_float, &ffi_type_float };
+ 
+     if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_float, args) != FFI_OK) {
+         fprintf(stderr, "ffi_prep_cif failed\n");
+         return NULL;
+     }
+ 
+     ffi_closure *closure = ffi_closure_alloc(sizeof(ffi_closure), (void **)&arg);
+ 
+     if (ffi_prep_closure_loc(closure, &cif, callback, NULL, arg) != FFI_OK) {
+         fprintf(stderr, "ffi_prep_closure_loc failed\n");
+         return NULL;
+     }
+ 
+     callback_fn fn = (callback_fn)arg;
+     (void) fn(4.0f, 6.0f);
+ 
+     ffi_closure_free(closure);
+     return NULL;
+ }
+ 
+ int main() {
+     pthread_t threads[NUM_THREADS];
+ 
+ #ifdef _POSIX_BARRIERS
+     pthread_barrier_init(&barrier, NULL, NUM_THREADS);
+ #endif
+ 
+     for (int i = 0; i < NUM_THREADS; ++i) {
+         if (pthread_create(&threads[i], NULL, thread_func, NULL) != 0) {
+             perror("pthread_create");
+             exit(EXIT_FAILURE);
+         }
+     }
+ 
+     for (int i = 0; i < NUM_THREADS; ++i) {
+         pthread_join(threads[i], NULL);
+     }
+ 
+ #ifdef _POSIX_BARRIERS
+     pthread_barrier_destroy(&barrier);
+ #endif
+ 
+     printf("Completed\n");
+     return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgcc/ChangeLog gcc-17-20260524/libgcc/ChangeLog
*** gcc-17-20260517/libgcc/ChangeLog	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgcc/ChangeLog	Sun May 24 22:32:13 2026
***************
*** 1,3 ****
--- 1,54 ----
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/feature_bits.c (ZICFISS_GROUPID,
+ 	ZICFISS_BITMASK, RISCV_HWPROBE_KEY_IMA_EXT_1,
+ 	RISCV_HWPROBE_EXT_ZICFISS): Define.
+ 	(SET_FROM_IMA_EXT_1): Define.
+ 	(__init_riscv_features_bits_linux): Query IMA_EXT_1 and set
+ 	zicfiss from the corresponding upstream Linux hwprobe bit.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/feature_bits.c (RISCV_HWPROBE_EXT_SUPM,
+ 	RISCV_HWPROBE_EXT_ZICNTR, RISCV_HWPROBE_EXT_ZIHPM,
+ 	RISCV_HWPROBE_EXT_ZFBFMIN, RISCV_HWPROBE_EXT_ZVFBFMIN,
+ 	RISCV_HWPROBE_EXT_ZVFBFWMA, RISCV_HWPROBE_EXT_ZICBOM,
+ 	RISCV_HWPROBE_EXT_ZAAMO, RISCV_HWPROBE_EXT_ZALRSC,
+ 	RISCV_HWPROBE_EXT_ZABHA, RISCV_HWPROBE_EXT_ZALASR,
+ 	RISCV_HWPROBE_EXT_ZICBOP, RISCV_HWPROBE_EXT_ZILSD,
+ 	RISCV_HWPROBE_EXT_ZCLSD, RISCV_HWPROBE_EXT_ZICFILP): Define.
+ 	(__init_riscv_features_bits_linux): Set feature bits from the
+ 	corresponding upstream Linux hwprobe bits.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/feature_bits.c (SUPM_GROUPID, SUPM_BITMASK,
+ 	ZICNTR_GROUPID, ZICNTR_BITMASK, ZIHPM_GROUPID,
+ 	ZIHPM_BITMASK, ZFBFMIN_GROUPID, ZFBFMIN_BITMASK,
+ 	ZVFBFMIN_GROUPID, ZVFBFMIN_BITMASK, ZVFBFWMA_GROUPID,
+ 	ZVFBFWMA_BITMASK, ZICBOM_GROUPID, ZICBOM_BITMASK,
+ 	ZAAMO_GROUPID, ZAAMO_BITMASK, ZALRSC_GROUPID,
+ 	ZALRSC_BITMASK, ZABHA_GROUPID, ZABHA_BITMASK,
+ 	ZALASR_GROUPID, ZALASR_BITMASK, ZICBOP_GROUPID,
+ 	ZICBOP_BITMASK, ZICFILP_GROUPID, ZICFILP_BITMASK):
+ 	Define.
+ 
+ 2026-05-21  Christoph Müllner  <christoph.muellner@vrull.eu>
+ 
+ 	* config/riscv/feature_bits.c (B_GROUPID, B_BITMASK,
+ 	E_GROUPID, E_BITMASK, H_GROUPID, H_BITMASK,
+ 	ZILSD_GROUPID, ZILSD_BITMASK, ZCLSD_GROUPID,
+ 	ZCLSD_BITMASK, ZCMP_GROUPID, ZCMP_BITMASK,
+ 	ZIFENCEI_GROUPID, ZIFENCEI_BITMASK, ZMMUL_GROUPID,
+ 	ZMMUL_BITMASK): Define.
+ 
+ 2026-05-19  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	* config/avr/t-avr (LIB1ASMFUNCS): Add _bitreverse8, _bitreverse16,
+ 	_bitreverse24, _bitreverse32.
+ 	* config/avr/lib1funcs.S (__bitreverse8, __bitreverse16)
+ 	(__bitreverse24, __bitreverse32): New functions.
+ 
  2026-05-11  John David Anglin  <danglin@gcc.gnu.org>
  
  	* config.host (hppa*64*-hp-hpux11*): Handle linking with GNU ld.
diff -Nrcpad gcc-17-20260517/libgcc/config/avr/lib1funcs.S gcc-17-20260524/libgcc/config/avr/lib1funcs.S
*** gcc-17-20260517/libgcc/config/avr/lib1funcs.S	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgcc/config/avr/lib1funcs.S	Sun May 24 22:32:13 2026
*************** ENDF __bswapdi2
*** 3206,3211 ****
--- 3206,3276 ----
  #endif /* defined (L_bswapdi2) */
  
  
+ /*****************************************
+  * Reverse bitorder (__builtin_bitreverse)
+  ****************************************/
+ 
+ #if defined (L_bitreverse8)
+ DEFUN __bitreverse8
+     ;; 76543210
+     lsl r24
+     adc r24, __zero_reg__
+     ;; ...3...7
+     mov __tmp_reg__, r24            ; 65432107
+     bst __tmp_reg__, 1 $ bld r24, 7
+     ;; 0..3...7
+     bst __tmp_reg__, 2 $ bld r24, 6
+     ;; 01.3...7
+     bst __tmp_reg__, 3 $ bld r24, 5
+     ;; 0123...7
+     bst __tmp_reg__, 5 $ bld r24, 3
+     ;; 01234..7
+     bst __tmp_reg__, 6 $ bld r24, 2
+     ;; 012345.7
+     bst __tmp_reg__, 7 $ bld r24, 1
+     ;; 01234567
+     ret
+ ENDF __bitreverse8
+ #endif /* L_bitreverse8 */
+ 
+ #if defined (L_bitreverse16)
+ DEFUN __bitreverse16
+     XCALL __bitreverse8
+     bswap   r24, r25
+     XJMP __bitreverse8
+ ENDF __bitreverse16
+ #endif /* L_bitreverse16 */
+ 
+ #if defined (L_bitreverse24)
+ DEFUN __bitreverse24
+     XCALL __bitreverse8
+     push    r24
+     mov     r24, r23
+     XCALL __bitreverse8
+     mov     r23, r24
+     mov     r24, r22
+     pop     r22
+     XJMP __bitreverse8
+ ENDF __bitreverse24
+ #endif /* L_bitreverse24 */
+ 
+ #if defined (L_bitreverse32)
+ DEFUN __bitreverse32
+     XCALL __bitreverse16
+ #if defined (__AVR_HAVE_MOVW__)
+     movw    __tmp_reg__, r22
+     movw    r22, r24
+     movw    r24, __tmp_reg__
+     clr     __zero_reg__
+ #else
+     bswap   r22, r24
+     bswap   r23, r25
+ #endif
+     XJMP __bitreverse16
+ ENDF __bitreverse32
+ #endif /* L_bitreverse32 */
+ 
+ 
  /**********************************
   * 64-bit shifts
   **********************************/
diff -Nrcpad gcc-17-20260517/libgcc/config/avr/t-avr gcc-17-20260524/libgcc/config/avr/t-avr
*** gcc-17-20260517/libgcc/config/avr/t-avr	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgcc/config/avr/t-avr	Sun May 24 22:32:13 2026
*************** LIB1ASMFUNCS = \
*** 34,39 ****
--- 34,40 ----
  	_popcountsi2 \
  	_popcountqi2 \
  	_bswapsi2 \
+ 	_bitreverse8 _bitreverse16 _bitreverse24 _bitreverse32 \
  	_fmul _fmuls _fmulsu \
  	_mulqq3 \
  	_mulhq3 _muluhq3 \
diff -Nrcpad gcc-17-20260517/libgcc/config/riscv/feature_bits.c gcc-17-20260524/libgcc/config/riscv/feature_bits.c
*** gcc-17-20260517/libgcc/config/riscv/feature_bits.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgcc/config/riscv/feature_bits.c	Sun May 24 22:32:13 2026
*************** struct {
*** 38,49 ****
--- 38,55 ----
  
  #define A_GROUPID 0
  #define A_BITMASK (1ULL << 0)
+ #define B_GROUPID 0
+ #define B_BITMASK (1ULL << 1)
  #define C_GROUPID 0
  #define C_BITMASK (1ULL << 2)
  #define D_GROUPID 0
  #define D_BITMASK (1ULL << 3)
+ #define E_GROUPID 0
+ #define E_BITMASK (1ULL << 4)
  #define F_GROUPID 0
  #define F_BITMASK (1ULL << 5)
+ #define H_GROUPID 0
+ #define H_BITMASK (1ULL << 7)
  #define I_GROUPID 0
  #define I_BITMASK (1ULL << 8)
  #define M_GROUPID 0
*************** struct {
*** 142,147 ****
--- 148,191 ----
  #define ZCMOP_BITMASK (1ULL << 6)
  #define ZAWRS_GROUPID 1
  #define ZAWRS_BITMASK (1ULL << 7)
+ #define ZILSD_GROUPID 1
+ #define ZILSD_BITMASK (1ULL << 8)
+ #define ZCLSD_GROUPID 1
+ #define ZCLSD_BITMASK (1ULL << 9)
+ #define ZCMP_GROUPID 1
+ #define ZCMP_BITMASK (1ULL << 10)
+ #define ZIFENCEI_GROUPID 1
+ #define ZIFENCEI_BITMASK (1ULL << 11)
+ #define ZMMUL_GROUPID 1
+ #define ZMMUL_BITMASK (1ULL << 12)
+ #define SUPM_GROUPID 1
+ #define SUPM_BITMASK (1ULL << 14)
+ #define ZICNTR_GROUPID 1
+ #define ZICNTR_BITMASK (1ULL << 15)
+ #define ZIHPM_GROUPID 1
+ #define ZIHPM_BITMASK (1ULL << 16)
+ #define ZFBFMIN_GROUPID 1
+ #define ZFBFMIN_BITMASK (1ULL << 17)
+ #define ZVFBFMIN_GROUPID 1
+ #define ZVFBFMIN_BITMASK (1ULL << 18)
+ #define ZVFBFWMA_GROUPID 1
+ #define ZVFBFWMA_BITMASK (1ULL << 19)
+ #define ZICBOM_GROUPID 1
+ #define ZICBOM_BITMASK (1ULL << 20)
+ #define ZAAMO_GROUPID 1
+ #define ZAAMO_BITMASK (1ULL << 21)
+ #define ZALRSC_GROUPID 1
+ #define ZALRSC_BITMASK (1ULL << 22)
+ #define ZABHA_GROUPID 1
+ #define ZABHA_BITMASK (1ULL << 23)
+ #define ZALASR_GROUPID 1
+ #define ZALASR_BITMASK (1ULL << 24)
+ #define ZICBOP_GROUPID 1
+ #define ZICBOP_BITMASK (1ULL << 25)
+ #define ZICFILP_GROUPID 1
+ #define ZICFILP_BITMASK (1ULL << 26)
+ #define ZICFISS_GROUPID 1
+ #define ZICFISS_BITMASK (1ULL << 27)
  
  #define SET_EXT(EXT) features[EXT##_GROUPID] |= EXT##_BITMASK
  
*************** struct {
*** 203,208 ****
--- 247,267 ----
  #define RISCV_HWPROBE_EXT_ZCF    (1ULL << 46)
  #define RISCV_HWPROBE_EXT_ZCMOP  (1ULL << 47)
  #define RISCV_HWPROBE_EXT_ZAWRS  (1ULL << 48)
+ #define RISCV_HWPROBE_EXT_SUPM   (1ULL << 49)
+ #define RISCV_HWPROBE_EXT_ZICNTR (1ULL << 50)
+ #define RISCV_HWPROBE_EXT_ZIHPM  (1ULL << 51)
+ #define RISCV_HWPROBE_EXT_ZFBFMIN (1ULL << 52)
+ #define RISCV_HWPROBE_EXT_ZVFBFMIN (1ULL << 53)
+ #define RISCV_HWPROBE_EXT_ZVFBFWMA (1ULL << 54)
+ #define RISCV_HWPROBE_EXT_ZICBOM (1ULL << 55)
+ #define RISCV_HWPROBE_EXT_ZAAMO  (1ULL << 56)
+ #define RISCV_HWPROBE_EXT_ZALRSC (1ULL << 57)
+ #define RISCV_HWPROBE_EXT_ZABHA  (1ULL << 58)
+ #define RISCV_HWPROBE_EXT_ZALASR (1ULL << 59)
+ #define RISCV_HWPROBE_EXT_ZICBOP (1ULL << 60)
+ #define RISCV_HWPROBE_EXT_ZILSD  (1ULL << 61)
+ #define RISCV_HWPROBE_EXT_ZCLSD  (1ULL << 62)
+ #define RISCV_HWPROBE_EXT_ZICFILP (1ULL << 63)
  #define RISCV_HWPROBE_KEY_CPUPERF_0 5
  #define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
  #define RISCV_HWPROBE_MISALIGNED_EMULATED (1ULL << 0)
*************** struct {
*** 211,216 ****
--- 270,277 ----
  #define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
  #define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
  #define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
+ #define RISCV_HWPROBE_KEY_IMA_EXT_1 16
+ #define RISCV_HWPROBE_EXT_ZICFISS (1ULL << 0)
  
  struct riscv_hwprobe {
    long long key;
*************** static long syscall_5_args (long number,
*** 240,245 ****
--- 301,309 ----
  #define SET_FROM_IMA_EXT(EXT) \
    SET_FROM_HWPROBE (hwprobe_ima_ext, EXT)
  
+ #define SET_FROM_IMA_EXT_1(EXT) \
+   SET_FROM_HWPROBE (hwprobe_ima_ext_1, EXT)
+ 
  static void __init_riscv_features_bits_linux ()
  {
    struct riscv_hwprobe hwprobes[] = {
*************** static void __init_riscv_features_bits_l
*** 248,253 ****
--- 312,318 ----
      {RISCV_HWPROBE_KEY_MIMPID, 0},
      {RISCV_HWPROBE_KEY_BASE_BEHAVIOR, 0},
      {RISCV_HWPROBE_KEY_IMA_EXT_0, 0},
+     {RISCV_HWPROBE_KEY_IMA_EXT_1, 0},
    };
  
    long res = syscall_5_args (__NR_riscv_hwprobe, (long)&hwprobes,
*************** static void __init_riscv_features_bits_l
*** 370,375 ****
--- 435,458 ----
    SET_FROM_IMA_EXT (ZCF);
    SET_FROM_IMA_EXT (ZCMOP);
    SET_FROM_IMA_EXT (ZAWRS);
+   SET_FROM_IMA_EXT (SUPM);
+   SET_FROM_IMA_EXT (ZICNTR);
+   SET_FROM_IMA_EXT (ZIHPM);
+   SET_FROM_IMA_EXT (ZFBFMIN);
+   SET_FROM_IMA_EXT (ZVFBFMIN);
+   SET_FROM_IMA_EXT (ZVFBFWMA);
+   SET_FROM_IMA_EXT (ZICBOM);
+   SET_FROM_IMA_EXT (ZAAMO);
+   SET_FROM_IMA_EXT (ZALRSC);
+   SET_FROM_IMA_EXT (ZABHA);
+   SET_FROM_IMA_EXT (ZALASR);
+   SET_FROM_IMA_EXT (ZICBOP);
+   SET_FROM_IMA_EXT (ZILSD);
+   SET_FROM_IMA_EXT (ZCLSD);
+   SET_FROM_IMA_EXT (ZICFILP);
+ 
+   const struct riscv_hwprobe hwprobe_ima_ext_1 = hwprobes[5];
+   SET_FROM_IMA_EXT_1 (ZICFISS);
  
    for (i = 0; i < RISCV_FEATURE_BITS_LENGTH; ++i)
      __riscv_feature_bits.features[i] = features[i];
diff -Nrcpad gcc-17-20260517/libgfortran/ChangeLog gcc-17-20260524/libgfortran/ChangeLog
*** gcc-17-20260517/libgfortran/ChangeLog	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/ChangeLog	Sun May 24 22:32:13 2026
***************
*** 1,3 ****
--- 1,22 ----
+ 2026-05-22  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* m4/matmul.m4: Fix comment typo.
+ 	* generated/matmul_c10.c: Regenerate.
+ 	* generated/matmul_c16.c: Regenerate.
+ 	* generated/matmul_c17.c: Regenerate.
+ 	* generated/matmul_c4.c: Regenerate.
+ 	* generated/matmul_c8.c: Regenerate.
+ 	* generated/matmul_i1.c: Regenerate.
+ 	* generated/matmul_i16.c: Regenerate.
+ 	* generated/matmul_i2.c: Regenerate.
+ 	* generated/matmul_i4.c: Regenerate.
+ 	* generated/matmul_i8.c: Regenerate.
+ 	* generated/matmul_r10.c: Regenerate.
+ 	* generated/matmul_r16.c: Regenerate.
+ 	* generated/matmul_r17.c: Regenerate.
+ 	* generated/matmul_r4.c: Regenerate.
+ 	* generated/matmul_r8.c: Regenerate.
+ 
  2026-05-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* caf/shmem/sync.h (lock_t): Rename to caf_shmem_lock_t.
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_c10.c gcc-17-20260524/libgfortran/generated/matmul_c10.c
*** gcc-17-20260517/libgfortran/generated/matmul_c10.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_c10.c	Sun May 24 22:32:13 2026
*************** matmul_c10_avx512f (gfc_array_c10 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_c16.c gcc-17-20260524/libgfortran/generated/matmul_c16.c
*** gcc-17-20260517/libgfortran/generated/matmul_c16.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_c16.c	Sun May 24 22:32:13 2026
*************** matmul_c16_avx512f (gfc_array_c16 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_c17.c gcc-17-20260524/libgfortran/generated/matmul_c17.c
*** gcc-17-20260517/libgfortran/generated/matmul_c17.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_c17.c	Sun May 24 22:32:13 2026
*************** matmul_c17_avx512f (gfc_array_c17 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_c4.c gcc-17-20260524/libgfortran/generated/matmul_c4.c
*** gcc-17-20260517/libgfortran/generated/matmul_c4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_c4.c	Sun May 24 22:32:13 2026
*************** matmul_c4_avx512f (gfc_array_c4 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_c8.c gcc-17-20260524/libgfortran/generated/matmul_c8.c
*** gcc-17-20260517/libgfortran/generated/matmul_c8.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_c8.c	Sun May 24 22:32:13 2026
*************** matmul_c8_avx512f (gfc_array_c8 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_i1.c gcc-17-20260524/libgfortran/generated/matmul_i1.c
*** gcc-17-20260517/libgfortran/generated/matmul_i1.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_i1.c	Sun May 24 22:32:13 2026
*************** matmul_i1_avx512f (gfc_array_m1 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_i16.c gcc-17-20260524/libgfortran/generated/matmul_i16.c
*** gcc-17-20260517/libgfortran/generated/matmul_i16.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_i16.c	Sun May 24 22:32:13 2026
*************** matmul_i16_avx512f (gfc_array_m16 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_i2.c gcc-17-20260524/libgfortran/generated/matmul_i2.c
*** gcc-17-20260517/libgfortran/generated/matmul_i2.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_i2.c	Sun May 24 22:32:13 2026
*************** matmul_i2_avx512f (gfc_array_m2 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_i4.c gcc-17-20260524/libgfortran/generated/matmul_i4.c
*** gcc-17-20260517/libgfortran/generated/matmul_i4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_i4.c	Sun May 24 22:32:13 2026
*************** matmul_i4_avx512f (gfc_array_m4 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_i8.c gcc-17-20260524/libgfortran/generated/matmul_i8.c
*** gcc-17-20260517/libgfortran/generated/matmul_i8.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_i8.c	Sun May 24 22:32:13 2026
*************** matmul_i8_avx512f (gfc_array_m8 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_r10.c gcc-17-20260524/libgfortran/generated/matmul_r10.c
*** gcc-17-20260517/libgfortran/generated/matmul_r10.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_r10.c	Sun May 24 22:32:13 2026
*************** matmul_r10_avx512f (gfc_array_r10 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_r16.c gcc-17-20260524/libgfortran/generated/matmul_r16.c
*** gcc-17-20260517/libgfortran/generated/matmul_r16.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_r16.c	Sun May 24 22:32:13 2026
*************** matmul_r16_avx512f (gfc_array_r16 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_r17.c gcc-17-20260524/libgfortran/generated/matmul_r17.c
*** gcc-17-20260517/libgfortran/generated/matmul_r17.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_r17.c	Sun May 24 22:32:13 2026
*************** matmul_r17_avx512f (gfc_array_r17 * cons
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_r4.c gcc-17-20260524/libgfortran/generated/matmul_r4.c
*** gcc-17-20260517/libgfortran/generated/matmul_r4.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_r4.c	Sun May 24 22:32:13 2026
*************** matmul_r4_avx512f (gfc_array_r4 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/generated/matmul_r8.c gcc-17-20260524/libgfortran/generated/matmul_r8.c
*** gcc-17-20260517/libgfortran/generated/matmul_r8.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/generated/matmul_r8.c	Sun May 24 22:32:13 2026
*************** matmul_r8_avx512f (gfc_array_r8 * const
*** 1785,1791 ****
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
--- 1785,1791 ----
  
  #endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  void
diff -Nrcpad gcc-17-20260517/libgfortran/io/format.c gcc-17-20260524/libgfortran/io/format.c
*** gcc-17-20260517/libgfortran/io/format.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/io/format.c	Sun May 24 22:32:13 2026
*************** format_lex (format_data *fmt)
*** 522,527 ****
--- 522,530 ----
  	case 'S':
  	  token = FMT_ES;
  	  break;
+ 	case 'X':
+ 	  token = FMT_EX;
+ 	  break;
  	default:
  	  token = FMT_E;
  	  unget_char (fmt);
*************** parse_format_list (st_parameter_dt *dtp,
*** 706,712 ****
        tail->repeat = 1;
  
        t = format_lex (fmt);
!       if (t == FMT_F || t == FMT_EN || t == FMT_ES || t == FMT_D
  	  || t == FMT_G || t == FMT_E)
  	{
  	  repeat = 1;
--- 709,715 ----
        tail->repeat = 1;
  
        t = format_lex (fmt);
!       if (t == FMT_F || t == FMT_EN || t == FMT_ES || t == FMT_EX || t == FMT_D
  	  || t == FMT_G || t == FMT_E)
  	{
  	  repeat = 1;
*************** parse_format_list (st_parameter_dt *dtp,
*** 818,823 ****
--- 821,827 ----
      case FMT_E:
      case FMT_EN:
      case FMT_ES:
+     case FMT_EX:
      case FMT_D:
      case FMT_DT:
      case FMT_L:
*************** parse_format_list (st_parameter_dt *dtp,
*** 921,926 ****
--- 925,931 ----
      case FMT_G:
      case FMT_EN:
      case FMT_ES:
+     case FMT_EX:
        *seen_dd = true;
        get_fnode (fmt, &head, &tail, t);
        tail->repeat = repeat;
*************** next_format (st_parameter_dt *dtp)
*** 1538,1545 ****
  
    if (!fmt->reversion_ok &&
        (t == FMT_I || t == FMT_B || t == FMT_O || t == FMT_Z || t == FMT_F ||
!        t == FMT_E || t == FMT_EN || t == FMT_ES || t == FMT_G || t == FMT_L ||
!        t == FMT_A || t == FMT_D || t == FMT_DT))
      fmt->reversion_ok = 1;
    return f;
  }
--- 1543,1550 ----
  
    if (!fmt->reversion_ok &&
        (t == FMT_I || t == FMT_B || t == FMT_O || t == FMT_Z || t == FMT_F ||
!        t == FMT_E || t == FMT_EN || t == FMT_ES || t== FMT_EX || t == FMT_G ||
!        t == FMT_L || t == FMT_A || t == FMT_D || t == FMT_DT))
      fmt->reversion_ok = 1;
    return f;
  }
diff -Nrcpad gcc-17-20260517/libgfortran/io/io.h gcc-17-20260524/libgfortran/io/io.h
*** gcc-17-20260517/libgfortran/io/io.h	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/io/io.h	Sun May 24 22:32:13 2026
*************** typedef enum
*** 145,151 ****
    FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
    FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
    FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, FMT_DC,
!   FMT_DP, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ, FMT_DT
  }
  format_token;
  
--- 145,152 ----
    FMT_LPAREN, FMT_RPAREN, FMT_X, FMT_S, FMT_SS, FMT_SP, FMT_STRING,
    FMT_BADSTRING, FMT_P, FMT_I, FMT_B, FMT_BN, FMT_BZ, FMT_O, FMT_Z, FMT_F,
    FMT_E, FMT_EN, FMT_ES, FMT_G, FMT_L, FMT_A, FMT_D, FMT_H, FMT_END, FMT_DC,
!   FMT_DP, FMT_STAR, FMT_RC, FMT_RD, FMT_RN, FMT_RP, FMT_RU, FMT_RZ, FMT_DT, FMT_EX,
!   FMT_LPS, FMT_LPZ, FMT_LZ
  }
  format_token;
  
*************** internal_proto(write_en);
*** 946,951 ****
--- 947,955 ----
  extern void write_es (st_parameter_dt *, const fnode *, const char *, int);
  internal_proto(write_es);
  
+ extern void write_ex (st_parameter_dt *, const fnode *, const char *, int);
+ internal_proto(write_ex);
+ 
  extern void write_f (st_parameter_dt *, const fnode *, const char *, int);
  internal_proto(write_f);
  
diff -Nrcpad gcc-17-20260517/libgfortran/io/transfer.c gcc-17-20260524/libgfortran/io/transfer.c
*** gcc-17-20260517/libgfortran/io/transfer.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/io/transfer.c	Sun May 24 22:32:13 2026
*************** formatted_transfer_scalar_write (st_para
*** 2129,2135 ****
  		    || t == FMT_Z  || t == FMT_F  || t == FMT_E
  		    || t == FMT_EN || t == FMT_ES || t == FMT_G
  		    || t == FMT_L  || t == FMT_A  || t == FMT_D
! 		    || t == FMT_DT))
  	    || t == FMT_STRING))
  	{
  	  if (dtp->u.p.skips > 0)
--- 2129,2135 ----
  		    || t == FMT_Z  || t == FMT_F  || t == FMT_E
  		    || t == FMT_EN || t == FMT_ES || t == FMT_G
  		    || t == FMT_L  || t == FMT_A  || t == FMT_D
! 		    || t == FMT_DT || t == FMT_EX))
  	    || t == FMT_STRING))
  	{
  	  if (dtp->u.p.skips > 0)
*************** formatted_transfer_scalar_write (st_para
*** 2351,2356 ****
--- 2351,2365 ----
  	    write_es (dtp, f, p, kind);
  	  break;
  
+ 	case FMT_EX:
+ 	  if (n == 0)
+ 	    goto need_data;
+ 	  if (require_type (dtp, BT_REAL, type, f))
+ 	    return;
+ 	  write_ex (dtp, f, p, kind);
+ 	  break;
+ 
+ 
  	case FMT_F:
  	  if (n == 0)
  	    goto need_data;
diff -Nrcpad gcc-17-20260517/libgfortran/io/write.c gcc-17-20260524/libgfortran/io/write.c
*** gcc-17-20260517/libgfortran/io/write.c	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/io/write.c	Sun May 24 22:32:13 2026
*************** see the files COPYING3 and COPYING.RUNTI
*** 30,35 ****
--- 30,36 ----
  #include "unix.h"
  #include <assert.h>
  #include <string.h>
+ #include "config.h"
  
  #define star_fill(p, n) memset(p, '*', n)
  
*************** write_default_char4 (st_parameter_dt *dt
*** 127,133 ****
  		return;
  	      *p++ = (uchar) c;
  	    }
!           else
  	    {
  	      p = write_block (dtp, 1);
  	      if (p == NULL)
--- 128,134 ----
  		return;
  	      *p++ = (uchar) c;
  	    }
! 	  else
  	    {
  	      p = write_block (dtp, 1);
  	      if (p == NULL)
*************** write_a (st_parameter_dt *dtp, const fno
*** 409,416 ****
  	      /* Write out the CR_LF sequence.  */
  	      q++;
  	      p = write_block (dtp, 2);
!               if (p == NULL)
!                 return;
  	      memcpy (p, crlf, 2);
  	    }
  	  else
--- 410,417 ----
  	      /* Write out the CR_LF sequence.  */
  	      q++;
  	      p = write_block (dtp, 2);
! 	      if (p == NULL)
! 		return;
  	      memcpy (p, crlf, 2);
  	    }
  	  else
*************** write_boz (st_parameter_dt *dtp, const f
*** 709,719 ****
    if (m == 0 && n == 0)
      {
        if (w == 0)
!         w = 1;
  
        p = write_block (dtp, w);
        if (p == NULL)
!         return;
        if (unlikely (is_char4_unit (dtp)))
  	{
  	  gfc_char4_t *p4 = (gfc_char4_t *) p;
--- 710,720 ----
    if (m == 0 && n == 0)
      {
        if (w == 0)
! 	w = 1;
  
        p = write_block (dtp, w);
        if (p == NULL)
! 	return;
        if (unlikely (is_char4_unit (dtp)))
  	{
  	  gfc_char4_t *p4 = (gfc_char4_t *) p;
*************** write_decimal (st_parameter_dt *dtp, con
*** 825,835 ****
    if (m == 0 && n == 0)
      {
        if (w == 0)
!         w = 1;
  
        p = write_block (dtp, w);
        if (p == NULL)
!         return;
        if (unlikely (is_char4_unit (dtp)))
  	{
  	  gfc_char4_t *p4 = (gfc_char4_t *) p;
--- 826,836 ----
    if (m == 0 && n == 0)
      {
        if (w == 0)
! 	w = 1;
  
        p = write_block (dtp, w);
        if (p == NULL)
! 	return;
        if (unlikely (is_char4_unit (dtp)))
  	{
  	  gfc_char4_t *p4 = (gfc_char4_t *) p;
*************** otoa_big (const char *s, char *buffer, i
*** 1250,1256 ****
  	      octet |= (c & 1) << j;
  	      c >>= 1;
  	      if (++k > 7)
! 	        {
  		  i++;
  		  k = 0;
  		  c = *--p;
--- 1251,1257 ----
  	      octet |= (c & 1) << j;
  	      c >>= 1;
  	      if (++k > 7)
! 		{
  		  i++;
  		  k = 0;
  		  c = *--p;
*************** otoa_big (const char *s, char *buffer, i
*** 1275,1281 ****
  	      octet |= (c & 1) << j;
  	      c >>= 1;
  	      if (++k > 7)
! 	        {
  		  i++;
  		  k = 0;
  		  c = *++p;
--- 1276,1282 ----
  	      octet |= (c & 1) << j;
  	      c >>= 1;
  	      if (++k > 7)
! 		{
  		  i++;
  		  k = 0;
  		  c = *++p;
*************** write_character (st_parameter_dt *dtp, c
*** 1661,1669 ****
  	  *p++ = d;
  
  	  for (size_t i = 0; i < length; i++)
!             {
!               *p++ = source[i];
!               if (source[i] == d)
  		*p++ = d;
  	    }
  
--- 1662,1670 ----
  	  *p++ = d;
  
  	  for (size_t i = 0; i < length; i++)
! 	    {
! 	      *p++ = source[i];
! 	      if (source[i] == d)
  		*p++ = d;
  	    }
  
*************** write_float_0 (st_parameter_dt *dtp, con
*** 1812,1818 ****
    buffer = select_buffer (dtp, f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, f, source , kind, 0, buffer,
!                            precision, buf_size, result, &flt_str_len);
    write_float_string (dtp, result, flt_str_len);
  
    if (buf_size > BUF_STACK_SZ)
--- 1813,1819 ----
    buffer = select_buffer (dtp, f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, f, source , kind, 0, buffer,
! 			   precision, buf_size, result, &flt_str_len);
    write_float_string (dtp, result, flt_str_len);
  
    if (buf_size > BUF_STACK_SZ)
*************** write_es (st_parameter_dt *dtp, const fn
*** 1855,1860 ****
--- 1856,2051 ----
    write_float_0 (dtp, f, p, len);
  }
  
+ void
+ write_ex (st_parameter_dt *dtp, const fnode *f, const char *p, int kind)
+ {
+   /* The EX specifier in Fortran 2018 produces hexadecimal floating-point
+      output.  The format is EXw.dEe where:
+      - w is the total field width
+      - d is the number of significant hex digits after the radix point
+      - e is the width of the exponent field (including 'p' and sign)
+ 
+      Example output: 0x1.23p+10 or -0x1.abcp-5 */
+ 
+   char buf[64];
+   char output[64];
+   char *p_pos, *exp_pos, *decimal;
+   char sign_char;
+   int w, d, e, result, res_len;
+   int exp_value;
+   int mantissa_digits;
+   size_t output_len, mantissa_len, copy_len;
+ 
+   /* Get the user supplied width parameters.  */
+ 
+   w = f->u.real.w;  /* Total field width */
+   d = f->u.real.d;  /* Significant hex digits after decimal */
+   e = f->u.real.e == -1 ? 0 : f->u.real.e; /* Exponent field width */
+ 
+   /* Get the hex float string using uppercase format (e.g., 0X1.23P+10) */
+   result = get_float_hex_string (p, kind, buf, &res_len);
+ 
+   if (result < 0)
+     {
+       /* Error - output asterisks  */
+       w = (w > 0) ? w : 1;
+       char *out = write_block (dtp, w);
+       if (out != NULL)
+ 	memset (out, '*', w);
+       return;
+     }
+ 
+   /* Find the exponent marker 'P' (uppercase from %A format) */
+   p_pos = strchr (buf, 'P');
+   if (p_pos == NULL)
+     {
+       /* No exponent found - this occurs when the value is INF or NAN  */
+       strncpy (output, buf, sizeof (output) - 1);
+       output[sizeof (output) - 1] = '\0';
+       output_len = strlen (output);
+       goto write_output;
+     }
+ 
+   /* Parse exponent value  */
+   exp_pos = p_pos + 1;
+   sign_char = '+';
+   if (*exp_pos == '+' || *exp_pos == '-')
+     {
+       sign_char = *exp_pos;
+       exp_pos++;
+     }
+ 
+   if (sscanf (exp_pos, "%d", &exp_value) != 1)
+     {
+       /* Failed to parse - use original */
+       strncpy (output, buf, sizeof (output) - 1);
+       output[sizeof (output) - 1] = '\0';
+       output_len = strlen (output);
+       goto write_output;
+     }
+ 
+   /* Handle the 'd' parameter - trim trailing zeros before 'P'.  */
+   if (d == 0)
+     {
+       decimal = strchr (buf, '.');
+       if (decimal != NULL && decimal < p_pos)
+ 	{
+ 	  char *trim = p_pos - 1;
+ 	  while (trim > decimal && *trim == '0')
+ 	    trim--;
+ 	  /* Shift 'P...' part left to just after last non-zero digit.  */
+ 	  if (trim + 1 < p_pos)
+ 	    {
+ 	      memmove (trim + 1, p_pos, strlen (p_pos) + 1);
+ 	      p_pos = trim + 1;
+ 	    }
+ 	}
+     }
+ 
+   /* Handle the 'd' parameter - adjust mantissa precision if specified */
+   if (d > 0)
+     {
+       /* Find the decimal point in mantissa */
+       decimal = strchr (buf, '.');
+       if (decimal != NULL && decimal < p_pos)
+ 	{
+ 	  /* Count current mantissa digits after decimal point */
+ 	  mantissa_digits = p_pos - decimal - 1;
+ 
+ 	  /* Adjust mantissa to have exactly 'd' digits after decimal */
+ 	  if (d < mantissa_digits)
+ 	    {
+ 	      /* Truncate mantissa */
+ 	      memmove (decimal + d + 1, p_pos, strlen (p_pos) + 1);
+ 	      p_pos = decimal + d + 1;
+ 	    }
+ 	  else if (d > mantissa_digits)
+ 	    {
+ 	      /* Pad with zeros - shift exponent part right */
+ 	      int pad_count = d - mantissa_digits;
+ 	      if (strlen (buf) + pad_count < sizeof (buf))
+ 		{
+ 		  memmove (p_pos + pad_count, p_pos, strlen (p_pos) + 1);
+ 		  memset (p_pos, '0', pad_count);
+ 		  p_pos += pad_count;
+ 		}
+ 	    }
+ 	}
+     }
+ 
+   /* Format the exponent field with specified width 'e'. The 'e' parameter
+      is the total exponent width INCLUDING 'P' and the sign.  */
+ 
+   int exp_digits = e;
+   if (exp_digits < 1)
+     exp_digits = 1;  /* Minimum 1 digit */
+ 
+   /* Construct output with formatted exponent */
+   mantissa_len = p_pos - buf;
+   if (mantissa_len >= sizeof (output))
+     mantissa_len = sizeof (output) - 1;
+ 
+   memcpy (output, buf, mantissa_len);
+   snprintf (output + mantissa_len, sizeof (output) - mantissa_len,
+ 	    "P%c%0*d", sign_char, exp_digits, abs (exp_value));
+ 
+   output_len = strlen (output);
+ 
+   /* Check the field width 'w' if specified. If the field width is not
+      wide enough, fill it with  "*"  before writing it out.  */
+   if (w > 0 && (output_len > (size_t) w))
+     {
+       char *out = write_block (dtp, w);
+       if (out != NULL)
+ 	{
+ 	  if (unlikely (is_char4_unit (dtp)))
+ 	    {
+ 	      gfc_char4_t *out4 = (gfc_char4_t *) out;
+ 	      memset4 (out4, '*', w);
+ 	    }
+ 	  else
+ 	    memset (out, '*', w);
+ 	}
+       return;
+     }
+ 
+ write_output:
+ 
+   /* Determine actual output width */
+   int actual_width = (w > 0) ? w : (int) output_len;
+ 
+   /* Get the block of memory that will be transferred out.  */
+   char *out = write_block (dtp, actual_width);
+   if (out == NULL)
+     return;
+ 
+   /* Handle character unit type (4-byte vs 1-byte) */
+   if (unlikely (is_char4_unit (dtp)))
+     {
+       gfc_char4_t *out4 = (gfc_char4_t *) out;
+ 
+       /* Pad with spaces if width specified and we're short */
+       int pad_len = actual_width - output_len;
+       if (pad_len > 0)
+ 	memset4 (out4, ' ', pad_len);
+ 
+       /* Copy out the wide character string.  */
+       out4 += (actual_width - output_len);
+       memcpy4 (out4, output, output_len);
+     }
+   else
+     {
+       /* Pad with spaces if width specified and we're short */
+       if (w > 0 && output_len < (size_t)actual_width)
+ 	memset (out, ' ', actual_width - output_len);
+       out += (actual_width - output_len);
+ 
+       /* Copy output string */
+       copy_len = (output_len < (size_t)actual_width)
+ 		  ? output_len : (size_t)actual_width;
+       memcpy (out, output, copy_len);
+     }
+ }
  
  /* Set an fnode to default format.  */
  
*************** write_real (st_parameter_dt *dtp, const
*** 1938,1944 ****
    buffer = select_buffer (dtp, &f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, &f, source , kind, 1, buffer,
!                            precision, buf_size, result, &flt_str_len);
    write_float_string (dtp, result, flt_str_len);
  
    dtp->u.p.scale_factor = orig_scale;
--- 2129,2135 ----
    buffer = select_buffer (dtp, &f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, &f, source , kind, 1, buffer,
! 			   precision, buf_size, result, &flt_str_len);
    write_float_string (dtp, result, flt_str_len);
  
    dtp->u.p.scale_factor = orig_scale;
*************** write_complex (st_parameter_dt *dtp, con
*** 2046,2054 ****
    buffer = select_buffer (dtp, &f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, &f, source , kind, 0, buffer,
!                            precision, buf_size, result1, &flt_str_len1);
    get_float_string (dtp, &f, source + size / 2 , kind, 0, buffer,
!                            precision, buf_size, result2, &flt_str_len2);
    if (!dtp->u.p.namelist_mode)
      {
        lblanks = width - flt_str_len1 - flt_str_len2 - 3;
--- 2237,2245 ----
    buffer = select_buffer (dtp, &f, precision, buf_stack, &buf_size, kind);
  
    get_float_string (dtp, &f, source , kind, 0, buffer,
! 			   precision, buf_size, result1, &flt_str_len1);
    get_float_string (dtp, &f, source + size / 2 , kind, 0, buffer,
! 			   precision, buf_size, result2, &flt_str_len2);
    if (!dtp->u.p.namelist_mode)
      {
        lblanks = width - flt_str_len1 - flt_str_len2 - 3;
*************** nml_write_obj (st_parameter_dt *dtp, nam
*** 2344,2353 ****
  	  len = strlen (base->var_name);
  	  base_name_len = strlen (base_name);
  	  for (dim_i = 0; dim_i < base_name_len; dim_i++)
!             {
  	      cup = safe_toupper (base_name[dim_i]);
  	      write_character (dtp, &cup, 1, 1, NODELIM);
!             }
  	}
        clen = strlen (obj->var_name);
        for (dim_i = len; dim_i < clen; dim_i++)
--- 2535,2544 ----
  	  len = strlen (base->var_name);
  	  base_name_len = strlen (base_name);
  	  for (dim_i = 0; dim_i < base_name_len; dim_i++)
! 	    {
  	      cup = safe_toupper (base_name[dim_i]);
  	      write_character (dtp, &cup, 1, 1, NODELIM);
! 	    }
  	}
        clen = strlen (obj->var_name);
        for (dim_i = len; dim_i < clen; dim_i++)
*************** nml_write_obj (st_parameter_dt *dtp, nam
*** 2440,2467 ****
  
  	    case BT_INTEGER:
  	      write_integer (dtp, p, len);
!               break;
  
  	    case BT_LOGICAL:
  	      write_logical (dtp, p, len);
!               break;
  
  	    case BT_CHARACTER:
  	      if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
  		write_character (dtp, p, 4, obj->string_length, DELIM);
  	      else
  		write_character (dtp, p, 1, obj->string_length, DELIM);
!               break;
  
  	    case BT_REAL:
  	      write_real (dtp, p, len);
!               break;
  
  	   case BT_COMPLEX:
  	      dtp->u.p.no_leading_blank = 0;
  	      num++;
!               write_complex (dtp, p, len, obj_size);
!               break;
  
  	    case BT_DERIVED:
  	    case BT_CLASS:
--- 2631,2658 ----
  
  	    case BT_INTEGER:
  	      write_integer (dtp, p, len);
! 	      break;
  
  	    case BT_LOGICAL:
  	      write_logical (dtp, p, len);
! 	      break;
  
  	    case BT_CHARACTER:
  	      if (dtp->u.p.current_unit->flags.encoding == ENCODING_UTF8)
  		write_character (dtp, p, 4, obj->string_length, DELIM);
  	      else
  		write_character (dtp, p, 1, obj->string_length, DELIM);
! 	      break;
  
  	    case BT_REAL:
  	      write_real (dtp, p, len);
! 	      break;
  
  	   case BT_COMPLEX:
  	      dtp->u.p.no_leading_blank = 0;
  	      num++;
! 	      write_complex (dtp, p, len, obj_size);
! 	      break;
  
  	    case BT_DERIVED:
  	    case BT_CLASS:
*************** nml_write_obj (st_parameter_dt *dtp, nam
*** 2603,2611 ****
  	      free (ext_name);
  	      goto obj_loop;
  
!             default:
  	      internal_error (&dtp->common, "Bad type for namelist write");
!             }
  
  	  /* Reset the leading blank suppression, write a comma (or semi-colon)
  	     and, if 5 values have been output, write a newline and advance
--- 2794,2802 ----
  	      free (ext_name);
  	      goto obj_loop;
  
! 	    default:
  	      internal_error (&dtp->common, "Bad type for namelist write");
! 	    }
  
  	  /* Reset the leading blank suppression, write a comma (or semi-colon)
  	     and, if 5 values have been output, write a newline and advance
*************** namelist_write (st_parameter_dt *dtp)
*** 2670,2676 ****
    switch (dtp->u.p.current_unit->delim_status)
      {
        case DELIM_APOSTROPHE:
!         dtp->u.p.nml_delim = '\'';
  	break;
        case DELIM_QUOTE:
        case DELIM_UNSPECIFIED:
--- 2861,2867 ----
    switch (dtp->u.p.current_unit->delim_status)
      {
        case DELIM_APOSTROPHE:
! 	dtp->u.p.nml_delim = '\'';
  	break;
        case DELIM_QUOTE:
        case DELIM_UNSPECIFIED:
diff -Nrcpad gcc-17-20260517/libgfortran/io/write_float.def gcc-17-20260524/libgfortran/io/write_float.def
*** gcc-17-20260517/libgfortran/io/write_float.def	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/io/write_float.def	Sun May 24 22:32:13 2026
*************** see the files COPYING3 and COPYING.RUNTI
*** 26,31 ****
--- 26,320 ----
  
  #include "config.h"
  
+ /* Math function dispatch macros for kind=16.  The type and its math functions
+    vary by platform: _Float128 (IEC 60559), __float128 (libquadmath, including
+    POWER_IEEE128), or 128-bit long double.  */
+ #ifdef HAVE_GFC_REAL_16
+ # if defined(GFC_REAL_16_IS_FLOAT128)
+ #  if defined(GFC_REAL_16_USE_IEC_60559)
+ #   define GFC_REAL_16_FREXP(x, e)  frexpf128 (x, e)
+ #   define GFC_REAL_16_FABS(x)      fabsf128 (x)
+ #   define GFC_REAL_16_SCALBN(x, n) scalbnf128 (x, n)
+ #  else  /* libquadmath __float128, including POWER_IEEE128  */
+ #   define GFC_REAL_16_FREXP(x, e)  frexpq (x, e)
+ #   define GFC_REAL_16_FABS(x)      fabsq (x)
+ #   define GFC_REAL_16_SCALBN(x, n) scalbnq (x, n)
+ #  endif
+ # else  /* 128-bit long double  */
+ #  define GFC_REAL_16_FREXP(x, e)   frexpl (x, e)
+ #  define GFC_REAL_16_FABS(x)       fabsl (x)
+ #  define GFC_REAL_16_SCALBN(x, n)  scalbnl (x, n)
+ # endif
+ #endif /* HAVE_GFC_REAL_16  */
+ 
+ /* Helper function for EX format specifier.
+ 
+    Returns 0 on success, -1 on error. Fills 'buffer' with the hexadecimal
+    floating-point representation of the input value derived from the
+    IEEE-754 bit representations.  Non-IEEE-754 representations are not
+    supported. Sets '*res_len' to the length of the string,
+    excluding NUL terminator. The buffer must be at least 64 bytes to
+    contain the resulting string for all kinds.  */
+ static int
+ get_float_hex_string (const void *source, int kind, char *buffer,
+ 		      int *res_len)
+ {
+   int result = -1;
+   bool is_negative;
+   *res_len = 0;
+ 
+   switch (kind)
+     {
+     case 4:
+       {
+ 	GFC_REAL_4 val;
+ 	GFC_REAL_4 mant;
+ 	int expon;
+ 	int int_part;
+ 	unsigned int frac_part;
+ 
+ 	val = *(const GFC_REAL_4 *) source;
+ 	is_negative = signbit (val);
+ 	if (val == 0.0f)
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 9, "-0X0.P0");
+ 	    else
+ 	      result = snprintf (buffer, 8, "0X0.P0");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isinf (val))
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 5, "-Inf");
+ 	    else
+ 	      result = snprintf (buffer, 4, "Inf");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isnan (val))
+ 	  {
+ 	    result = snprintf (buffer, 4, "NaN");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	mant = frexpf (val, &expon);
+ 	/* Scale mantissa so the leading hex digit is in the range [8, 15].  */
+ 	if (mant != 0.0f)
+ 	  {
+ 	    mant = fabsf (mant);
+ 	    mant = scalbnf (mant, 4);
+ 	    expon -= 4;
+ 	    if (mant < 8.f)
+ 	      {
+ 		mant = scalbnf (mant, 1);
+ 		expon -= 1;
+ 	      }
+ 	  }
+ 	int_part = (int) mant;
+ 	/* 24 is the nearest integer divisible by 4 that is >= 23 (mantissa bits
+ 	   for kind=4).  (24-4)/4 = 5 hex digits for the fractional part.  */
+ 	frac_part = (unsigned int) scalbnf (mant - (GFC_REAL_4) int_part, 24 - 4);
+ 	if (is_negative)
+ 	  result = snprintf (buffer, 16, "-0X%X.%5.5XP%+d", int_part, frac_part, expon);
+ 	else
+ 	  result = snprintf (buffer, 16, "0X%X.%5.5XP%+d", int_part, frac_part, expon);
+       }
+       break;
+     case 8:
+       {
+ 	double val;
+ 	double mant;
+ 	int expon;
+ 	int int_part;
+ 	unsigned long frac_part;
+ 
+ 	val = *(const GFC_REAL_8 *) source;
+ 	is_negative = signbit (val);
+ 	if (val == 0.0)
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 9, "-0X0.P0");
+ 	    else
+ 	      result = snprintf (buffer, 8, "0X0.P0");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isinf (val))
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 5, "-Inf");
+ 	    else
+ 	      result = snprintf (buffer, 4, "Inf");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isnan (val))
+ 	  {
+ 	    result = snprintf (buffer, 4, "NaN");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	mant = frexp (val, &expon);
+ 	/* Scale mantissa so the leading hex digit is in the range [8, 15].  */
+ 	if (mant != 0.0)
+ 	  {
+ 	    mant = fabs (mant);
+ 	    mant = scalbn (mant, 4);
+ 	    expon -= 4;
+ 	    if (mant < 8.)
+ 	      {
+ 		mant = scalbn (mant, 1);
+ 		expon -= 1;
+ 	      }
+ 	  }
+ 	int_part = (int) mant;
+ 	/* 56 is the nearest integer divisible by 4 that is >= 53 (mantissa bits
+ 	   for kind=8).  (56-4)/4 = 13 hex digits for the fractional part.  */
+ 	frac_part = (unsigned long) scalbn (mant - (double) int_part, 56 - 4);
+ 	if (is_negative)
+ 	  result = snprintf (buffer, 25, "-0X%X.%13.13lXP%+d", int_part, frac_part, expon);
+ 	else
+ 	  result = snprintf (buffer, 25, "0X%X.%13.13lXP%+d", int_part, frac_part, expon);
+       }
+       break;
+ #ifdef HAVE_GFC_REAL_10
+     case 10:
+       {
+ 	GFC_REAL_10 val;
+ 	GFC_REAL_10 mant;
+ 	int expon;
+ 	int int_part;
+ 	unsigned long long frac_part;
+ 
+ 	val = *(const GFC_REAL_10 *) source;
+ 	is_negative = signbit (val);
+ 	if (val == 0.0L)
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 9, "-0X0.P0");
+ 	    else
+ 	      result = snprintf (buffer, 8, "0X0.P0");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isinf (val))
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 5, "-Inf");
+ 	    else
+ 	      result = snprintf (buffer, 4, "Inf");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isnan (val))
+ 	  {
+ 	    result = snprintf (buffer, 4, "NaN");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	mant = frexpl (val, &expon);
+ 	/* Scale mantissa so the leading hex digit is in the range [8, 15].  */
+ 	if (mant != 0.0L)
+ 	  {
+ 	    mant = fabsl (mant);
+ 	    mant = scalbnl (mant, 4);
+ 	    expon -= 4;
+ 	    if (mant < 8.L)
+ 	      {
+ 		mant = scalbnl (mant, 1);
+ 		expon -= 1;
+ 	      }
+ 	  }
+ 	int_part = (int) mant;
+ 	/* 64 is the nearest integer divisible by 4 that is >= 64 (mantissa bits
+ 	   for kind=10).  (64-4)/4 = 15 hex digits for the fractional part.  */
+ 	frac_part = (unsigned long long) scalbnl (mant - (GFC_REAL_10) int_part, 64 - 4);
+ 	if (is_negative)
+ 	  result = snprintf (buffer, 28, "-0X%X.%15.15llXP%+d", int_part, frac_part, expon);
+ 	else
+ 	  result = snprintf (buffer, 28, "0X%X.%15.15llXP%+d", int_part, frac_part, expon);
+       }
+       break;
+ #endif
+ #ifdef HAVE_GFC_REAL_16
+     case 16:
+       {
+ 	GFC_REAL_16 val;
+ 	GFC_REAL_16 mant;
+ 	int expon;
+ 	int int_part;
+ 	unsigned long long frac_hi, frac_lo;
+ 	GFC_REAL_16 frac_val, frac_lo_val;
+ 
+ 	val = *(const GFC_REAL_16 *) source;
+ 	is_negative = signbit (val);
+ 	if (val == (GFC_REAL_16) 0.0)
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 9, "-0X0.P0");
+ 	    else
+ 	      result = snprintf (buffer, 8, "0X0.P0");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isinf (val))
+ 	  {
+ 	    if (is_negative)
+ 	      result = snprintf (buffer, 5, "-Inf");
+ 	    else
+ 	      result = snprintf (buffer, 4, "Inf");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	if (isnan (val))
+ 	  {
+ 	    result = snprintf (buffer, 4, "NaN");
+ 	    *res_len = result;
+ 	    return result < 0 ? -1 : 0;
+ 	  }
+ 	mant = GFC_REAL_16_FREXP (val, &expon);
+ 	/* Scale mantissa so the leading hex digit is in the range [8, 15].  */
+ 	if (mant != (GFC_REAL_16) 0.0)
+ 	  {
+ 	    mant = GFC_REAL_16_FABS (mant);
+ 	    mant = GFC_REAL_16_SCALBN (mant, 4);
+ 	    expon -= 4;
+ 	    if (mant < (GFC_REAL_16) 8.)
+ 	      {
+ 		mant = GFC_REAL_16_SCALBN (mant, 1);
+ 		expon -= 1;
+ 	      }
+ 	  }
+ 	int_part = (int) mant;
+ 	/* 116 is the nearest integer divisible by 4 that is >= 113 (mantissa
+ 	   bits for kind=16).  (116-4)/4 = 28 hex digits for the fractional
+ 	   part, split into two 56-bit halves (14 hex digits each) to fit in
+ 	   unsigned long long.  */
+ 	frac_val = mant - (GFC_REAL_16) int_part;
+ 	frac_hi = (unsigned long long) GFC_REAL_16_SCALBN (frac_val, 56);
+ 	frac_lo_val = frac_val - GFC_REAL_16_SCALBN ((GFC_REAL_16) frac_hi, -56);
+ 	frac_lo = (unsigned long long) GFC_REAL_16_SCALBN (frac_lo_val, 112);
+ 	if (is_negative)
+ 	  result = snprintf (buffer, 42, "-0X%X.%14.14llX%14.14llXP%+d",
+ 			     int_part, frac_hi, frac_lo, expon);
+ 	else
+ 	  result = snprintf (buffer, 42, "0X%X.%14.14llX%14.14llXP%+d",
+ 			     int_part, frac_hi, frac_lo, expon);
+       }
+       break;
+ #endif /* HAVE_GFC_REAL_16  */
+     default:
+       return -1;
+     }
+   if (result < 0)
+     return -1;
+ 
+   *res_len = result;
+   return 0;
+ }
+ 
  typedef enum
  { S_NONE, S_MINUS, S_PLUS }
  sign_t;
*************** build_float_string (st_parameter_dt *dtp
*** 186,192 ****
      case FMT_F:
        nbefore = ndigits - precision;
        if ((w > 0) && (nbefore > (int) size))
!         {
  	  *len = w;
  	  star_fill (result, w);
  	  result[w] = '\0';
--- 475,481 ----
      case FMT_F:
        nbefore = ndigits - precision;
        if ((w > 0) && (nbefore > (int) size))
! 	{
  	  *len = w;
  	  star_fill (result, w);
  	  result[w] = '\0';
*************** build_float_string (st_parameter_dt *dtp
*** 310,316 ****
        /* The exponent must be a multiple of three, with 1-3 digits before
  	 the decimal point.  */
        if (!zero_flag)
!         e--;
        if (e >= 0)
  	nbefore = e % 3;
        else
--- 599,605 ----
        /* The exponent must be a multiple of three, with 1-3 digits before
  	 the decimal point.  */
        if (!zero_flag)
! 	e--;
        if (e >= 0)
  	nbefore = e % 3;
        else
*************** build_float_string (st_parameter_dt *dtp
*** 328,334 ****
  
      case FMT_ES:
        if (!zero_flag)
!         e--;
        nbefore = 1;
        nzero = 0;
        nafter = d;
--- 617,623 ----
  
      case FMT_ES:
        if (!zero_flag)
! 	e--;
        nbefore = 1;
        nzero = 0;
        nafter = d;
*************** build_float_string (st_parameter_dt *dtp
*** 444,452 ****
  	  if (i < 0)
  	    {
  	      /* The carry overflowed.  Fortunately we have some spare
! 	         space at the start of the buffer.  We may discard some
! 	         digits, but this is ok because we already know they are
! 	         zero.  */
  	      digits--;
  	      digits[0] = '1';
  	      if (ft == FMT_F)
--- 733,741 ----
  	  if (i < 0)
  	    {
  	      /* The carry overflowed.  Fortunately we have some spare
! 		 space at the start of the buffer.  We may discard some
! 		 digits, but this is ok because we already know they are
! 		 zero.  */
  	      digits--;
  	      digits[0] = '1';
  	      if (ft == FMT_F)
*************** build_float_string (st_parameter_dt *dtp
*** 562,568 ****
        /* The output is zero, so set the sign according to the sign bit unless
  	 -fno-sign-zero was specified.  */
        if (compile_options.sign_zero == 1)
!         sign = calculate_sign (dtp, sign_bit);
        else
  	sign = calculate_sign (dtp, 0);
      }
--- 851,857 ----
        /* The output is zero, so set the sign according to the sign bit unless
  	 -fno-sign-zero was specified.  */
        if (compile_options.sign_zero == 1)
! 	sign = calculate_sign (dtp, sign_bit);
        else
  	sign = calculate_sign (dtp, 0);
      }
*************** quadmath_snprintf (buffer, size, "%+-#.*
*** 987,995 ****
     10.0**e even when the final result will not be rounded to 10.0**e.
     For these values the exponent returned by atoi has to be decremented
     by one. The values y in the ranges
!        (1000.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*(n+1))
!         (100.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+2)
!          (10.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+1)
     are correctly rounded respectively to 1.0...0*10.0*(3*(n+1)),
     100.0...0*10.0*(3*n), and 10.0...0*10.0*(3*n), where 0...0
     represents d zeroes, by the lines 279 to 297. */
--- 1276,1284 ----
     10.0**e even when the final result will not be rounded to 10.0**e.
     For these values the exponent returned by atoi has to be decremented
     by one. The values y in the ranges
! 	(1000.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*(n+1))
! 	 (100.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+2)
! 	  (10.0-0.5*10.0**(-d))*10.0**(3*n) <= y < 10.0*(3*n+1)
     are correctly rounded respectively to 1.0...0*10.0*(3*(n+1)),
     100.0...0*10.0*(3*n), and 10.0...0*10.0*(3*n), where 0...0
     represents d zeroes, by the lines 279 to 297. */
*************** determine_en_precision (st_parameter_dt
*** 1118,1124 ****
  	  d = precision;\
  	}\
        /* The switch between FMT_E and FMT_F is based on the absolute value.  \
!          Set r=0 for rounding toward zero and r = 1 otherwise.  \
  	 If (exp_d - m) == 1 there is no rounding needed.  */\
        switch (dtp->u.p.current_unit->round_status)\
  	{\
--- 1407,1413 ----
  	  d = precision;\
  	}\
        /* The switch between FMT_E and FMT_F is based on the absolute value.  \
! 	 Set r=0 for rounding toward zero and r = 1 otherwise.  \
  	 If (exp_d - m) == 1 there is no rounding needed.  */\
        switch (dtp->u.p.current_unit->round_status)\
  	{\
diff -Nrcpad gcc-17-20260517/libgfortran/m4/matmul.m4 gcc-17-20260524/libgfortran/m4/matmul.m4
*** gcc-17-20260517/libgfortran/m4/matmul.m4	Sun May 17 22:32:14 2026
--- gcc-17-20260524/libgfortran/m4/matmul.m4	Sun May 24 22:32:13 2026
*************** static' include(matmul_internal.m4)dnl
*** 109,115 ****
  static' include(matmul_internal.m4)dnl
  `#endif  /* HAVE_AVX512F */
  
! /* AMD-specifix funtions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  'define(`matmul_name',`matmul_'rtype_code`_avx128_fma3')dnl
--- 109,115 ----
  static' include(matmul_internal.m4)dnl
  `#endif  /* HAVE_AVX512F */
  
! /* AMD-specific functions with AVX128 and FMA3/FMA4.  */
  
  #if defined(HAVE_AVX) && defined(HAVE_FMA3) && defined(HAVE_AVX128)
  'define(`matmul_name',`matmul_'rtype_code`_avx128_fma3')dnl
diff -Nrcpad gcc-17-20260517/libgomp/ChangeLog gcc-17-20260524/libgomp/ChangeLog
*** gcc-17-20260517/libgomp/ChangeLog	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libgomp/ChangeLog	Sun May 24 22:32:14 2026
***************
*** 1,3 ****
--- 1,24 ----
+ 2026-05-21  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* testsuite/libgomp.c/ipcp-cb-spec1.c: Set lower param
+ 	ipa-cp-eval-threshold.
+ 
+ 2026-05-19  Paul-Antoine Arras  <parras@baylibre.com>
+ 	    Chung-Lin Tang  <cltang@baylibre.com>
+ 	    Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-map-multi-1.C: New test.
+ 	* testsuite/libgomp.c-c++-common/target-map-iterators-6.c: New test.
+ 	* testsuite/libgomp.c-c++-common/target-map-multi-1.c: New test.
+ 	* testsuite/libgomp.c-c++-common/target-map-multi-2.c: New test.
+ 	* testsuite/libgomp.c-c++-common/target-map-multi-3.c: New test.
+ 	* testsuite/libgomp.c-c++-common/target-map-multi-4.c: New test.
+ 	* testsuite/libgomp.fortran/target-map-multi-1.f90: New test.
+ 	* testsuite/libgomp.fortran/target-map-multi-2.f90: New test.
+ 	* testsuite/libgomp.fortran/target-map-multi-3.f90: New test.
+ 	* testsuite/libgomp.fortran/target-map-multi-4.f90: New test.
+ 	* testsuite/libgomp.fortran/target-map-multi-5.f90: New test.
+ 
  2026-05-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* env.c (initialize_env): Check GOMP_DEFAULT_STACKSIZE for
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c gcc-17-20260524/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c	Sun May 24 22:32:14 2026
***************
*** 1,7 ****
  /* Test that GOMP_task is special cased when cpyfn is NULL.  */
  
  /* { dg-do run } */
! /* { dg-options "-O3 -fopenmp -std=gnu99 -fdump-ipa-cp-details" } */
  /* { dg-require-effective-target fopenmp } */
  
  void test(int c) {
--- 1,7 ----
  /* Test that GOMP_task is special cased when cpyfn is NULL.  */
  
  /* { dg-do run } */
! /* { dg-options "-O3 -fopenmp -std=gnu99 -fdump-ipa-cp-details --param ipa-cp-eval-threshold=1" } */
  /* { dg-require-effective-target fopenmp } */
  
  void test(int c) {
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c++/target-map-multi-1.C gcc-17-20260524/libgomp/testsuite/libgomp.c++/target-map-multi-1.C
*** gcc-17-20260517/libgomp/testsuite/libgomp.c++/target-map-multi-1.C	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c++/target-map-multi-1.C	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,113 ----
+ // Test multiple map clauses for the same variable using pointer array sections
+ // and C++ references.
+ // { dg-do run }
+ 
+ extern "C" void abort ();
+ 
+ static const int N = 100;
+ 
+ /* Test fixed-size array with multiple map clauses.  */
+ static void
+ test_pointer ()
+ {
+   int p[N];
+ 
+   /* map(to) + map(alloc) + map(from): three clauses on the same array.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   #pragma omp target map(to: p) map(alloc: p) map(from: p)
+     for (int i = 0; i < N; i++) p[i] *= 4;
+   for (int i = 0; i < N; i++) if (p[i] != i * 4) abort ();
+ 
+   /* map(to) + map(tofrom): tofrom covers both directions.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   #pragma omp target map(to: p) map(tofrom: p)
+     for (int i = 0; i < N; i++) p[i] *= 5;
+   for (int i = 0; i < N; i++) if (p[i] != i * 5) abort ();
+ 
+   /* map(alloc) + map(to): device gets host values via 'to'.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   int sum = 0;
+   #pragma omp target map(alloc: p) map(to: p) map(tofrom: sum)
+     for (int i = 0; i < N; i++) sum += p[i];
+   if (sum != N * (N - 1) / 2) abort ();
+ 
+   /* map(alloc) + map(from): device values come back via 'from'.  */
+   #pragma omp target map(alloc: p) map(from: p)
+     for (int i = 0; i < N; i++) p[i] = i * 7;
+   for (int i = 0; i < N; i++) if (p[i] != i * 7) abort ();
+ 
+   /* map(alloc) + map(tofrom) + map(alloc): three clauses, full bidirectional.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   #pragma omp target map(alloc: p) map(tofrom: p) map(alloc: p)
+     for (int i = 0; i < N; i++) p[i] *= 8;
+   for (int i = 0; i < N; i++) if (p[i] != i * 8) abort ();
+ }
+ 
+ /* Test C++ array references: r aliases a.  */
+ static void
+ test_reference ()
+ {
+   int a[N];
+   int (&r)[N] = a;
+ 
+   /* map(to: r) + map(from: r): send and receive via the same reference.  */
+   for (int i = 0; i < N; i++) a[i] = i;
+   #pragma omp target map(to: r) map(from: r)
+     for (int i = 0; i < N; i++) r[i] *= 4;
+   for (int i = 0; i < N; i++) if (r[i] != i * 4) abort ();
+ 
+   /* map(to: r) + map(tofrom: r): to and tofrom on the same reference.  */
+   for (int i = 0; i < N; i++) a[i] = i;
+   #pragma omp target map(to: r) map(tofrom: r)
+     for (int i = 0; i < N; i++) r[i] *= 5;
+   for (int i = 0; i < N; i++) if (r[i] != i * 5) abort ();
+ 
+   /* map(to: r) + map(alloc: r) + map(from: r): three clauses on the same reference.  */
+   for (int i = 0; i < N; i++) a[i] = i;
+   #pragma omp target map(to: r) map(alloc: r) map(from: r)
+     for (int i = 0; i < N; i++) r[i] *= 6;
+   for (int i = 0; i < N; i++) if (r[i] != i * 6) abort ();
+ 
+   /* map(alloc: r) + map(to: r): alloc and to on the same reference.  */
+   for (int i = 0; i < N; i++) a[i] = i;
+   int sum = 0;
+   #pragma omp target map(alloc: r) map(to: r) map(tofrom: sum)
+     for (int i = 0; i < N; i++) sum += r[i];
+   if (sum != N * (N - 1) / 2) abort ();
+ }
+ 
+ /* Test pointer + array sections with enter/exit data using multiple map
+    clauses.  */
+ static void
+ test_pointer_enter_exit ()
+ {
+   int *p = new int[N];
+ 
+   /* map(alloc) + map(to) on enter data.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   #pragma omp target enter data map(alloc: p[0:N]) map(to: p[0:N])
+   int sum = 0;
+   #pragma omp target map(alloc: p[0:N]) map(tofrom: sum)
+     for (int i = 0; i < N; i++) sum += p[i];
+   if (sum != N * (N - 1) / 2) abort ();
+   #pragma omp target exit data map(delete: p[0:N])
+ 
+   /* map(release) + map(from) on exit data: copy back then release.  */
+   for (int i = 0; i < N; i++) p[i] = i;
+   #pragma omp target enter data map(to: p[0:N])
+   #pragma omp target map(alloc: p[0:N])
+     for (int i = 0; i < N; i++) p[i] *= 3;
+   #pragma omp target exit data map(release: p[0:N]) map(from: p[0:N])
+   for (int i = 0; i < N; i++) if (p[i] != i * 3) abort ();
+ 
+   delete[] p;
+ }
+ 
+ int
+ main ()
+ {
+   test_pointer ();
+   test_reference ();
+   test_pointer_enter_exit ();
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-6.c gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-6.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-6.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-iterators-6.c	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,43 ----
+ /* { dg-do run } */
+ /* { dg-require-effective-target offload_device_nonshared_as } */
+ 
+ /* This testcase used to ICE.  Test that an array can appear more than once
+    in map clauses in combination with iterators.  */
+ 
+ #include <stdlib.h>
+ 
+ #define DIM 128
+ 
+ void
+ make_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     {
+       x[i] = (int *) malloc (sizeof (int));
+       *(x[i]) = i;
+     }
+ }
+ 
+ int
+ check_array (int *x[], int dim)
+ {
+   for (int i = 0; i < DIM; i++)
+     if (*(x[i]) != -i)
+       return 1;
+   return 0;
+ }
+ 
+ int
+ main (void)
+ {
+   int *x[DIM];
+   make_array (x, DIM);
+ 
+ #pragma omp target map (iterator(it = 0:DIM), tofrom: x[it][:1]) map (to: x)
+   {
+     for (int i = 0; i < DIM; i++)
+       x[i][0] = -x[i][0];
+   }
+ 
+   return check_array (x, DIM);
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-1.c gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-1.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-1.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-1.c	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,72 ----
+ /* Test multiple map clauses for the same variable with various
+    combinations of map-types: alloc, to, from, tofrom.  */
+ /* { dg-do run } */
+ 
+ #define N 100
+ 
+ int
+ main (void)
+ {
+   int a[N];
+   int sum;
+ 
+   /* map(to) + map(from) = map(tofrom).  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target map(to: a) map(alloc: a) map(from: a)
+     for (int i = 0; i < N; i++)
+       a[i] *= 4;
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 4)
+       __builtin_abort ();
+ 
+   /* map(to) + map(tofrom): tofrom covers both directions.  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target map(to: a) map(tofrom: a) map(to: a)
+     for (int i = 0; i < N; i++)
+       a[i] *= 5;
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 5)
+       __builtin_abort ();
+ 
+   /* map(from) + map(tofrom): tofrom covers both directions.  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target map(from: a) map(tofrom: a) map(from: a)
+     for (int i = 0; i < N; i++)
+       a[i] *= 6;
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 6)
+       __builtin_abort ();
+ 
+   /* map(alloc) + map(to): device gets host values via 'to'.  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   sum = 0;
+   #pragma omp target map(alloc: a) map(to: a) map(tofrom: sum) map(alloc: sum)
+     for (int i = 0; i < N; i++)
+       sum += a[i];
+   if (sum != N * (N - 1) / 2)
+     __builtin_abort ();
+ 
+   /* map(alloc) + map(from): device values come back to host via 'from'.  */
+   #pragma omp target map(alloc: a) map(from: a) map(alloc: a)
+     for (int i = 0; i < N; i++)
+       a[i] = i * 7;
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 7)
+       __builtin_abort ();
+ 
+   /* map(alloc) + map(tofrom): full bidirectional transfer.  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target map(alloc: a) map(tofrom: a) map(alloc: a)
+     for (int i = 0; i < N; i++)
+       a[i] *= 8;
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 8)
+       __builtin_abort ();
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-2.c gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-2.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-2.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-2.c	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,54 ----
+ /* Test multiple map clauses for the same variable with the 'always'
+    map-type modifier.  */
+ /* { dg-do run { target offload_device_nonshared_as } } */
+ 
+ #define N 100
+ 
+ int
+ main (void)
+ {
+   int a[N];
+ 
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target data map(tofrom: a)
+     {
+       /* Device has a[i] = i.  Update the host copy to create divergence.  */
+       for (int i = 0; i < N; i++)
+ 	a[i] = i * 2;
+ 
+       /* map(always, to) + map(tofrom): 'always' forces the updated host
+ 	 values (i*2) onto the device despite the existing mapping.  */
+       #pragma omp target map(always, to: a) map(tofrom: a)
+ 	{
+ 	  for (int i = 0; i < N; i++)
+ 	    if (a[i] != i * 2)
+ 	      __builtin_abort ();
+           for (int i = 0; i < N; i++)
+             a[i] = i * 3;
+ 	}
+ 
+       for (int i = 0; i < N; i++)
+         if (a[i] != i * 2)
+           __builtin_abort ();
+ 
+       /* Reset host for the next test; device retains i*3.  */
+       for (int i = 0; i < N; i++)
+         a[i] = i;
+ 
+       /* map(tofrom) + map(always, from): 'always' forces new device values
+ 	 back to host.  */
+       #pragma omp target map(tofrom: a) map(always, from: a)
+ 	for (int i = 0; i < N; i++)
+ 	  {
+ 	    if (a[i] != i * 3)
+ 	      __builtin_abort ();
+ 	    a[i] = i * 4;
+ 	  }
+       for (int i = 0; i < N; i++)
+ 	if (a[i] != i * 4)
+ 	  __builtin_abort ();
+     }
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-3.c gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-3.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-3.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-3.c	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,22 ----
+ /* Test multiple map clauses for the same variable with the 'present'
+    map-type modifier.  */
+ /* { dg-do run } */
+ 
+ #define N 100
+ 
+ int
+ main (void)
+ {
+   int a[N];
+ 
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+ 
+       /* { dg-output "libgomp: present clause: not present on the device \\(addr: 0x\[0-9a-f\]+, size: \[0-9\]+ \\(0x\[0-9a-f\]+\\), dev: \[0-9\]+\\\)" { target offload_device_nonshared_as } } */
+     /* { dg-shouldfail "present error triggered" { offload_device_nonshared_as } } */
+       #pragma omp target map(to: a) map(present, alloc: a) map(from: a)
+         for (int i = 0; i < N; i++)
+ 	  a[i] *= 2;
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-4.c gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-4.c
*** gcc-17-20260517/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-4.c	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.c-c++-common/target-map-multi-4.c	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,66 ----
+ /* Test multiple map clauses for the same variable in target enter/exit data
+    constructs, including release and delete map-types.  */
+ /* { dg-do run } */
+ 
+ #define N 100
+ 
+ int
+ main (void)
+ {
+   int a[N];
+   int sum;
+ 
+   /* delete + release  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target enter data map(alloc: a) map(to: a)
+   sum = 0;
+   #pragma omp target map(alloc: a) map(tofrom: sum)
+     for (int i = 0; i < N; i++)
+       sum += a[i];
+   if (sum != N * (N - 1) / 2)
+     __builtin_abort ();
+   #pragma omp target exit data map(delete: a) map(release: a)
+ 
+ 
+   /* release + release: duplicate release
+      decrements the reference count once (deduplicated).  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target enter data map(to: a)   /* refcount = 1 */
+   #pragma omp target enter data map(to: a)   /* refcount = 2 */
+   #pragma omp target exit data map(release: a) map(release: a)  /* refcount = 1 */
+   sum = 0;
+   #pragma omp target map(alloc: a) map(tofrom: sum)
+     for (int i = 0; i < N; i++)
+       sum += a[i];
+   if (sum != N * (N - 1) / 2)
+     __builtin_abort ();
+   #pragma omp target exit data map(delete: a)   /* refcount = 0 */
+ 
+   /* delete + delete: duplicate delete
+      removes the mapping unconditionally once (deduplicated).  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target enter data map(to: a)
+   #pragma omp target exit data map(delete: a) map(delete: a)
+ 
+   /* from + release: copy device values back
+      to host and release the mapping.  */
+   for (int i = 0; i < N; i++)
+     a[i] = i;
+   #pragma omp target enter data map(to: a)   /* refcount = 1 */
+   #pragma omp target
+     for (int i = 0; i < N; i++)
+       a[i] *= 3;
+   #pragma omp target exit data map(release: a) map(from: a)  /* refcount = 0 */
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 3)
+       __builtin_abort ();
+ 
+   for (int i = 0; i < N; i++)
+     if (a[i] != i * 3)
+       __builtin_abort ();
+ 
+   return 0;
+ }
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-1.f90 gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-1.f90
*** gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-1.f90	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,83 ----
+ ! Test multiple map clauses for the same variable with various
+ ! combinations of map-types: alloc, to, from, tofrom.
+ ! { dg-do run }
+ 
+ program main
+   implicit none
+   integer, parameter :: N = 100
+   integer :: a(N), s, i
+ 
+   ! map(to) + map(alloc) + map(from) = map(tofrom).
+   a = [(i, i=1,N)]
+   !$omp target map(to: a) map(alloc: a) map(from: a)
+     a = a * 4
+   !$omp end target
+   if (any (a /= [(i*4, i=1,N)])) stop 1
+ 
+   ! map(to) + map(tofrom) + map(to): tofrom covers both directions.
+   a = [(i, i=1,N)]
+   !$omp target map(to: a) map(tofrom: a) map(to: a)
+     a = a * 5
+   !$omp end target
+   if (any (a /= [(i*5, i=1,N)])) stop 2
+ 
+   ! map(from) + map(tofrom) + map(from): tofrom covers both directions.
+   a = [(i, i=1,N)]
+   !$omp target map(from: a) map(tofrom: a) map(from: a)
+     a = a * 6
+   !$omp end target
+   if (any (a /= [(i*6, i=1,N)])) stop 3
+ 
+   ! map(alloc) + map(to): device gets host values via 'to'.
+   ! Also tests map(tofrom) + map(alloc) on the scalar s.
+   a = [(i, i=1,N)]
+   s = 0
+   !$omp target map(alloc: a) map(to: a) map(tofrom: s) map(alloc: s)
+     do i = 1, N
+       s = s + a(i)
+     end do
+   !$omp end target
+   if (s /= N * (N + 1) / 2) stop 4
+ 
+   ! map(alloc) + map(from) + map(alloc): device values come back via 'from'.
+   !$omp target map(alloc: a) map(from: a) map(alloc: a)
+     do i = 1, N
+       a(i) = i * 7
+     end do
+   !$omp end target
+   if (any (a /= [(i*7, i=1,N)])) stop 5
+ 
+   ! map(alloc) + map(tofrom) + map(alloc): full bidirectional transfer.
+   a = [(i, i=1,N)]
+   !$omp target map(alloc: a) map(tofrom: a) map(alloc: a)
+     a = a * 8
+   !$omp end target
+   if (any (a /= [(i*8, i=1,N)])) stop 6
+ 
+   ! Same tests via a subroutine to verify correct behaviour with
+   ! dummy arguments (passed by reference).
+   call test_dummy (a)
+ 
+ contains
+ 
+   subroutine test_dummy (a)
+     integer, intent(inout) :: a(:)
+     integer :: i
+ 
+     ! map(to) + map(alloc) + map(from) with dummy argument.
+     a = [(i, i=1,size(a))]
+     !$omp target map(to: a) map(alloc: a) map(from: a)
+       a = a * 4
+     !$omp end target
+     if (any (a /= [(i*4, i=1,size(a))])) stop 7
+ 
+     ! map(alloc) + map(tofrom) + map(alloc) with dummy argument.
+     a = [(i, i=1,size(a))]
+     !$omp target map(alloc: a) map(tofrom: a) map(alloc: a)
+       a = a * 8
+     !$omp end target
+     if (any (a /= [(i*8, i=1,size(a))])) stop 8
+ 
+   end subroutine
+ 
+ end program
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-2.f90 gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-2.f90
*** gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-2.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-2.f90	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,84 ----
+ ! Test multiple map clauses for the same variable with the 'always'
+ ! map-type modifier.
+ ! { dg-do run { target offload_device_nonshared_as } }
+ 
+ program main
+   implicit none
+   integer, parameter :: N = 100
+   integer :: a(N), i
+ 
+   a = [(i, i=1,N)]
+   !$omp target data map(tofrom: a)
+     ! Device has a(i) = i.  Update the host copy to create divergence.
+     a = [(i*2, i=1,N)]
+ 
+     ! map(always, to) + map(tofrom): 'always' forces the updated host
+     ! values (i*2) onto the device despite the existing mapping.
+     !$omp target map(always, to: a) map(tofrom: a)
+       do i = 1, N
+         if (a(i) /= i*2) stop 1
+       end do
+       a = [(i*3, i=1,N)]
+     !$omp end target
+ 
+     do i = 1, N
+       if (a(i) /= i*2) stop 2
+     end do  
+ 
+     ! Reset host for the next test; device retains i*3.
+     a = [(i, i=1,N)]
+ 
+     ! map(tofrom) + map(always, from): 'always' forces new device values
+     ! back to host.
+     !$omp target map(tofrom: a) map(always, from: a)
+       do i = 1, N
+         if (a(i) /= i*3) stop 3
+         a(i) = i*4
+       end do
+     !$omp end target
+     do i = 1, N
+       if (a(i) /= i*4) stop 4
+     end do
+   !$omp end target data
+ 
+   ! Same tests via a subroutine to verify correct behaviour with
+   ! dummy arguments (passed by reference).
+   call test_dummy (a)
+ 
+ contains
+ 
+   subroutine test_dummy (a)
+     integer, intent(inout) :: a(:)
+     integer :: i
+ 
+     a = [(i, i=1,size(a))]
+     !$omp target data map(tofrom: a)
+       a = [(i*2, i=1,size(a))]
+ 
+       !$omp target map(always, to: a) map(tofrom: a)
+         do i = 1, size(a)
+           if (a(i) /= i*2) stop 5
+         end do
+         a = [(i*3, i=1,size(a))]
+       !$omp end target
+ 
+       do i = 1, size(a)
+         if (a(i) /= i*2) stop 6
+       end do
+ 
+       a = [(i, i=1,size(a))]
+ 
+       !$omp target map(tofrom: a) map(always, from: a)
+         do i = 1, size(a)
+           if (a(i) /= i*3) stop 7
+           a(i) = i*4
+         end do
+       !$omp end target
+       do i = 1, size(a)
+         if (a(i) /= i*4) stop 8
+       end do
+     !$omp end target data
+ 
+   end subroutine
+ 
+ end program
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-3.f90 gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-3.f90
*** gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-3.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-3.f90	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,18 ----
+ ! Test multiple map clauses for the same variable with the 'present'
+ ! modifier.
+ ! { dg-do run }
+ 
+ program main
+   implicit none
+   integer, parameter :: N = 100
+   integer :: a(N), i
+ 
+   a = [(i, i=1,N)]
+ 
+   ! { dg-output "libgomp: present clause: not present on the device \\(addr: 0x\[0-9a-f\]+, size: \[0-9\]+ \\(0x\[0-9a-f\]+\\), dev: \[0-9\]+\\\)" { target offload_device_nonshared_as } }
+   ! { dg-shouldfail "present error triggered" { offload_device_nonshared_as } }
+   !$omp target map(to: a) map(present, alloc: a) map(from: a)
+     a = a * 2
+   !$omp end target
+ 
+ end program
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-4.f90 gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-4.f90
*** gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-4.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-4.f90	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,87 ----
+ ! Test multiple map clauses for the same variable in target enter/exit
+ ! data constructs, including release and delete map-types.
+ ! { dg-do run }
+ 
+ program main
+   implicit none
+   integer, parameter :: N = 100
+   integer :: a(N), s, i
+ 
+   ! delete + release in exit data.
+   a = [(i, i=1,N)]
+   !$omp target enter data map(alloc: a) map(to: a)
+   s = 0
+   !$omp target map(alloc: a) map(tofrom: s)
+     do i = 1, N
+       s = s + a(i)
+     end do
+   !$omp end target
+   if (s /= N * (N + 1) / 2) stop 1
+   !$omp target exit data map(delete: a) map(release: a)
+ 
+   ! release + release: duplicate release decrements the reference count
+   ! once (deduplicated).  Two enter data calls set refcount to 2, so after
+   ! one deduplicated release refcount is 1 and the mapping remains.
+   a = [(i, i=1,N)]
+   !$omp target enter data map(to: a)   ! refcount = 1
+   !$omp target enter data map(to: a)   ! refcount = 2
+   !$omp target exit data map(release: a) map(release: a)   ! refcount = 1
+   s = 0
+   !$omp target map(alloc: a) map(tofrom: s)
+     do i = 1, N
+       s = s + a(i)
+     end do
+   !$omp end target
+   if (s /= N * (N + 1) / 2) stop 2
+   !$omp target exit data map(delete: a)   ! refcount = 0
+ 
+   ! delete + delete: duplicate delete removes the mapping unconditionally
+   ! once (deduplicated).
+   a = [(i, i=1,N)]
+   !$omp target enter data map(to: a)
+   !$omp target exit data map(delete: a) map(delete: a)
+ 
+   ! from + release: copy device values back to host and release the mapping.
+   a = [(i, i=1,N)]
+   !$omp target enter data map(to: a)   ! refcount = 1
+   !$omp target
+     a = a * 3
+   !$omp end target
+   !$omp target exit data map(release: a) map(from: a)   ! refcount = 0
+   if (any (a /= [(i*3, i=1,N)])) stop 3
+   if (any (a /= [(i*3, i=1,N)])) stop 4
+ 
+   ! Same tests via a subroutine to verify correct behaviour with
+   ! dummy arguments (passed by reference).
+   call test_dummy (a)
+ 
+ contains
+ 
+   subroutine test_dummy (a)
+     integer, intent(inout) :: a(:)
+     integer :: s, i
+ 
+     ! delete + release with dummy argument.
+     a = [(i, i=1,size(a))]
+     !$omp target enter data map(alloc: a) map(to: a)
+     s = 0
+     !$omp target map(alloc: a) map(tofrom: s)
+       do i = 1, size(a)
+         s = s + a(i)
+       end do
+     !$omp end target
+     if (s /= size(a) * (size(a) + 1) / 2) stop 5
+     !$omp target exit data map(delete: a) map(release: a)
+ 
+     ! from + release with dummy argument.
+     a = [(i, i=1,size(a))]
+     !$omp target enter data map(to: a)
+     !$omp target
+       a = a * 3
+     !$omp end target
+     !$omp target exit data map(release: a) map(from: a)
+     if (any (a /= [(i*3, i=1,size(a))])) stop 6
+ 
+   end subroutine
+ 
+ end program
diff -Nrcpad gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-5.f90 gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-5.f90
*** gcc-17-20260517/libgomp/testsuite/libgomp.fortran/target-map-multi-5.f90	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libgomp/testsuite/libgomp.fortran/target-map-multi-5.f90	Sun May 24 22:32:14 2026
***************
*** 0 ****
--- 1,142 ----
+ ! Test multiple map clauses for the same variable using Fortran array section
+ ! notation (subscript triplets): fixed-size, allocatable, and dummy arrays.
+ ! { dg-do run }
+ 
+ program main
+   implicit none
+   integer, parameter :: N = 100
+   integer :: a(N), s, i
+   integer, allocatable :: b(:)
+ 
+   ! --- Fixed-size array ---
+ 
+   ! map(to) + map(alloc) + map(from) on the same section.
+   a = [(i, i=1,N)]
+   !$omp target map(to: a(1:N)) map(alloc: a(1:N)) map(from: a(1:N))
+     a = a * 4
+   !$omp end target
+   if (any (a /= [(i*4, i=1,N)])) stop 1
+ 
+   ! map(to) + map(tofrom) on the same section.
+   a = [(i, i=1,N)]
+   !$omp target map(to: a(1:N)) map(tofrom: a(1:N))
+     a = a * 5
+   !$omp end target
+   if (any (a /= [(i*5, i=1,N)])) stop 2
+ 
+   ! map(alloc) + map(to): device gets host values via 'to'.
+   a = [(i, i=1,N)]
+   s = 0
+   !$omp target map(alloc: a(1:N)) map(to: a(1:N)) map(tofrom: s)
+     do i = 1, N
+       s = s + a(i)
+     end do
+   !$omp end target
+   if (s /= N*(N+1)/2) stop 3
+ 
+   ! map(alloc) + map(from): device values come back via 'from'.
+   !$omp target map(alloc: a(1:N)) map(from: a(1:N))
+     do i = 1, N
+       a(i) = i * 7
+     end do
+   !$omp end target
+   if (any (a /= [(i*7, i=1,N)])) stop 4
+ 
+   ! map(alloc) + map(tofrom) + map(alloc): full bidirectional.
+   a = [(i, i=1,N)]
+   !$omp target map(alloc: a(1:N)) map(tofrom: a(1:N)) map(alloc: a(1:N))
+     a = a * 8
+   !$omp end target
+   if (any (a /= [(i*8, i=1,N)])) stop 5
+ 
+   ! --- Allocatable array ---
+ 
+   allocate (b(N))
+ 
+   ! map(to) + map(alloc) + map(from) on the same section.
+   b = [(i, i=1,N)]
+   !$omp target map(to: b(1:N)) map(alloc: b(1:N)) map(from: b(1:N))
+     b = b * 4
+   !$omp end target
+   if (any (b /= [(i*4, i=1,N)])) stop 6
+ 
+   ! map(to) + map(tofrom) on the same section.
+   b = [(i, i=1,N)]
+   !$omp target map(to: b(1:N)) map(tofrom: b(1:N))
+     b = b * 5
+   !$omp end target
+   if (any (b /= [(i*5, i=1,N)])) stop 7
+ 
+   ! map(alloc) + map(to): device gets host values via 'to'.
+   b = [(i, i=1,N)]
+   s = 0
+   !$omp target map(alloc: b(1:N)) map(to: b(1:N)) map(tofrom: s)
+     do i = 1, N
+       s = s + b(i)
+     end do
+   !$omp end target
+   if (s /= N*(N+1)/2) stop 8
+ 
+   ! map(alloc) + map(from): device values come back via 'from'.
+   !$omp target map(alloc: b(1:N)) map(from: b(1:N))
+     do i = 1, N
+       b(i) = i * 7
+     end do
+   !$omp end target
+   if (any (b /= [(i*7, i=1,N)])) stop 9
+ 
+   ! map(alloc) + map(tofrom) + map(alloc): full bidirectional.
+   b = [(i, i=1,N)]
+   !$omp target map(alloc: b(1:N)) map(tofrom: b(1:N)) map(alloc: b(1:N))
+     b = b * 8
+   !$omp end target
+   if (any (b /= [(i*8, i=1,N)])) stop 10
+ 
+   deallocate (b)
+ 
+   ! Same tests via a subroutine to verify correct behaviour with
+   ! dummy arguments (passed by reference / array descriptor).
+   call test_dummy (a)
+ 
+ contains
+ 
+   subroutine test_dummy (a)
+     integer, intent(inout) :: a(:)
+     integer :: i, s, n
+ 
+     n = size(a)
+ 
+     ! map(to) + map(alloc) + map(from) on the same section.
+     a = [(i, i=1,n)]
+     !$omp target map(to: a(1:n)) map(alloc: a(1:n)) map(from: a(1:n))
+       a = a * 4
+     !$omp end target
+     if (any (a /= [(i*4, i=1,n)])) stop 11
+ 
+     ! map(to) + map(tofrom) on the same section.
+     a = [(i, i=1,n)]
+     !$omp target map(to: a(1:n)) map(tofrom: a(1:n))
+       a = a * 5
+     !$omp end target
+     if (any (a /= [(i*5, i=1,n)])) stop 12
+ 
+     ! map(alloc) + map(to): device gets host values via 'to'.
+     a = [(i, i=1,n)]
+     s = 0
+     !$omp target map(alloc: a(1:n)) map(to: a(1:n)) map(tofrom: s)
+       do i = 1, n
+         s = s + a(i)
+       end do
+     !$omp end target
+     if (s /= n*(n+1)/2) stop 13
+ 
+     ! map(alloc) + map(tofrom) + map(alloc): full bidirectional.
+     a = [(i, i=1,n)]
+     !$omp target map(alloc: a(1:n)) map(tofrom: a(1:n)) map(alloc: a(1:n))
+       a = a * 8
+     !$omp end target
+     if (any (a /= [(i*8, i=1,n)])) stop 14
+ 
+   end subroutine
+ 
+ end program
diff -Nrcpad gcc-17-20260517/libstdc++-v3/ChangeLog gcc-17-20260524/libstdc++-v3/ChangeLog
*** gcc-17-20260517/libstdc++-v3/ChangeLog	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/ChangeLog	Sun May 24 22:32:15 2026
***************
*** 1,3 ****
--- 1,230 ----
+ 2026-05-22  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc:
+ 	Ensure there is no unused capacity before inserting new element.
+ 	* testsuite/23_containers/vector/modifiers/insert/self_insert.cc:
+ 	Likewise.
+ 
+ 2026-05-21  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/29_atomics/headers/atomic/types_std_c++0x.cc: Check
+ 	for C++20 std::memory_order enum. Use feature test macro for
+ 	char8_t.
+ 	* testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc:
+ 	Add check for atomic_char8_t.
+ 	* testsuite/29_atomics/headers/atomic/types_std_c++20.cc:
+ 	Removed.
+ 	* testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc:
+ 	Removed.
+ 	* testsuite/29_atomics/headers/atomic/types_std_c++2a.cc:
+ 	Removed.
+ 
+ 2026-05-21  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	* testsuite/23_containers/flat_map/1.cc (test_constexpr):
+ 	If std::string isn't constexpr don't run test10.
+ 
+ 2026-05-21  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* doc/xml/manual/evolution.xml: Document deprecations.
+ 	* doc/html/manual/api.html: Regenerate.
+ 	* include/bits/max_size_type.h (numeric_limits::has_denorm):
+ 	Mark as deprecated.
+ 	(numeric_limits::has_denorm_loss): Likewise.
+ 	* include/std/limits (float_denorm_style): Mark as deprecated.
+ 	(numeric_limits::has_denorm, numeric_limits::has_denorm_loss):
+ 	Mark as deprecated.
+ 	* testsuite/18_support/numeric_limits/char16_32_t.cc: Add
+ 	dg-warning for expected deprecation warnings.
+ 	* testsuite/18_support/numeric_limits/char8_t.cc: Likewise.
+ 	* testsuite/18_support/numeric_limits/denorm_min.cc: Likewise.
+ 	* testsuite/18_support/numeric_limits/dr559.cc: Likewise.
+ 	* testsuite/18_support/numeric_limits/requirements/constexpr_data.cc:
+ 	Likewise.
+ 	* testsuite/18_support/numeric_limits/specialization_default_values.cc:
+ 	Likewise.
+ 	* testsuite/std/ranges/iota/max_size_type.cc: Likewise.
+ 
+ 2026-05-21  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* doc/xml/manual/evolution.xml: Document constructor changes.
+ 	* doc/html/*: Regenerate.
+ 	* include/std/future (uses_allocator): Remove specializations
+ 	for std::promise and std::packaged_task.
+ 	(promise(allocator_arg_t, const Alloc&, promise&&)): Remove
+ 	constructor proposed for LWG 2095 but not in P3503R3.
+ 	(packaged_task(allocator_arg_t, const Alloc&)): Likewise.
+ 	(packaged_task(allocator_arg_t, const Alloc&, packaged_task&&)):
+ 	Likewise.
+ 	(packaged_task(allocator_arg_t, const Alloc&, F&&)): Restore
+ 	constructor for C++20 and later.
+ 	* testsuite/30_threads/packaged_task/uses_allocator.cc: Adjust
+ 	expected result for static_assert.
+ 	* testsuite/30_threads/promise/uses_allocator.cc: Likewise.
+ 
+ 2026-05-21  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* include/std/inplace_vector (inplace_vector::assign_range)
+ 	(inplace_vector::append_range): Cast ranges::distance(__rg)
+ 	to size_t.
+ 	* testsuite/23_containers/inplace_vector/cons/from_range.cc: New
+ 	test for ranges with integer-class size_type.
+ 	* testsuite/23_containers/inplace_vector/modifiers/assign.cc:
+ 	Likewise.
+ 	* testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc:
+ 	Likewise.
+ 
+ 2026-05-20  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/c++20/Makefile.am [USE_STATIC_TZDATA]: Remove targets for
+ 	tzdata.zi.h, tzdb.lo and tzdb.o.
+ 	* src/c++20/Makefile.in: Regenerate.
+ 	* src/c++20/tzdb.cc (tzdata_chars): Use #embed.
+ 	(tzdata_stream::ispanbuf): Remove adjustment for extra newline
+ 	inserted by the Makefile recipe for tzdata.zi.h.
+ 
+ 2026-05-20  Nathan Myers  <ncm@cantrip.org>
+ 
+ 	* config/abi/pre/gnu.ver: Remove recent symbol swept up in
+ 	GLIBCXX_3.4.21.
+ 	* include/bits/basic_string.tcc (reserve): Guard __limit decl
+ 	under #if __cpp_exceptions to quiet warning.
+ 
+ 2026-05-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/c++20/tzdata.zi: Import new file from 2026b release.
+ 
+ 2026-05-19  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/125374
+ 	* include/std/flat_map (_Flat_map_impl::_M_try_emplace): Forward
+ 	instead of unconditionally moving __k when inserting it.
+ 	* testsuite/23_containers/flat_map/1.cc (test10): New test.
+ 
+ 2026-05-19  Nathan Myers  <ncm@cantrip.org>
+ 
+ 	PR libstdc++/118030
+ 	* config/abi/pre/gnu.ver: Expose string::_S_allocate_at_least,
+ 	_M_create_plus symbols.
+ 	* include/bits/alloc_traits.h:
+ 	(allocate_at_least): Delegate in allocator_traits<allocator<_Tp>>
+ 	specialization to allocator<_Tp>::allocate_at_least, unconditionally;
+ 	annotate [[__gnu__::always_inline__]].
+ 	(allocate_at_least): Declare "= delete;" in allocator<void>.
+ 	* include/bits/allocator.h (allocate_at_least): Delegate to base
+ 	allocate_at_least where defined, calling with explicit base-class
+ 	qualification, picking up __new_allocator member.
+ 	* include/bits/basic_string.h:
+ 	(_Alloc_result): Define new type.
+ 	(_S_allocate_at_least): Define, using it.
+ 	(_S_allocate): Minimize for legacy ABI use only.
+ 	(_M_create_plus): Declare.
+ 	(_M_create_and_place): Define, abstracting common operations.
+ 	(assign): Use _S_allocate_at_least.
+ 	* include/bits/basic_string.tcc:
+ 	(_M_create_plus): Define.
+ 	(_M_replace, reserve): Use _S_allocate_at_least.
+ 	(_M_construct, others (3x)): Use _M_create_and_place.
+ 	(_M_construct, input iterators): Use _M_create_plus.
+ 	(_M_create, _M_assign, reserve, _M_mutate): Same.
+ 	* include/bits/memory_resource.h (allocate_at_least): Define,
+ 	document.
+ 	* include/bits/new_allocator.h (allocate_at_least): Define.
+ 	(_S_check_allocation_limit) Define.
+ 	(allocate): Use _S_check_allocation_limit.
+ 	(_S_max_size): Change from _M_max_size.
+ 	(deallocate): Refine "if constexpr" logic.
+ 	* include/bits/stl_vector.h:
+ 	(_S_max_size): Move to _Vector_base.
+ 	(_Alloc_result): Define type.
+ 	(_M_allocate_at_least): Define, using allocate_at_least where supported.
+ 	(_M_allocate): Delegate to _M_allocate_at_least.
+ 	(max_size, _S_check_init_len): Use _S_max_size as moved.
+ 	(_M_create_storage, append_range, _M_allocate_and_copy,
+ 	_M_replace_storage): Define, abstracting common operations.
+ 	(_M_replace_with): Define, likewise.
+ 	(_M_range_initialize_n): Use _M_allocate_at_least.
+ 	(_M_check_len): Improve logic.
+ 	* include/bits/vector.tcc:
+ 	(reserve, _M_fill_append, _M_range_insert): Use _M_allocate_at_least
+ 	and _M_replace_storage.
+ 	(operator=, _M_assign_aux): Use _M_replace_with.
+ 	(_M_realloc_insert, _M_realloc_append, _M_default_append, insert_range):
+ 	Use _M_allocate_at_least.
+ 	(_M_fill_insert): Use _M_replace_storage, normalize whitespace.
+ 	* testsuite/util/testsuite_allocator.h:
+ 	(allocate_at_least (3x)): Define.
+ 	(allocate): Use allocate_at_least.
+ 	* testsuite/20_util/allocator/allocate_at_least.cc: Add tests.
+ 	* testsuite/21_strings/basic_string/capacity/char/18654.cc:
+ 	Loosen capacity check.
+ 	* testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc:
+ 	Same.
+ 	* testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc: Same.
+ 	* testsuite/21_strings/basic_string/capacity/wchar_t/2.cc: Same.
+ 	* testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc:
+ 	Same.
+ 	* testsuite/23_containers/vector/capacity/shrink_to_fit.cc: Same.
+ 	* testsuite/23_containers/vector/capacity/shrink_to_fit2.cc: Same
+ 	* testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc:
+ 	Adapt to looser reserve behavior.
+ 
+ 2026-05-19  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/125369
+ 	* include/bits/chrono_io.h (__detail::_Parser::operator()):
+ 	Check for errors when parsing digits for a %z format.
+ 	* testsuite/std/time/parse/125369.cc: New test.
+ 
+ 2026-05-18  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/23_containers/bitset/lwg4294.cc: Move to...
+ 	* testsuite/20_util/bitset/cons/lwg4294.cc: ...here.
+ 
+ 2026-05-18  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc:
+ 	Reduce iterations for debug mode.
+ 
+ 2026-05-18  Avi Kivity  <avi@scylladb.com>
+ 
+ 	PR libstdc++/121789
+ 	* include/bits/stl_uninitialized.h (uninitialized_copy):
+ 	Unwrap move iterators
+ 	* testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc:
+ 	New test.
+ 	* testsuite/util/testsuite_greedy_ops.h (greedy_ops): Comment
+ 	out operator-(T, T).
+ 
+ 2026-05-18  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* include/std/valarray [__cplusplus >= 201103L]: Include
+ 	<bits/ranges_access.h>.
+ 	* testsuite/26_numerics/valarray/range_access2.cc: Remove
+ 	<iterator> include, and add test for std::size.
+ 
+ 2026-05-18  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* include/std/mdspan (layout_left_padded::is_exhaustive)
+ 	(layout_righ_padded::is_exhaustive): Mark as const.
+ 	* testsuite/23_containers/mdspan/layouts/mapping.cc: Test noexcept and
+ 	const-invocability for is_exhaustive, is_strided, and is_unique.
+ 	* testsuite/23_containers/mdspan/layouts/padded.cc: Test is_exhaustive on
+ 	const mapping..
+ 	* testsuite/23_containers/mdspan/layouts/stride.cc: Likewise.
+ 	* testsuite/23_containers/mdspan/mdspan.cc: Checks const-invocability
+ 	for is_exhaustive, is_strided, is_unique.
+ 
+ 2026-05-18  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/124852
+ 	* src/c++20/tzdb.cc (on_month_day::on_day_t, on_month_day::on_day):
+ 	Remove.
+ 	(operator>>(istream&, on_month_day::day_t&)): Inlined into...
+ 	(operator>>(istream&, on_month_day)): Inlined on_month_day::on_day.
+ 	Avoid modifying on.month if MONTH is not present. Report failure
+ 	on failure to parse day for LessEq / GreaterEq.
+ 
  2026-05-16  Dragon Archer  <dragon-archer@outlook.com>
  
  	PR libstdc++/125228
diff -Nrcpad gcc-17-20260517/libstdc++-v3/config/abi/pre/gnu.ver gcc-17-20260524/libstdc++-v3/config/abi/pre/gnu.ver
*** gcc-17-20260517/libstdc++-v3/config/abi/pre/gnu.ver	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/config/abi/pre/gnu.ver	Sun May 24 22:32:15 2026
*************** GLIBCXX_3.4.21 {
*** 1775,1781 ****
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE12_M_constructI[NP]*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE13*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE14_M_replace_aux*;
!     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE1[68-9]*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE2at*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE3end*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE4back*;
--- 1775,1781 ----
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE12_M_constructI[NP]*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE13*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE14_M_replace_aux*;
!     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE1[68]*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE2at*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE3end*;
      _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE4back*;
*************** GLIBCXX_3.4.36 {
*** 2628,2633 ****
--- 2628,2637 ----
  
      _ZNSt6chrono8__detail25__recent_leap_second_infoERNS_16leap_second_infoEj;
  
+     # basic_string::allocate_at_least
+     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE*_S_allocate_*;
+     _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE*_M_create_*;
+ 
  } GLIBCXX_3.4.35;
  
  # Symbols in the support library (libsupc++) have their own tag.
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/html/index.html gcc-17-20260524/libstdc++-v3/doc/html/index.html
*** gcc-17-20260517/libstdc++-v3/doc/html/index.html	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/html/index.html	Sun May 24 22:32:15 2026
***************
*** 142,148 ****
      Existing tests
  </a></span></dt><dt><span class="section"><a href="manual/test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="manual/abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="manual/abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="manual/abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_16"><code class="constant">16</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="manual/backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="manual/backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.support_cxx98">
--- 142,148 ----
      Existing tests
  </a></span></dt><dt><span class="section"><a href="manual/test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="manual/abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="manual/abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="manual/abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="manual/abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="manual/abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="manual/api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_16"><code class="constant">16</code></a></span></dt><dt><span class="section"><a href="manual/api.html#api.rel_17"><code class="constant">17</code></a></span></dt></dl></dd><dt><span class="section"><a href="manual/backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="manual/backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="manual/backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="manual/backwards.html#backwards.third.support_cxx98">
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/html/manual/api.html gcc-17-20260524/libstdc++-v3/doc/html/manual/api.html
*** gcc-17-20260517/libstdc++-v3/doc/html/manual/api.html	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/html/manual/api.html	Sun May 24 22:32:15 2026
*************** Deprecated the non-standard overload of
*** 515,518 ****
--- 515,527 ----
  </p><p>
  Made <code class="code">std::is_integral_v&lt;__int128&gt;</code> true for strict
  <code class="code">-std</code> dialects.
+ </p></div><div class="section"><div class="titlepage"><div><div><h3 class="title"><a id="api.rel_17"></a><code class="constant">17</code></h3></div></div></div><p>
+ Removed allocator-extended constructors and support for uses-allocator
+ construction from <code class="classname">std::promise</code> and
+ <code class="classname">std::packaged_task</code>.
+ </p><p>
+ <code class="code">std::numeric_limits::has_denorm</code>,
+ <code class="code">std::numeric_limits::has_denorm_loss</code>,
+ and <code class="code">enum std::float_denorm_style</code> and its enumerators
+ were deprecated for C++23.
  </p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="abi.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="appendix_porting.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="backwards.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">ABI Policy and Guidelines </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Backwards Compatibility</td></tr></table></div></body></html>
\ No newline at end of file
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/html/manual/appendix.html gcc-17-20260524/libstdc++-v3/doc/html/manual/appendix.html
*** gcc-17-20260517/libstdc++-v3/doc/html/manual/appendix.html	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/html/manual/appendix.html	Sun May 24 22:32:15 2026
***************
*** 16,22 ****
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
--- 16,22 ----
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_17"><code class="constant">17</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/html/manual/appendix_porting.html gcc-17-20260524/libstdc++-v3/doc/html/manual/appendix_porting.html
*** gcc-17-20260517/libstdc++-v3/doc/html/manual/appendix_porting.html	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/html/manual/appendix_porting.html	Sun May 24 22:32:15 2026
***************
*** 14,20 ****
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
--- 14,20 ----
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_17"><code class="constant">17</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/html/manual/index.html gcc-17-20260524/libstdc++-v3/doc/html/manual/index.html
*** gcc-17-20260517/libstdc++-v3/doc/html/manual/index.html	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/html/manual/index.html	Sun May 24 22:32:15 2026
***************
*** 123,129 ****
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
--- 123,129 ----
      Existing tests
  </a></span></dt><dt><span class="section"><a href="test.html#test.exception.safety.containers">
  C++11 Requirements Test Sequence Descriptions
! </a></span></dt></dl></dd></dl></dd></dl></dd><dt><span class="section"><a href="abi.html">ABI Policy and Guidelines</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.cxx_interface">The C++ Interface</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning">Versioning</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.versioning.goals">Goals</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.history">History</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.prereq">Prerequisites</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.config">Configuring</a></span></dt><dt><span class="section"><a href="abi.html#abi.versioning.active">Checking Active</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.changes_allowed">Allowed Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.changes_no">Prohibited Changes</a></span></dt><dt><span class="section"><a href="abi.html#abi.impl">Implementation</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing">Testing</a></span></dt><dd><dl><dt><span class="section"><a href="abi.html#abi.testing.single">Single ABI Testing</a></span></dt><dt><span class="section"><a href="abi.html#abi.testing.multi">Multiple ABI Testing</a></span></dt></dl></dd><dt><span class="section"><a href="abi.html#abi.issues">Outstanding Issues</a></span></dt></dl></dd><dt><span class="section"><a href="api.html">API Evolution and Deprecation History</a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_300"><code class="constant">3.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_310"><code class="constant">3.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_320"><code class="constant">3.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_330"><code class="constant">3.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_340"><code class="constant">3.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_400"><code class="constant">4.0</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_410"><code class="constant">4.1</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_420"><code class="constant">4.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_430"><code class="constant">4.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_440"><code class="constant">4.4</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_450"><code class="constant">4.5</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_460"><code class="constant">4.6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_470"><code class="constant">4.7</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_480"><code class="constant">4.8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_490"><code class="constant">4.9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_51"><code class="constant">5</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_53"><code class="constant">5.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_61"><code class="constant">6</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_71"><code class="constant">7</code></a></span></dt><dd><dl><dt><span class="section"><a href="api.html#api.rel_72"><code class="constant">7.2</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_73"><code class="constant">7.3</code></a></span></dt></dl></dd><dt><span class="section"><a href="api.html#api.rel_81"><code class="constant">8</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_91"><code class="constant">9</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_101"><code class="constant">10</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_111"><code class="constant">11</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_121"><code class="constant">12</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_123"><code class="constant">12.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_131"><code class="constant">13</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_133"><code class="constant">13.3</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_141"><code class="constant">14</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_151"><code class="constant">15</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_16"><code class="constant">16</code></a></span></dt><dt><span class="section"><a href="api.html#api.rel_17"><code class="constant">17</code></a></span></dt></dl></dd><dt><span class="section"><a href="backwards.html">Backwards Compatibility</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.first">First</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.second">Second</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third">Third</a></span></dt><dd><dl><dt><span class="section"><a href="backwards.html#backwards.third.headers">Pre-ISO headers removed</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.hash">Extension headers hash_map, hash_set moved to ext or backwards</a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.nocreate_noreplace">No <code class="code">ios::nocreate/ios::noreplace</code>.
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.streamattach">
  No <code class="code">stream::attach(int fd)</code>
  </a></span></dt><dt><span class="section"><a href="backwards.html#backwards.third.support_cxx98">
diff -Nrcpad gcc-17-20260517/libstdc++-v3/doc/xml/manual/evolution.xml gcc-17-20260524/libstdc++-v3/doc/xml/manual/evolution.xml
*** gcc-17-20260517/libstdc++-v3/doc/xml/manual/evolution.xml	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/doc/xml/manual/evolution.xml	Sun May 24 22:32:15 2026
*************** Made <code>std::is_integral_v&lt;__int12
*** 1164,1167 ****
--- 1164,1183 ----
  </para>
  </section>
  
+ <section xml:id="api.rel_17"><info><title><constant>17</constant></title></info>
+ <para>
+ Removed allocator-extended constructors and support for uses-allocator
+ construction from <classname>std::promise</classname> and
+ <classname>std::packaged_task</classname>.
+ </para>
+ 
+ <para>
+ <code>std::numeric_limits::has_denorm</code>,
+ <code>std::numeric_limits::has_denorm_loss</code>,
+ and <code>enum std::float_denorm_style</code> and its enumerators
+ were deprecated for C++23.
+ </para>
+ 
+ </section>
+ 
  </section>
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/alloc_traits.h gcc-17-20260524/libstdc++-v3/include/bits/alloc_traits.h
*** gcc-17-20260517/libstdc++-v3/include/bits/alloc_traits.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/alloc_traits.h	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 417,425 ****
         *  is obliged to reserve more space than required for the cited
         *  `n` objects, it may deliver the extra space to the caller.
        */
!       [[nodiscard]] static constexpr auto
        allocate_at_least(_Alloc& __a, size_type __n)
- 	-> allocation_result<pointer, size_type>
        {
  	if constexpr (requires { __a.allocate_at_least(__n); })
  	  return __a.allocate_at_least(__n);
--- 417,424 ----
         *  is obliged to reserve more space than required for the cited
         *  `n` objects, it may deliver the extra space to the caller.
        */
!       [[nodiscard]] static constexpr allocation_result<pointer, size_type>
        allocate_at_least(_Alloc& __a, size_type __n)
        {
  	if constexpr (requires { __a.allocate_at_least(__n); })
  	  return __a.allocate_at_least(__n);
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 664,677 ****
         *  @brief  Allocate memory, generously.
         *  @param  __a  An allocator.
         *  @param  __n  The minimum number of objects to allocate space for.
!        *  @return Memory of suitable size and alignment for `n` or more
!        *  contiguous objects of type `value_type`.
         *
         *  Returns `a.allocate_at_least(n)`.
        */
!       [[nodiscard]] static constexpr auto
        allocate_at_least(allocator_type& __a, size_type __n)
- 	-> allocation_result<pointer, size_type>
        { return __a.allocate_at_least(__n); }
  #endif
  
--- 663,676 ----
         *  @brief  Allocate memory, generously.
         *  @param  __a  An allocator.
         *  @param  __n  The minimum number of objects to allocate space for.
!        *  @return Memory of suitable size and alignment for `m >= n`
!        *  contiguous objects of type `value_type`, and `m`.
         *
         *  Returns `a.allocate_at_least(n)`.
        */
!       [[nodiscard,__gnu__::__always_inline__]]
!       static constexpr allocation_result<pointer, size_type>
        allocate_at_least(allocator_type& __a, size_type __n)
        { return __a.allocate_at_least(__n); }
  #endif
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 822,827 ****
--- 821,831 ----
        static void*
        allocate(allocator_type&, size_type, const void* = nullptr) = delete;
  
+ #ifdef __glibcxx_allocate_at_least
+       static allocation_result<void*, size_type>
+       allocate_at_least(allocator_type&, size_type) = delete;
+ #endif
+ 
        /// deallocate is ill-formed for allocator<void>
        static void
        deallocate(allocator_type&, void*, size_type) = delete;
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 872,878 ****
        select_on_container_copy_construction(const allocator_type& __rhs)
        { return __rhs; }
      };
! #endif
  
    /// @cond undocumented
  #pragma GCC diagnostic push
--- 876,882 ----
        select_on_container_copy_construction(const allocator_type& __rhs)
        { return __rhs; }
      };
! #endif // _GLIBCXX_HOSTED
  
    /// @cond undocumented
  #pragma GCC diagnostic push
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/allocator.h gcc-17-20260524/libstdc++-v3/include/bits/allocator.h
*** gcc-17-20260517/libstdc++-v3/include/bits/allocator.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/allocator.h	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 193,201 ****
        constexpr _Tp*
        allocate(size_t __n)
        {
! #if __cpp_concepts
  	if constexpr (requires { sizeof(_Tp); })
! #endif
  	if (std::__is_constant_evaluated())
  	  {
  	    if (__builtin_mul_overflow(__n, sizeof(_Tp), &__n))
--- 193,201 ----
        constexpr _Tp*
        allocate(size_t __n)
        {
! # if __cpp_concepts
  	if constexpr (requires { sizeof(_Tp); })
! # endif
  	if (std::__is_constant_evaluated())
  	  {
  	    if (__builtin_mul_overflow(__n, sizeof(_Tp), &__n))
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 205,211 ****
--- 205,231 ----
  
  	return __allocator_base<_Tp>::allocate(__n, 0);
        }
+ #endif
+ 
+ #ifdef __glibcxx_allocate_at_least  // C++23
+       [[nodiscard,__gnu__::__always_inline__]]
+       constexpr allocation_result<_Tp*, size_t>
+       allocate_at_least(size_t __n)
+       {
+ 	if consteval
+ 	  { return { allocate(__n), __n }; }
+ 	else
+ 	  {
+ 	    if constexpr (requires
+ 		   { __allocator_base<_Tp>::allocate_at_least(__n); })
+ 	      return __allocator_base<_Tp>::allocate_at_least(__n);
+ 	    else
+ 	      return { __allocator_base<_Tp>::allocate(__n), __n };
+ 	  }
+       }
+ #endif
  
+ #if __cpp_constexpr_dynamic_alloc // >= C++20
        [[__gnu__::__always_inline__]]
        constexpr void
        deallocate(_Tp* __p, size_t __n)
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 219,230 ****
        }
  #endif // C++20
  
- #ifdef __glibcxx_allocate_at_least  // C++23
-       [[nodiscard]] constexpr allocation_result<_Tp*, size_t>
-       allocate_at_least(size_t __n)
-       { return { this->allocate(__n), __n }; }
- #endif
- 
        friend __attribute__((__always_inline__)) _GLIBCXX20_CONSTEXPR
        bool
        operator==(const allocator&, const allocator&) _GLIBCXX_NOTHROW
--- 239,244 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/basic_string.h gcc-17-20260524/libstdc++-v3/include/bits/basic_string.h
*** gcc-17-20260517/libstdc++-v3/include/bits/basic_string.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/basic_string.h	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_CXX11
*** 135,154 ****
  #endif
  
      private:
        static _GLIBCXX20_CONSTEXPR pointer
        _S_allocate(_Char_alloc_type& __a, size_type __n)
        {
! 	pointer __p = _Alloc_traits::allocate(__a, __n);
  #if __glibcxx_constexpr_string >= 201907L
  	// std::char_traits begins the lifetime of characters,
  	// but custom traits might not, so do it here.
  	if constexpr (!is_same_v<_Traits, char_traits<_CharT>>)
  	  if (std::__is_constant_evaluated())
  	    // Begin the lifetime of characters in allocated storage.
! 	    for (size_type __i = 0; __i < __n; ++__i)
! 	      std::construct_at(__builtin_addressof(__p[__i]));
  #endif
! 	return __p;
        }
  
  #ifdef __glibcxx_string_view // >= C++17
--- 135,169 ----
  #endif
  
      private:
+       // For ABI reasons this must remain, though unused.
        static _GLIBCXX20_CONSTEXPR pointer
        _S_allocate(_Char_alloc_type& __a, size_type __n)
+       { return _Alloc_traits::allocate(__a, __n); }
+ 
+       struct _Alloc_result { pointer __ptr; size_type __count; };
+ 
+       static _GLIBCXX20_CONSTEXPR _Alloc_result
+       _S_allocate_at_least(_Char_alloc_type& __a, size_type __n)
        {
! 	_Alloc_result __r;
! #ifdef __glibcxx_allocate_at_least  // C++23
! 	auto [__ptr, __count] = _Alloc_traits::allocate_at_least(__a, __n);
! 	__r.__ptr = __ptr;
! 	__r.__count = __count;
! #else
! 	__r.__ptr = _Alloc_traits::allocate(__a, __n);
! 	__r.__count = __n;
! #endif
  #if __glibcxx_constexpr_string >= 201907L
  	// std::char_traits begins the lifetime of characters,
  	// but custom traits might not, so do it here.
  	if constexpr (!is_same_v<_Traits, char_traits<_CharT>>)
  	  if (std::__is_constant_evaluated())
  	    // Begin the lifetime of characters in allocated storage.
! 	    for (size_type __i = 0; __i < __r.__count; ++__i)
! 	      std::construct_at(__builtin_addressof(__r.__ptr[__i]));
  #endif
! 	return __r;
        }
  
  #ifdef __glibcxx_string_view // >= C++17
*************** _GLIBCXX_BEGIN_NAMESPACE_CXX11
*** 287,292 ****
--- 302,322 ----
  
        // Create & Destroy
        _GLIBCXX20_CONSTEXPR
+       _Alloc_result
+       _M_create_plus(size_type __new_capacity, size_type __old_capacity);
+ 
+       __attribute__((__always_inline__))
+       _GLIBCXX20_CONSTEXPR
+       void
+       _M_create_and_place(size_type __new_capacity, size_type __old_capacity)
+ 	{
+ 	  _Alloc_result __r = _M_create_plus(__new_capacity, __old_capacity);
+ 	  _M_data(__r.__ptr);
+ 	  _M_capacity(__r.__count - 1);  // Leave room for NUL.
+ 	}
+ 
+       // This must remain for ABI stability though unused.
+       _GLIBCXX20_CONSTEXPR
        pointer
        _M_create(size_type&, size_type);
  
*************** _GLIBCXX_BEGIN_NAMESPACE_CXX11
*** 1782,1791 ****
  		    const auto __len = __str.size();
  		    auto __alloc = __str._M_get_allocator();
  		    // If this allocation throws there are no effects:
! 		    auto __ptr = _S_allocate(__alloc, __len + 1);
  		    _M_destroy(_M_allocated_capacity);
! 		    _M_data(__ptr);
! 		    _M_capacity(__len);
  		    _M_set_length(__len);
  		  }
  	      }
--- 1812,1821 ----
  		    const auto __len = __str.size();
  		    auto __alloc = __str._M_get_allocator();
  		    // If this allocation throws there are no effects:
! 		    auto __r = _S_allocate_at_least(__alloc, __len + 1);
  		    _M_destroy(_M_allocated_capacity);
! 		    _M_data(__r.__ptr);
! 		    _M_capacity(__r.__count - 1);
  		    _M_set_length(__len);
  		  }
  	      }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/basic_string.tcc gcc-17-20260524/libstdc++-v3/include/bits/basic_string.tcc
*** gcc-17-20260517/libstdc++-v3/include/bits/basic_string.tcc	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/basic_string.tcc	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 139,152 ****
  
    template<typename _CharT, typename _Traits, typename _Alloc>
      _GLIBCXX20_CONSTEXPR
!     typename basic_string<_CharT, _Traits, _Alloc>::pointer
      basic_string<_CharT, _Traits, _Alloc>::
!     _M_create(size_type& __capacity, size_type __old_capacity)
      {
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 83.  String::npos vs. string::max_size()
        if (__capacity > max_size())
! 	std::__throw_length_error(__N("basic_string::_M_create"));
  
        // The below implements an exponential growth policy, necessary to
        // meet amortized linear time requirements of the library: see
--- 139,152 ----
  
    template<typename _CharT, typename _Traits, typename _Alloc>
      _GLIBCXX20_CONSTEXPR
!     typename basic_string<_CharT, _Traits, _Alloc>::_Alloc_result
      basic_string<_CharT, _Traits, _Alloc>::
!     _M_create_plus(size_type __capacity, size_type __old_capacity)
      {
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 83.  String::npos vs. string::max_size()
        if (__capacity > max_size())
! 	std::__throw_length_error(__N("basic_string::_M_create_plus"));
  
        // The below implements an exponential growth policy, necessary to
        // meet amortized linear time requirements of the library: see
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 161,167 ****
  
        // NB: Need an array of char_type[__capacity], plus a terminating
        // null char_type() element.
!       return _S_allocate(_M_get_allocator(), __capacity + 1);
      }
  
    // NB: This is the special case for Input Iterators, used in
--- 161,179 ----
  
        // NB: Need an array of char_type[__capacity], plus a terminating
        // null char_type() element.
!       return _S_allocate_at_least(_M_get_allocator(), __capacity + 1);
!     }
! 
!   // This must remain for ABI stability, though unused in current code.
!   template<typename _CharT, typename _Traits, typename _Alloc>
!     _GLIBCXX20_CONSTEXPR
!     typename basic_string<_CharT, _Traits, _Alloc>::pointer
!     basic_string<_CharT, _Traits, _Alloc>::
!     _M_create(size_type& __capacity, size_type __old_capacity)
!     {
!       _Alloc_result __r = _M_create_plus(__capacity, __old_capacity);
!       __capacity = __r.__count - 1;  // Leave room for NUL.
!       return __r.__ptr;
      }
  
    // NB: This is the special case for Input Iterators, used in
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 203,213 ****
  	    if (__len == __capacity)
  	      {
  		// Allocate more space.
! 		__capacity = __len + 1;
! 		pointer __another = _M_create(__capacity, __len);
! 		this->_S_copy(__another, _M_data(), __len);
  		_M_dispose();
! 		_M_data(__another);
  		_M_capacity(__capacity);
  	      }
  	    traits_type::assign(_M_data()[__len++],
--- 215,225 ----
  	    if (__len == __capacity)
  	      {
  		// Allocate more space.
! 		_Alloc_result __another = _M_create_plus(__len + 1, __len);
! 		__capacity = __another.__count - 1; // Leave room for NUL.
! 		this->_S_copy(__another.__ptr, _M_data(), __len);
  		_M_dispose();
! 		_M_data(__another.__ptr);
  		_M_capacity(__capacity);
  	      }
  	    traits_type::assign(_M_data()[__len++],
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 231,240 ****
  	size_type __dnew = static_cast<size_type>(std::distance(__beg, __end));
  
  	if (__dnew > size_type(_S_local_capacity))
! 	  {
! 	    _M_data(_M_create(__dnew, size_type(0)));
! 	    _M_capacity(__dnew);
! 	  }
  	else
  	  _M_init_local_buf();
  
--- 243,249 ----
  	size_type __dnew = static_cast<size_type>(std::distance(__beg, __end));
  
  	if (__dnew > size_type(_S_local_capacity))
! 	  _M_create_and_place(__dnew, size_type(0));
  	else
  	  _M_init_local_buf();
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 264,273 ****
      _M_construct(size_type __n, _CharT __c)
      {
        if (__n > size_type(_S_local_capacity))
! 	{
! 	  _M_data(_M_create(__n, size_type(0)));
! 	  _M_capacity(__n);
! 	}
        else
  	_M_init_local_buf();
  
--- 273,279 ----
      _M_construct(size_type __n, _CharT __c)
      {
        if (__n > size_type(_S_local_capacity))
! 	_M_create_and_place(__n, size_type(0));
        else
  	_M_init_local_buf();
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 281,296 ****
    // than difference between iterators.
    template<typename _CharT, typename _Traits, typename _Alloc>
      template<bool _Terminated>
!     _GLIBCXX20_CONSTEXPR 
      void
      basic_string<_CharT, _Traits, _Alloc>::
      _M_construct(const _CharT* __str, size_type __n)
      {
        if (__n > size_type(_S_local_capacity))
! 	{
! 	  _M_data(_M_create(__n, size_type(0)));
! 	  _M_capacity(__n);
! 	}
        else
  	_M_init_local_buf();
  
--- 287,299 ----
    // than difference between iterators.
    template<typename _CharT, typename _Traits, typename _Alloc>
      template<bool _Terminated>
!     _GLIBCXX20_CONSTEXPR
      void
      basic_string<_CharT, _Traits, _Alloc>::
      _M_construct(const _CharT* __str, size_type __n)
      {
        if (__n > size_type(_S_local_capacity))
! 	_M_create_and_place(__n, size_type(0));
        else
  	_M_init_local_buf();
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 347,357 ****
  
  	  if (__rsize > __capacity)
  	    {
! 	      size_type __new_capacity = __rsize;
! 	      pointer __tmp = _M_create(__new_capacity, __capacity);
  	      _M_dispose();
! 	      _M_data(__tmp);
! 	      _M_capacity(__new_capacity);
  	    }
  
  	  if (__rsize)
--- 350,360 ----
  
  	  if (__rsize > __capacity)
  	    {
! 	      // if _M_create_plus throws, there is no effect.
! 	      _Alloc_result __tmp = _M_create_plus(__rsize, __capacity);
  	      _M_dispose();
! 	      _M_data(__tmp.__ptr);
! 	      _M_capacity(__tmp.__count - 1);
  	    }
  
  	  if (__rsize)
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 375,385 ****
        if (__res <= __capacity)
  	return;
  
!       pointer __tmp = _M_create(__res, __capacity);
!       this->_S_copy(__tmp, _M_data(), length() + 1);
        _M_dispose();
!       _M_data(__tmp);
!       _M_capacity(__res);
      }
  
    template<typename _CharT, typename _Traits, typename _Alloc>
--- 378,388 ----
        if (__res <= __capacity)
  	return;
  
!       _Alloc_result __r = _M_create_plus(__res, __capacity);
!       this->_S_copy(__r.__ptr, _M_data(), length() + 1);
        _M_dispose();
!       _M_data(__r.__ptr);
!       _M_capacity(__r.__count - 1);  // Leave room for NUL.
      }
  
    template<typename _CharT, typename _Traits, typename _Alloc>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 392,410 ****
        const size_type __how_much = length() - __pos - __len1;
  
        size_type __new_capacity = length() + __len2 - __len1;
!       pointer __r = _M_create(__new_capacity, capacity());
  
        if (__pos)
! 	this->_S_copy(__r, _M_data(), __pos);
        if (__s && __len2)
! 	this->_S_copy(__r + __pos, __s, __len2);
        if (__how_much)
! 	this->_S_copy(__r + __pos + __len2,
  		      _M_data() + __pos + __len1, __how_much);
  
        _M_dispose();
!       _M_data(__r);
!       _M_capacity(__new_capacity);
      }
  
    template<typename _CharT, typename _Traits, typename _Alloc>
--- 395,413 ----
        const size_type __how_much = length() - __pos - __len1;
  
        size_type __new_capacity = length() + __len2 - __len1;
!       _Alloc_result __r = _M_create_plus(__new_capacity, capacity());
  
        if (__pos)
! 	this->_S_copy(__r.__ptr, _M_data(), __pos);
        if (__s && __len2)
! 	this->_S_copy(__r.__ptr + __pos, __s, __len2);
        if (__how_much)
! 	this->_S_copy(__r.__ptr + __pos + __len2,
  		      _M_data() + __pos + __len1, __how_much);
  
        _M_dispose();
!       _M_data(__r.__ptr);
!       _M_capacity(__r.__count - 1);  // Leave room for NUL.
      }
  
    template<typename _CharT, typename _Traits, typename _Alloc>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 439,454 ****
  	  this->_S_copy(_M_local_buf, _M_data(), __length + 1);
  	  _M_destroy(__capacity);
  	  _M_data(_M_local_data());
  	}
  #if __cpp_exceptions
!       else if (__length < __capacity)
  	try
  	  {
! 	    pointer __tmp = _S_allocate(_M_get_allocator(), __length + 1);
! 	    this->_S_copy(__tmp, _M_data(), __length + 1);
  	    _M_dispose();
! 	    _M_data(__tmp);
! 	    _M_capacity(__length);
  	  }
  	catch (const __cxxabiv1::__forced_unwind&)
  	  { throw; }
--- 442,465 ----
  	  this->_S_copy(_M_local_buf, _M_data(), __length + 1);
  	  _M_destroy(__capacity);
  	  _M_data(_M_local_data());
+ 	  return;
  	}
  #if __cpp_exceptions
! #ifdef __glibcxx_allocate_at_least  // C++23
!       const size_type __limit =
! 	(__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(_CharT);
! #else
!       const size_type __limit = 0;
! #endif
!       if (__capacity - __length > __limit )
  	try
  	  {
! 	    _Alloc_result __r = _S_allocate_at_least(
! 	      _M_get_allocator(), __length + 1);
! 	    this->_S_copy(__r.__ptr, _M_data(), __length + 1);
  	    _M_dispose();
! 	    _M_data(__r.__ptr);
! 	    _M_capacity(__r.__count - 1);  // reserve room for NUL.
  	  }
  	catch (const __cxxabiv1::__forced_unwind&)
  	  { throw; }
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 588,594 ****
  #if __cpp_lib_is_constant_evaluated
  	  if (std::is_constant_evaluated())
  	    {
! 	      auto __newp = _S_allocate(_M_get_allocator(), __new_size);
  	      _S_copy(__newp, this->_M_data(), __pos);
  	      _S_copy(__newp + __pos, __s, __len2);
  	      _S_copy(__newp + __pos + __len2, __p + __len1, __how_much);
--- 599,606 ----
  #if __cpp_lib_is_constant_evaluated
  	  if (std::is_constant_evaluated())
  	    {
! 	      auto __newp =
! 		_S_allocate_at_least(_M_get_allocator(), __new_size).__ptr;
  	      _S_copy(__newp, this->_M_data(), __pos);
  	      _S_copy(__newp + __pos, __s, __len2);
  	      _S_copy(__newp + __pos + __len2, __p + __len1, __how_much);
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 677,683 ****
  #endif // C++11
  
  #endif  // _GLIBCXX_USE_CXX11_ABI
!    
  #if __glibcxx_constexpr_string >= 201907L
  # define _GLIBCXX_STRING_CONSTEXPR constexpr
  #else
--- 689,695 ----
  #endif // C++11
  
  #endif  // _GLIBCXX_USE_CXX11_ABI
! 
  #if __glibcxx_constexpr_string >= 201907L
  # define _GLIBCXX_STRING_CONSTEXPR constexpr
  #else
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 916,922 ****
  	      // Avoid reallocation for common case.
  	      __str.erase();
  	      _CharT __buf[128];
! 	      __size_type __len = 0;	      
  	      const streamsize __w = __in.width();
  	      const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
  		                              : __str.max_size();
--- 928,934 ----
  	      // Avoid reallocation for common case.
  	      __str.erase();
  	      _CharT __buf[128];
! 	      __size_type __len = 0;
  	      const streamsize __w = __in.width();
  	      const __size_type __n = __w > 0 ? static_cast<__size_type>(__w)
  		                              : __str.max_size();
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/chrono_io.h gcc-17-20260524/libstdc++-v3/include/bits/chrono_io.h
*** gcc-17-20260517/libstdc++-v3/include/bits/chrono_io.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/chrono_io.h	Sun May 24 22:32:15 2026
*************** namespace __detail
*** 5234,5241 ****
  		      else
  			{
  			  // Read hh
! 			  __hh = 10 * _S_try_read_digit(__is, __err);
! 			  __hh += _S_try_read_digit(__is, __err);
  			}
  
  		      if (__is_failed(__err))
--- 5234,5245 ----
  		      else
  			{
  			  // Read hh
! 			  auto __d1 = _S_try_read_digit(__is, __err);
! 			  auto __d2 = _S_try_read_digit(__is, __err);
! 			  if (__d1 >= 0 && __d2 >= 0) [[likely]]
! 			    __hh = 10 * __d1 + __d2;
! 			  else
! 			    __err |= ios_base::failbit;
  			}
  
  		      if (__is_failed(__err))
*************** namespace __detail
*** 5269,5276 ****
  		      int_least32_t __mm = 0;
  		      if (__read_mm)
  			{
! 			  __mm = 10 * _S_try_read_digit(__is, __err);
! 			  __mm += _S_try_read_digit(__is, __err);
  			}
  
  		      if (!__is_failed(__err))
--- 5273,5284 ----
  		      int_least32_t __mm = 0;
  		      if (__read_mm)
  			{
! 			  auto __d1 = _S_try_read_digit(__is, __err);
! 			  auto __d2 = _S_try_read_digit(__is, __err);
! 			  if (__d1 >= 0 && __d2 >= 0) [[likely]]
! 			    __mm = 10 * __d1 + __d2;
! 			  else
! 			    __err |= ios_base::failbit;
  			}
  
  		      if (!__is_failed(__err))
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/max_size_type.h gcc-17-20260524/libstdc++-v3/include/bits/max_size_type.h
*** gcc-17-20260517/libstdc++-v3/include/bits/max_size_type.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/max_size_type.h	Sun May 24 22:32:15 2026
*************** namespace ranges
*** 791,799 ****
--- 791,804 ----
        static constexpr bool has_infinity = false;
        static constexpr bool has_quiet_NaN = false;
        static constexpr bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static constexpr bool has_denorm_loss = false;
        static constexpr bool tinyness_before = false;
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" // denorm_absent
+       _GLIBCXX23_DEPRECATED
        static constexpr float_denorm_style has_denorm = denorm_absent;
+ #pragma GCC diagnostic pop
        static constexpr float_round_style round_style = round_toward_zero;
  
        static constexpr _Sp
*************** namespace ranges
*** 858,866 ****
--- 863,876 ----
        static constexpr bool has_infinity = false;
        static constexpr bool has_quiet_NaN = false;
        static constexpr bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static constexpr bool has_denorm_loss = false;
        static constexpr bool tinyness_before = false;
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+       _GLIBCXX23_DEPRECATED
        static constexpr float_denorm_style has_denorm = denorm_absent;
+ #pragma GCC diagnostic pop
        static constexpr float_round_style round_style = round_toward_zero;
  
        static constexpr _Dp
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/memory_resource.h gcc-17-20260524/libstdc++-v3/include/bits/memory_resource.h
*** gcc-17-20260517/libstdc++-v3/include/bits/memory_resource.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/memory_resource.h	Sun May 24 22:32:15 2026
***************
*** 48,53 ****
--- 48,54 ----
  # include <bits/utility.h>		// index_sequence
  # include <tuple>			// tuple, forward_as_tuple
  #endif
+ #include <bits/memoryfwd.h>
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
*************** namespace pmr
*** 468,473 ****
--- 469,490 ----
        allocate(allocator_type& __a, size_type __n, const_void_pointer)
        { return __a.allocate(__n); }
  
+ #ifdef __glibcxx_allocate_at_least
+       /**
+        *  @brief  Allocate memory.
+        *  @param  __a  An allocator.
+        *  @param  __n  The number of objects to allocate space for.
+        *  @return Memory of suitable size and alignment for `n` objects
+        *          of type `value_type`.
+        *
+        *  Just returns `{ a.allocate(n), n }`: `polymorphic_allocator`
+        *  cannot be extended without breaking ABI.
+       */
+       [[nodiscard]] static std::allocation_result<pointer, size_type>
+       allocate_at_least(allocator_type& __a, size_type __n)
+       { return { __a.allocate(__n), __n }; }
+ #endif
+ 
        /**
         *  @brief  Deallocate memory.
         *  @param  __a  An allocator.
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/new_allocator.h gcc-17-20260524/libstdc++-v3/include/bits/new_allocator.h
*** gcc-17-20260517/libstdc++-v3/include/bits/new_allocator.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/new_allocator.h	Sun May 24 22:32:15 2026
***************
*** 37,42 ****
--- 37,43 ----
  #if __cplusplus >= 201103L
  #include <type_traits>
  #endif
+ #include <bits/memoryfwd.h>
  
  namespace std _GLIBCXX_VISIBILITY(default)
  {
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 123,128 ****
--- 124,143 ----
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
  
+       __attribute__((__always_inline__))
+       _GLIBCXX20_CONSTEXPR static void
+       _S_check_allocation_limit(size_t __n)
+       {
+ 	if (__builtin_expect(__n > _S_max_size(), false))
+ 	  {
+ 	    // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ 	    // 3190. allocator::allocate sometimes returns too little storage
+ 	    if (__n > (std::size_t(-1) / sizeof(_Tp)))
+ 	      std::__throw_bad_array_new_length();
+ 	    std::__throw_bad_alloc();
+ 	  }
+       }
+ 
        // NB: __n is permitted to be 0.  The C++ standard says nothing
        // about what the return value is when __n == 0.
        _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR _Tp*
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 142,166 ****
  	else
  #endif
  #endif
- 	if (__builtin_expect(__n > this->_M_max_size(), false))
  	  {
! 	    // _GLIBCXX_RESOLVE_LIB_DEFECTS
! 	    // 3190. allocator::allocate sometimes returns too little storage
! 	    if (__n > (std::size_t(-1) / sizeof(_Tp)))
! 	      std::__throw_bad_array_new_length();
! 	    std::__throw_bad_alloc();
! 	  }
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	else if constexpr (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
  	  {
! 	    std::align_val_t __al = std::align_val_t(alignof(_Tp));
! 	    return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp),
! 							   __al));
  	  }
! #endif
! 	else
! 	  return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp)));
        }
  
        // __p is not permitted to be a null pointer.
        _GLIBCXX20_CONSTEXPR void
--- 157,205 ----
  	else
  #endif
  #endif
  	  {
! 	    _S_check_allocation_limit(__n);
  #if __cpp_aligned_new && __cplusplus >= 201103L
! 	    if constexpr (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
! 	      {
! 		std::align_val_t __al = std::align_val_t(alignof(_Tp));
! 		return static_cast<_Tp*>(
! 		  _GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp), __al));
! 	      }
! 	    else
! #endif
! 	      return static_cast<_Tp*>(
! 		_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp)));
! 	  }
!       }
! 
! #ifdef __glibcxx_allocate_at_least  // C++23
!       [[nodiscard]] constexpr std::allocation_result<_Tp*, size_t>
!       allocate_at_least(size_t __n)
!       {
! 	if ! consteval
  	  {
! 	    if constexpr (requires { sizeof(_Tp); })
! 	    if constexpr (alignof(_Tp) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__)
! 	    if constexpr ( sizeof(_Tp) <  __STDCPP_DEFAULT_NEW_ALIGNMENT__)
! 	      {
! 		_S_check_allocation_limit(__n);
! 		const size_t __need = __n * sizeof(_Tp);
! 		const size_t __mask = __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1;
! 		size_t __ask = (__need + __mask) & ~__mask;
! 		// Avoid rounding up to and asking for 2^63 bytes (PR108377):
! 		__ask -= __ask >> (__SIZE_WIDTH__ - 1);
! 		auto* __p = static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__ask));
! 		using _U8 = const unsigned char;
! 		static_assert(sizeof(_Tp) <= ~_U8());
! 		// Use 8-bit division for minimal latency:
! 		_U8 __spare = __ask - __need, __size = sizeof(_Tp);
! 		return { __p , __n + __spare / __size };
! 	      }
  	  }
! 	return { allocate(__n), __n };
        }
+ #endif
  
        // __p is not permitted to be a null pointer.
        _GLIBCXX20_CONSTEXPR void
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 177,186 ****
  	  {
  	    _GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n),
  				     std::align_val_t(alignof(_Tp)));
- 	    return;
  	  }
  #endif
! 	_GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n));
        }
  
  #pragma GCC diagnostic pop
--- 216,225 ----
  	  {
  	    _GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n),
  				     std::align_val_t(alignof(_Tp)));
  	  }
+ 	else
  #endif
! 	  _GLIBCXX_OPERATOR_DELETE(_GLIBCXX_SIZED_DEALLOC(__p, __n));
        }
  
  #pragma GCC diagnostic pop
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 192,198 ****
        __attribute__((__always_inline__))
        size_type
        max_size() const _GLIBCXX_USE_NOEXCEPT
!       { return _M_max_size(); }
  
  #if __cplusplus >= 201103L
        template<typename _Up, typename... _Args>
--- 231,237 ----
        __attribute__((__always_inline__))
        size_type
        max_size() const _GLIBCXX_USE_NOEXCEPT
!       { return _S_max_size(); }
  
  #if __cplusplus >= 201103L
        template<typename _Up, typename... _Args>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 238,245 ****
  
      private:
        __attribute__((__always_inline__))
!       _GLIBCXX_CONSTEXPR size_type
!       _M_max_size() const _GLIBCXX_USE_NOEXCEPT
        {
  #if __PTRDIFF_MAX__ < __SIZE_MAX__
  	return std::size_t(__PTRDIFF_MAX__) / sizeof(_Tp);
--- 277,284 ----
  
      private:
        __attribute__((__always_inline__))
!       _GLIBCXX_CONSTEXPR static size_type
!       _S_max_size() _GLIBCXX_USE_NOEXCEPT
        {
  #if __PTRDIFF_MAX__ < __SIZE_MAX__
  	return std::size_t(__PTRDIFF_MAX__) / sizeof(_Tp);
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/stl_uninitialized.h gcc-17-20260524/libstdc++-v3/include/bits/stl_uninitialized.h
*** gcc-17-20260517/libstdc++-v3/include/bits/stl_uninitialized.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/stl_uninitialized.h	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 275,281 ****
  
  #if __cplusplus >= 201103L
        using _Dest = decltype(std::__niter_base(__result));
!       using _Src = decltype(std::__niter_base(__first));
        using _ValT = typename iterator_traits<_ForwardIterator>::value_type;
  
  #if __glibcxx_raw_memory_algorithms >= 202411L // >= C++26
--- 275,281 ----
  
  #if __cplusplus >= 201103L
        using _Dest = decltype(std::__niter_base(__result));
!       using _Src = decltype(std::__miter_base(std::__niter_base(__first)));
        using _ValT = typename iterator_traits<_ForwardIterator>::value_type;
  
  #if __glibcxx_raw_memory_algorithms >= 202411L // >= C++26
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 292,298 ****
  	    {
  	      using _ValT = typename remove_pointer<_Src>::type;
  	      __builtin_memcpy(std::__niter_base(__result),
! 			       std::__niter_base(__first),
  			       __n * sizeof(_ValT));
  	      __result += __n;
  	    }
--- 292,298 ----
  	    {
  	      using _ValT = typename remove_pointer<_Src>::type;
  	      __builtin_memcpy(std::__niter_base(__result),
! 			       std::__miter_base(std::__niter_base(__first)),
  			       __n * sizeof(_ValT));
  	      __result += __n;
  	    }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/stl_vector.h gcc-17-20260524/libstdc++-v3/include/bits/stl_vector.h
*** gcc-17-20260517/libstdc++-v3/include/bits/stl_vector.h	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/stl_vector.h	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 317,322 ****
--- 317,335 ----
        get_allocator() const _GLIBCXX_NOEXCEPT
        { return allocator_type(_M_get_Tp_allocator()); }
  
+       static _GLIBCXX20_CONSTEXPR size_t
+       _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
+       {
+ 	// std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
+ 	// and realistically we can't store more than PTRDIFF_MAX/sizeof(T)
+ 	// (even if std::allocator_traits::max_size says we can).
+ 	const size_t __diffmax =
+ 	  __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
+ 	const size_t __allocmax =
+ 	  __gnu_cxx::__alloc_traits<_Alloc>::max_size(__a);
+ 	return (std::min)(__diffmax, __allocmax);
+       }
+ 
  #if __cplusplus >= 201103L
        _Vector_base() = default;
  #else
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 389,394 ****
--- 402,444 ----
  	return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
        }
  
+       struct _Alloc_result { pointer __ptr; size_t __count; };
+ 
+       _GLIBCXX20_CONSTEXPR
+       _Alloc_result
+       _M_allocate_at_least(size_t __n)
+       {
+ 	typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
+ 	_Alloc_result __r;
+ 	if (__builtin_expect(__n != 0, true))
+ 	  {
+ #ifdef __glibcxx_allocate_at_least  // C++23
+ 	    if constexpr (requires    { _Tr::allocate_at_least(_M_impl, __n); })
+ 	      {
+ 		auto [__ptr, __count] = _Tr::allocate_at_least(_M_impl, __n);
+ 		if (__count > __n)
+ 		  {
+ 		    size_t __max = _S_max_size(_M_get_Tp_allocator());
+ 		    if (__builtin_expect(__count > __max, false))
+ 		      __count = __max;
+ 		  }
+ 		__r = { __ptr, __count };
+ 	      }
+ 	    else
+ #endif
+ 	      {
+ 		__r.__ptr = _Tr::allocate(_M_impl, __n);
+ 		__r.__count = __n;
+ 	      }
+ 	  }
+ 	else
+ 	  {
+ 	    __r.__ptr = pointer();
+ 	    __r.__count = 0;
+ 	  }
+ 	return __r;
+       }
+ 
        _GLIBCXX20_CONSTEXPR
        void
        _M_deallocate(pointer __p, size_t __n)
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 404,412 ****
        void
        _M_create_storage(size_t __n)
        {
! 	this->_M_impl._M_start = this->_M_allocate(__n);
! 	this->_M_impl._M_finish = this->_M_impl._M_start;
! 	this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
        }
  
  #if __glibcxx_containers_ranges // C++ >= 23
--- 454,462 ----
        void
        _M_create_storage(size_t __n)
        {
! 	_Alloc_result __r = this->_M_allocate_at_least(__n);
! 	this->_M_impl._M_finish = this->_M_impl._M_start = __r.__ptr;
! 	this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __r.__count;
        }
  
  #if __glibcxx_containers_ranges // C++ >= 23
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 480,485 ****
--- 530,536 ----
        typedef _Vector_base<_Tp, _Alloc>			_Base;
        typedef typename _Base::_Tp_alloc_type		_Tp_alloc_type;
        typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>	_Alloc_traits;
+       typedef typename _Base::_Alloc_result             _Alloc_result;
  
      public:
        typedef _Tp					value_type;
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 536,541 ****
--- 587,593 ----
  
      protected:
        using _Base::_M_allocate;
+       using _Base::_M_allocate_at_least;
        using _Base::_M_deallocate;
        using _Base::_M_impl;
        using _Base::_M_get_Tp_allocator;
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1116,1122 ****
        _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
        size_type
        max_size() const _GLIBCXX_NOEXCEPT
!       { return _S_max_size(_M_get_Tp_allocator()); }
  
  #if __cplusplus >= 201103L
        /**
--- 1168,1174 ----
        _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
        size_type
        max_size() const _GLIBCXX_NOEXCEPT
!       { return _Base::_S_max_size(_M_get_Tp_allocator()); }
  
  #if __cplusplus >= 201103L
        /**
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1682,1697 ****
  		  return;
  		}
  
! 	      const size_type __len = _M_check_len(__n, "vector::append_range");
  
  	      pointer __old_start = this->_M_impl._M_start;
  	      pointer __old_finish = this->_M_impl._M_finish;
  
! 	      allocator_type& __a = _M_get_Tp_allocator();
! 	      const pointer __start = this->_M_allocate(__len);
  	      const pointer __mid = __start + __sz;
  	      const pointer __back = __mid + __n;
! 	      _Guard_alloc __guard(__start, __len, *this);
  	      std::__uninitialized_copy_a(ranges::begin(__rg),
  					  ranges::end(__rg),
  					  __mid, __a);
--- 1734,1750 ----
  		  return;
  		}
  
! 	      const size_type __ask = _M_check_len(__n, "vector::append_range");
  
  	      pointer __old_start = this->_M_impl._M_start;
  	      pointer __old_finish = this->_M_impl._M_finish;
  
! 	      auto [__ptr, __got] = this->_M_allocate_at_least(__ask);
! 	      const pointer __start = __ptr;
  	      const pointer __mid = __start + __sz;
  	      const pointer __back = __mid + __n;
! 	      _Guard_alloc __guard(__start, __got, *this);
! 	      allocator_type& __a = _M_get_Tp_allocator();
  	      std::__uninitialized_copy_a(ranges::begin(__rg),
  					  ranges::end(__rg),
  					  __mid, __a);
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1733,1739 ****
  	      // Finally, take ownership of new storage:
  	      this->_M_impl._M_start = __start;
  	      this->_M_impl._M_finish = __back;
! 	      this->_M_impl._M_end_of_storage = __start + __len;
  	    }
  	  else
  	    {
--- 1786,1792 ----
  	      // Finally, take ownership of new storage:
  	      this->_M_impl._M_start = __start;
  	      this->_M_impl._M_finish = __back;
! 	      this->_M_impl._M_end_of_storage = __start + __got;
  	    }
  	  else
  	    {
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1889,1908 ****
      protected:
        /**
         *  Memory expansion handler.  Uses the member allocation function to
!        *  obtain @a n bytes of memory, and then copies [first,last) into it.
         */
        template<typename _ForwardIterator>
  	_GLIBCXX20_CONSTEXPR
! 	pointer
  	_M_allocate_and_copy(size_type __n,
  			     _ForwardIterator __first, _ForwardIterator __last)
  	{
! 	  _Guard_alloc __guard(this->_M_allocate(__n), __n, *this);
  	  std::__uninitialized_copy_a
  	    (__first, __last, __guard._M_storage, _M_get_Tp_allocator());
! 	  return __guard._M_release();
  	}
  
  
        // Internal constructor functions follow.
  
--- 1942,1986 ----
      protected:
        /**
         *  Memory expansion handler.  Uses the member allocation function to
!        *  obtain at least `n` objects worth of memory, copies `[first,last)`
!        *  into it, reports what was actually allocated.
         */
        template<typename _ForwardIterator>
  	_GLIBCXX20_CONSTEXPR
! 	_Alloc_result
  	_M_allocate_and_copy(size_type __n,
  			     _ForwardIterator __first, _ForwardIterator __last)
  	{
! 	  _Alloc_result __r = this->_M_allocate_at_least(__n);
! 	  _Guard_alloc __guard(__r.__ptr, __r.__count, *this);
  	  std::__uninitialized_copy_a
  	    (__first, __last, __guard._M_storage, _M_get_Tp_allocator());
! 	  (void) __guard._M_release();
! 	  return __r;
  	}
  
+       _GLIBCXX20_CONSTEXPR void
+       _M_replace_storage(pointer __start, pointer __end, size_type __cap)
+       {
+ 	  _GLIBCXX_ASAN_ANNOTATE_REINIT;
+ 	  _M_deallocate(this->_M_impl._M_start,
+ 	    this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
+ 	  this->_M_impl._M_start = __start;
+ 	  this->_M_impl._M_finish = __end;
+ 	  this->_M_impl._M_end_of_storage = __start + __cap;
+       }
+ 
+       template<typename _ForwardIterator>
+ 	_GLIBCXX20_CONSTEXPR
+ 	void
+ 	_M_replace_with(size_type __n,
+ 		_ForwardIterator __first, _ForwardIterator __last)
+ 	{
+ 	  _Alloc_result __r = _M_allocate_and_copy(__n, __first, __last);
+ 	  std::_Destroy(this->_M_impl._M_start,
+ 	    this->_M_impl._M_finish, _M_get_Tp_allocator());
+ 	  _M_replace_storage(__r.__ptr, __r.__ptr + __n, __r.__count);
+ 	}
  
        // Internal constructor functions follow.
  
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1916,1921 ****
--- 1994,2000 ----
  	_M_initialize_dispatch(_Integer __int_n, _Integer __value, __true_type)
  	{
  	  const size_type __n = static_cast<size_type>(__int_n);
+ 	  // NB this is c++98 code, so has no allocate_at_least.
  	  pointer __start =
  	    _M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
  	  this->_M_impl._M_start = __start;
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1971,1980 ****
  	_M_range_initialize_n(_Iterator __first, _Sentinel __last,
  			      size_type __n)
  	{
! 	  pointer __start =
! 	    this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
  	  this->_M_impl._M_start = this->_M_impl._M_finish = __start;
! 	  this->_M_impl._M_end_of_storage = __start + __n;
  	  this->_M_impl._M_finish
  	      = std::__uninitialized_copy_a(_GLIBCXX_MOVE(__first), __last,
  					    __start, _M_get_Tp_allocator());
--- 2050,2060 ----
  	_M_range_initialize_n(_Iterator __first, _Sentinel __last,
  			      size_type __n)
  	{
! 	  _Alloc_result __r = this->_M_allocate_at_least(
! 	    _S_check_init_len(__n, _M_get_Tp_allocator()));
! 	  pointer __start = __r.__ptr;
  	  this->_M_impl._M_start = this->_M_impl._M_finish = __start;
! 	  this->_M_impl._M_end_of_storage = __start + __r.__count;
  	  this->_M_impl._M_finish
  	      = std::__uninitialized_copy_a(_GLIBCXX_MOVE(__first), __last,
  					    __start, _M_get_Tp_allocator());
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 2191,2225 ****
        size_type
        _M_check_len(size_type __n, const char* __s) const
        {
! 	if (max_size() - size() < __n)
  	  __throw_length_error(__N(__s));
  
! 	const size_type __len = size() + (std::max)(size(), __n);
! 	return (__len < size() || __len > max_size()) ? max_size() : __len;
        }
  
        // Called by constructors to check initial size.
        static _GLIBCXX20_CONSTEXPR size_type
        _S_check_init_len(size_type __n, const allocator_type& __a)
        {
! 	if (__n > _S_max_size(_Tp_alloc_type(__a)))
  	  __throw_length_error(
  	      __N("cannot create std::vector larger than max_size()"));
  	return __n;
        }
  
-       static _GLIBCXX20_CONSTEXPR size_type
-       _S_max_size(const _Tp_alloc_type& __a) _GLIBCXX_NOEXCEPT
-       {
- 	// std::distance(begin(), end()) cannot be greater than PTRDIFF_MAX,
- 	// and realistically we can't store more than PTRDIFF_MAX/sizeof(T)
- 	// (even if std::allocator_traits::max_size says we can).
- 	const size_t __diffmax
- 	  = __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
- 	const size_t __allocmax = _Alloc_traits::max_size(__a);
- 	return (std::min)(__diffmax, __allocmax);
-       }
- 
        // Internal erase functions follow.
  
        // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
--- 2271,2297 ----
        size_type
        _M_check_len(size_type __n, const char* __s) const
        {
! 	const size_type __room = max_size() - size();
! 	if (__room < __n)
  	  __throw_length_error(__N(__s));
  
! 	if (__n < size())
! 	  __n = size();  // Grow by (at least) doubling ...
! 	if (__n > __room)
! 	  __n = __room;  //  ... but only as much as will fit.
! 	return size() + __n;
        }
  
        // Called by constructors to check initial size.
        static _GLIBCXX20_CONSTEXPR size_type
        _S_check_init_len(size_type __n, const allocator_type& __a)
        {
! 	if (__n > _Base::_S_max_size(_Tp_alloc_type(__a)))
  	  __throw_length_error(
  	      __N("cannot create std::vector larger than max_size()"));
  	return __n;
        }
  
        // Internal erase functions follow.
  
        // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/bits/vector.tcc gcc-17-20260524/libstdc++-v3/include/bits/vector.tcc
*** gcc-17-20260517/libstdc++-v3/include/bits/vector.tcc	Sun May 17 22:32:15 2026
--- gcc-17-20260524/libstdc++-v3/include/bits/vector.tcc	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 75,87 ****
        if (this->capacity() < __n)
  	{
  	  const size_type __old_size = size();
! 	  pointer __tmp;
  #if __cplusplus >= 201103L
  	  if constexpr (_S_use_relocate())
  	    {
! 	      __tmp = this->_M_allocate(__n);
  	      std::__relocate_a(this->_M_impl._M_start, this->_M_impl._M_finish,
! 				__tmp, _M_get_Tp_allocator());
  	    }
  	  else
  #endif
--- 75,87 ----
        if (this->capacity() < __n)
  	{
  	  const size_type __old_size = size();
! 	  _Alloc_result __tmp;
  #if __cplusplus >= 201103L
  	  if constexpr (_S_use_relocate())
  	    {
! 	      __tmp = this->_M_allocate_at_least(__n);
  	      std::__relocate_a(this->_M_impl._M_start, this->_M_impl._M_finish,
! 				__tmp.__ptr, _M_get_Tp_allocator());
  	    }
  	  else
  #endif
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 92,104 ****
  	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
  			    _M_get_Tp_allocator());
  	    }
! 	  _GLIBCXX_ASAN_ANNOTATE_REINIT;
! 	  _M_deallocate(this->_M_impl._M_start,
! 			this->_M_impl._M_end_of_storage
! 			- this->_M_impl._M_start);
! 	  this->_M_impl._M_start = __tmp;
! 	  this->_M_impl._M_finish = __tmp + __old_size;
! 	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
  	}
      }
  #pragma GCC diagnostic pop
--- 92,99 ----
  	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
  			    _M_get_Tp_allocator());
  	    }
! 	  _M_replace_storage(
! 	    __tmp.__ptr, __tmp.__ptr + __old_size, __tmp.__count);
  	}
      }
  #pragma GCC diagnostic pop
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 106,117 ****
  #if __cplusplus >= 201103L
    template<typename _Tp, typename _Alloc>
      template<typename... _Args>
! #if __cplusplus > 201402L
        _GLIBCXX20_CONSTEXPR
        typename vector<_Tp, _Alloc>::reference
! #else
        void
! #endif
        vector<_Tp, _Alloc>::
        emplace_back(_Args&&... __args)
        {
--- 101,112 ----
  #if __cplusplus >= 201103L
    template<typename _Tp, typename _Alloc>
      template<typename... _Args>
! # if __cplusplus > 201402L
        _GLIBCXX20_CONSTEXPR
        typename vector<_Tp, _Alloc>::reference
! # else
        void
! # endif
        vector<_Tp, _Alloc>::
        emplace_back(_Args&&... __args)
        {
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 125,135 ****
  	  }
  	else
  	  _M_realloc_append(std::forward<_Args>(__args)...);
! #if __cplusplus > 201402L
  	return back();
! #endif
        }
! #endif
  
    template<typename _Tp, typename _Alloc>
      _GLIBCXX20_CONSTEXPR
--- 120,130 ----
  	  }
  	else
  	  _M_realloc_append(std::forward<_Args>(__args)...);
! # if __cplusplus > 201402L
  	return back();
! # endif
        }
! #endif  // __cplusplus >= 201103L
  
    template<typename _Tp, typename _Alloc>
      _GLIBCXX20_CONSTEXPR
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 238,259 ****
  #endif
  	  const size_type __xlen = __x.size();
  	  if (__xlen > capacity())
! 	    {
! 	      pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),
! 						   __x.end());
! 	      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
! 			    _M_get_Tp_allocator());
! 	      _M_deallocate(this->_M_impl._M_start,
! 			    this->_M_impl._M_end_of_storage
! 			    - this->_M_impl._M_start);
! 	      this->_M_impl._M_start = __tmp;
! 	      this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __xlen;
! 	    }
  	  else if (size() >= __xlen)
! 	    {
! 	      std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),
! 			    end(), _M_get_Tp_allocator());
! 	    }
  	  else
  	    {
  	      std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),
--- 233,242 ----
  #endif
  	  const size_type __xlen = __x.size();
  	  if (__xlen > capacity())
! 	    _M_replace_with(__xlen, __x.begin(), __x.end());
  	  else if (size() >= __xlen)
! 	    std::_Destroy(std::copy(__x.begin(), __x.end(), begin()),
! 	      end(), _M_get_Tp_allocator());
  	  else
  	    {
  	      std::copy(__x._M_impl._M_start, __x._M_impl._M_start + size(),
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 332,347 ****
  	      __builtin_unreachable();
  
  	    _S_check_init_len(__len, _M_get_Tp_allocator());
! 	    pointer __tmp(_M_allocate_and_copy(__len, __first, __last));
! 	    std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
! 			  _M_get_Tp_allocator());
! 	    _GLIBCXX_ASAN_ANNOTATE_REINIT;
! 	    _M_deallocate(this->_M_impl._M_start,
! 			  this->_M_impl._M_end_of_storage
! 			  - this->_M_impl._M_start);
! 	    this->_M_impl._M_start = __tmp;
! 	    this->_M_impl._M_finish = this->_M_impl._M_start + __len;
! 	    this->_M_impl._M_end_of_storage = this->_M_impl._M_finish;
  	  }
  	else if (__sz >= __len)
  	  _M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start));
--- 315,321 ----
  	      __builtin_unreachable();
  
  	    _S_check_init_len(__len, _M_get_Tp_allocator());
! 	    _M_replace_with(__len, __first, __last);
  	  }
  	else if (__sz >= __len)
  	  _M_erase_at_end(std::copy(__first, __last, this->_M_impl._M_start));
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 464,476 ****
      _M_realloc_insert(iterator __position, const _Tp& __x)
  #endif
      {
!       const size_type __len = _M_check_len(1u, "vector::_M_realloc_insert");
!       if (__len <= 0)
  	__builtin_unreachable();
        pointer __old_start = this->_M_impl._M_start;
        pointer __old_finish = this->_M_impl._M_finish;
        const size_type __elems_before = __position - begin();
!       pointer __new_start(this->_M_allocate(__len));
        pointer __new_finish(__new_start);
  
        {
--- 438,452 ----
      _M_realloc_insert(iterator __position, const _Tp& __x)
  #endif
      {
!       const size_type __len1 = _M_check_len(1u, "vector::_M_realloc_insert");
!       if (__len1 <= 0)
  	__builtin_unreachable();
        pointer __old_start = this->_M_impl._M_start;
        pointer __old_finish = this->_M_impl._M_finish;
        const size_type __elems_before = __position - begin();
!       _Alloc_result __r = this->_M_allocate_at_least(__len1);
!       const size_type __len = __r.__count;
!       pointer __new_start(__r.__ptr);
        pointer __new_finish(__new_start);
  
        {
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 574,587 ****
        const size_type __len = _M_check_len(1u, "vector::_M_realloc_append");
        if (__len <= 0)
  	__builtin_unreachable();
!       pointer __old_start = this->_M_impl._M_start;
!       pointer __old_finish = this->_M_impl._M_finish;
        const size_type __elems = size();
!       pointer __new_start(this->_M_allocate(__len));
        pointer __new_finish(__new_start);
  
        {
! 	_Guard_alloc __guard(__new_start, __len, *this);
  
  	// The order of the three operations is dictated by the C++11
  	// case, where the moves could alter a new element belonging
--- 550,565 ----
        const size_type __len = _M_check_len(1u, "vector::_M_realloc_append");
        if (__len <= 0)
  	__builtin_unreachable();
!       const pointer __old_start = this->_M_impl._M_start;
!       const pointer __old_finish = this->_M_impl._M_finish;
        const size_type __elems = size();
!       const _Alloc_result __r = this->_M_allocate_at_least(__len);
!       const size_type __rlen = __r.__count;
!       const pointer __new_start(__r.__ptr);
        pointer __new_finish(__new_start);
  
        {
! 	_Guard_alloc __guard(__new_start, __rlen, *this);
  
  	// The order of the three operations is dictated by the C++11
  	// case, where the moves could alter a new element belonging
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 652,658 ****
  
        this->_M_impl._M_start = __new_start;
        this->_M_impl._M_finish = __new_finish;
!       this->_M_impl._M_end_of_storage = __new_start + __len;
      }
  #pragma GCC diagnostic pop
  
--- 630,636 ----
  
        this->_M_impl._M_start = __new_start;
        this->_M_impl._M_finish = __new_finish;
!       this->_M_impl._M_end_of_storage = __new_start + __rlen;
      }
  #pragma GCC diagnostic pop
  
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 716,725 ****
  	      pointer __old_finish = this->_M_impl._M_finish;
  	      const pointer __pos = __position.base();
  
! 	      const size_type __len =
  		_M_check_len(__n, "vector::_M_fill_insert");
  	      const size_type __elems_before = __pos - __old_start;
! 	      pointer __new_start(this->_M_allocate(__len));
  	      pointer __new_finish(__new_start);
  	      __try
  		{
--- 694,705 ----
  	      pointer __old_finish = this->_M_impl._M_finish;
  	      const pointer __pos = __position.base();
  
! 	      const size_type __len1 =
  		_M_check_len(__n, "vector::_M_fill_insert");
  	      const size_type __elems_before = __pos - __old_start;
! 	      _Alloc_result __r = this->_M_allocate_at_least(__len1);
! 	      const size_type __len = __r.__count;
! 	      pointer __new_start(__r.__ptr);
  	      pointer __new_finish(__new_start);
  	      __try
  		{
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 727,747 ****
  		  std::__uninitialized_fill_n_a(__new_start + __elems_before,
  						__n, __x,
  						_M_get_Tp_allocator());
! 		  __new_finish = pointer();
! 
! 		  __new_finish
! 		    = std::__uninitialized_move_if_noexcept_a
! 		    (__old_start, __pos, __new_start, _M_get_Tp_allocator());
! 
  		  __new_finish += __n;
! 
! 		  __new_finish
! 		    = std::__uninitialized_move_if_noexcept_a
! 		    (__pos, __old_finish, __new_finish, _M_get_Tp_allocator());
  		}
  	      __catch(...)
  		{
! 		  if (!__new_finish)
  		    std::_Destroy(__new_start + __elems_before,
  				  __new_start + __elems_before + __n,
  				  _M_get_Tp_allocator());
--- 707,722 ----
  		  std::__uninitialized_fill_n_a(__new_start + __elems_before,
  						__n, __x,
  						_M_get_Tp_allocator());
! 		  __new_finish = pointer();  // ... in case of a throw.
! 		  __new_finish = std::__uninitialized_move_if_noexcept_a(
! 		      __old_start, __pos, __new_start, _M_get_Tp_allocator());
  		  __new_finish += __n;
! 		  __new_finish = std::__uninitialized_move_if_noexcept_a(
! 		      __pos, __old_finish, __new_finish, _M_get_Tp_allocator());
  		}
  	      __catch(...)
  		{
! 		  if (__new_finish == pointer())
  		    std::_Destroy(__new_start + __elems_before,
  				  __new_start + __elems_before + __n,
  				  _M_get_Tp_allocator());
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 752,763 ****
  		  __throw_exception_again;
  		}
  	      std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
! 	      _GLIBCXX_ASAN_ANNOTATE_REINIT;
! 	      _M_deallocate(__old_start,
! 			    this->_M_impl._M_end_of_storage - __old_start);
! 	      this->_M_impl._M_start = __new_start;
! 	      this->_M_impl._M_finish = __new_finish;
! 	      this->_M_impl._M_end_of_storage = __new_start + __len;
  	    }
  	}
      }
--- 727,733 ----
  		  __throw_exception_again;
  		}
  	      std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
! 	      _M_replace_storage(__new_start, __new_finish, __len);
  	    }
  	}
      }
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 785,793 ****
  	   pointer __old_finish = this->_M_impl._M_finish;
  	   const size_type __old_size = __old_finish - __old_start;
  
! 	   const size_type __len =
! 	     _M_check_len(__n, "vector::_M_fill_append");
! 	   pointer __new_start(this->_M_allocate(__len));
  	   pointer __new_finish(__new_start + __old_size);
  	   __try
  	     {
--- 755,764 ----
  	   pointer __old_finish = this->_M_impl._M_finish;
  	   const size_type __old_size = __old_finish - __old_start;
  
! 	   size_type __len = _M_check_len(__n, "vector::_M_fill_append");
! 	   _Alloc_result __r = this->_M_allocate_at_least(__len);
! 	   __len = __r.__count;
! 	   pointer __new_start(__r.__ptr);
  	   pointer __new_finish(__new_start + __old_size);
  	   __try
  	     {
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 807,818 ****
  		__throw_exception_again;
  	      }
  	   std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
! 	   _GLIBCXX_ASAN_ANNOTATE_REINIT;
! 	   _M_deallocate(__old_start,
! 			 this->_M_impl._M_end_of_storage - __old_start);
! 	   this->_M_impl._M_start = __new_start;
! 	   this->_M_impl._M_finish = __new_finish;
! 	   this->_M_impl._M_end_of_storage = __new_start + __len;
  	 }
      }
  
--- 778,784 ----
  		__throw_exception_again;
  	      }
  	   std::_Destroy(__old_start, __old_finish, _M_get_Tp_allocator());
! 	   _M_replace_storage(__new_start, __new_finish, __len);
  	 }
      }
  
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 852,860 ****
  	      pointer __old_start = this->_M_impl._M_start;
  	      pointer __old_finish = this->_M_impl._M_finish;
  
! 	      const size_type __len =
  		_M_check_len(__n, "vector::_M_default_append");
! 	      pointer __new_start(this->_M_allocate(__len));
  
  	      {
  		_Guard_alloc __guard(__new_start, __len, *this);
--- 818,828 ----
  	      pointer __old_start = this->_M_impl._M_start;
  	      pointer __old_finish = this->_M_impl._M_finish;
  
! 	      const size_type __len1 =
  		_M_check_len(__n, "vector::_M_default_append");
! 	      _Alloc_result __r = this->_M_allocate_at_least(__len1);
! 	      const size_type __len = __r.__count;
! 	      pointer __new_start(__r.__ptr);
  
  	      {
  		_Guard_alloc __guard(__new_start, __len, *this);
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1003,1016 ****
  		pointer __old_start = this->_M_impl._M_start;
  		pointer __old_finish = this->_M_impl._M_finish;
  
! 		const size_type __len =
  		  _M_check_len(__n, "vector::_M_range_insert");
  #if __cplusplus < 201103L
! 		if (__len < (__n + (__old_finish - __old_start)))
  		  __builtin_unreachable();
  #endif
  
! 		pointer __new_start(this->_M_allocate(__len));
  		pointer __new_finish(__new_start);
  		__try
  		  {
--- 971,986 ----
  		pointer __old_start = this->_M_impl._M_start;
  		pointer __old_finish = this->_M_impl._M_finish;
  
! 		const size_type __ask =
  		  _M_check_len(__n, "vector::_M_range_insert");
  #if __cplusplus < 201103L
! 		if (__ask < (__n + (__old_finish - __old_start)))
  		  __builtin_unreachable();
  #endif
  
! 		_Alloc_result __r = this->_M_allocate_at_least(__ask);
! 		const size_type __got = __r.__count;
! 		pointer __new_start(__r.__ptr);
  		pointer __new_finish(__new_start);
  		__try
  		  {
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1031,1047 ****
  		  {
  		    std::_Destroy(__new_start, __new_finish,
  				  _M_get_Tp_allocator());
! 		    _M_deallocate(__new_start, __len);
  		    __throw_exception_again;
  		  }
  		std::_Destroy(__old_start, __old_finish,
  			      _M_get_Tp_allocator());
! 		_GLIBCXX_ASAN_ANNOTATE_REINIT;
! 		_M_deallocate(__old_start,
! 			      this->_M_impl._M_end_of_storage - __old_start);
! 		this->_M_impl._M_start = __new_start;
! 		this->_M_impl._M_finish = __new_finish;
! 		this->_M_impl._M_end_of_storage = __new_start + __len;
  	      }
  	  }
        }
--- 1001,1012 ----
  		  {
  		    std::_Destroy(__new_start, __new_finish,
  				  _M_get_Tp_allocator());
! 		    _M_deallocate(__new_start, __got);
  		    __throw_exception_again;
  		  }
  		std::_Destroy(__old_start, __old_finish,
  			      _M_get_Tp_allocator());
! 		_M_replace_storage(__new_start, __new_finish, __got);
  	      }
  	  }
        }
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1111,1117 ****
  	      }
  	    else // Reallocate
  	      {
! 		const size_type __len
  		  = _M_check_len(__n, "vector::insert_range");
  
  		struct _Guard : _Guard_alloc
--- 1076,1082 ----
  	      }
  	    else // Reallocate
  	      {
! 		const size_type __ask
  		  = _M_check_len(__n, "vector::insert_range");
  
  		struct _Guard : _Guard_alloc
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1130,1137 ****
  		};
  
  		// Allocate new storage:
! 		pointer __new_start(this->_M_allocate(__len));
! 		_Guard __guard(__new_start, __len, *this);
  
  		auto& __alloc = _M_get_Tp_allocator();
  
--- 1095,1104 ----
  		};
  
  		// Allocate new storage:
! 		_Alloc_result __r = this->_M_allocate_at_least(__ask);
! 		const size_type __got = __r.__count;
! 		pointer __new_start(__r.__ptr);
! 		_Guard __guard(__new_start, __got, *this);
  
  		auto& __alloc = _M_get_Tp_allocator();
  
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 1158,1170 ****
  		// with __guard so that it cleans up the old storage:
  		this->_M_impl._M_start = __guard._M_storage;
  		this->_M_impl._M_finish = __guard._M_finish;
! 		this->_M_impl._M_end_of_storage = __new_start + __len;
  		__guard._M_storage = __old_start;
  		__guard._M_finish = __old_finish;
  		__guard._M_len = (__old_finish - __old_start) + __cap;
  		// _Asan::_Reinit destructor marks unused capacity.
  		// _Guard destructor destroys [old_start,old_finish).
! 		// _Guard_alloc destructor frees [old_start,old_start+len).
  	      }
  	    return begin() + __ins_idx;
  	  }
--- 1125,1137 ----
  		// with __guard so that it cleans up the old storage:
  		this->_M_impl._M_start = __guard._M_storage;
  		this->_M_impl._M_finish = __guard._M_finish;
! 		this->_M_impl._M_end_of_storage = __new_start + __got;
  		__guard._M_storage = __old_start;
  		__guard._M_finish = __old_finish;
  		__guard._M_len = (__old_finish - __old_start) + __cap;
  		// _Asan::_Reinit destructor marks unused capacity.
  		// _Guard destructor destroys [old_start,old_finish).
! 		// _Guard_alloc destructor frees [old_start,old_start+got).
  	      }
  	    return begin() + __ins_idx;
  	  }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/flat_map gcc-17-20260524/libstdc++-v3/include/std/flat_map
*** gcc-17-20260517/libstdc++-v3/include/std/flat_map	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/flat_map	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 534,540 ****
  	      return {iterator{this, __key_it}, false};
  
  	  auto __guard = _M_make_clear_guard();
! 	  __key_it = _M_cont.keys.insert(__key_it, std::move(__k));
  	  __value_it = _M_cont.values.begin() + (__key_it - _M_cont.keys.begin());
  	  _M_cont.values.emplace(__value_it, std::forward<_Args>(__args)...);
  	  __guard._M_disable();
--- 534,540 ----
  	      return {iterator{this, __key_it}, false};
  
  	  auto __guard = _M_make_clear_guard();
! 	  __key_it = _M_cont.keys.insert(__key_it, std::forward<_Key2>(__k));
  	  __value_it = _M_cont.values.begin() + (__key_it - _M_cont.keys.begin());
  	  _M_cont.values.emplace(__value_it, std::forward<_Args>(__args)...);
  	  __guard._M_disable();
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/future gcc-17-20260524/libstdc++-v3/include/std/future
*** gcc-17-20260517/libstdc++-v3/include/std/future	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/future	Sun May 24 22:32:15 2026
***************
*** 52,58 ****
  #include <bits/shared_ptr.h>
  #include <bits/std_function.h>
  #include <bits/std_thread.h>
- #include <bits/uses_allocator.h>
  #include <ext/aligned_buffer.h>
  
  namespace std _GLIBCXX_VISIBILITY(default)
--- 52,57 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1112,1133 ****
  	_M_storage(new _Res_type())
        { }
  
-       promise(promise&& __rhs) noexcept
-       : _M_future(std::move(__rhs._M_future)),
- 	_M_storage(std::move(__rhs._M_storage))
-       { }
- 
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<_Res>(__a))
  	{ }
  
!       template<typename _Allocator>
! 	promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
! 	: _M_future(std::move(__rhs._M_future)),
! 	  _M_storage(std::move(__rhs._M_storage))
! 	{ }
  
        promise(const promise&) = delete;
  
--- 1111,1126 ----
  	_M_storage(new _Res_type())
        { }
  
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<_Res>(__a))
  	{ }
  
!       promise(promise&& __rhs) noexcept
!       : _M_future(std::move(__rhs._M_future)),
! 	_M_storage(std::move(__rhs._M_storage))
!       { }
  
        promise(const promise&) = delete;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1207,1217 ****
      swap(promise<_Res>& __x, promise<_Res>& __y) noexcept
      { __x.swap(__y); }
  
-   template<typename _Res, typename _Alloc>
-     struct uses_allocator<promise<_Res>, _Alloc>
-     : public true_type { };
- 
- 
    /// Partial specialization for promise<R&>
    template<typename _Res>
      class promise<_Res&>
--- 1200,1205 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1231,1252 ****
  	_M_storage(new _Res_type())
        { }
  
-       promise(promise&& __rhs) noexcept
-       : _M_future(std::move(__rhs._M_future)),
- 	_M_storage(std::move(__rhs._M_storage))
-       { }
- 
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<_Res&>(__a))
  	{ }
  
!       template<typename _Allocator>
! 	promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
! 	: _M_future(std::move(__rhs._M_future)),
! 	  _M_storage(std::move(__rhs._M_storage))
! 	{ }
  
        promise(const promise&) = delete;
  
--- 1219,1234 ----
  	_M_storage(new _Res_type())
        { }
  
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<_Res&>(__a))
  	{ }
  
!       promise(promise&& __rhs) noexcept
!       : _M_future(std::move(__rhs._M_future)),
! 	_M_storage(std::move(__rhs._M_storage))
!       { }
  
        promise(const promise&) = delete;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1329,1352 ****
  	_M_storage(new _Res_type())
        { }
  
-       promise(promise&& __rhs) noexcept
-       : _M_future(std::move(__rhs._M_future)),
- 	_M_storage(std::move(__rhs._M_storage))
-       { }
- 
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<void>(__a))
  	{ }
  
!       // _GLIBCXX_RESOLVE_LIB_DEFECTS
!       // 2095.  missing constructors needed for uses-allocator construction
!       template<typename _Allocator>
! 	promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
! 	: _M_future(std::move(__rhs._M_future)),
! 	  _M_storage(std::move(__rhs._M_storage))
! 	{ }
  
        promise(const promise&) = delete;
  
--- 1311,1326 ----
  	_M_storage(new _Res_type())
        { }
  
        template<typename _Allocator>
  	promise(allocator_arg_t, const _Allocator& __a)
  	: _M_future(std::allocate_shared<_State>(__a)),
  	  _M_storage(__future_base::_S_allocate_result<void>(__a))
  	{ }
  
!       promise(promise&& __rhs) noexcept
!       : _M_future(std::move(__rhs._M_future)),
! 	_M_storage(std::move(__rhs._M_storage))
!       { }
  
        promise(const promise&) = delete;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1575,1607 ****
  	: _M_state(_Task_state<_Fn>::_S_create(std::forward<_Fn>(__fn), {}))
  	{ }
  
- #if __cplusplus < 201703L
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 2097. packaged_task constructors should be constrained
        // 2407. [this constructor should not be] explicit
        // 2921. packaged_task and type-erased allocators
        template<typename _Fn, typename _Alloc, typename = __not_same<_Fn>>
  	packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn)
  	: _M_state(_Task_state<_Fn, _Alloc>::_S_create(std::forward<_Fn>(__fn),
  						       __a))
  	{ }
  
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // 2095.  missing constructors needed for uses-allocator construction
-       template<typename _Allocator>
- 	packaged_task(allocator_arg_t, const _Allocator&) noexcept
- 	{ }
- 
-       template<typename _Allocator>
- 	packaged_task(allocator_arg_t, const _Allocator&,
- 		      const packaged_task&) = delete;
- 
-       template<typename _Allocator>
- 	packaged_task(allocator_arg_t, const _Allocator&,
- 		      packaged_task&& __other) noexcept
- 	{ this->swap(__other); }
- #endif
- 
        ~packaged_task()
        {
  	if (static_cast<bool>(_M_state) && !_M_state.unique())
--- 1549,1565 ----
  	: _M_state(_Task_state<_Fn>::_S_create(std::forward<_Fn>(__fn), {}))
  	{ }
  
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 2097. packaged_task constructors should be constrained
        // 2407. [this constructor should not be] explicit
        // 2921. packaged_task and type-erased allocators
+       // 3003. <future> still has type-erased allocators in promise
        template<typename _Fn, typename _Alloc, typename = __not_same<_Fn>>
  	packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn)
  	: _M_state(_Task_state<_Fn, _Alloc>::_S_create(std::forward<_Fn>(__fn),
  						       __a))
  	{ }
  
        ~packaged_task()
        {
  	if (static_cast<bool>(_M_state) && !_M_state.unique())
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1678,1691 ****
  	 packaged_task<_Res(_ArgTypes...)>& __y) noexcept
      { __x.swap(__y); }
  
- #if __cplusplus < 201703L
-   // _GLIBCXX_RESOLVE_LIB_DEFECTS
-   // 2976. Dangling uses_allocator specialization for packaged_task
-   template<typename _Res, typename _Alloc>
-     struct uses_allocator<packaged_task<_Res>, _Alloc>
-     : public true_type { };
- #endif
- 
    /// @cond undocumented
  
    // Shared state created by std::async().
--- 1636,1641 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/inplace_vector gcc-17-20260524/libstdc++-v3/include/std/inplace_vector
*** gcc-17-20260517/libstdc++-v3/include/std/inplace_vector	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/inplace_vector	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 248,256 ****
  	{
  	  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
  	    {
! 	      const auto __sz = ranges::distance(__rg);
! 	      if (__sz > _Nm)
  		__throw_bad_alloc();
  	      if (__sz <= size())
  		{
  		  ranges::copy_n(ranges::begin(__rg), __sz, data());
--- 248,258 ----
  	{
  	  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
  	    {
! 	      const auto __len = ranges::distance(__rg);
! 	      if (__len > _Nm)
  		__throw_bad_alloc();
+ 
+ 	      const size_t __sz = size_t(__len);
  	      if (__sz <= size())
  		{
  		  ranges::copy_n(ranges::begin(__rg), __sz, data());
*************** _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*** 523,531 ****
  	{
  	  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
  	    {
! 	      const auto __sz = ranges::distance(__rg);
! 	      if (__sz > (_Nm - size()))
  		__throw_bad_alloc();
  	      // Bounded on output range due PR121143
  	      ranges::uninitialized_copy(
  		ranges::begin(__rg), unreachable_sentinel,
--- 525,535 ----
  	{
  	  if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
  	    {
! 	      const auto __len = ranges::distance(__rg);
! 	      if (__len > (_Nm - size()))
  		__throw_bad_alloc();
+ 
+ 	      const size_t __sz = size_t(__len);
  	      // Bounded on output range due PR121143
  	      ranges::uninitialized_copy(
  		ranges::begin(__rg), unreachable_sentinel,
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/limits gcc-17-20260524/libstdc++-v3/include/std/limits
*** gcc-17-20260517/libstdc++-v3/include/std/limits	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/limits	Sun May 24 22:32:15 2026
***************
*** 45,50 ****
--- 45,51 ----
  #pragma GCC diagnostic ignored "-Wpedantic" // Q suffix
  #pragma GCC diagnostic ignored "-Wlong-long"
  #pragma GCC diagnostic ignored "-Wc++23-extensions"
+ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" // denorm enums
  
  #include <bits/c++config.h>
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 191,204 ****
     *  These values represent the presence or absence of a variable number
     *  of exponent bits.  This type is used in the std::numeric_limits class.
    */
!   enum float_denorm_style
    {
      /// Indeterminate at compile time whether denormalized values are allowed.
!     denorm_indeterminate = -1,
      /// The type does not allow denormalized values.
!     denorm_absent        = 0,
      /// The type allows denormalized values.
!     denorm_present       = 1
    };
  
    /**
--- 192,205 ----
     *  These values represent the presence or absence of a variable number
     *  of exponent bits.  This type is used in the std::numeric_limits class.
    */
!   enum _GLIBCXX23_DEPRECATED float_denorm_style
    {
      /// Indeterminate at compile time whether denormalized values are allowed.
!     denorm_indeterminate _GLIBCXX23_DEPRECATED = -1,
      /// The type does not allow denormalized values.
!     denorm_absent        _GLIBCXX23_DEPRECATED = 0,
      /// The type allows denormalized values.
!     denorm_present       _GLIBCXX23_DEPRECATED = 1
    };
  
    /**
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 275,284 ****
--- 276,287 ----
      static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
  
      /** See std::float_denorm_style for more information.  */
+     _GLIBCXX23_DEPRECATED
      static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
  
      /** True if loss of accuracy is detected as a denormalization loss,
  	rather than as an inexact result. */
+     _GLIBCXX23_DEPRECATED
      static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
      /** True if-and-only-if the type adheres to the IEC 559 standard, also
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 431,438 ****
--- 434,443 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR bool
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 498,505 ****
--- 503,512 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 566,573 ****
--- 573,582 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR signed char
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 637,644 ****
--- 646,655 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR unsigned char
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 709,716 ****
--- 720,729 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR wchar_t
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 773,780 ****
--- 786,795 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR char8_t
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 838,844 ****
--- 853,861 ----
        static constexpr bool has_infinity = false;
        static constexpr bool has_quiet_NaN = false;
        static constexpr bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static constexpr float_denorm_style has_denorm = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static constexpr bool has_denorm_loss = false;
  
        static constexpr char16_t
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 899,905 ****
--- 916,924 ----
        static constexpr bool has_infinity = false;
        static constexpr bool has_quiet_NaN = false;
        static constexpr bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static constexpr float_denorm_style has_denorm = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static constexpr bool has_denorm_loss = false;
  
        static constexpr char32_t
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 965,972 ****
--- 984,993 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR short
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1034,1041 ****
--- 1055,1064 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR unsigned short
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1105,1112 ****
--- 1128,1137 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR int
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1174,1181 ****
--- 1199,1208 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR unsigned int
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1244,1251 ****
--- 1271,1280 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR long
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1313,1320 ****
--- 1342,1351 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR unsigned long
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1386,1393 ****
--- 1417,1426 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR long long
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1456,1463 ****
--- 1489,1498 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
         = denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR unsigned long long
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1525,1532 ****
--- 1560,1569 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;		\
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;		\
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;	\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm	\
  	= denorm_absent;						\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;	\
  									\
        static _GLIBCXX_CONSTEXPR TYPE					\
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1594,1601 ****
--- 1631,1640 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = false;		\
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = false;		\
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;	\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm	\
         = denorm_absent; 						\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;	\
  									\
        static _GLIBCXX_CONSTEXPR unsigned TYPE 				\
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1715,1722 ****
--- 1754,1763 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __FLT_HAS_INFINITY__;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= bool(__FLT_HAS_DENORM__) ? denorm_present : denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
         = __glibcxx_float_has_denorm_loss;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1790,1797 ****
--- 1831,1840 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __DBL_HAS_INFINITY__;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __DBL_HAS_QUIET_NAN__;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= bool(__DBL_HAS_DENORM__) ? denorm_present : denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
          = __glibcxx_double_has_denorm_loss;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1865,1872 ****
--- 1908,1917 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_infinity = __LDBL_HAS_INFINITY__;
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN = __LDBL_HAS_QUIET_NAN__;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= bool(__LDBL_HAS_DENORM__) ? denorm_present : denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss
  	= __glibcxx_long_double_has_denorm_loss;
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 1958,1966 ****
--- 2003,2013 ----
  	= __glibcxx_concat3 (__FLT, BITSIZE, _HAS_QUIET_NAN__);		\
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN		\
  	= has_quiet_NaN;						\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm	\
  	= bool(__glibcxx_concat3 (__FLT, BITSIZE, _HAS_DENORM__))	\
  	  ? denorm_present : denorm_absent;				\
+       _GLIBCXX23_DEPRECATED						\
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;	\
  									\
        static _GLIBCXX_CONSTEXPR _Float##BITSIZE				\
*************** __glibcxx_float_n(128)
*** 2057,2064 ****
--- 2104,2113 ----
        static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN
  	= __BFLT16_HAS_QUIET_NAN__;
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = has_quiet_NaN;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= bool(__BFLT16_HAS_DENORM__) ? denorm_present : denorm_absent;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR __gnu_cxx::__bfloat16_t
*************** __glibcxx_float_n(128)
*** 2157,2164 ****
--- 2206,2215 ----
  #else
        static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = false;
  #endif
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm
  	= denorm_present;
+       _GLIBCXX23_DEPRECATED
        static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss = false;
  
        static _GLIBCXX_CONSTEXPR __float128
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/mdspan gcc-17-20260524/libstdc++-v3/include/std/mdspan
*** gcc-17-20260517/libstdc++-v3/include/std/mdspan	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/mdspan	Sun May 24 22:32:15 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 2621,2627 ****
  	{ return _PaddedStorage::_M_is_always_exhaustive(); }
  
  	constexpr bool
! 	is_exhaustive() noexcept
  	{ return _M_storage._M_is_exhaustive(); }
  
  	static constexpr bool
--- 2621,2627 ----
  	{ return _PaddedStorage::_M_is_always_exhaustive(); }
  
  	constexpr bool
! 	is_exhaustive() const noexcept
  	{ return _M_storage._M_is_exhaustive(); }
  
  	static constexpr bool
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 2794,2800 ****
  	{ return _PaddedStorage::_M_is_always_exhaustive(); }
  
  	constexpr bool
! 	is_exhaustive() noexcept
  	{ return _M_storage._M_is_exhaustive(); }
  
  	static constexpr bool
--- 2794,2800 ----
  	{ return _PaddedStorage::_M_is_always_exhaustive(); }
  
  	constexpr bool
! 	is_exhaustive() const noexcept
  	{ return _M_storage._M_is_exhaustive(); }
  
  	static constexpr bool
diff -Nrcpad gcc-17-20260517/libstdc++-v3/include/std/valarray gcc-17-20260524/libstdc++-v3/include/std/valarray
*** gcc-17-20260517/libstdc++-v3/include/std/valarray	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/include/std/valarray	Sun May 24 22:32:15 2026
***************
*** 43,48 ****
--- 43,49 ----
  #include <debug/debug.h>
  #if __cplusplus >= 201103L
  #include <initializer_list>
+ #include <bits/range_access.h>
  #endif
  
  namespace std _GLIBCXX_VISIBILITY(default)
diff -Nrcpad gcc-17-20260517/libstdc++-v3/src/c++20/Makefile.am gcc-17-20260524/libstdc++-v3/src/c++20/Makefile.am
*** gcc-17-20260517/libstdc++-v3/src/c++20/Makefile.am	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/src/c++20/Makefile.am	Sun May 24 22:32:15 2026
*************** if ENABLE_DUAL_ABI
*** 54,72 ****
  cow-string-inst.lo cow-string-inst.o: string-inst.cc
  endif
  
- if USE_STATIC_TZDATA
- tzdata.zi.h: $(top_srcdir)/src/c++20/tzdata.zi
- 	echo 'static const char tzdata_chars[] = R"__libstdcxx__(' > $@.tmp
- 	cat $^ >> $@.tmp
- 	echo ')__libstdcxx__";' >> $@.tmp
- 	mv $@.tmp $@
- 
- tzdb.lo: tzdb.cc tzdata.zi.h
- 	$(LTCXXCOMPILE) -I. -c $<
- tzdb.o: tzdb.cc tzdata.zi.h
- 	$(CXXCOMPILE) -I. -c $<
- endif
- 
  # This needs access to std::text_encoding and to the internals of std::locale.
  format.lo: format.cc
  	$(LTCXXCOMPILE) -std=gnu++26 -fno-access-control -c $<
--- 54,59 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/src/c++20/Makefile.in gcc-17-20260524/libstdc++-v3/src/c++20/Makefile.in
*** gcc-17-20260517/libstdc++-v3/src/c++20/Makefile.in	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/src/c++20/Makefile.in	Sun May 24 22:32:15 2026
*************** vpath % $(top_srcdir)/src/c++20
*** 758,774 ****
  # These files should be rebuilt if the .cc prerequisite changes.
  @ENABLE_DUAL_ABI_TRUE@cow-string-inst.lo cow-string-inst.o: string-inst.cc
  
- @USE_STATIC_TZDATA_TRUE@tzdata.zi.h: $(top_srcdir)/src/c++20/tzdata.zi
- @USE_STATIC_TZDATA_TRUE@	echo 'static const char tzdata_chars[] = R"__libstdcxx__(' > $@.tmp
- @USE_STATIC_TZDATA_TRUE@	cat $^ >> $@.tmp
- @USE_STATIC_TZDATA_TRUE@	echo ')__libstdcxx__";' >> $@.tmp
- @USE_STATIC_TZDATA_TRUE@	mv $@.tmp $@
- 
- @USE_STATIC_TZDATA_TRUE@tzdb.lo: tzdb.cc tzdata.zi.h
- @USE_STATIC_TZDATA_TRUE@	$(LTCXXCOMPILE) -I. -c $<
- @USE_STATIC_TZDATA_TRUE@tzdb.o: tzdb.cc tzdata.zi.h
- @USE_STATIC_TZDATA_TRUE@	$(CXXCOMPILE) -I. -c $<
- 
  # This needs access to std::text_encoding and to the internals of std::locale.
  format.lo: format.cc
  	$(LTCXXCOMPILE) -std=gnu++26 -fno-access-control -c $<
--- 758,763 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/src/c++20/tzdata.zi gcc-17-20260524/libstdc++-v3/src/c++20/tzdata.zi
*** gcc-17-20260517/libstdc++-v3/src/c++20/tzdata.zi	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/src/c++20/tzdata.zi	Sun May 24 22:32:15 2026
***************
*** 1,4 ****
! # version 2026a
  # redo posix_only
  # This zic input file is in the public domain.
  R d 1916 o - Jun 14 23s 1 S
--- 1,4 ----
! # version 2026b
  # redo posix_only
  # This zic input file is in the public domain.
  R d 1916 o - Jun 14 23s 1 S
*************** Z America/Toronto -5:17:32 - LMT 1895
*** 2966,2972 ****
  -5 C E%sT
  Z America/Vancouver -8:12:28 - LMT 1884
  -8 Va P%sT 1987
! -8 C P%sT
  Z America/Whitehorse -9:0:12 - LMT 1900 Au 20
  -9 Y Y%sT 1965
  -9 Yu Y%sT 1966 F 27
--- 2966,2974 ----
  -5 C E%sT
  Z America/Vancouver -8:12:28 - LMT 1884
  -8 Va P%sT 1987
! -8 C P%sT 2026 Mar 9
! -8 1 PDT 2026 N 1 2
! -7 - MST
  Z America/Whitehorse -9:0:12 - LMT 1900 Au 20
  -9 Y Y%sT 1965
  -9 Yu Y%sT 1966 F 27
diff -Nrcpad gcc-17-20260517/libstdc++-v3/src/c++20/tzdb.cc gcc-17-20260524/libstdc++-v3/src/c++20/tzdb.cc
*** gcc-17-20260517/libstdc++-v3/src/c++20/tzdb.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/src/c++20/tzdb.cc	Sun May 24 22:32:15 2026
*************** namespace std::chrono
*** 371,383 ****
  	return ymd;
        }
  
-       struct on_day_t // tag type for reading ON and DAY fields only
-       {
- 	on_month_day& parent;
- 	friend istream& operator>>(istream&, on_day_t&&);
-       };
- 
-       on_day_t on_day() { return on_day_t{*this}; }
  
        friend istream& operator>>(istream&, on_month_day&);
      };
--- 371,376 ----
*************** namespace std::chrono
*** 1215,1222 ****
      const string_view leaps_file = "/leapseconds";
  
  #ifdef _GLIBCXX_STATIC_TZDATA
! // Static copy of tzdata.zi embedded in the library as tzdata_chars[]
! #include "tzdata.zi.h"
  #endif
  
      // An istream type that can read from a file or from a string.
--- 1208,1217 ----
      const string_view leaps_file = "/leapseconds";
  
  #ifdef _GLIBCXX_STATIC_TZDATA
! // Static copy of tzdata.zi embedded in the library.
! static constexpr char tzdata_chars[] = {
! #embed "tzdata.zi"
! };
  #endif
  
      // An istream type that can read from a file or from a string.
*************** namespace std::chrono
*** 1229,1235 ****
  	{
  #ifdef _GLIBCXX_STATIC_TZDATA
  	  char* p = const_cast<char*>(tzdata_chars);
! 	  this->setg(p, p, p + std::size(tzdata_chars) - 1);
  #endif
  	}
  
--- 1224,1230 ----
  	{
  #ifdef _GLIBCXX_STATIC_TZDATA
  	  char* p = const_cast<char*>(tzdata_chars);
! 	  this->setg(p, p, p + std::size(tzdata_chars));
  #endif
  	}
  
*************** namespace
*** 2334,2406 ****
        }
      };
  
!     // Read the day-component of an on_month_day expression (everything after
!     // the month).  Three forms are accepted: a plain day-of-month number,
!     // "lastXxx" where Xxx is a weekday name (LastWeekday), or "Xxx<=N" or
!     // "Xxx>=N" (LessEq / GreaterEq).  On failure the function sets failbit
!     // and leaves `to.parent` unchanged.
!     istream& operator>>(istream& in, on_month_day::on_day_t&& to)
      {
        using enum on_month_day::Kind;
! 
!       on_month_day& on = to.parent;
!       int c = ws(in).peek();
!       if ('0' <= c && c <= '9')
  	{
! 	  unsigned d;
! 	  in >> d;
! 	  if (d <= 31) [[likely]]
  	    {
! 	      on.kind = DayOfMonth;
! 	      on.day_of_month = d;
! 	      return in;
  	    }
! 	}
!       else if (c == 'l') // lastSunday, lastWed, ...
! 	{
! 	  in.ignore(4);
! 	  if (abbrev_weekday w{}; in >> w) [[likely]]
  	    {
! 	      on.kind = LastWeekday;
! 	      on.day_of_week = w.wd.c_encoding();
! 	      return in;
  	    }
! 	}
!       else
! 	{
! 	  abbrev_weekday w;
! 	  in >> w;
! 	  if (auto c = in.get(); c == '<' || c == '>')
  	    {
! 	      if (in.get() == '=')
! 		{
! 		  unsigned d;
! 		  in >> d;
! 		  if (d <= 31) [[likely]]
  		    {
  		      on.kind = c == '<' ? LessEq : GreaterEq;
  		      on.day_of_week = w.wd.c_encoding();
  		      on.day_of_month = d;
  		      return in;
  		    }
- 		}
  	    }
  	}
        in.setstate(ios::failbit);
        return in;
      }
  
-     istream& operator>>(istream& in, on_month_day& to)
-     {
-       on_month_day md{};
-       abbrev_month m{};
-       in >> m;
-       md.month = static_cast<unsigned>(m.m);
-       if (in >> md.on_day())
- 	to = md;
-       return in;
-     }
- 
      istream& operator>>(istream& in, at_time& at)
      {
        int sign = 1;
--- 2329,2383 ----
        }
      };
  
!     // Read the MONTH DAY. Three forms are accepted for DAY:
!     // * a plain day-of-month number (DayOfMonth),
!     // * "lastWww" where Www is a weekday name (LastWeekday),
!     // * "Www<=N" or "Www>=N" (LessEq / GreaterEq).
!     // On failure to read either MONTH or DAY this function sets
!     // failbit. If DAY is not parsed, only `on.month` is modified,
!     // otherwise `on` is left unchanged.
!     istream& operator>>(istream& in, on_month_day& on)
      {
        using enum on_month_day::Kind;
!       if (abbrev_month m{}; in >> m)
  	{
!  	  on.month = static_cast<unsigned>(m.m);
! 	  if (int c = ws(in).peek(); '0' <= c && c <= '9')
  	    {
! 	      if (unsigned d; (in >> d) && (d <= 31)) [[likely]]
! 		{
! 		  on.kind = DayOfMonth;
! 		  on.day_of_month = d;
! 		  return in;
! 		}
  	    }
! 	  else if (c == 'l') // lastSunday, lastWed, ...
  	    {
! 	      in.ignore(4);
! 	      if (abbrev_weekday w{}; in >> w) [[likely]]
! 		{
! 		  on.kind = LastWeekday;
! 		  on.day_of_week = w.wd.c_encoding();
! 		  return in;
! 		}
  	    }
! 	  else if (abbrev_weekday w; in >> w) [[likely]]
  	    {
! 	      if (c = in.get(); c == '<' || c == '>')
! 		if (in.get() == '=')
! 	          if (unsigned d; (in >> d) && (d <= 31)) [[likely]]
  		    {
  		      on.kind = c == '<' ? LessEq : GreaterEq;
  		      on.day_of_week = w.wd.c_encoding();
  		      on.day_of_month = d;
  		      return in;
  		    }
  	    }
  	}
        in.setstate(ios::failbit);
        return in;
      }
  
      istream& operator>>(istream& in, at_time& at)
      {
        int sign = 1;
*************** namespace
*** 2506,2516 ****
  	  on_month_day on{ .kind = on_month_day::DayOfMonth,
  			   .month = 1, .day_of_month = 1 };
  	  at_time t{};
! 	  if (abbrev_month m{January}; in >> m)
! 	    {
! 	      on.month = static_cast<unsigned>(m.m);
! 	      in >> on.on_day() >> t;
! 	    }
  	  year_month_day ymd = on.pin(year(y));
  	  inf.m_until = sys_days(ymd) + seconds(t.time);
  	  if (t.indicator != at_time::Universal)
--- 2483,2489 ----
  	  on_month_day on{ .kind = on_month_day::DayOfMonth,
  			   .month = 1, .day_of_month = 1 };
  	  at_time t{};
! 	  in >> on >> t;
  	  year_month_day ymd = on.pin(year(y));
  	  inf.m_until = sys_days(ymd) + seconds(t.time);
  	  if (t.indicator != at_time::Universal)
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/char16_32_t.cc	Sun May 24 22:32:15 2026
*************** template<typename T, typename R>
*** 66,71 ****
--- 66,74 ----
      VERIFY( char_type::round_style == impl_type::round_style );
    }
  
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 55 }
+ // { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 56 }
+ 
  int main()
  {
    do_test<char16_t, std::uint_least16_t>();
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/char8_t.cc	Sun May 24 22:32:15 2026
*************** template<typename T, typename R>
*** 63,68 ****
--- 63,71 ----
      VERIFY( char_type::round_style == impl_type::round_style );
    }
  
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 52 }
+ // { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 53 }
+ 
  int main()
  {
    do_test<char8_t, unsigned char>();
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/denorm_min.cc	Sun May 24 22:32:15 2026
*************** test_denorm_min()
*** 43,48 ****
--- 43,50 ----
  
    VERIFY (test);
  }
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 36 }
+ // { dg-warning "denorm_present' is deprecated" "" { target c++23 } 36 }
  
  int main()
  {
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/dr559.cc	Sun May 24 22:32:15 2026
*************** template<typename T>
*** 65,70 ****
--- 65,72 ----
      VERIFY( cv_limits::tinyness_before == limits::tinyness_before );
      VERIFY( cv_limits::round_style == limits::round_style );
    }
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 52 }
+ // { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 53 }
  
  template<typename T>
    void
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/requirements/constexpr_data.cc	Sun May 24 22:32:15 2026
*************** namespace __gnu_test
*** 88,93 ****
--- 88,96 ----
        }
    };
  }
+ // { dg-warning "float_denorm_style' is deprecated" "" { target c++23 } 67 }
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 68 }
+ // { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 70 }
  
  int main()
  {
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/18_support/numeric_limits/specialization_default_values.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 78,83 ****
--- 78,85 ----
    VERIFY( !obj.tinyness_before );
    VERIFY( obj.round_style == std::round_toward_zero );
  }
+ // { dg-warning "has_denorm' is deprecated" "" { target c++23 } 68 }
+ // { dg-warning "has_denorm_loss' is deprecated" "" { target c++23 } 69 }
  
  // test linkage of the generic bits
  template struct std::numeric_limits<B>;
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc gcc-17-20260524/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc	Sun May 24 22:32:15 2026
*************** template <typename T>
*** 29,35 ****
        }
    };
  
! int main()
  {
    std::allocator<X> native;
    auto a1 = native.allocate_at_least(100);
--- 29,35 ----
        }
    };
  
! void base()
  {
    std::allocator<X> native;
    auto a1 = native.allocate_at_least(100);
*************** int main()
*** 63,65 ****
--- 63,171 ----
    VERIFY(a5.ptr == minimal.keep);
    minimal_traits::deallocate(minimal, a5.ptr, a5.count);
  }
+ 
+ void extra()
+ {
+   using SatC = std::allocator_traits<std::allocator<char>>;
+   std::allocator<char> satc;
+   {
+     auto [p, n] = SatC::allocate_at_least(satc, 1);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatC::deallocate(satc, p, n);
+   }
+   {
+     auto [p, n] = SatC::allocate_at_least(satc, 2);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatC::deallocate(satc, p, n);
+   }
+   {
+     auto [p, n] =
+       SatC::allocate_at_least(satc, __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatC::deallocate(satc, p, n);
+   }
+   {
+     auto [p, n] = SatC::allocate_at_least(
+ 	satc, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatC::deallocate(satc, p, n);
+   }
+ 
+   using SatS = std::allocator_traits<std::allocator<short>>;
+   std::allocator<short> sats;
+   {
+     auto [p, n] = SatS::allocate_at_least(sats, 1);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
+     SatS::deallocate(sats, p, n);
+   }
+   {
+     auto [p, n] = SatS::allocate_at_least(sats, 2);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
+     SatS::deallocate(sats, p, n);
+   }
+   {
+     auto [p, n] = SatS::allocate_at_least(sats,
+ 	(__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(short));
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
+     SatS::deallocate(sats, p, n);
+   }
+   {
+     auto [p, n] = SatS::allocate_at_least(sats,
+ 	__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
+     SatS::deallocate(sats, p, n);
+   }
+ 
+   struct A3 { char s[3]; };
+   using SatA3 = std::allocator_traits<std::allocator<A3>>;
+   std::allocator<A3> sata3;
+   {
+     auto [p, n] = SatA3::allocate_at_least(sata3, 1);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
+     SatA3::deallocate(sata3, p, n);
+   }
+   {
+     auto [p, n] = SatA3::allocate_at_least(sata3, 2);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
+     SatA3::deallocate(sata3, p, n);
+   }
+   {
+     auto [p, n] = SatA3::allocate_at_least(sata3,
+ 	(__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A3));
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
+     SatA3::deallocate(sata3, p, n);
+   }
+   {
+     auto [p, n] = SatA3::allocate_at_least(sata3,
+ 	__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
+     SatA3::deallocate(sata3, p, n);
+   }
+ 
+   struct Anm1 { char s[__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1]; };
+   using SatAnm1 = std::allocator_traits<std::allocator<Anm1>>;
+   std::allocator<Anm1> satanm1;
+   {
+     auto [p, n] = SatAnm1::allocate_at_least(satanm1, 1);
+     VERIFY(n == 1);
+     SatAnm1::deallocate(satanm1, p, n);
+   }
+   {
+     auto [p, n] = SatAnm1::allocate_at_least(satanm1,
+ 	__STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatAnm1::deallocate(satanm1, p, n);
+   }
+   {
+     auto [p, n] = SatAnm1::allocate_at_least(satanm1,
+ 	__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
+     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
+     SatAnm1::deallocate(satanm1, p, n);
+   }
+ }
+ 
+ int main()
+ {
+   base();
+   extra();
+ }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/20_util/bitset/cons/lwg4294.cc gcc-17-20260524/libstdc++-v3/testsuite/20_util/bitset/cons/lwg4294.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/20_util/bitset/cons/lwg4294.cc	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libstdc++-v3/testsuite/20_util/bitset/cons/lwg4294.cc	Sun May 24 22:32:15 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++11 } }
+ 
+ // Bug 121046
+ // Asking is_constructible_v<std::bitset<1>, NonTrivial*> is ill-formed
+ 
+ // LWG 4294. bitset(const CharT*) constructor needs to be constrained
+ 
+ #include <bitset>
+ struct NonTrivial { ~NonTrivial() { } };
+ static_assert( ! std::is_constructible<std::bitset<1>, NonTrivial*>::value,
+ 	       "std::bitset cannot be constructed from this pointer" );
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc gcc-17-20260524/libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libstdc++-v3/testsuite/20_util/specialized_algorithms/uninitialized_move/121789.cc	Sun May 24 22:32:15 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-options "-O1 -fdump-tree-optimized" }
+ // { dg-do compile { target c++17 } }
+ // { dg-final { scan-tree-dump "memcpy" "optimized" } }
+ 
+ // PR libstdc++/121789
+ // std::uninitialized_move_n() and friends don't optimize to memcpy
+ 
+ #include <memory>
+ 
+ struct T { int x; };
+ 
+ void f(T* src, T* dst, unsigned n)
+ {
+   std::uninitialized_move(src, src + n, dst);
+ }
+ 
+ void g(T* src, T* dst, unsigned n)
+ {
+   std::uninitialized_move_n(src, n, dst);
+ }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/18654.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 58,64 ****
  #else
        str.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
!       VERIFY( str.capacity() == i );
      }
  }
  
--- 58,69 ----
  #else
        str.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
! #if __glibcxx_allocate_at_least
!       unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1;
! #else
!       unsigned limit = 0;
! #endif
!       VERIFY( str.capacity() - i <= limit);
      }
  }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/shrink_to_fit.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 30,36 ****
    s.push_back('b');
    VERIFY( s.size() < s.capacity() );
    s.shrink_to_fit();
!   VERIFY( s.size() == s.capacity() );
  }
  
  int main()
--- 30,41 ----
    s.push_back('b');
    VERIFY( s.size() < s.capacity() );
    s.shrink_to_fit();
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1;
! #else
!   unsigned limit = 0;
! #endif
!   VERIFY( s.capacity() - s.size() <= limit );
  }
  
  int main()
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/18654.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 50,55 ****
--- 50,56 ----
        const size_type cap = str.capacity();
        VERIFY( cap >= 3 * i );
  
+       // no shrink.
        str.reserve(2 * i);
        VERIFY( str.capacity() == cap );
  
*************** void test01()
*** 58,64 ****
  #else
        str.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
!       VERIFY( str.capacity() == i );
      }
  }
  
--- 59,70 ----
  #else
        str.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
! #if __glibcxx_allocate_at_least
!       unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(wchar_t) - 1;
! #else
!       unsigned limit = 0;
! #endif
!       VERIFY( str.capacity() - i <= limit);
      }
  }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/2.cc	Sun May 24 22:32:15 2026
***************
*** 27,40 ****
  void test02()
  {
    std::wstring str01 = L"twelve chars";
!   // str01 becomes shared
!   std::wstring str02 = str01;
  #if __cplusplus <= 201703L
    str01.reserve();
  #else
    str01.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
!   VERIFY( str01.capacity() == 12 );
  }
  
  int main()
--- 27,47 ----
  void test02()
  {
    std::wstring str01 = L"twelve chars";
!   str01.reserve(100);
  #if __cplusplus <= 201703L
    str01.reserve();
  #else
    str01.shrink_to_fit(); // reserve is deprecated in C++20
  #endif
!   // These are not guaranteed to absolutely minimize storage.
!   // allocator<wchar_t>::allocate_at_least rounds up to what
!   // it knows ::op new delivers.
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(wchar_t) - 1;
! #else
!   unsigned limit = 0;
! #endif
!   VERIFY( str01.capacity() - str01.size() <= limit);
  }
  
  int main()
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/21_strings/basic_string/capacity/wchar_t/shrink_to_fit.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 30,36 ****
    s.push_back(L'b');
    VERIFY( s.size() < s.capacity() );
    s.shrink_to_fit();
!   VERIFY( s.size() == s.capacity() );
  }
  
  int main()
--- 30,41 ----
    s.push_back(L'b');
    VERIFY( s.size() < s.capacity() );
    s.shrink_to_fit();
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(wchar_t) - 1;
! #else
!   unsigned limit = 0;
! #endif
!   VERIFY( s.capacity() - s.size() <= limit );
  }
  
  int main()
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/bitset/lwg4294.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/bitset/lwg4294.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/bitset/lwg4294.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/bitset/lwg4294.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,11 ****
- // { dg-do compile { target c++11 } }
- 
- // Bug 121046
- // Asking is_constructible_v<std::bitset<1>, NonTrivial*> is ill-formed
- 
- // LWG 4294. bitset(const CharT*) constructor needs to be constrained
- 
- #include <bitset>
- struct NonTrivial { ~NonTrivial() { } };
- static_assert( ! std::is_constructible<std::bitset<1>, NonTrivial*>::value,
- 	       "std::bitset cannot be constructed from this pointer" );
--- 0 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/flat_map/1.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/flat_map/1.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/flat_map/1.cc	Sun May 24 22:32:15 2026
***************
*** 13,18 ****
--- 13,19 ----
  #include <testsuite_allocator.h>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
+ #include <string>
  #include <tuple>
  
  struct Gt {
*************** test09()
*** 283,288 ****
--- 284,304 ----
    using value_type = std::pair<int, int>;
  }
  
+ constexpr
+ void
+ test10()
+ {
+   // PR libstdc++/125374 - flat_map unconditionally moves from lvalue keys in
+   // _M_try_emplace
+   std::flat_map<std::string, int, std::less<>> m;
+   std::string k = "hello";
+   m[k] = 1;
+   VERIFY (k == "hello");
+   k = "world";
+   m.try_emplace(k, 2);
+   VERIFY (k == "world");
+ }
+ 
  void
  test()
  {
*************** test()
*** 298,303 ****
--- 314,320 ----
    test07();
    test08();
    test09();
+   test10();
  }
  
  constexpr
*************** test_constexpr()
*** 313,318 ****
--- 330,338 ----
    test07();
    test08();
    test09();
+ #if __cpp_lib_constexpr_string >= 201907L
+   test10();
+ #endif
    return true;
  }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/cons/from_range.cc	Sun May 24 22:32:15 2026
***************
*** 2,7 ****
--- 2,8 ----
  
  #include <inplace_vector>
  
+ #include <ranges>
  #include <span>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test_iterators()
*** 77,83 ****
    do_test_it<int, input_iterator_wrapper>();
    do_test_it<int, forward_iterator_wrapper>();
    do_test_it<int, random_access_iterator_wrapper>();
!   
    do_test_it<short, forward_iterator_wrapper>();
    return true;
  }
--- 78,84 ----
    do_test_it<int, input_iterator_wrapper>();
    do_test_it<int, forward_iterator_wrapper>();
    do_test_it<int, random_access_iterator_wrapper>();
! 
    do_test_it<short, forward_iterator_wrapper>();
    return true;
  }
*************** do_test_r()
*** 108,114 ****
      return;
    }
  #endif
!   
    try
    {
      std::inplace_vector<V, 5> v9(std::from_range, Range(a, a+9));
--- 109,115 ----
      return;
    }
  #endif
! 
    try
    {
      std::inplace_vector<V, 5> v9(std::from_range, Range(a, a+9));
*************** test_ranges()
*** 161,171 ****
--- 162,226 ----
    return true;
  }
  
+ template<typename T>
+ constexpr void
+ test_iota()
+ {
+   T a[]{1,2,3,4,5,6,7,8,9,10};
+ 
+   std::inplace_vector<T, 10> v1(
+     std::from_range, std::views::iota(T(1), T(11)));
+   VERIFY( eq<T>(v1, {a, a+10}) );
+ 
+   std::inplace_vector<T, 10> v2(
+     std::from_range,
+     std::views::iota(T(1))
+     | std::views::as_input
+     | std::views::take_while([](T t) { return t <= 10; }));
+   VERIFY( eq<T>(v2, {a, a+10}) );
+ 
+ #ifdef __cpp_exceptions
+ #ifndef __cpp_lib_constexpr_exceptions
+   if consteval {
+     return;
+   }
+ #endif
+   constexpr T max = std::numeric_limits<T>::max();
+   try
+   {
+     std::inplace_vector<T, 10> v(
+       std::from_range, std::views::iota(T(0), max));
+     VERIFY(false);
+   }
+   catch (std::bad_alloc const&)
+   {
+   }
+ 
+   try
+   {
+     std::inplace_vector<T, 10> v(
+       std::from_range,
+       std::views::iota(T(0))
+       | std::views::as_input
+       | std::views::take_while([](T t) { return t < 15; }));
+     VERIFY(false);
+   }
+   catch (std::bad_alloc const&)
+   {
+   }
+ #endif
+ }
+ 
  int main()
  {
    auto test_all = [] {
      test_iterators();
      test_ranges();
+ 
+     test_iota<long long>();
+ #ifdef __SIZEOF_INT128__
+     test_iota<__int128>();
+ #endif
      return true;
    };
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/assign.cc	Sun May 24 22:32:15 2026
***************
*** 2,7 ****
--- 2,8 ----
  
  #include <inplace_vector>
  
+ #include <ranges>
  #include <span>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test_assigns()
*** 353,358 ****
--- 354,406 ----
    test_resize<T>();
  }
  
+ template<typename T>
+ constexpr void
+ test_iota()
+ {
+   T a[]{1,2,3,4,5,6,7,8,9,10};
+ 
+   std::inplace_vector<T, 10> v;
+   v.assign_range(std::views::iota(T(1), T(11)));
+   VERIFY( eq<T>(v, {a, a+10}) );
+ 
+   v.assign_range(
+     std::views::iota(T(1))
+     | std::views::as_input
+     | std::views::take_while([](T t) { return t <= 10; }));
+   VERIFY( eq<T>(v, {a, a+10}) );
+ 
+ #ifdef __cpp_exceptions
+ #ifndef __cpp_lib_constexpr_exceptions
+   if consteval {
+     return;
+   }
+ #endif
+   constexpr T max = std::numeric_limits<T>::max();
+   try
+   {
+     v.assign_range(std::views::iota(T(0), max));
+     VERIFY(false);
+   }
+   catch (std::bad_alloc const&)
+   {
+   }
+   VERIFY( eq<T>(v, {a, 10}) );
+ 
+   try
+   {
+     v.assign_range(
+       std::views::iota(T(0))
+       | std::views::as_input
+       | std::views::take_while([](T t) { return t < 15; }));
+     VERIFY(false);
+   }
+   catch (std::bad_alloc const&)
+   {
+   }
+ #endif
+ }
+ 
  int main()
  {
    auto test_all = [] {
*************** int main()
*** 368,377 ****
        test_assign_empty<2, X>();
        test_assigns<X>();
      }
      return true;
    };
  
- 
    test_all();
    static_assert(test_all());
  }
--- 416,430 ----
        test_assign_empty<2, X>();
        test_assigns<X>();
      }
+ 
+     test_iota<long long>();
+ #ifdef __SIZEOF_INT128__
+     test_iota<__int128>();
+ #endif
+ 
      return true;
    };
  
    test_all();
    static_assert(test_all());
  }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/inplace_vector/modifiers/multi_insert.cc	Sun May 24 22:32:15 2026
***************
*** 2,7 ****
--- 2,8 ----
  
  #include <inplace_vector>
  
+ #include <ranges>
  #include <span>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test_insert_repeated()
*** 506,511 ****
--- 507,514 ----
  #endif
  }
  
+ 
+ 
  template<typename T>
  constexpr void
  test_inserts()
*************** test_inserts()
*** 526,541 ****
    test_insert_iterators<T, forward_iterator_wrapper>();
    test_insert_iterators<T, random_access_iterator_wrapper>();
  
! test_insert_initializer_list<T>();
! test_insert_repeated<T>();
  }
  
  int main()
  {
! auto test_all = []{
!   test_add_to_full<0, int>();
!   test_add_to_full<0, X>();
!   test_add_to_full<4, int>();
  
      test_inserts<int>();
  #ifdef __cpp_lib_constexpr_inplace_vector
--- 529,630 ----
    test_insert_iterators<T, forward_iterator_wrapper>();
    test_insert_iterators<T, random_access_iterator_wrapper>();
  
!   test_insert_initializer_list<T>();
!   test_insert_repeated<T>();
! }
! 
! template<typename T>
! constexpr void
! test_iota()
! {
!   T a[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
! 
!   std::inplace_vector<T, 20> v;
!   auto it = v.insert_range(v.begin(), std::views::iota(T(1), T(11)));
!   VERIFY( eq<T>(v, {a, a+10}) );
!   VERIFY( it == v.begin() );
! 
!   v.append_range(std::views::iota(T(11), T(16)));
!   VERIFY( eq<T>(v, {a, 15}) );
! 
!   v.clear();
!   it = v.insert_range(v.begin(),
!     std::views::iota(T(1))
!     | std::views::as_input
!     | std::views::take_while([](T t) { return t <= 10; }));
!   VERIFY( eq<T>(v, {a, a+10}) );
!   VERIFY( it == v.begin() );
! 
!   v.append_range(
!     std::views::iota(T(11))
!     | std::views::as_input
!     | std::views::take_while([](T t) { return t <= 15; }));
!   VERIFY( eq<T>(v, {a, 15}) );
! 
! #ifdef __cpp_exceptions
! #ifndef __cpp_lib_constexpr_exceptions
!   if consteval {
!     return;
!   }
! #endif
!   constexpr T max = std::numeric_limits<T>::max();
!   try
!   {
!     v.insert_range(v.end(), std::views::iota(T(0), max));
!     VERIFY(false);
!   }
!   catch (std::bad_alloc const&)
!   {
!   }
!   VERIFY( eq<T>(v, {a, 15}) );
! 
!   try
!   {
!     v.append_range(std::views::iota(T(0), max));
!     VERIFY(false);
!   }
!   catch (std::bad_alloc const&)
!   {
!   }
!   VERIFY( eq<T>(v, {a, 15}) );
! 
!   auto vc = v;
!   try
!   {
!     vc.insert_range(vc.end(),
!       std::views::iota(T(1))
!       | std::views::as_input
!       | std::views::take_while([](T t) { return t <= 20; }));
!     VERIFY(false);
!   }
!   catch (std::bad_alloc const&)
!   {
!   }
!   VERIFY( prefix<T>(vc, {a, 15}) );
! 
!   vc = v;
!   try
!   {
!     vc.append_range(
!       std::views::iota(T(1))
!       | std::views::as_input
!       | std::views::take_while([](T t) { return t <= 20; }));
!     VERIFY(false);
!   }
!   catch (std::bad_alloc const&)
!   {
!   }
!   VERIFY( prefix<T>(vc, {a, 15}) );
! 
! #endif
  }
  
  int main()
  {
!   auto test_all = []{
!     test_add_to_full<0, int>();
!     test_add_to_full<0, X>();
!     test_add_to_full<4, int>();
  
      test_inserts<int>();
  #ifdef __cpp_lib_constexpr_inplace_vector
*************** auto test_all = []{
*** 545,550 ****
--- 634,644 ----
        test_add_to_full<4, X>();
        test_inserts<X>();
      }
+ 
+     test_iota<long long>();
+ #ifdef __SIZEOF_INT128__
+     test_iota<__int128>();
+ #endif
      return true;
    };
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc	Sun May 24 22:32:15 2026
*************** template<typename Layout, typename Exten
*** 44,49 ****
--- 44,57 ----
      static_assert(M::is_always_strided() && M::is_strided());
      if constexpr (has_static_is_exhaustive<M>)
        static_assert(M::is_always_exhaustive() && M::is_exhaustive());
+ 
+     static_assert(noexcept(M::is_always_unique()));
+     static_assert(noexcept(M::is_always_strided()));
+     static_assert(noexcept(M::is_always_exhaustive()));
+     static_assert(noexcept(std::declval<const M>().is_unique()));
+     static_assert(noexcept(std::declval<const M>().is_strided()));
+     static_assert(noexcept(std::declval<const M>().is_exhaustive()));
+ 
      return true;
    }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/padded.cc	Sun May 24 22:32:15 2026
*************** template<template<size_t> typename Layou
*** 509,515 ****
    {
      auto exts = std::extents<int>{};
  
!     auto check = [](auto m)
      {
        static_assert(m.is_always_exhaustive());
        VERIFY(m.is_exhaustive());
--- 509,515 ----
    {
      auto exts = std::extents<int>{};
  
!     auto check = [](const auto m)
      {
        static_assert(m.is_always_exhaustive());
        VERIFY(m.is_exhaustive());
*************** constexpr void
*** 529,535 ****
      {
        auto check = [](auto exts)
        {
! 	auto m = typename PaddedLayout::mapping(exts);
  	static_assert(m.is_always_exhaustive());
  	VERIFY(m.is_exhaustive());
        };
--- 529,535 ----
      {
        auto check = [](auto exts)
        {
! 	const auto m = typename PaddedLayout::mapping(exts);
  	static_assert(m.is_always_exhaustive());
  	VERIFY(m.is_exhaustive());
        };
*************** template<template<size_t> typename Layou
*** 554,560 ****
      auto ctrue = std::cw<true>;
      auto cfalse= std::cw<false>;
  
!     auto check = [](auto m, auto static_expected, auto runtime_expected)
      {
        static_assert(m.is_always_exhaustive() == static_expected);
        VERIFY(m.is_exhaustive() == runtime_expected);
--- 554,560 ----
      auto ctrue = std::cw<true>;
      auto cfalse= std::cw<false>;
  
!     auto check = [](const auto m, auto static_expected, auto runtime_expected)
      {
        static_assert(m.is_always_exhaustive() == static_expected);
        VERIFY(m.is_exhaustive() == runtime_expected);
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride.cc	Sun May 24 22:32:15 2026
*************** template<typename Extents, typename Stri
*** 278,284 ****
    constexpr void
    test_is_exhaustive(Extents extents, Strides strides, bool expected)
    {
!     std::layout_stride::mapping<Extents> m(extents, strides);
      VERIFY(m.is_exhaustive() == expected);
  
      bool always_exhaustive = extents.rank() == 0 || m.required_span_size() == 0;
--- 278,284 ----
    constexpr void
    test_is_exhaustive(Extents extents, Strides strides, bool expected)
    {
!     const std::layout_stride::mapping<Extents> m(extents, strides);
      VERIFY(m.is_exhaustive() == expected);
  
      bool always_exhaustive = extents.rank() == 0 || m.required_span_size() == 0;
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc	Sun May 24 22:32:15 2026
*************** template<typename Layout, bool Expected>
*** 720,728 ****
      static_assert(noexcept(MDSpan::is_always_exhaustive()) == Expected);
      static_assert(noexcept(MDSpan::is_always_strided()) == Expected);
  
!     static_assert(noexcept(std::declval<MDSpan>().is_unique()) == Expected);
!     static_assert(noexcept(std::declval<MDSpan>().is_exhaustive()) == Expected);
!     static_assert(noexcept(std::declval<MDSpan>().is_strided()) == Expected);
    }
  
  int
--- 720,728 ----
      static_assert(noexcept(MDSpan::is_always_exhaustive()) == Expected);
      static_assert(noexcept(MDSpan::is_always_strided()) == Expected);
  
!     static_assert(noexcept(std::declval<const MDSpan>().is_unique()) == Expected);
!     static_assert(noexcept(std::declval<const MDSpan>().is_exhaustive()) == Expected);
!     static_assert(noexcept(std::declval<const MDSpan>().is_strided()) == Expected);
    }
  
  int
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 30,40 ****
    v.push_back(1);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
! #if __cpp_exceptions
!   VERIFY( v.size() == v.capacity() );
  #else
!   VERIFY( v.size() < v.capacity() );
  #endif
  }
  
  int main()
--- 30,41 ----
    v.push_back(1);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(int);
  #else
!   unsigned limit = 0;
  #endif
+   VERIFY(v.capacity() - v.size() <= limit);
  }
  
  int main()
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/capacity/shrink_to_fit2.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 32,38 ****
    v.reserve(100);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
!   VERIFY( v.size() == v.capacity() );
    VERIFY( v.get_allocator().get_personality() == alloc.get_personality() );
  }
  
--- 32,43 ----
    v.reserve(100);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(int);
! #else
!   unsigned limit = 0;
! #endif
!   VERIFY( v.capacity() - v.size() <= limit);
    VERIFY( v.get_allocator().get_personality() == alloc.get_personality() );
  }
  
*************** void test02()
*** 45,51 ****
    v.reserve(100);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
!   VERIFY( v.size() == v.capacity() );
    VERIFY( v.get_allocator().get_personality() == alloc.get_personality() );
  }
  
--- 50,61 ----
    v.reserve(100);
    VERIFY( v.size() < v.capacity() );
    v.shrink_to_fit();
! #ifdef __glibcxx_allocate_at_least
!   unsigned limit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(int);
! #else
!   unsigned limit = 0;
! #endif
!   VERIFY( v.capacity() - v.size() <= limit);
    VERIFY( v.get_allocator().get_personality() == alloc.get_personality() );
  }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/modifiers/emplace/self_emplace.cc	Sun May 24 22:32:15 2026
*************** test01()
*** 31,41 ****
      };
  
    // Make sure emplace will imply reallocation.
!   VERIFY( vv.capacity() == 3 );
  
    vv.emplace(vv.begin(), vv[0]);
  
!   VERIFY( vv.size() == 4 );
    VERIFY( vv[0].size() == 2 );
    VERIFY( vv[0][0] == 2 );
    VERIFY( vv[0][1] == 3 );
--- 31,42 ----
      };
  
    // Make sure emplace will imply reallocation.
!   const auto n = vv.capacity();
!   vv.resize(n);
  
    vv.emplace(vv.begin(), vv[0]);
  
!   VERIFY( vv.size() == (n + 1) );
    VERIFY( vv[0].size() == 2 );
    VERIFY( vv[0][0] == 2 );
    VERIFY( vv[0][1] == 3 );
*************** struct A
*** 99,135 ****
  void
  test03()
  {
!   std::vector<A> va =
!     {
!       { A(1) },
!       { A(2) },
!       { A(3) }
!     };
! 
!   // Make sure emplace will imply reallocation.
!   VERIFY( va.capacity() == 3 );
  
    va.emplace(va.begin(), va.begin());
  
!   VERIFY( va.size() == 4 );
    VERIFY( va[0]._i == 1 );
  }
  
  void
  test04()
  {
!   std::vector<A> va =
!     {
!       { A(1) },
!       { A(2) },
!       { A(3) }
!     };
  
    // Make sure emplace won't reallocate.
-   va.reserve(4);
    va.emplace(va.begin(), va.begin());
  
!   VERIFY( va.size() == 4 );
    VERIFY( va[0]._i == 1 );
  }
  
--- 100,136 ----
  void
  test03()
  {
! #ifdef __glibcxx_allocate_at_least
!   unsigned fit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A);
! #else
!   unsigned fit = 4;
! #endif
!   std::vector<A> va; va.reserve(fit);
!   for (int i = 1; va.size() < va.capacity(); ++i)
!       va.push_back(A(i));
  
    va.emplace(va.begin(), va.begin());
  
!   VERIFY( va.size() == fit + 1 );
    VERIFY( va[0]._i == 1 );
  }
  
  void
  test04()
  {
! #ifdef __glibcxx_allocate_at_least
!   unsigned fit = __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A);
! #else
!   unsigned fit = 4;
! #endif
!   std::vector<A> va; va.reserve(fit);
!   for (int i = 1; va.size() < va.capacity() - 1; ++i)
!       va.push_back(A(i));
  
    // Make sure emplace won't reallocate.
    va.emplace(va.begin(), va.begin());
  
!   VERIFY( va.size() == fit );
    VERIFY( va[0]._i == 1 );
  }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/self_insert.cc	Sun May 24 22:32:15 2026
*************** void test02()
*** 51,61 ****
      };
  
    // Make sure we will reallocate for insertion.
!   VERIFY( vv.capacity() == 3 );
  
    vv.insert(vv.begin(), vv[0]);
  
!   VERIFY( vv.size() == 4 );
    VERIFY( vv[0].size() == 2 );
    VERIFY( vv[0][0] == 2 );
    VERIFY( vv[0][1] == 3 );
--- 51,62 ----
      };
  
    // Make sure we will reallocate for insertion.
!   const auto n = vv.capacity();
!   vv.resize(n);
  
    vv.insert(vv.begin(), vv[0]);
  
!   VERIFY( vv.size() == (n + 1) );
    VERIFY( vv[0].size() == 2 );
    VERIFY( vv[0][0] == 2 );
    VERIFY( vv[0][1] == 3 );
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc gcc-17-20260524/libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/25_algorithms/pstl/alg_sorting/minmax_element.cc	Sun May 24 22:32:15 2026
*************** int
*** 189,195 ****
--- 189,199 ----
  main()
  {
      using TestUtils::float64_t;
+ #ifndef _GLIBCXX_DEBUG
      const std::size_t N = 100000;
+ #else
+     const std::size_t N = 10000;
+ #endif
  
      for (std::size_t n = 0; n < N; n = n < 16 ? n + 1 : size_t(3.14159 * n))
      {
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc gcc-17-20260524/libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/26_numerics/valarray/range_access2.cc	Sun May 24 22:32:15 2026
***************
*** 19,25 ****
  
  // C++11 26.6.10 valarray range access: [valarray.range]
  
- #include <iterator>
  #include <valarray>
  
  // PR libstdc++/67374
--- 19,24 ----
*************** test02()
*** 46,53 ****
--- 45,65 ----
    (void) std::cend(cva);
  }
  
+ // P3016R6 4.8
+ void
+ test03()
+ {
+ #if __cplusplus >= 201703L
+   std::valarray<double> va;
+   (void) std::size(va);
+   const auto& cva = va;
+   (void) std::size(cva);
+ #endif
+ }
+ 
  int main()
  {
    test01();
    test02();
+   test03();
  }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 30,35 ****
--- 30,48 ----
    using std::memory_order_acq_rel;
    using std::memory_order_seq_cst;
  
+ #if __cplusplus >= 202002L
+   using std::memory_order;
+   constexpr auto relaxed = memory_order::relaxed;
+   constexpr auto consume = memory_order::consume;
+   constexpr auto acquire = memory_order::acquire;
+   constexpr auto release = memory_order::release;
+   constexpr auto acq_rel = memory_order::acq_rel;
+   constexpr auto seq_cst = memory_order::seq_cst;
+ #ifdef __cpp_lib_is_scoped_enum
+   static_assert(std::is_scoped_enum_v<std::memory_order>);
+ #endif
+ #endif
+ 
    using std::atomic_flag;
  
    // atomics for builtins types
*************** void test01()
*** 46,52 ****
    using std::atomic_llong;
    using std::atomic_ullong;
    using std::atomic_wchar_t;
! #ifdef _GLIBCXX_USE_CHAR8_T
    using std::atomic_char8_t;
  #endif
    using std::atomic_char16_t;
--- 59,65 ----
    using std::atomic_llong;
    using std::atomic_ullong;
    using std::atomic_wchar_t;
! #ifdef __cpp_lib_char8_t
    using std::atomic_char8_t;
  #endif
    using std::atomic_char16_t;
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x_neg.cc	Sun May 24 22:32:15 2026
*************** void test01()
*** 45,50 ****
--- 45,51 ----
    using atomic_llong;		// { dg-error "expected nested-name-specifier" }
    using atomic_ullong;		// { dg-error "expected nested-name-specifier" }
    using atomic_wchar_t;		// { dg-error "expected nested-name-specifier" }
+   using atomic_char8_t;		// { dg-error "expected nested-name-specifier" }
    using atomic_char16_t;	// { dg-error "expected nested-name-specifier" }
    using atomic_char32_t;	// { dg-error "expected nested-name-specifier" }
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20.cc gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,95 ****
- // { dg-do compile { target c++20 } }
- // { dg-require-cstdint "" }
- 
- // Copyright (C) 2008-2026 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3.  If not see
- // <http://www.gnu.org/licenses/>.
- 
- #include <atomic>
- 
- void test01()
- {
-   using std::memory_order;
-   // TODO add checks for new enumerators memory_order::relaxed etc.
-   // using std::memory_order::relaxed;
-   // using std::memory_order::consume;
-   // using std::memory_order::acquire;
-   // using std::memory_order::release;
-   // using std::memory_order::acq_rel;
-   // using std::memory_order::seq_cst;
-   using std::memory_order_relaxed;
-   using std::memory_order_consume;
-   using std::memory_order_acquire;
-   using std::memory_order_release;
-   using std::memory_order_acq_rel;
-   using std::memory_order_seq_cst;
- 
-   using std::atomic_flag;
- 
-   // atomics for builtins types
-   using std::atomic_bool;
-   using std::atomic_char;
-   using std::atomic_schar;
-   using std::atomic_uchar;
-   using std::atomic_short;
-   using std::atomic_ushort;
-   using std::atomic_int;
-   using std::atomic_uint;
-   using std::atomic_long;
-   using std::atomic_ulong;
-   using std::atomic_llong;
-   using std::atomic_ullong;
-   using std::atomic_wchar_t;
- #ifdef _GLIBCXX_USE_CHAR8_T
-   using std::atomic_char8_t;
- #endif
-   using std::atomic_char16_t;
-   using std::atomic_char32_t;
- 
-   // atomics for standard typedefs
-   using std::atomic_int_least8_t;
-   using std::atomic_uint_least8_t;
-   using std::atomic_int_least16_t;
-   using std::atomic_uint_least16_t;
-   using std::atomic_int_least32_t;
-   using std::atomic_uint_least32_t;
-   using std::atomic_int_least64_t;
-   using std::atomic_uint_least64_t;
-   using std::atomic_int_fast8_t;
-   using std::atomic_uint_fast8_t;
-   using std::atomic_int_fast16_t;
-   using std::atomic_uint_fast16_t;
-   using std::atomic_int_fast32_t;
-   using std::atomic_uint_fast32_t;
-   using std::atomic_int_fast64_t;
-   using std::atomic_uint_fast64_t;
-   using std::atomic_intptr_t;
-   using std::atomic_uintptr_t;
-   using std::atomic_size_t;
-   using std::atomic_ptrdiff_t;
-   using std::atomic_intmax_t;
-   using std::atomic_uintmax_t;
- 
-   // DR 2441
-   using std::atomic_int8_t;
-   using std::atomic_uint8_t;
-   using std::atomic_int16_t;
-   using std::atomic_uint16_t;
-   using std::atomic_int32_t;
-   using std::atomic_uint32_t;
-   using std::atomic_int64_t;
-   using std::atomic_uint64_t;
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++20_neg.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,80 ****
- // { dg-do compile { target c++20 } }
- // { dg-require-cstdint "" }
- 
- // Copyright (C) 2009-2026 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3.  If not see
- // <http://www.gnu.org/licenses/>.
- 
- #include <atomic>
- 
- void test01()
- {
-   // Not global scoped, only namespace std.
-   using memory_order;		// { dg-error "expected nested-name-specifier" }
-   // TODO add checks for new enumerators memory_order::relaxed etc.
-   using memory_order_relaxed;	// { dg-error "expected nested-name-specifier" }
-   using memory_order_consume;	// { dg-error "expected nested-name-specifier" }
-   using memory_order_acquire;	// { dg-error "expected nested-name-specifier" }
-   using memory_order_release;	// { dg-error "expected nested-name-specifier" }
-   using memory_order_acq_rel;	// { dg-error "expected nested-name-specifier" }
-   using memory_order_seq_cst;	// { dg-error "expected nested-name-specifier" }
- 
-   using atomic_flag;		// { dg-error "expected nested-name-specifier" }
- 
-   using atomic_bool;		// { dg-error "expected nested-name-specifier" }
-   using atomic_char;		// { dg-error "expected nested-name-specifier" }
-   using atomic_schar;		// { dg-error "expected nested-name-specifier" }
-   using atomic_uchar;		// { dg-error "expected nested-name-specifier" }
-   using atomic_short;		// { dg-error "expected nested-name-specifier" }
-   using atomic_ushort;		// { dg-error "expected nested-name-specifier" }
-   using atomic_int;		// { dg-error "expected nested-name-specifier" }
-   using atomic_uint;		// { dg-error "expected nested-name-specifier" }
-   using atomic_long;		// { dg-error "expected nested-name-specifier" }
-   using atomic_ulong;		// { dg-error "expected nested-name-specifier" }
-   using atomic_llong;		// { dg-error "expected nested-name-specifier" }
-   using atomic_ullong;		// { dg-error "expected nested-name-specifier" }
-   using atomic_wchar_t;		// { dg-error "expected nested-name-specifier" }
-   using atomic_char8_t;		// { dg-error "expected nested-name-specifier" }
-   using atomic_char16_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_char32_t;	// { dg-error "expected nested-name-specifier" }
- 
-   using atomic_int_least8_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_least8_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_least16_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_least16_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_least32_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_least32_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_least64_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_least64_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_fast8_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_fast8_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_fast16_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_fast16_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_fast32_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_fast32_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_int_fast64_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uint_fast64_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_intptr_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uintptr_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_size_t;		// { dg-error "expected nested-name-specifier" }
-   using atomic_ptrdiff_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_intmax_t;	// { dg-error "expected nested-name-specifier" }
-   using atomic_uintmax_t;	// { dg-error "expected nested-name-specifier" }
- 
-   using atomic_address;		// { dg-error "expected nested-name-specifier" }
-   // Present in C++0x drafts but not final C++11 standard:
-   using std::atomic_address;	// { dg-error "has not been declared" }
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a.cc gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++2a.cc	Thu Jan  1 00:00:00 1970
***************
*** 1,31 ****
- // { dg-do compile { target c++20 } }
- 
- // Copyright (C) 2019-2026 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library.  This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this library; see the file COPYING3.  If not see
- // <http://www.gnu.org/licenses/>.
- 
- #include <atomic>
- 
- void test01()
- {
-   using std::memory_order;
-   constexpr auto relaxed = memory_order::relaxed;
-   constexpr auto consume = memory_order::consume;
-   constexpr auto acquire = memory_order::acquire;
-   constexpr auto release = memory_order::release;
-   constexpr auto acq_rel = memory_order::acq_rel;
-   constexpr auto seq_cst = memory_order::seq_cst;
- }
--- 0 ----
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc gcc-17-20260524/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/30_threads/packaged_task/uses_allocator.cc	Sun May 24 22:32:15 2026
***************
*** 1,4 ****
! // { dg-do compile { target { c++11_only || c++14_only } } }
  // { dg-require-gthreads "" }
  
  // Copyright (C) 2011-2026 Free Software Foundation, Inc.
--- 1,4 ----
! // { dg-do compile { target c++11 } }
  // { dg-require-gthreads "" }
  
  // Copyright (C) 2011-2026 Free Software Foundation, Inc.
***************
*** 25,29 ****
  using std::uses_allocator;
  using std::allocator;
  using std::packaged_task;
! static_assert( uses_allocator<packaged_task<int()>, allocator<int>>::value,
!                "packaged_task supports uses-allocator construction" );
--- 25,29 ----
  using std::uses_allocator;
  using std::allocator;
  using std::packaged_task;
! static_assert( ! uses_allocator<packaged_task<int()>, allocator<int>>::value,
!                "packaged_task does not support uses-allocator construction" );
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc gcc-17-20260524/libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/30_threads/promise/uses_allocator.cc	Sun May 24 22:32:15 2026
***************
*** 25,29 ****
  using std::uses_allocator;
  using std::allocator;
  using std::promise;
! static_assert( uses_allocator<promise<int>, allocator<int>>::value,
!                "promise supports uses-allocator construction" );
--- 25,29 ----
  using std::uses_allocator;
  using std::allocator;
  using std::promise;
! static_assert( ! uses_allocator<promise<int>, allocator<int>>::value,
!                "promise does not support uses-allocator construction" );
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc gcc-17-20260524/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/std/ranges/iota/max_size_type.cc	Sun May 24 22:32:16 2026
*************** constexpr bool verify_numeric_limits_val
*** 428,433 ****
--- 428,435 ----
  	&& (numeric_limits<integer_class>::quiet_NaN() == 0)
  	&& (numeric_limits<integer_class>::signaling_NaN() == 0);
  
+ // { dg-warning "denorm_absent' is deprecated" "" { target c++23 } 422 }
+ 
  static_assert(verify_numeric_limits_values_not_meaningful_for<max_size_t>);
  static_assert(verify_numeric_limits_values_not_meaningful_for<max_diff_t>);
  
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/std/time/parse/125369.cc gcc-17-20260524/libstdc++-v3/testsuite/std/time/parse/125369.cc
*** gcc-17-20260517/libstdc++-v3/testsuite/std/time/parse/125369.cc	Thu Jan  1 00:00:00 1970
--- gcc-17-20260524/libstdc++-v3/testsuite/std/time/parse/125369.cc	Sun May 24 22:32:16 2026
***************
*** 0 ****
--- 1,65 ----
+ // { dg-do run { target c++20 } }
+ 
+ #include <chrono>
+ #include <sstream>
+ #include <testsuite_hooks.h>
+ 
+ using namespace std::chrono;
+ 
+ const std::string input = "2026-05-18 15:26:48 ";
+ const std::string fmt = "%F %T %";
+ sys_seconds ss;
+ minutes offset{};
+ std::string abbrev;
+ 
+ void
+ test_parse_z()
+ {
+   for (auto suffix : {"Z", "+", "+Z", "-A", "+1Z", "+010", "+010Z"})
+   {
+     std::istringstream in{input + suffix};
+     from_stream(in, (fmt + "z").c_str(), ss, &abbrev, &offset);
+ 
+     VERIFY( in.fail() );
+     VERIFY( ss == sys_seconds(0s) );
+     VERIFY( offset == 0min );
+     VERIFY( abbrev.empty() );
+   }
+ }
+ 
+ void
+ test_parse_Ez()
+ {
+   for (auto suffix : {"Z", "+", "-", "+01:", "+01:X"})
+   {
+     std::istringstream in{input + suffix};
+     from_stream(in, (fmt + "Ez").c_str(), ss, &abbrev, &offset);
+ 
+     VERIFY( in.fail() );
+     VERIFY( ss == sys_seconds(0s) );
+     VERIFY( offset == 0min );
+     VERIFY( abbrev.empty() );
+   }
+ }
+ 
+ void
+ test_parse_Oz()
+ {
+   for (auto suffix : {"Z", "+", "-", "+01:", "+01:X"})
+   {
+     std::istringstream in{input + suffix};
+     from_stream(in, (fmt + "Oz").c_str(), ss, &abbrev, &offset);
+ 
+     VERIFY( in.fail() );
+     VERIFY( ss == sys_seconds(0s) );
+     VERIFY( offset == 0min );
+     VERIFY( abbrev.empty() );
+   }
+ }
+ 
+ int main()
+ {
+   test_parse_z();
+   test_parse_Ez();
+   test_parse_Oz();
+ }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/util/testsuite_allocator.h gcc-17-20260524/libstdc++-v3/testsuite/util/testsuite_allocator.h
*** gcc-17-20260517/libstdc++-v3/testsuite/util/testsuite_allocator.h	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/util/testsuite_allocator.h	Sun May 24 22:32:16 2026
*************** namespace __gnu_test
*** 168,173 ****
--- 168,183 ----
  	  : Alloc(alloc)
  	{ }
  
+ #ifdef __glibcxx_allocate_at_least // C++23
+       std::allocation_result<pointer, size_type>
+       allocate_at_least(size_type n)
+       {
+ 	auto [p, c] = AllocTraits::allocate_at_least(*this, n);
+ 	counter_type::allocate(c * sizeof(T));
+ 	return { p, c };
+       }
+ #endif
+ 
        pointer
        allocate(size_type n, const void* = 0)
        {
*************** namespace __gnu_test
*** 373,378 ****
--- 383,414 ----
  	return p;
        }
  
+ #ifdef __glibcxx_allocate_at_least
+       constexpr auto
+       allocate_at_least(size_type n)
+       -> std::allocation_result<Tp*, size_t>
+       {
+ 	auto r = AllocTraits::allocate_at_least(*this, n);
+ 
+ 	if consteval
+ 	  { return r; }
+ 	else
+ 	  {
+ 	    try
+ 	      {
+ 		get_map().insert(map_type::value_type(
+ 		      reinterpret_cast<void*>(r.ptr), personality));
+ 	      }
+ 	    catch(...)
+ 	      {
+ 		AllocTraits::deallocate(*this, r.ptr, r.count);
+ 		__throw_exception_again;
+ 	      }
+ 	    return r;
+ 	  }
+       }
+ #endif
+ 
        _GLIBCXX14_CONSTEXPR
        void
        deallocate(pointer p, size_type n)
*************** namespace __gnu_test
*** 632,637 ****
--- 668,680 ----
        pointer allocate(std::size_t n, const_void_pointer = {})
        { return pointer(std::allocator<Tp>::allocate(n)); }
  
+ #ifdef __glibcxx_allocate_at_least
+       _GLIBCXX14_CONSTEXPR
+       std::allocation_result<pointer, std::size_t>
+       allocate_at_least(std::size_t n)
+       { return { allocate(n), n }; }
+ #endif
+ 
        _GLIBCXX14_CONSTEXPR
        void deallocate(pointer p, std::size_t n)
        { std::allocator<Tp>::deallocate(std::addressof(*p), n); }
diff -Nrcpad gcc-17-20260517/libstdc++-v3/testsuite/util/testsuite_greedy_ops.h gcc-17-20260524/libstdc++-v3/testsuite/util/testsuite_greedy_ops.h
*** gcc-17-20260517/libstdc++-v3/testsuite/util/testsuite_greedy_ops.h	Sun May 17 22:32:16 2026
--- gcc-17-20260524/libstdc++-v3/testsuite/util/testsuite_greedy_ops.h	Sun May 24 22:32:16 2026
*************** namespace greedy_ops
*** 46,55 ****
    X operator>=(T, T)
    { return X(); }
  
    template<typename T>
    X operator-(T, T)
    { return X(); }
!   /*
    template<typename T>
    T operator+(std::size_t, T)
    { return T(); }
--- 46,56 ----
    X operator>=(T, T)
    { return X(); }
  
+   /*
    template<typename T>
    X operator-(T, T)
    { return X(); }
! 
    template<typename T>
    T operator+(std::size_t, T)
    { return T(); }
