diff -Nrcpad gcc-16-20250622/ChangeLog gcc-16-20250629/ChangeLog
*** gcc-16-20250622/ChangeLog	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/ChangeLog	Sun Jun 29 22:32:24 2025
***************
*** 1,3 ****
--- 1,11 ----
+ 2025-06-22  Nicolas Boulenguez  <nicolas@debian.org>
+ 
+ 	PR ada/120106
+ 	* Makefile.tpl: Add GNATMAKE_FOR_BUILD to {HOST,BASE_TARGET}_EXPORTS
+ 	* Makefile.in: Regenerate.
+ 	* configure.ac: Set the default and substitute the variable.
+ 	* configure: Regenerate.
+ 
  2025-06-09  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
  
  	* configure.ac: Special case cpu_type for x86_64.
diff -Nrcpad gcc-16-20250622/LAST_UPDATED gcc-16-20250629/LAST_UPDATED
*** gcc-16-20250622/LAST_UPDATED	Sun Jun 22 22:34:34 2025
--- gcc-16-20250629/LAST_UPDATED	Sun Jun 29 22:35:00 2025
***************
*** 1 ****
! Obtained from git: master revision 596ab7c67f05f45f94e527830404c391141ec85c
--- 1 ----
! Obtained from git: master revision 0cd06c1da7a706330045e54a7516de2601341bc7
diff -Nrcpad gcc-16-20250622/MD5SUMS gcc-16-20250629/MD5SUMS
*** gcc-16-20250622/MD5SUMS	Sun Jun 22 22:34:39 2025
--- gcc-16-20250629/MD5SUMS	Sun Jun 29 22:35:04 2025
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20250622.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-16-20250629.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
*************** b8acb527560fc760209d200fcfab8ff4  .githu
*** 21,31 ****
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! 2b29272c42f59a7ae9462445dd333847  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 7cc4b23a23913209e187c765ede02cce  LAST_UPDATED
  0243224447499a1a62c0125937291a7c  MAINTAINERS
  95166ed050922b15d201d1fa647b5872  Makefile.def
  7dcc983bfbcda6838b504185562b60a3  Makefile.in
--- 21,31 ----
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! ad8edbf5beec6325b8b06ff605bf9278  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 67a73dc478fc5ffa89fce23c7608acad  LAST_UPDATED
  0243224447499a1a62c0125937291a7c  MAINTAINERS
  95166ed050922b15d201d1fa647b5872  Makefile.def
  7dcc983bfbcda6838b504185562b60a3  Makefile.in
*************** e2dc6b4fd62b77bff96b7951ef74f78f  config
*** 154,160 ****
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  9d9c5508a65175be5f9e10721e55ebbc  configure
  82e46c5338f6449fa0a149b6adf12797  configure.ac
! ee0613335cef93cc6f0f9375ce947171  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
--- 154,160 ----
  db74a73c3c9c3cc71edec37c2436e082  config/zstd.m4
  9d9c5508a65175be5f9e10721e55ebbc  configure
  82e46c5338f6449fa0a149b6adf12797  configure.ac
! dd9a29f02f7388885480b6ddbc89538a  contrib/ChangeLog
  5fc435c7928f858246df931ea3f3ece7  contrib/ChangeLog.jit
  7af8d2979bf1a7cfa88e30d05fa22be2  contrib/ChangeLog.tree-ssa
  13605e5ba7b533ecbe3a902b8ebe4079  contrib/analyze_brprob.py
*************** fc5d12bb94b4667b18df90dda451f776  contri
*** 177,186 ****
  4688ffec8f146aa47298dec84f2cb5cf  contrib/compare_two_ftime_report_sets
  ff41beb85e232853543074466232e9c0  contrib/config-list.mk
  d575264f7a1cdc4afba872bdd7d2e2dd  contrib/dg-cmp-results.sh
! a7bf75440b2b5e23832d4709be97a378  contrib/dg-extract-results.py
! 20da46ad6b1a4d8406632a892673e202  contrib/dg-extract-results.sh
! f0c0df1ce77eb76338f0ef3330293536  contrib/dg-lint/dg-lint
! 82cc672ab1d10c6b0023399b6b0808ba  contrib/dg-lint/libgdiagnostics.py
  c3217001bd26d7357f97d76467773e6d  contrib/dg-lint/test-1.c
  3676f3483293ec7cf746b0728e85eb3f  contrib/dg-lint/test-2.c
  5366c5961ca00049e66387009ac4311e  contrib/dg-out-generator.pl
--- 177,186 ----
  4688ffec8f146aa47298dec84f2cb5cf  contrib/compare_two_ftime_report_sets
  ff41beb85e232853543074466232e9c0  contrib/config-list.mk
  d575264f7a1cdc4afba872bdd7d2e2dd  contrib/dg-cmp-results.sh
! 2496352a13912278327150659aad23a7  contrib/dg-extract-results.py
! e4aa1756f00ff5294c836c52d0d1da43  contrib/dg-extract-results.sh
! b8760dfd50a642f261fd59805fbf681d  contrib/dg-lint/dg-lint
! d17c035f935c033a8da0d176a8aa5db7  contrib/dg-lint/libgdiagnostics.py
  c3217001bd26d7357f97d76467773e6d  contrib/dg-lint/test-1.c
  3676f3483293ec7cf746b0728e85eb3f  contrib/dg-lint/test-2.c
  5366c5961ca00049e66387009ac4311e  contrib/dg-out-generator.pl
*************** ef13953e64bd4e093d01aad4a9309c10  contri
*** 248,254 ****
  ef13953e64bd4e093d01aad4a9309c10  contrib/mdcompact/tests/6.md.out
  e4c7c4ac31575610ebd46840cc5d9ac6  contrib/mdcompact/tests/7.md
  bda0e2d8e6960465c7778fe3856cdacc  contrib/mdcompact/tests/7.md.out
! 1ccd71d7893e370e4b3d008255da6087  contrib/mklog.py
  9bb8c12fc069b7624268da15bd911667  contrib/paranoia.cc
  56f5ae231f8677575e2be3afe11f0bf3  contrib/patch_tester.sh
  26ca88683b396ae6e8989515fd8a244e  contrib/prepare-commit-msg
--- 248,254 ----
  ef13953e64bd4e093d01aad4a9309c10  contrib/mdcompact/tests/6.md.out
  e4c7c4ac31575610ebd46840cc5d9ac6  contrib/mdcompact/tests/7.md
  bda0e2d8e6960465c7778fe3856cdacc  contrib/mdcompact/tests/7.md.out
! c5572589247d96d3a50b4dab8f7bcd46  contrib/mklog.py
  9bb8c12fc069b7624268da15bd911667  contrib/paranoia.cc
  56f5ae231f8677575e2be3afe11f0bf3  contrib/patch_tester.sh
  26ca88683b396ae6e8989515fd8a244e  contrib/prepare-commit-msg
*************** a22e70b3f29292d0e628450f4bb11e62  fixinc
*** 516,522 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 97fce58ff7aad50779db6f11fbac68f0  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 516,522 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 83122d1848e4d5b81f6ac524d73d33f5  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 553,571 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 36177472a04f877d3874afdccd32b917  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  4dc2573d948287a3722ce977490b026c  gcc/LANGUAGES
! 23956154cef18ee478426f2e806d7377  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  15d6908b4409b0925d9f1c72b56b5cb7  gcc/README.Portability
  cd96bf34cb76c97f86704a59b9ddb18a  gcc/acinclude.m4
  18db4664d7e31002aac43ebcf20e075f  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 2caa2f16ce6027a37342c74c6bc08b5f  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 553,571 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 2f822fdbee20e0c0bace28a9dcaa892b  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  4dc2573d948287a3722ce977490b026c  gcc/LANGUAGES
! 104ee5096a64d0578642abcfc873a433  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  15d6908b4409b0925d9f1c72b56b5cb7  gcc/README.Portability
  cd96bf34cb76c97f86704a59b9ddb18a  gcc/acinclude.m4
  18db4664d7e31002aac43ebcf20e075f  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 2f037bf997904c05da966c43229be974  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** aad2a318697514ee6e576768c075fc0e  gcc/ad
*** 827,833 ****
  0cfb73b82bc6277eb801329c392229d2  gcc/ada/freeze.ads
  c6d8bff803673243e76f3e9aa705e974  gcc/ada/frontend.adb
  6f776be1d84e9d8c996b576c19a4349f  gcc/ada/frontend.ads
! 7cb990da5787a02f58f48506632b9364  gcc/ada/gcc-interface/Make-lang.in
  c966c1785f2c20d928007c7842c93db0  gcc/ada/gcc-interface/Makefile.in
  b02134e55a04db5c49a710da26b19be1  gcc/ada/gcc-interface/ada-builtin-types.def
  bc1175cb4ea0b9cb5f8751b3f0da7f74  gcc/ada/gcc-interface/ada-builtins.def
--- 827,833 ----
  0cfb73b82bc6277eb801329c392229d2  gcc/ada/freeze.ads
  c6d8bff803673243e76f3e9aa705e974  gcc/ada/frontend.adb
  6f776be1d84e9d8c996b576c19a4349f  gcc/ada/frontend.ads
! 7aa596095d9ed5610d539070fd80a826  gcc/ada/gcc-interface/Make-lang.in
  c966c1785f2c20d928007c7842c93db0  gcc/ada/gcc-interface/Makefile.in
  b02134e55a04db5c49a710da26b19be1  gcc/ada/gcc-interface/ada-builtin-types.def
  bc1175cb4ea0b9cb5f8751b3f0da7f74  gcc/ada/gcc-interface/ada-builtins.def
*************** fa1feb51010fc73b933487acbdcf85e8  gcc/ad
*** 842,848 ****
  8c3391ec25d2f8a3e26b0553d537d3e2  gcc/ada/gcc-interface/lang-specs.h
  43e609e56eeb0ff4e57be465cd17ddbc  gcc/ada/gcc-interface/lang.opt
  9b5bb16ec797188515b64efd5c00378a  gcc/ada/gcc-interface/lang.opt.urls
! e8ba734d63b4001c905ea24a0dc1b6a3  gcc/ada/gcc-interface/misc.cc
  a74b4504c5ad4ed4e963f0691c289b40  gcc/ada/gcc-interface/system.ads
  b350a6fd65cafe8bd47dc42192437310  gcc/ada/gcc-interface/targtyps.cc
  459f0b99e7a1b0ab35902e89fc170732  gcc/ada/gcc-interface/trans.cc
--- 842,848 ----
  8c3391ec25d2f8a3e26b0553d537d3e2  gcc/ada/gcc-interface/lang-specs.h
  43e609e56eeb0ff4e57be465cd17ddbc  gcc/ada/gcc-interface/lang.opt
  9b5bb16ec797188515b64efd5c00378a  gcc/ada/gcc-interface/lang.opt.urls
! 1403993cbf8ac5d3b60092dd85c26fa6  gcc/ada/gcc-interface/misc.cc
  a74b4504c5ad4ed4e963f0691c289b40  gcc/ada/gcc-interface/system.ads
  b350a6fd65cafe8bd47dc42192437310  gcc/ada/gcc-interface/targtyps.cc
  459f0b99e7a1b0ab35902e89fc170732  gcc/ada/gcc-interface/trans.cc
*************** ea4d856a616d24b9db47871b82e88726  gcc/ad
*** 2927,2933 ****
  c074ec7450863300eff2a21c036a624b  gcc/ada/sem_elab.ads
  1dcf7c5349839b9e9ab4ee0d1954c7c6  gcc/ada/sem_elim.adb
  c837e01542a712c622bac1cd152fc080  gcc/ada/sem_elim.ads
! c5985b744f37c622b9b6e1304c1f0a25  gcc/ada/sem_eval.adb
  6ad36871bb495808ea611c6c620fc482  gcc/ada/sem_eval.ads
  e8e79e2a818321d7816e27eed8d17404  gcc/ada/sem_intr.adb
  66ccba8e3b77fa8d6e0e13f6368d804a  gcc/ada/sem_intr.ads
--- 2927,2933 ----
  c074ec7450863300eff2a21c036a624b  gcc/ada/sem_elab.ads
  1dcf7c5349839b9e9ab4ee0d1954c7c6  gcc/ada/sem_elim.adb
  c837e01542a712c622bac1cd152fc080  gcc/ada/sem_elim.ads
! 8b4f9372162e98d77174047dfe754b49  gcc/ada/sem_eval.adb
  6ad36871bb495808ea611c6c620fc482  gcc/ada/sem_eval.ads
  e8e79e2a818321d7816e27eed8d17404  gcc/ada/sem_intr.adb
  66ccba8e3b77fa8d6e0e13f6368d804a  gcc/ada/sem_intr.ads
*************** df3f6c6882fc8f715d4cc537af0f6442  gcc/ad
*** 3054,3062 ****
  a13250e9011949e791f210139f4c4323  gcc/align.h
  192d075c6984da6ef1e282fd63829079  gcc/alloc-pool.cc
  b2194a7136db5f26272ca6162d858997  gcc/alloc-pool.h
! 8e9ce47ddff1fd3fd3b4702589f8ad23  gcc/analyzer/ChangeLog
  c1d8dcf12e8a4e4782fe39d54eed2d1d  gcc/analyzer/access-diagram.cc
  9de61ebb9551c4e4ef3bfa77f503bfa0  gcc/analyzer/access-diagram.h
  0fbda9dacfcf6f4071f7bee8c6b7dbe9  gcc/analyzer/analysis-plan.cc
  b5f1385e0b051936dcf6b44d2802237b  gcc/analyzer/analysis-plan.h
  1008e37744d30bb0a67499e909668195  gcc/analyzer/analyzer-language.cc
--- 3054,3064 ----
  a13250e9011949e791f210139f4c4323  gcc/align.h
  192d075c6984da6ef1e282fd63829079  gcc/alloc-pool.cc
  b2194a7136db5f26272ca6162d858997  gcc/alloc-pool.h
! 55c320ab579ed9b949f0e885631bd9ce  gcc/analyzer/ChangeLog
  c1d8dcf12e8a4e4782fe39d54eed2d1d  gcc/analyzer/access-diagram.cc
  9de61ebb9551c4e4ef3bfa77f503bfa0  gcc/analyzer/access-diagram.h
+ 3f3ac93dc38bf711c84a6bad8eb25b24  gcc/analyzer/ana-state-to-diagnostic-state.cc
+ b37c0d2fb30992bd6ff7d1094082d20b  gcc/analyzer/ana-state-to-diagnostic-state.h
  0fbda9dacfcf6f4071f7bee8c6b7dbe9  gcc/analyzer/analysis-plan.cc
  b5f1385e0b051936dcf6b44d2802237b  gcc/analyzer/analysis-plan.h
  1008e37744d30bb0a67499e909668195  gcc/analyzer/analyzer-language.cc
*************** ab7785be9752af3c41527ce7aa08e5f9  gcc/an
*** 3080,3148 ****
  269242e7e59c0f923c78aaa080a5ca62  gcc/analyzer/call-string.h
  0c33640a03f3ee40fe825f5f1e2ad950  gcc/analyzer/call-summary.cc
  bc77cd1e5aec40e5623c49cb8974b3d4  gcc/analyzer/call-summary.h
! 3f62325364760248ae18299a0bd12bf2  gcc/analyzer/checker-event.cc
! f35c616beb0caf53d918a3aa7cfabd1b  gcc/analyzer/checker-event.h
  c4687f7aa3cb8374e9f9a685ba14ee0e  gcc/analyzer/checker-path.cc
! 1a2151bebf901fa4bb299b2c486fc38e  gcc/analyzer/checker-path.h
! ccd93b30934aa1ee88f4ab3938c3d509  gcc/analyzer/common.h
  60fa08b701b562f0dde13dd1877ddcd1  gcc/analyzer/complexity.cc
  9113c9c3a7167f3119fc0552883611b5  gcc/analyzer/complexity.h
  47a07fbad11f20bb3af463bdfa71f998  gcc/analyzer/constraint-manager.cc
  a23c7325bc2b24e45ed69ba1e934aedc  gcc/analyzer/constraint-manager.h
! 2546d588840487b3d4203a3d1772783b  gcc/analyzer/diagnostic-manager.cc
  f44cc8516da447fede0702befbb862f6  gcc/analyzer/diagnostic-manager.h
! 66966ef6aa01ef22fe422f7715c0011a  gcc/analyzer/engine.cc
  acc1f4f20384df654fa365f64ad6a6f9  gcc/analyzer/engine.h
  c31696d47421f74a13cc907d022b3935  gcc/analyzer/event-loc-info.h
! 6e46b2c5c008a56044c9f20dcd583805  gcc/analyzer/exploded-graph.h
  7330a37bff32b8bb4d971ffc043827a2  gcc/analyzer/feasible-graph.cc
  af675735c50099e3d3123b9ef8d97dad  gcc/analyzer/feasible-graph.h
  6b62290e89378d4a19f4db1d7a4fc427  gcc/analyzer/function-set.cc
  73d77bbed77b45ed4b05881eeccbc992  gcc/analyzer/function-set.h
  eac039e9d9e8b9cb384a8ba136fdbf78  gcc/analyzer/infinite-loop.cc
! 96007518bcc3a32fc43f0f7fc793d85d  gcc/analyzer/infinite-recursion.cc
  07eafd27ed9c4ea180d12eb903958401  gcc/analyzer/inlining-iterator.h
! c5746d0d589ba67e6a87e28ed6980dce  gcc/analyzer/kf-analyzer.cc
  f939ceabcab4e031bd8a0960eaa768dc  gcc/analyzer/kf-lang-cp.cc
  d36a60c41884b753cc7b96c9b4618d5d  gcc/analyzer/kf.cc
  cb79a8daeada17a63bea055278c1e25c  gcc/analyzer/known-function-manager.cc
  03a32d089b911aa5389a2b9006795f83  gcc/analyzer/known-function-manager.h
! d91bbce748c3f8a03c77d0b0ddc40626  gcc/analyzer/pending-diagnostic.cc
! 8c4506933b8c8798adedf5a429035117  gcc/analyzer/pending-diagnostic.h
  87f808d699834f4b511d01124e808634  gcc/analyzer/program-point.cc
  f7322383aecfa4152a4484c8cd3b66a1  gcc/analyzer/program-point.h
! 9fa31dfc758adf6a9e8567ffd8257f99  gcc/analyzer/program-state.cc
! 92294eeef442da5833ebd35cfd350dba  gcc/analyzer/program-state.h
  fe06c3c30ebc980430c4383a990fb092  gcc/analyzer/ranges.cc
  f0acfecca8767075f2b2e9bc04089741  gcc/analyzer/ranges.h
  58fb7d339e1159812f9592e6de91dfa3  gcc/analyzer/reachability.h
! 09fcfcccd5740db8d20ee08395e67fad  gcc/analyzer/record-layout.cc
! 137aeb98f719cee5d7abad8c51521e21  gcc/analyzer/record-layout.h
  ae849797eb29fb52bbe52783a1ee2d3b  gcc/analyzer/region-model-asm.cc
  a6df7126d3a84e80baac78fb613d0c28  gcc/analyzer/region-model-manager.cc
  9195fc0db12dd5628901e3d6615a1f44  gcc/analyzer/region-model-manager.h
  37e8578fcafa5394667c58349c364c6b  gcc/analyzer/region-model-reachability.cc
  34ab719ce08057bb88f8bf20e7c3c959  gcc/analyzer/region-model-reachability.h
! da8f6be6d2a9cc3c1cbf2935c1b51c4d  gcc/analyzer/region-model.cc
! 708ca693237680beb7b771c4e68495db  gcc/analyzer/region-model.h
  c3f5de40a834f109e8a799af75eb37cd  gcc/analyzer/region.cc
  6e644055b512784328073293c1d0a0c7  gcc/analyzer/region.h
! d04fe2c268348275bff2ee3780c30c94  gcc/analyzer/sm-fd.cc
  7a28d77074f7b1b5ea7b79aa82f21698  gcc/analyzer/sm-fd.dot
! b01164eb7e5747c4af6762a8f3c7444e  gcc/analyzer/sm-file.cc
  38e55000eed6a24e2db959ceb1b99c4f  gcc/analyzer/sm-file.dot
! 110d468df852f5be58d5db347628239a  gcc/analyzer/sm-malloc.cc
  e0c92f0f51c6cc6d8c51b020ac66c866  gcc/analyzer/sm-malloc.dot
  141ae863b6f281cf450bbc5d30e58076  gcc/analyzer/sm-pattern-test.cc
  a1eebf5f1420ee989ee9218858607d5b  gcc/analyzer/sm-sensitive.cc
  6da176ebc525b6cbf863d0f63675bdd5  gcc/analyzer/sm-signal.cc
  49206d1ec370c4b174cf135e5d4d7da1  gcc/analyzer/sm-taint.cc
! 84610f958093b6cc31feec14da8420f4  gcc/analyzer/sm.cc
! a63d323937d9606eac3fbec40182bd9b  gcc/analyzer/sm.h
  956efeb36f5f9266262e298ea01834b6  gcc/analyzer/state-purge.cc
  4b6805c85c83335ce9698d34e7bc061c  gcc/analyzer/state-purge.h
  f94c8c0f96bf04b92f13d9cef9a2fc8b  gcc/analyzer/store.cc
! e87fed78000d6a03b9e4b79c55cd4cb6  gcc/analyzer/store.h
  86ff86d74970d23c852c158ca4d5ae29  gcc/analyzer/supergraph.cc
  7f300defa9e3114d228cc7eb3ddd8b61  gcc/analyzer/supergraph.h
  cd23a3be8c0ce4de780f305ab42b6bf0  gcc/analyzer/svalue.cc
--- 3082,3150 ----
  269242e7e59c0f923c78aaa080a5ca62  gcc/analyzer/call-string.h
  0c33640a03f3ee40fe825f5f1e2ad950  gcc/analyzer/call-summary.cc
  bc77cd1e5aec40e5623c49cb8974b3d4  gcc/analyzer/call-summary.h
! fb9d1e32dc6c3b1ef18905c09c9fa657  gcc/analyzer/checker-event.cc
! c6d3fa1382c4d33f5b729f45daad68ce  gcc/analyzer/checker-event.h
  c4687f7aa3cb8374e9f9a685ba14ee0e  gcc/analyzer/checker-path.cc
! bbcfe5f4c035b0e04c335bc110c841c0  gcc/analyzer/checker-path.h
! 41fcbb178345b1c1d87e0271919d1aac  gcc/analyzer/common.h
  60fa08b701b562f0dde13dd1877ddcd1  gcc/analyzer/complexity.cc
  9113c9c3a7167f3119fc0552883611b5  gcc/analyzer/complexity.h
  47a07fbad11f20bb3af463bdfa71f998  gcc/analyzer/constraint-manager.cc
  a23c7325bc2b24e45ed69ba1e934aedc  gcc/analyzer/constraint-manager.h
! 21af69a3c5b6f2c556fa1e09d5a9ca99  gcc/analyzer/diagnostic-manager.cc
  f44cc8516da447fede0702befbb862f6  gcc/analyzer/diagnostic-manager.h
! 97c11311ab26e3134a6a2dcfae21f127  gcc/analyzer/engine.cc
  acc1f4f20384df654fa365f64ad6a6f9  gcc/analyzer/engine.h
  c31696d47421f74a13cc907d022b3935  gcc/analyzer/event-loc-info.h
! 44ededce237e02c414bf842c82718cee  gcc/analyzer/exploded-graph.h
  7330a37bff32b8bb4d971ffc043827a2  gcc/analyzer/feasible-graph.cc
  af675735c50099e3d3123b9ef8d97dad  gcc/analyzer/feasible-graph.h
  6b62290e89378d4a19f4db1d7a4fc427  gcc/analyzer/function-set.cc
  73d77bbed77b45ed4b05881eeccbc992  gcc/analyzer/function-set.h
  eac039e9d9e8b9cb384a8ba136fdbf78  gcc/analyzer/infinite-loop.cc
! 8a548b26c22b5aee1504a1d0c15e0854  gcc/analyzer/infinite-recursion.cc
  07eafd27ed9c4ea180d12eb903958401  gcc/analyzer/inlining-iterator.h
! 9289c540d66da127e56aa983ca018af6  gcc/analyzer/kf-analyzer.cc
  f939ceabcab4e031bd8a0960eaa768dc  gcc/analyzer/kf-lang-cp.cc
  d36a60c41884b753cc7b96c9b4618d5d  gcc/analyzer/kf.cc
  cb79a8daeada17a63bea055278c1e25c  gcc/analyzer/known-function-manager.cc
  03a32d089b911aa5389a2b9006795f83  gcc/analyzer/known-function-manager.h
! 8fb5dbd300e0b21f4dbfa0c6c2252265  gcc/analyzer/pending-diagnostic.cc
! 801dd659a2e39b1419f0cf63f793e632  gcc/analyzer/pending-diagnostic.h
  87f808d699834f4b511d01124e808634  gcc/analyzer/program-point.cc
  f7322383aecfa4152a4484c8cd3b66a1  gcc/analyzer/program-point.h
! 9589225e5611ad16b14b8a12bf36120b  gcc/analyzer/program-state.cc
! c97e443d99b96358049864f06819f73a  gcc/analyzer/program-state.h
  fe06c3c30ebc980430c4383a990fb092  gcc/analyzer/ranges.cc
  f0acfecca8767075f2b2e9bc04089741  gcc/analyzer/ranges.h
  58fb7d339e1159812f9592e6de91dfa3  gcc/analyzer/reachability.h
! 65bf29d94a5ee15e6710eb43f16fc235  gcc/analyzer/record-layout.cc
! 57354826ca1c448180149706333f891f  gcc/analyzer/record-layout.h
  ae849797eb29fb52bbe52783a1ee2d3b  gcc/analyzer/region-model-asm.cc
  a6df7126d3a84e80baac78fb613d0c28  gcc/analyzer/region-model-manager.cc
  9195fc0db12dd5628901e3d6615a1f44  gcc/analyzer/region-model-manager.h
  37e8578fcafa5394667c58349c364c6b  gcc/analyzer/region-model-reachability.cc
  34ab719ce08057bb88f8bf20e7c3c959  gcc/analyzer/region-model-reachability.h
! 91ead31c0782dac4955c4a1a4d0bc1d2  gcc/analyzer/region-model.cc
! 3625b99b6aa470fbd2564ca0941260b1  gcc/analyzer/region-model.h
  c3f5de40a834f109e8a799af75eb37cd  gcc/analyzer/region.cc
  6e644055b512784328073293c1d0a0c7  gcc/analyzer/region.h
! 177e877832850e8f6423642df0d999fc  gcc/analyzer/sm-fd.cc
  7a28d77074f7b1b5ea7b79aa82f21698  gcc/analyzer/sm-fd.dot
! 5047ef0b8d2074e82cd1c31e14b486bb  gcc/analyzer/sm-file.cc
  38e55000eed6a24e2db959ceb1b99c4f  gcc/analyzer/sm-file.dot
! 91fc92cde065262460929de2f1015b52  gcc/analyzer/sm-malloc.cc
  e0c92f0f51c6cc6d8c51b020ac66c866  gcc/analyzer/sm-malloc.dot
  141ae863b6f281cf450bbc5d30e58076  gcc/analyzer/sm-pattern-test.cc
  a1eebf5f1420ee989ee9218858607d5b  gcc/analyzer/sm-sensitive.cc
  6da176ebc525b6cbf863d0f63675bdd5  gcc/analyzer/sm-signal.cc
  49206d1ec370c4b174cf135e5d4d7da1  gcc/analyzer/sm-taint.cc
! 0800cbb02ef79d9288ce09defd9c419c  gcc/analyzer/sm.cc
! 072aa5171d5c8c621b5a006ec2e6d969  gcc/analyzer/sm.h
  956efeb36f5f9266262e298ea01834b6  gcc/analyzer/state-purge.cc
  4b6805c85c83335ce9698d34e7bc061c  gcc/analyzer/state-purge.h
  f94c8c0f96bf04b92f13d9cef9a2fc8b  gcc/analyzer/store.cc
! f0810d512591ebc1aa9ec31d1bb3b192  gcc/analyzer/store.h
  86ff86d74970d23c852c158ca4d5ae29  gcc/analyzer/supergraph.cc
  7f300defa9e3114d228cc7eb3ddd8b61  gcc/analyzer/supergraph.h
  cd23a3be8c0ce4de780f305ab42b6bf0  gcc/analyzer/svalue.cc
*************** cd23a3be8c0ce4de780f305ab42b6bf0  gcc/an
*** 3151,3157 ****
  336e5422328aefad109c05dff847934f  gcc/analyzer/symbol.h
  c60f1ef3d02e040c88d9e217de84ee81  gcc/analyzer/trimmed-graph.cc
  2d528f5f807adc6941ed2a20cc193c7f  gcc/analyzer/trimmed-graph.h
! 1c81af4bc406ae0877330e02ea57edad  gcc/analyzer/varargs.cc
  cc81acb908eb9d6b13038a95c3a10a9c  gcc/analyzer/varargs.dot
  eeb42b412edc2884a4c60d6f38f7473b  gcc/array-traits.h
  6abcb9777280c69da14835a391a5c347  gcc/asan.cc
--- 3153,3159 ----
  336e5422328aefad109c05dff847934f  gcc/analyzer/symbol.h
  c60f1ef3d02e040c88d9e217de84ee81  gcc/analyzer/trimmed-graph.cc
  2d528f5f807adc6941ed2a20cc193c7f  gcc/analyzer/trimmed-graph.h
! e536d88f5c5cf78ee226a42b013854b7  gcc/analyzer/varargs.cc
  cc81acb908eb9d6b13038a95c3a10a9c  gcc/analyzer/varargs.dot
  eeb42b412edc2884a4c60d6f38f7473b  gcc/array-traits.h
  6abcb9777280c69da14835a391a5c347  gcc/asan.cc
*************** c77616ec7ed7ec81357de9544f955910  gcc/at
*** 3161,3169 ****
  0e1b67f20b5d137d4e1d6915400e406b  gcc/attribs.cc
  1bdf6723b4c88b5b1495f718e4dd00c7  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
! 3049600f55b669dc92c245e5e2d8ee80  gcc/auto-profile.cc
  e229f7b70350c202e4563272e7f07ca4  gcc/auto-profile.h
! b49502046f4647eae48740d67a1ad97e  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
  db748cbed8c442a442779d8d857a3ae4  gcc/backend.h
  d6b885b0c4ea7cf856ba4b84021613ce  gcc/basic-block.h
--- 3163,3171 ----
  0e1b67f20b5d137d4e1d6915400e406b  gcc/attribs.cc
  1bdf6723b4c88b5b1495f718e4dd00c7  gcc/attribs.h
  54fb3cb1cab63227c50a50819ea1a3c3  gcc/auto-inc-dec.cc
! 683717178e4b18589287f75989a52472  gcc/auto-profile.cc
  e229f7b70350c202e4563272e7f07ca4  gcc/auto-profile.h
! ad2d5f7f83620f81560675456886e45d  gcc/avoid-store-forwarding.cc
  b187aaef50f37afeeee1f8239d5aa033  gcc/avoid-store-forwarding.h
  db748cbed8c442a442779d8d857a3ae4  gcc/backend.h
  d6b885b0c4ea7cf856ba4b84021613ce  gcc/basic-block.h
*************** f808dbcc1ad6add5a0867c4b3e03fc4d  gcc/bu
*** 3178,3184 ****
  bec6a30db0391a4a551e8bd86db93219  gcc/builtins.cc
  dd55b2c473c288bdc5752f7da8cc21e7  gcc/builtins.def
  bd61b50b47560dc1324bf507bea5d87e  gcc/builtins.h
! 9a6b7083acc86b674ed7757eb0a98d50  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  823fe168bb0f63a39de62d9f0251a1b5  gcc/c-family/c-ada-spec.cc
  4e83011bee68d9607834ed5335191d65  gcc/c-family/c-ada-spec.h
--- 3180,3186 ----
  bec6a30db0391a4a551e8bd86db93219  gcc/builtins.cc
  dd55b2c473c288bdc5752f7da8cc21e7  gcc/builtins.def
  bd61b50b47560dc1324bf507bea5d87e  gcc/builtins.h
! 97cc58a0d6769a762450ea7b31ca9925  gcc/c-family/ChangeLog
  ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-family/ChangeLog.gimple-classes
  823fe168bb0f63a39de62d9f0251a1b5  gcc/c-family/c-ada-spec.cc
  4e83011bee68d9607834ed5335191d65  gcc/c-family/c-ada-spec.h
*************** ea3fa1f4d7390a105fa3caab4f79aaf7  gcc/c-
*** 3186,3192 ****
  c2c735946b54e5b592fe957bb4732f76  gcc/c-family/c-common.cc
  c273c4ad95ccdbfe677146505900c62e  gcc/c-family/c-common.def
  19fb19e4311805f52f48f30e7873ad2e  gcc/c-family/c-common.h
! 1c57db57b8673a678e1501b694ea87e0  gcc/c-family/c-cppbuiltin.cc
  01db2d5cca29943c49bb372f2137d874  gcc/c-family/c-dump.cc
  3406e6deaa6e96339c86962c3c82e169  gcc/c-family/c-format.cc
  89a27efffabf06afdd7dee7495d2591c  gcc/c-family/c-format.h
--- 3188,3194 ----
  c2c735946b54e5b592fe957bb4732f76  gcc/c-family/c-common.cc
  c273c4ad95ccdbfe677146505900c62e  gcc/c-family/c-common.def
  19fb19e4311805f52f48f30e7873ad2e  gcc/c-family/c-common.h
! 36fce1bd96bd2574b12ccb10c168a57f  gcc/c-family/c-cppbuiltin.cc
  01db2d5cca29943c49bb372f2137d874  gcc/c-family/c-dump.cc
  3406e6deaa6e96339c86962c3c82e169  gcc/c-family/c-format.cc
  89a27efffabf06afdd7dee7495d2591c  gcc/c-family/c-format.h
*************** c273c4ad95ccdbfe677146505900c62e  gcc/c-
*** 3195,3202 ****
  a4b7179d2e948bb7586a9143fbe05593  gcc/c-family/c-indentation.h
  4c01c042c599ee5c7b21aeb2c0cccbe8  gcc/c-family/c-lex.cc
  c880dc584a0fd4908e5df33dd81137b8  gcc/c-family/c-objc.h
! 1876df40eecc9db5f99f1b943e7ed8f3  gcc/c-family/c-omp.cc
! 3a6dcb45673c45ce1464ac5794d8f636  gcc/c-family/c-opts.cc
  2f1a14531d3a436ca9f4aad2812c3898  gcc/c-family/c-pch.cc
  6e53d008a0c4738339154c353a50ff0a  gcc/c-family/c-ppoutput.cc
  9fc831d62cb02feeec158e948abc2b6b  gcc/c-family/c-pragma.cc
--- 3197,3204 ----
  a4b7179d2e948bb7586a9143fbe05593  gcc/c-family/c-indentation.h
  4c01c042c599ee5c7b21aeb2c0cccbe8  gcc/c-family/c-lex.cc
  c880dc584a0fd4908e5df33dd81137b8  gcc/c-family/c-objc.h
! 552a5c4a255884ae21e74aa18e1083d3  gcc/c-family/c-omp.cc
! d7e7f12ccc73b1713acfdb5013fdfa77  gcc/c-family/c-opts.cc
  2f1a14531d3a436ca9f4aad2812c3898  gcc/c-family/c-pch.cc
  6e53d008a0c4738339154c353a50ff0a  gcc/c-family/c-ppoutput.cc
  9fc831d62cb02feeec158e948abc2b6b  gcc/c-family/c-pragma.cc
*************** aaf683e3b02704cfbfab0627d82edf85  gcc/c-
*** 3221,3227 ****
  ce9d2259a1edb5d4b1f728988bd9ef6a  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! 9387f9f9ea02c083e27f3088b779d578  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
--- 3223,3229 ----
  ce9d2259a1edb5d4b1f728988bd9ef6a  gcc/c-family/known-headers.h
  f09c431056b5138e7cfe8376e05de9a6  gcc/c-family/name-hint.h
  d71f74b5b48d9ec5e4e6463e7330121d  gcc/c-family/stub-objc.cc
! 75323c766ef03d72d1857866260bc7c4  gcc/c/ChangeLog
  b1fc09d2244c8e8a72b4df9bc9af30d7  gcc/c/Make-lang.in
  f1e5593aebd5cffb4b3cbffe6bd0860a  gcc/c/c-aux-info.cc
  178d24653bb20936d73bad078e70763c  gcc/c/c-convert.cc
*************** d9c0725d061adffdf400457d91be3aed  gcc/c/
*** 3232,3238 ****
  4be9de2ca25340adb8f350478db6a3d8  gcc/c/c-lang.h
  29c0a26baf73e55c081ac675fa7f87f8  gcc/c/c-objc-common.cc
  757f583d06a3ec98336adbfc92b4e6a8  gcc/c/c-objc-common.h
! 81a0a4ba972e1c94272c01b98813697f  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
  9cef7f8aed78affc01930dfcb3d3185c  gcc/c/c-tree.h
--- 3234,3240 ----
  4be9de2ca25340adb8f350478db6a3d8  gcc/c/c-lang.h
  29c0a26baf73e55c081ac675fa7f87f8  gcc/c/c-objc-common.cc
  757f583d06a3ec98336adbfc92b4e6a8  gcc/c/c-objc-common.h
! 405ec2a7e6b10d3ed5492267cdd23f08  gcc/c/c-parser.cc
  9c122bd6feb8ae4a94420c890e654801  gcc/c/c-parser.h
  9179f46b6a06c7d734278f5ce2c55883  gcc/c/c-tree.def
  9cef7f8aed78affc01930dfcb3d3185c  gcc/c/c-tree.h
*************** dce5f9aa135bb3752695f3103daa686a  gcc/cf
*** 3255,3261 ****
  0d52ee7360736bb3d0306e66c1f3a9ce  gcc/cfgbuild.h
  39bbd18fab17b2880094aa317111df50  gcc/cfgcleanup.cc
  0761d2fe0a8e51aa7ed662e27b66747a  gcc/cfgcleanup.h
! 2f6e6c229dad2f2c253046053ec5f719  gcc/cfgexpand.cc
  1ec4e9a88b7aff0e8dc3577ab103b559  gcc/cfgexpand.h
  748c8fca5e6dfe774ff333205ea9f9be  gcc/cfghooks.cc
  bbad65845fcf9cdbc5137d96f92eacab  gcc/cfghooks.h
--- 3257,3263 ----
  0d52ee7360736bb3d0306e66c1f3a9ce  gcc/cfgbuild.h
  39bbd18fab17b2880094aa317111df50  gcc/cfgcleanup.cc
  0761d2fe0a8e51aa7ed662e27b66747a  gcc/cfgcleanup.h
! f9b44ef75de6a13d29c49c6a328a87bf  gcc/cfgexpand.cc
  1ec4e9a88b7aff0e8dc3577ab103b559  gcc/cfgexpand.h
  748c8fca5e6dfe774ff333205ea9f9be  gcc/cfghooks.cc
  bbad65845fcf9cdbc5137d96f92eacab  gcc/cfghooks.h
*************** b87eab2b04054f0d3cd20768be99c655  gcc/cg
*** 3273,3279 ****
  3be8ee84d005d8a1f5a65ed6a7fce76a  gcc/cgraphunit.cc
  70fa61377ff65ad3f25778a40159f510  gcc/cif-code.def
  6b8842d0342104521107a87804a892e6  gcc/cobol/ChangeLog
! 450df51cf60a6697f9f7d8ba227547f1  gcc/cobol/Make-lang.in
  0a84e784d2bc4066654d2377fc6a2930  gcc/cobol/TODO
  9a13fd3cc88107d0eacd2642a730e64c  gcc/cobol/cbldiag.h
  030342886cc720f11f17d7691f6f24ae  gcc/cobol/cdf-copy.cc
--- 3275,3281 ----
  3be8ee84d005d8a1f5a65ed6a7fce76a  gcc/cgraphunit.cc
  70fa61377ff65ad3f25778a40159f510  gcc/cif-code.def
  6b8842d0342104521107a87804a892e6  gcc/cobol/ChangeLog
! 4aa2f919b02b0317155a96afd51aeb05  gcc/cobol/Make-lang.in
  0a84e784d2bc4066654d2377fc6a2930  gcc/cobol/TODO
  9a13fd3cc88107d0eacd2642a730e64c  gcc/cobol/cbldiag.h
  030342886cc720f11f17d7691f6f24ae  gcc/cobol/cdf-copy.cc
*************** ee4949fbb8e044a8e4f2b3c410068ea2  gcc/co
*** 3285,3300 ****
  aab9bcdb44bef72e1c3a8cd069bfcccd  gcc/cobol/convert.cc
  bdd6fbf13776c7983a16ac857615424c  gcc/cobol/copybook.h
  0a781b261895ff7f99592ae18f32722b  gcc/cobol/dts.h
! a9b94de9dc310de2e8a9dc0619b0f448  gcc/cobol/except.cc
  8208f264c49dfd56f856e8a4229545b9  gcc/cobol/exceptg.h
  24c537bb1367d796de8c91d7fb8ce910  gcc/cobol/gcobc
  1276523bb287dcb395003b230b9462f8  gcc/cobol/gcobol.1
  527925049a81a36c06220d368570f55a  gcc/cobol/gcobol.3
  ee529adcf01d8ec47590b845d67064e2  gcc/cobol/gcobolspec.cc
! 783288b330c35a6e4e7c5305d7a8af9f  gcc/cobol/genapi.cc
! 3e36796912b5946b5476905621c23f88  gcc/cobol/genapi.h
! 76715d80eb92c82c589f36918524fe44  gcc/cobol/gengen.cc
! a55838d98cd220b3d5367d83c32d64c5  gcc/cobol/gengen.h
  f0d89caf87ef5de96b8553aa49e712e3  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
  42723832cb37bac963c95a117b89f2e2  gcc/cobol/genutil.cc
--- 3287,3302 ----
  aab9bcdb44bef72e1c3a8cd069bfcccd  gcc/cobol/convert.cc
  bdd6fbf13776c7983a16ac857615424c  gcc/cobol/copybook.h
  0a781b261895ff7f99592ae18f32722b  gcc/cobol/dts.h
! 659e009bb5ec99fa506eb7f30a3ceb64  gcc/cobol/except.cc
  8208f264c49dfd56f856e8a4229545b9  gcc/cobol/exceptg.h
  24c537bb1367d796de8c91d7fb8ce910  gcc/cobol/gcobc
  1276523bb287dcb395003b230b9462f8  gcc/cobol/gcobol.1
  527925049a81a36c06220d368570f55a  gcc/cobol/gcobol.3
  ee529adcf01d8ec47590b845d67064e2  gcc/cobol/gcobolspec.cc
! bf2ee1e2b09908c918d4ec8650790636  gcc/cobol/genapi.cc
! dd72c11161e06d40fd3d674e841b6994  gcc/cobol/genapi.h
! 9bb3f8235db5eaff8925db3e1664496c  gcc/cobol/gengen.cc
! c6848847819715f0eeb0c129a43131a4  gcc/cobol/gengen.h
  f0d89caf87ef5de96b8553aa49e712e3  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
  42723832cb37bac963c95a117b89f2e2  gcc/cobol/genutil.cc
*************** d44e8c86d57fb704b6c1fbab3464fb9a  gcc/co
*** 3306,3313 ****
  746a2d46b3bc2a5f5663a9d64a78a674  gcc/cobol/lang.opt.urls
  1fc11522ebe3b5f6a4476a4fc671c005  gcc/cobol/lexio.cc
  d3d23cf0118f6d909db4f77c7d753dec  gcc/cobol/lexio.h
! 11ec054763a9e15f6012f08fd2d7d9b8  gcc/cobol/parse.y
! 6de15739e8518d4869a6ff160e45a0ef  gcc/cobol/parse_ante.h
  f76848cec8095aa9b4bda7d8cda8b162  gcc/cobol/parse_util.h
  cb5c9a5236dad8f58a71d23f6278fbd9  gcc/cobol/scan.l
  ea93cc6e5d103955594b1d60c7e1e2c9  gcc/cobol/scan_ante.h
--- 3308,3315 ----
  746a2d46b3bc2a5f5663a9d64a78a674  gcc/cobol/lang.opt.urls
  1fc11522ebe3b5f6a4476a4fc671c005  gcc/cobol/lexio.cc
  d3d23cf0118f6d909db4f77c7d753dec  gcc/cobol/lexio.h
! 7a16a3a15234096d70e3aec4ba7f1da5  gcc/cobol/parse.y
! 9770910367ff280c4f2b3a50667ab467  gcc/cobol/parse_ante.h
  f76848cec8095aa9b4bda7d8cda8b162  gcc/cobol/parse_util.h
  cb5c9a5236dad8f58a71d23f6278fbd9  gcc/cobol/scan.l
  ea93cc6e5d103955594b1d60c7e1e2c9  gcc/cobol/scan_ante.h
*************** f55010fab8b9aabea82c3ac50d031028  gcc/co
*** 3332,3345 ****
  7041e62f0f582b09331732fef4bb9545  gcc/combine-stack-adj.cc
  5d00831740184b5f4f8f133a3a1ffc16  gcc/combine.cc
  2b9ccf7fc2473ef7e36aee9bcf170843  gcc/common.md
! 8045185ca8e24e72801a20d223f8095d  gcc/common.opt
  0fa30baeb636ae24a437473c671f1ddb  gcc/common.opt.urls
  26050db921f73fd87b026dc950bde97b  gcc/common/common-target-def.h
  dae02ebe59cdaaf21611ad354e939ca5  gcc/common/common-target.def
  4a00b1cedd9d15d93e32920b16b3c292  gcc/common/common-target.h
  6a072ad74a92c43b4c4ddaf601c5dba5  gcc/common/common-targhooks.cc
  053301c186b4ed1dbacedc670026f9cf  gcc/common/common-targhooks.h
! 3fe6c7de4961f6aa3ee001889bd0ea14  gcc/common/config/aarch64/aarch64-common.cc
  7004f1c8c062f2b3fa9d5a44f86525a9  gcc/common/config/aarch64/cpuinfo.h
  583d89cf5b4ff63572bfcd107bd598e1  gcc/common/config/alpha/alpha-common.cc
  c54d5f1066ada6f197004c84bc9e6a63  gcc/common/config/arc/arc-common.cc
--- 3334,3347 ----
  7041e62f0f582b09331732fef4bb9545  gcc/combine-stack-adj.cc
  5d00831740184b5f4f8f133a3a1ffc16  gcc/combine.cc
  2b9ccf7fc2473ef7e36aee9bcf170843  gcc/common.md
! 4dd80ccf1713a906ce348e343ae51904  gcc/common.opt
  0fa30baeb636ae24a437473c671f1ddb  gcc/common.opt.urls
  26050db921f73fd87b026dc950bde97b  gcc/common/common-target-def.h
  dae02ebe59cdaaf21611ad354e939ca5  gcc/common/common-target.def
  4a00b1cedd9d15d93e32920b16b3c292  gcc/common/common-target.h
  6a072ad74a92c43b4c4ddaf601c5dba5  gcc/common/common-targhooks.cc
  053301c186b4ed1dbacedc670026f9cf  gcc/common/common-targhooks.h
! 23a82fb833f55a245e4aefdecf963119  gcc/common/config/aarch64/aarch64-common.cc
  7004f1c8c062f2b3fa9d5a44f86525a9  gcc/common/config/aarch64/cpuinfo.h
  583d89cf5b4ff63572bfcd107bd598e1  gcc/common/config/alpha/alpha-common.cc
  c54d5f1066ada6f197004c84bc9e6a63  gcc/common/config/arc/arc-common.cc
*************** e52e97d4d4876d6657fdd48e9f622383  gcc/co
*** 3357,3363 ****
  2da12f05a7597886b6b659f44fb2d0b0  gcc/common/config/gcn/gcn-common.cc
  cba8bad9b28e5a0f8934b00becb13d4a  gcc/common/config/h8300/h8300-common.cc
  b37309f1b28f107ba1954a2a91a61511  gcc/common/config/i386/cpuinfo.h
! eced44c54b29315b29b920d069a16aad  gcc/common/config/i386/i386-common.cc
  9578d58dfbd0a39d8cb71180552ad36a  gcc/common/config/i386/i386-cpuinfo.h
  539245ae5afaff8f57da7ed327bfd7e5  gcc/common/config/i386/i386-isas.h
  2a64c5f639b347964e652ebb1add9831  gcc/common/config/ia64/ia64-common.cc
--- 3359,3365 ----
  2da12f05a7597886b6b659f44fb2d0b0  gcc/common/config/gcn/gcn-common.cc
  cba8bad9b28e5a0f8934b00becb13d4a  gcc/common/config/h8300/h8300-common.cc
  b37309f1b28f107ba1954a2a91a61511  gcc/common/config/i386/cpuinfo.h
! 1ef6d5f92ee90c5c6d66c6caebd7fe08  gcc/common/config/i386/i386-common.cc
  9578d58dfbd0a39d8cb71180552ad36a  gcc/common/config/i386/i386-cpuinfo.h
  539245ae5afaff8f57da7ed327bfd7e5  gcc/common/config/i386/i386-isas.h
  2a64c5f639b347964e652ebb1add9831  gcc/common/config/ia64/ia64-common.cc
*************** f842f1b8595f3ac795ba92c2b07085e6  gcc/co
*** 3378,3384 ****
  03a53ecd36b397fbe0846ead66505e2d  gcc/common/config/pa/pa-common.cc
  1fbcfc1a92bb13e4405bc75767cf8a36  gcc/common/config/pdp11/pdp11-common.cc
  7ee5967300d3c96a608eea63008aa893  gcc/common/config/pru/pru-common.cc
! c15ef3710d0fea7363eec1a012fae3ac  gcc/common/config/riscv/riscv-common.cc
  8a5a4ee26b110f44497208d1b31e3503  gcc/common/config/riscv/riscv-ext-bitmask.def
  08537bef63b33fd56aeb2a292c9a207a  gcc/common/config/rs6000/rs6000-common.cc
  9ddaceac9f81b4798f64241b273f8e1c  gcc/common/config/rx/rx-common.cc
--- 3380,3386 ----
  03a53ecd36b397fbe0846ead66505e2d  gcc/common/config/pa/pa-common.cc
  1fbcfc1a92bb13e4405bc75767cf8a36  gcc/common/config/pdp11/pdp11-common.cc
  7ee5967300d3c96a608eea63008aa893  gcc/common/config/pru/pru-common.cc
! 6f7a26cf1a88b7872071faa582e63b9b  gcc/common/config/riscv/riscv-common.cc
  8a5a4ee26b110f44497208d1b31e3503  gcc/common/config/riscv/riscv-ext-bitmask.def
  08537bef63b33fd56aeb2a292c9a207a  gcc/common/config/rs6000/rs6000-common.cc
  9ddaceac9f81b4798f64241b273f8e1c  gcc/common/config/rx/rx-common.cc
*************** e2d80b89552da0c6b4cb6bede3b2e573  gcc/co
*** 3456,3465 ****
  065e0643d90a8831e9495b5ce2c12b0d  gcc/config/aarch64/aarch64-tune.md
  06480b67fa44a0b9fa7de2ed778a3df9  gcc/config/aarch64/aarch64-tuning-flags.def
  a5cfcce7c9dd86a597161f8bde3497bc  gcc/config/aarch64/aarch64-vxworks.h
! 7c04193698601fc8b2407105571b4a5d  gcc/config/aarch64/aarch64.cc
  4c2226a017b612867a61db1f7929ad43  gcc/config/aarch64/aarch64.h
  b0c9504f794c9543f15ac542746c9931  gcc/config/aarch64/aarch64.md
! 84c23cd68c90a9be4b986aa7009ba1c9  gcc/config/aarch64/aarch64.opt
  21fd50b19307096b8be37549ae0f6f77  gcc/config/aarch64/aarch64.opt.urls
  7b468a20f0362cbe02c7699720a962fa  gcc/config/aarch64/arm_acle.h
  d8c2d46b77748c711b5354380ee49819  gcc/config/aarch64/arm_bf16.h
--- 3458,3467 ----
  065e0643d90a8831e9495b5ce2c12b0d  gcc/config/aarch64/aarch64-tune.md
  06480b67fa44a0b9fa7de2ed778a3df9  gcc/config/aarch64/aarch64-tuning-flags.def
  a5cfcce7c9dd86a597161f8bde3497bc  gcc/config/aarch64/aarch64-vxworks.h
! fd9db3d02c37f812e8e9bd6671285dec  gcc/config/aarch64/aarch64.cc
  4c2226a017b612867a61db1f7929ad43  gcc/config/aarch64/aarch64.h
  b0c9504f794c9543f15ac542746c9931  gcc/config/aarch64/aarch64.md
! ae13780a8296e9c52f9e9b8cd95dc312  gcc/config/aarch64/aarch64.opt
  21fd50b19307096b8be37549ae0f6f77  gcc/config/aarch64/aarch64.opt.urls
  7b468a20f0362cbe02c7699720a962fa  gcc/config/aarch64/arm_acle.h
  d8c2d46b77748c711b5354380ee49819  gcc/config/aarch64/arm_bf16.h
*************** b48390d42ed25b5de4f864c39b3032b4  gcc/co
*** 3562,3578 ****
  7fd8ae0f98ae82f40fbf454d13369af4  gcc/config/arc/arc-c.cc
  3b86b7efc5ce0282ba18f254e565cbc1  gcc/config/arc/arc-c.def
  8c1288935121a21d6366a02ae45ebb96  gcc/config/arc/arc-cpus.def
! e9f2704f4d533052217498daeb6039e9  gcc/config/arc/arc-modes.def
  9b5d6d3d6cddb8822caaa79aa80feb3c  gcc/config/arc/arc-options.def
  e568b093a31424a4370af8fa48e7435f  gcc/config/arc/arc-opts.h
  fa51eae4a4a285a91dedb91fc0246a15  gcc/config/arc/arc-passes.def
! ca0f368e9dc0029f1bd04462f37bff1b  gcc/config/arc/arc-protos.h
  e54824657551f1b95cd19d0a50bef8b3  gcc/config/arc/arc-simd.h
  e4a75970451275f37c431cddbd360dce  gcc/config/arc/arc-tables.opt
  6704645d075bf670b5ed5d77f0a88b86  gcc/config/arc/arc-tables.opt.urls
! 70c8e8381e886f7e29e9331e3062a5b7  gcc/config/arc/arc.cc
  7571a4c51258ecb3cc685c010427e67b  gcc/config/arc/arc.h
! 1fa49626336ccb287a77a7c72d57a372  gcc/config/arc/arc.md
  5e49444e76be2e50b3f491529836f101  gcc/config/arc/arc.opt
  37a4012c7ff454831fdb2049d8fa1e27  gcc/config/arc/arc.opt.urls
  6501826900ef8a0676f77ac8ebf5ccd9  gcc/config/arc/arc600.md
--- 3564,3580 ----
  7fd8ae0f98ae82f40fbf454d13369af4  gcc/config/arc/arc-c.cc
  3b86b7efc5ce0282ba18f254e565cbc1  gcc/config/arc/arc-c.def
  8c1288935121a21d6366a02ae45ebb96  gcc/config/arc/arc-cpus.def
! bec816c59fd9c7200a546fc8dd0eac07  gcc/config/arc/arc-modes.def
  9b5d6d3d6cddb8822caaa79aa80feb3c  gcc/config/arc/arc-options.def
  e568b093a31424a4370af8fa48e7435f  gcc/config/arc/arc-opts.h
  fa51eae4a4a285a91dedb91fc0246a15  gcc/config/arc/arc-passes.def
! b2e606b88879370871146df60afc66a7  gcc/config/arc/arc-protos.h
  e54824657551f1b95cd19d0a50bef8b3  gcc/config/arc/arc-simd.h
  e4a75970451275f37c431cddbd360dce  gcc/config/arc/arc-tables.opt
  6704645d075bf670b5ed5d77f0a88b86  gcc/config/arc/arc-tables.opt.urls
! ca9c4d0d766fbdffac7a35699768f3c6  gcc/config/arc/arc.cc
  7571a4c51258ecb3cc685c010427e67b  gcc/config/arc/arc.h
! 4cadddca7ac158eaad53c0fe55f8523d  gcc/config/arc/arc.md
  5e49444e76be2e50b3f491529836f101  gcc/config/arc/arc.opt
  37a4012c7ff454831fdb2049d8fa1e27  gcc/config/arc/arc.opt.urls
  6501826900ef8a0676f77ac8ebf5ccd9  gcc/config/arc/arc600.md
*************** a6c8d11dbc1fab218405531bf2476e24  gcc/co
*** 3591,3597 ****
  ece8354f31c69ce2bad8b1af869d70b7  gcc/config/arc/genmultilib.awk
  af77dcb21d43cb0e647fb24fcba56e57  gcc/config/arc/genoptions.awk
  47b2c36765c0f4b5eb537a72bc32e9c4  gcc/config/arc/linux.h
! 645b64af66baac819e623f52227d24b3  gcc/config/arc/predicates.md
  cadfbc5633eee7fc0d364e10df21da63  gcc/config/arc/simdext.md
  fe307ea249223c9530e784c8fc5c6fc0  gcc/config/arc/t-arc
  efbc0ac68a9a367ae71e2270f5e67e97  gcc/config/arc/t-multilib
--- 3593,3599 ----
  ece8354f31c69ce2bad8b1af869d70b7  gcc/config/arc/genmultilib.awk
  af77dcb21d43cb0e647fb24fcba56e57  gcc/config/arc/genoptions.awk
  47b2c36765c0f4b5eb537a72bc32e9c4  gcc/config/arc/linux.h
! c09775c76420a32368d668660a3f5a4b  gcc/config/arc/predicates.md
  cadfbc5633eee7fc0d364e10df21da63  gcc/config/arc/simdext.md
  fe307ea249223c9530e784c8fc5c6fc0  gcc/config/arc/t-arc
  efbc0ac68a9a367ae71e2270f5e67e97  gcc/config/arc/t-multilib
*************** d37f092206fc4c0379cee5e5fc01b654  gcc/co
*** 3745,3754 ****
  0f30b0a73f6c1a84b2ba73050f568645  gcc/config/avr/avr-passes.def
  5e1a1c5c73b0e9dbabe637fa8700bf6e  gcc/config/avr/avr-protos.h
  eb753641e5bf09dbcc2be97e61be8767  gcc/config/avr/avr-stdint.h
! 78caecca99df5a6a9281a59cbb1f4940  gcc/config/avr/avr.cc
  08a0b2010b152c01b9bb5883c3d62b7f  gcc/config/avr/avr.h
  3d964ad6aff7842114bb72be953b8364  gcc/config/avr/avr.md
! 076d1efacbf67abfb55af3f4a6d35b43  gcc/config/avr/avr.opt
  f53384c1aec1ca9f9bbe9dd81baace9a  gcc/config/avr/avr.opt.urls
  e6d58e7505c28a23d3cd4e70e534521e  gcc/config/avr/avrlibc.h
  441eaa03acda9ba9c8febfe4aab09aaf  gcc/config/avr/builtins.def
--- 3747,3756 ----
  0f30b0a73f6c1a84b2ba73050f568645  gcc/config/avr/avr-passes.def
  5e1a1c5c73b0e9dbabe637fa8700bf6e  gcc/config/avr/avr-protos.h
  eb753641e5bf09dbcc2be97e61be8767  gcc/config/avr/avr-stdint.h
! 43eb60436b7399e8fb4c76e8d1374edc  gcc/config/avr/avr.cc
  08a0b2010b152c01b9bb5883c3d62b7f  gcc/config/avr/avr.h
  3d964ad6aff7842114bb72be953b8364  gcc/config/avr/avr.md
! 1bac38e16b25dcdb993b743133b6bad5  gcc/config/avr/avr.opt
  f53384c1aec1ca9f9bbe9dd81baace9a  gcc/config/avr/avr.opt.urls
  e6d58e7505c28a23d3cd4e70e534521e  gcc/config/avr/avrlibc.h
  441eaa03acda9ba9c8febfe4aab09aaf  gcc/config/avr/builtins.def
*************** e89c0c1a7b28f107b53b364765ee06a9  gcc/co
*** 3960,3975 ****
  f562bceab670643f983022c708caa29c  gcc/config/gcn/gcn-devices.def
  ff3ae1701a0dc72a48dd18a907796d2e  gcc/config/gcn/gcn-hsa.h
  491ab7557adb9ed61fba81e4f5b96dc2  gcc/config/gcn/gcn-modes.def
! 2258d13b4a75d456f7f0d88dac6c6b8b  gcc/config/gcn/gcn-opts.h
  b395ed990d9e6d7c2698fdd602685d3f  gcc/config/gcn/gcn-protos.h
  96a52bdb8005bdd8f36552a27a7234d2  gcc/config/gcn/gcn-run.cc
  1dbed4e12cf62ae67464d874f1e2e9e8  gcc/config/gcn/gcn-tables.opt
  ca8c1935ac88d760dc3a5b7e97558f28  gcc/config/gcn/gcn-tables.opt.urls
  23106fa0b82354400a9c82b82a9af33a  gcc/config/gcn/gcn-tree.cc
  6a8bbbcc3aeaabb5764442677cc5e730  gcc/config/gcn/gcn-valu.md
! e8cb8169e5e20b62bcb93eb3f52ed05e  gcc/config/gcn/gcn.cc
  686d66a24f66638a6a8dc76ddae3acb6  gcc/config/gcn/gcn.h
! ec56b3b46deea86778d1b3906f48197a  gcc/config/gcn/gcn.md
  ea362cc71f1b9679e105d57822167b51  gcc/config/gcn/gcn.opt
  6c96a5ccd826ec5a9ddf7ffe7fda572d  gcc/config/gcn/gcn.opt.urls
  6d70e3b6694d21aaf0fc6f1764858c4e  gcc/config/gcn/gen-gcn-device-macros.awk
--- 3962,3977 ----
  f562bceab670643f983022c708caa29c  gcc/config/gcn/gcn-devices.def
  ff3ae1701a0dc72a48dd18a907796d2e  gcc/config/gcn/gcn-hsa.h
  491ab7557adb9ed61fba81e4f5b96dc2  gcc/config/gcn/gcn-modes.def
! 6dc006161b26192d57c73a8d136a24a2  gcc/config/gcn/gcn-opts.h
  b395ed990d9e6d7c2698fdd602685d3f  gcc/config/gcn/gcn-protos.h
  96a52bdb8005bdd8f36552a27a7234d2  gcc/config/gcn/gcn-run.cc
  1dbed4e12cf62ae67464d874f1e2e9e8  gcc/config/gcn/gcn-tables.opt
  ca8c1935ac88d760dc3a5b7e97558f28  gcc/config/gcn/gcn-tables.opt.urls
  23106fa0b82354400a9c82b82a9af33a  gcc/config/gcn/gcn-tree.cc
  6a8bbbcc3aeaabb5764442677cc5e730  gcc/config/gcn/gcn-valu.md
! 26fdf7c4c4217a569734143da4dd7b9c  gcc/config/gcn/gcn.cc
  686d66a24f66638a6a8dc76ddae3acb6  gcc/config/gcn/gcn.h
! 0b4e5b8405a5ddd4835814731a96a8b4  gcc/config/gcn/gcn.md
  ea362cc71f1b9679e105d57822167b51  gcc/config/gcn/gcn.opt
  6c96a5ccd826ec5a9ddf7ffe7fda572d  gcc/config/gcn/gcn.opt.urls
  6d70e3b6694d21aaf0fc6f1764858c4e  gcc/config/gcn/gen-gcn-device-macros.awk
*************** d3fb594d11281112ff8d8f304a000c4e  gcc/co
*** 4154,4176 ****
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! d62c059bfedb78bff7190cf4301c1878  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
! 97393080d15005c11dc8db98af1eb116  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
  66732512f01bad0bbb26cb3c09ec773e  gcc/config/i386/i386-isa.def
  795643c7d23acf02568d7fa7acad0138  gcc/config/i386/i386-modes.def
! ae55d83d5b332e663522f2352f5a3282  gcc/config/i386/i386-options.cc
  08c877d750ab52ddb4fe7c99c90d62de  gcc/config/i386/i386-options.h
  02c486451c524cfc143358e07b88cd70  gcc/config/i386/i386-opts.h
  2b4efb0edf861dd06ddc1445aa9e4d05  gcc/config/i386/i386-passes.def
! 1e4f342fabb9b3deea3614a7ce6ba9af  gcc/config/i386/i386-protos.h
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  b19c27e8a900f9eeb7d73e2bb4b8d313  gcc/config/i386/i386-rust.cc
  24065393854cd1e08e3285bd707210fe  gcc/config/i386/i386-rust.h
! cc716f41ed6e19d37555fe79d84d5142  gcc/config/i386/i386.cc
! 2eb1b22e4ae1718401757d9a48959841  gcc/config/i386/i386.h
! d96ee267770cfaef2792ef4dc8330f2c  gcc/config/i386/i386.md
  23985b411cb15228b631691265bfefe9  gcc/config/i386/i386.opt
  59cb9adff8fe9d24eed1cfac0c5bf62c  gcc/config/i386/i386.opt.urls
  f22876926ff4a2cb67b105ac266c72ea  gcc/config/i386/i386elf.h
--- 4156,4178 ----
  a4a1a27264871bfba9de0f4fbdb4f3ac  gcc/config/i386/i386-c.cc
  54909bb70e074c14dcf4499a5baedc54  gcc/config/i386/i386-d.cc
  172dcd61afc5800b61ebb688838d9adc  gcc/config/i386/i386-d.h
! 7d5337aec83c93c4ae5aa20e08ce2f08  gcc/config/i386/i386-expand.cc
  c9c3969c00808c9b6809fbeab3e4a1d2  gcc/config/i386/i386-expand.h
! 48afebe713ddd3f5c6c11bca4e216c78  gcc/config/i386/i386-features.cc
  1ee34fa5f2ae92fd7d48419d8fc529f8  gcc/config/i386/i386-features.h
  66732512f01bad0bbb26cb3c09ec773e  gcc/config/i386/i386-isa.def
  795643c7d23acf02568d7fa7acad0138  gcc/config/i386/i386-modes.def
! 407a2fbc00b8213a9a58709ae0f2829c  gcc/config/i386/i386-options.cc
  08c877d750ab52ddb4fe7c99c90d62de  gcc/config/i386/i386-options.h
  02c486451c524cfc143358e07b88cd70  gcc/config/i386/i386-opts.h
  2b4efb0edf861dd06ddc1445aa9e4d05  gcc/config/i386/i386-passes.def
! 63b5b13a05adfde88f41943df6b8fc44  gcc/config/i386/i386-protos.h
  5b778b3296ea91dab0ca82338ca6828d  gcc/config/i386/i386-rust-and-jit.inc
  b19c27e8a900f9eeb7d73e2bb4b8d313  gcc/config/i386/i386-rust.cc
  24065393854cd1e08e3285bd707210fe  gcc/config/i386/i386-rust.h
! d8856025e32aaeabdc544173d48679ae  gcc/config/i386/i386.cc
! 67d28bc93c120f3c30beaecf4f91ad94  gcc/config/i386/i386.h
! 5611bc207a6babace7d5bc4380ae103f  gcc/config/i386/i386.md
  23985b411cb15228b631691265bfefe9  gcc/config/i386/i386.opt
  59cb9adff8fe9d24eed1cfac0c5bf62c  gcc/config/i386/i386.opt.urls
  f22876926ff4a2cb67b105ac266c72ea  gcc/config/i386/i386elf.h
*************** b4cde95b709fc93c90bf4d6b3edc7fd0  gcc/co
*** 4281,4291 ****
  78c5d4aaa3e531354ff15f5de8bbe5f6  gcc/config/i386/x-mingw32
  1453972221e67e9b66910b97c6444e98  gcc/config/i386/x-mingw32-utf8
  458dd4e367214623fc01b5e796d65485  gcc/config/i386/x86-64.h
! b4bf5ad9f215cd28c4f2443dcadaf245  gcc/config/i386/x86-tune-costs.h
  17e3f95274600e3d41c671903847d8ec  gcc/config/i386/x86-tune-sched-atom.cc
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
! e21f7dac76df120789e69fef8e465413  gcc/config/i386/x86-tune-sched.cc
  923a6304c99ebb6bc9509acbe1afd4fd  gcc/config/i386/x86-tune.def
  95b91fd21504348ecd2f8510ebab204c  gcc/config/i386/x86gprintrin.h
  1ef1746c703bfdb9c245f7b7276b7d56  gcc/config/i386/x86intrin.h
--- 4283,4293 ----
  78c5d4aaa3e531354ff15f5de8bbe5f6  gcc/config/i386/x-mingw32
  1453972221e67e9b66910b97c6444e98  gcc/config/i386/x-mingw32-utf8
  458dd4e367214623fc01b5e796d65485  gcc/config/i386/x86-64.h
! 069db6446b18f4cc614043ed93c02e70  gcc/config/i386/x86-tune-costs.h
  17e3f95274600e3d41c671903847d8ec  gcc/config/i386/x86-tune-sched-atom.cc
  acfa3e6ce1f37bbad35e49e06b663ea9  gcc/config/i386/x86-tune-sched-bd.cc
  13fcb5234b2d8208c12932d96efef72b  gcc/config/i386/x86-tune-sched-core.cc
! 386439c1f5e6c412caa51de1d9a2c2e0  gcc/config/i386/x86-tune-sched.cc
  923a6304c99ebb6bc9509acbe1afd4fd  gcc/config/i386/x86-tune.def
  95b91fd21504348ecd2f8510ebab204c  gcc/config/i386/x86gprintrin.h
  1ef1746c703bfdb9c245f7b7276b7d56  gcc/config/i386/x86intrin.h
*************** a47c1d9626258e961f58aaa938dff7c0  gcc/co
*** 4860,4871 ****
  bd2f18deee7e7457f0e33c0ef25eda80  gcc/config/pru/pru-protos.h
  31d45a1306a4a7355fdbff5baa47684f  gcc/config/pru/pru.cc
  ea166a4ea21e8f1dc577c24b5a24d65c  gcc/config/pru/pru.h
! 147f9818d81f5ecaa02b09824ca89f65  gcc/config/pru/pru.md
  d6da8f84e5835bd14f146fc765bcb39d  gcc/config/pru/pru.opt
  cd13b51383c99c08d86250b61fed3805  gcc/config/pru/pru.opt.urls
  540013c309ceb3efb2b16d728b1fc726  gcc/config/pru/t-pru
  a5e691ce14017f2a89283ed510bb78fd  gcc/config/riscv/arch-canonicalize
! 05b752662704585fc33b14aaee77a880  gcc/config/riscv/autovec-opt.md
  47e29021b80dec813828275b077dd7be  gcc/config/riscv/autovec.md
  40e0e0684e3c3a934587129211c4674c  gcc/config/riscv/bitmanip.md
  525889fe38728a8c0ab013c27cb9e4e8  gcc/config/riscv/constraints.md
--- 4862,4873 ----
  bd2f18deee7e7457f0e33c0ef25eda80  gcc/config/pru/pru-protos.h
  31d45a1306a4a7355fdbff5baa47684f  gcc/config/pru/pru.cc
  ea166a4ea21e8f1dc577c24b5a24d65c  gcc/config/pru/pru.h
! d6a3fdc3ae6584fd2346ec32920baaa8  gcc/config/pru/pru.md
  d6da8f84e5835bd14f146fc765bcb39d  gcc/config/pru/pru.opt
  cd13b51383c99c08d86250b61fed3805  gcc/config/pru/pru.opt.urls
  540013c309ceb3efb2b16d728b1fc726  gcc/config/pru/t-pru
  a5e691ce14017f2a89283ed510bb78fd  gcc/config/riscv/arch-canonicalize
! 1413042bfbe300b454638ea3504be62b  gcc/config/riscv/autovec-opt.md
  47e29021b80dec813828275b077dd7be  gcc/config/riscv/autovec.md
  40e0e0684e3c3a934587129211c4674c  gcc/config/riscv/bitmanip.md
  525889fe38728a8c0ab013c27cb9e4e8  gcc/config/riscv/constraints.md
*************** d8e970a7377ae8ee7892f014d5bbc979  gcc/co
*** 4887,4893 ****
  52728cfca05017f727570e4e983fc5fa  gcc/config/riscv/multilib-generator
  80e8994ee9e6abf380e68aca6443d157  gcc/config/riscv/peephole.md
  a3d3fa9142d4e2ed34ead146941c574a  gcc/config/riscv/pic.md
! aa0207e67de9f5a818c1bbd8049e59fc  gcc/config/riscv/predicates.md
  d7a63bbbf6653fc311084e8bb09d713b  gcc/config/riscv/riscv-avlprop.cc
  3b5651b95f6a076ccd28e73bae600e52  gcc/config/riscv/riscv-builtins.cc
  717dabcf24d5f1356542a7716b96af87  gcc/config/riscv/riscv-c.cc
--- 4889,4895 ----
  52728cfca05017f727570e4e983fc5fa  gcc/config/riscv/multilib-generator
  80e8994ee9e6abf380e68aca6443d157  gcc/config/riscv/peephole.md
  a3d3fa9142d4e2ed34ead146941c574a  gcc/config/riscv/pic.md
! 2a71998d95e98219af9b8f38d141546c  gcc/config/riscv/predicates.md
  d7a63bbbf6653fc311084e8bb09d713b  gcc/config/riscv/riscv-avlprop.cc
  3b5651b95f6a076ccd28e73bae600e52  gcc/config/riscv/riscv-builtins.cc
  717dabcf24d5f1356542a7716b96af87  gcc/config/riscv/riscv-c.cc
*************** da4e034d23a8f2754b1dfce0122f286e  gcc/co
*** 4915,4921 ****
  5934e743da72bdc74e1d53f049b127fc  gcc/config/riscv/riscv-string.cc
  b0db0a336461a6390b254a883b8b491a  gcc/config/riscv/riscv-subset.h
  be3e0da2403121c429e21501de9c9b5f  gcc/config/riscv/riscv-target-attr.cc
! b28f841ed84806ad5833d92370fdc994  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  8bb68ed754e01cc6cbd31b250968d7f6  gcc/config/riscv/riscv-vector-builtins-bases.cc
--- 4917,4923 ----
  5934e743da72bdc74e1d53f049b127fc  gcc/config/riscv/riscv-string.cc
  b0db0a336461a6390b254a883b8b491a  gcc/config/riscv/riscv-subset.h
  be3e0da2403121c429e21501de9c9b5f  gcc/config/riscv/riscv-target-attr.cc
! da0ce5c87dd2627be1c3e9c7916b48dc  gcc/config/riscv/riscv-v.cc
  0d419e9df116fed7ce6e0ae15131417e  gcc/config/riscv/riscv-v.h
  c5f3161dedd668dfb126ffb191cfb236  gcc/config/riscv/riscv-vect-permconst.cc
  8bb68ed754e01cc6cbd31b250968d7f6  gcc/config/riscv/riscv-vector-builtins-bases.cc
*************** f51037a9e437f8e9ce7215b2da5ad4e2  gcc/co
*** 4933,4941 ****
  3c65f952c8116cc22f135cab9b639d28  gcc/config/riscv/riscv-vsetvl.cc
  16b7359c0b12895c0d7452fc89879a1a  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! 390ed451a4d0ae3bc8460e8a3727ece7  gcc/config/riscv/riscv.cc
  1e6d5c3cff4825c434ac203d43f0b5ab  gcc/config/riscv/riscv.h
! 8bd37a977d4889f918ddb12b34c3716b  gcc/config/riscv/riscv.md
  fec1c87bba727131a45d4ec4a9ae5490  gcc/config/riscv/riscv.opt
  d1d34490d8b53ec20d70ed9e2e56e3ab  gcc/config/riscv/riscv.opt.urls
  374e3c204946cff8c4be2bcad6641830  gcc/config/riscv/riscv_bitmanip.h
--- 4935,4943 ----
  3c65f952c8116cc22f135cab9b639d28  gcc/config/riscv/riscv-vsetvl.cc
  16b7359c0b12895c0d7452fc89879a1a  gcc/config/riscv/riscv-vsetvl.def
  7082a18dbfc574d47bf71f4d50dd30f9  gcc/config/riscv/riscv-zicfilp.cc
! a77fd800a5af1703ed8f8f20a168682a  gcc/config/riscv/riscv.cc
  1e6d5c3cff4825c434ac203d43f0b5ab  gcc/config/riscv/riscv.h
! 02b3093d583ee8f20e375b44b582091c  gcc/config/riscv/riscv.md
  fec1c87bba727131a45d4ec4a9ae5490  gcc/config/riscv/riscv.opt
  d1d34490d8b53ec20d70ed9e2e56e3ab  gcc/config/riscv/riscv.opt.urls
  374e3c204946cff8c4be2bcad6641830  gcc/config/riscv/riscv_bitmanip.h
*************** bcf728ad2379630774fd5bb529d4ee86  gcc/co
*** 4969,4976 ****
  fd8e9517de64ab23821ea1284ea6d7f6  gcc/config/riscv/thead.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! c4272a5cb6f62d49d008d6e9c4d08328  gcc/config/riscv/vector-iterators.md
! 2aac5fc6721c093a0f679d0e14d196e1  gcc/config/riscv/vector.md
  4ffde0be9b9a0efe78c98b4407d00397  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
  36cba2444ae9c8f107fee34492bd0ed6  gcc/config/riscv/zicond.md
--- 4971,4978 ----
  fd8e9517de64ab23821ea1284ea6d7f6  gcc/config/riscv/thead.md
  b5e46305db1116cc1758b504ea37fe74  gcc/config/riscv/vector-bfloat16.md
  88f7597398d0c8b8b87baba5fd207996  gcc/config/riscv/vector-crypto.md
! 9345c79d96476f90af64e73b779c5ab7  gcc/config/riscv/vector-iterators.md
! 41e0884b2c3fc61b50f0f86eabef18f6  gcc/config/riscv/vector.md
  4ffde0be9b9a0efe78c98b4407d00397  gcc/config/riscv/xiangshan.md
  0f64aaa114ab62a1a46f7ac422d6a129  gcc/config/riscv/zc.md
  36cba2444ae9c8f107fee34492bd0ed6  gcc/config/riscv/zicond.md
*************** dfb9fde7c7559a50905b02c01b6d6ee8  gcc/co
*** 5213,5219 ****
  bc0fb519f0c53f7b5e44aadede6fbfad  gcc/config/s390/tpf.opt
  34c54b547202715f11db388829243402  gcc/config/s390/tpf.opt.urls
  d225211a59c66716b9cad3d9a2f13af4  gcc/config/s390/vecintrin.h
! 8bb1bfb83bd810b3288df759a96e644e  gcc/config/s390/vector.md
  8f88205b80cb5c8a16a0f55c1bbc53ab  gcc/config/s390/vx-builtins.md
  7813da5eac25ac16f589b0319ad43386  gcc/config/s390/x-native
  f9d87cd50e032287752597f9c084e3f5  gcc/config/sh/constraints.md
--- 5215,5221 ----
  bc0fb519f0c53f7b5e44aadede6fbfad  gcc/config/s390/tpf.opt
  34c54b547202715f11db388829243402  gcc/config/s390/tpf.opt.urls
  d225211a59c66716b9cad3d9a2f13af4  gcc/config/s390/vecintrin.h
! 5031b6c6aefef14f5b9cec0a00c593f1  gcc/config/s390/vector.md
  8f88205b80cb5c8a16a0f55c1bbc53ab  gcc/config/s390/vx-builtins.md
  7813da5eac25ac16f589b0319ad43386  gcc/config/s390/x-native
  f9d87cd50e032287752597f9c084e3f5  gcc/config/sh/constraints.md
*************** a9c3cddee4e237141062720b72fe38cd  gcc/co
*** 5478,5484 ****
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  3a1ca7b4fe869dd9b031c27c8ad034e5  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! 6728c6a292b323fbf8394509524d89b8  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5480,5486 ----
  5d31df44fc0a5b17beb74ce0ff38e214  gcc/coroutine-passes.cc
  3a1ca7b4fe869dd9b031c27c8ad034e5  gcc/coverage.cc
  722fb5fda78e55c5af5da72cad78751f  gcc/coverage.h
! 5273668953ef7ccb14c70447bb089ae3  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp
*** 5517,5554 ****
  b09d7ab3506bc7d8aeef0ddfbca588a9  gcc/cp/call.cc
  fce8de27014c109814b3f69be6a5d4f6  gcc/cp/cfns.gperf
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
! 7f90c136ac9f52e1ed04214c1334365d  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! 8e902985df4571deafc1c61f71e4250c  gcc/cp/constexpr.cc
! e6fa17ce8a5bb0d13dda2e770f29e9d3  gcc/cp/constraint.cc
  613233facbf4b0f1cff770ed6c49c666  gcc/cp/contracts.cc
  1f1cd3a021a2cd25741e252145ee8282  gcc/cp/contracts.h
  78ed5e7da2c45931ed1e44da5f9040c9  gcc/cp/coroutines.cc
! be1619275f92c0a0eb6eb83c1e3c7f6b  gcc/cp/coroutines.h
! b001cf8db89c6befecfd660d313a1002  gcc/cp/cp-gimplify.cc
  3bf6da2fd9bef7475fae5ee6d9cdcf15  gcc/cp/cp-lang.cc
  0083c32822e7d365ab0074f1807e8679  gcc/cp/cp-name-hint.h
  7e2d2d0cd98f02686590d57bb37c0de9  gcc/cp/cp-objcp-common.cc
  acb30767d403ad5a0d7ae97437159ebe  gcc/cp/cp-objcp-common.h
! cbd62c9561857481942ff7b69278e505  gcc/cp/cp-trait.def
  ce9f2ccac9e2657417018bc8f8064421  gcc/cp/cp-tree.def
! c6f4b34e5f408e9f57853857df990ec7  gcc/cp/cp-tree.h
  e5ccdda9d62d96ac397910d0fa391b0a  gcc/cp/cp-ubsan.cc
  64450079a2dd9e5a8767bb5e4bf3d904  gcc/cp/cvt.cc
  28a2733b7abed60b2b102105bb7cebaf  gcc/cp/cxx-pretty-print.cc
  955ecfa636599a39229757737e271819  gcc/cp/cxx-pretty-print.h
  c1cc5dac36866c611933c037cc1d6f2f  gcc/cp/cxxapi-data.csv
! 42ffe9727e57e1d15b68c6611cb62019  gcc/cp/decl.cc
  7f116fdc50b24dcb13cdcf096636aef9  gcc/cp/decl.h
  a8747e45489cb64f2f4528a1973fcacf  gcc/cp/decl2.cc
  691a10b3246d19925433648ba9a4ea9a  gcc/cp/dump.cc
! d9ea913fbe43bf0dd45f96433d78f8ed  gcc/cp/error.cc
  86f47b28d673601022d0205cdd718f9d  gcc/cp/except.cc
  f1581b369c1962c764264b1b2af61ca2  gcc/cp/expr.cc
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
! bcd77de9155d0bae5293da112f650e43  gcc/cp/init.cc
  b802e8f4d91963d26f15f2d39ed1f219  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  1352d53c83446655a7fcab07fcdeddc1  gcc/cp/lex.cc
--- 5519,5556 ----
  b09d7ab3506bc7d8aeef0ddfbca588a9  gcc/cp/call.cc
  fce8de27014c109814b3f69be6a5d4f6  gcc/cp/cfns.gperf
  68fc21d4889b1c70ccf89747b98b1fb4  gcc/cp/cfns.h
! 5d3764d67c8143feccf90707b5abb50f  gcc/cp/class.cc
  ee3fb2cc9b9557d3895f527353160bd4  gcc/cp/config-lang.in
! ca47bbc742b617855ec8874e182033e6  gcc/cp/constexpr.cc
! c21cfefd63579862250f4ce93419cbc3  gcc/cp/constraint.cc
  613233facbf4b0f1cff770ed6c49c666  gcc/cp/contracts.cc
  1f1cd3a021a2cd25741e252145ee8282  gcc/cp/contracts.h
  78ed5e7da2c45931ed1e44da5f9040c9  gcc/cp/coroutines.cc
! 1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
! 3bfc4e038713bbc7803f1022c15dd17f  gcc/cp/cp-gimplify.cc
  3bf6da2fd9bef7475fae5ee6d9cdcf15  gcc/cp/cp-lang.cc
  0083c32822e7d365ab0074f1807e8679  gcc/cp/cp-name-hint.h
  7e2d2d0cd98f02686590d57bb37c0de9  gcc/cp/cp-objcp-common.cc
  acb30767d403ad5a0d7ae97437159ebe  gcc/cp/cp-objcp-common.h
! 7c0d44a729210a1f7e1dd8f8c57db320  gcc/cp/cp-trait.def
  ce9f2ccac9e2657417018bc8f8064421  gcc/cp/cp-tree.def
! 54d600007d68548c7febb549b9ed0474  gcc/cp/cp-tree.h
  e5ccdda9d62d96ac397910d0fa391b0a  gcc/cp/cp-ubsan.cc
  64450079a2dd9e5a8767bb5e4bf3d904  gcc/cp/cvt.cc
  28a2733b7abed60b2b102105bb7cebaf  gcc/cp/cxx-pretty-print.cc
  955ecfa636599a39229757737e271819  gcc/cp/cxx-pretty-print.h
  c1cc5dac36866c611933c037cc1d6f2f  gcc/cp/cxxapi-data.csv
! 6fd301ccfc6310c24b0c33c6c662ee08  gcc/cp/decl.cc
  7f116fdc50b24dcb13cdcf096636aef9  gcc/cp/decl.h
  a8747e45489cb64f2f4528a1973fcacf  gcc/cp/decl2.cc
  691a10b3246d19925433648ba9a4ea9a  gcc/cp/dump.cc
! 46923e8a135e0a029572dfae627d10f9  gcc/cp/error.cc
  86f47b28d673601022d0205cdd718f9d  gcc/cp/except.cc
  f1581b369c1962c764264b1b2af61ca2  gcc/cp/expr.cc
  3b7c086cfb4ed89e6ae40a09ca796704  gcc/cp/friend.cc
  3d079dd21f8a1ab95fb2d1f96d799283  gcc/cp/g++spec.cc
  30b9ed40d39cf78b95792ef5dca2aebb  gcc/cp/gen-cxxapi-file.py
! 6d44875db98234b640f99194d69cb96c  gcc/cp/init.cc
  b802e8f4d91963d26f15f2d39ed1f219  gcc/cp/lambda.cc
  ac5d78393361c1bcb930119a896a14ca  gcc/cp/lang-specs.h
  1352d53c83446655a7fcab07fcdeddc1  gcc/cp/lex.cc
*************** aaf76a9b03fd0532d2904aef004fd66a  gcc/cp
*** 5557,5575 ****
  936bd061907a7a899c3285cf17b17674  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
! 600af25aec04b18064ff0ef80ac0e88d  gcc/cp/method.cc
! b74d7d351d096f3c6a1af957c496992b  gcc/cp/module.cc
  06f95ada11e42d69946cf7b65d247c53  gcc/cp/name-lookup.cc
  6e376c0a7ec6c4a14de40885e3b1a0cb  gcc/cp/name-lookup.h
  e7fe06956aada61bcaae5168ad47a9c1  gcc/cp/operators.def
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
! 0e528d878aaffedeabdd48917494f05e  gcc/cp/parser.cc
  e8a3a03873c6294ff25a783941b8d8af  gcc/cp/parser.h
! 88a5d5dc87b9b8f224a7e12894edba4b  gcc/cp/pt.cc
  a121c0a45933b618832614be1fbfd5c7  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  a4930c49ed8f9e6b019399bd1faf86d0  gcc/cp/search.cc
! cf0e2cb39b6f6cbedb4ebac0a2157123  gcc/cp/semantics.cc
  b58bf61fbfed45af179b7104e72a9486  gcc/cp/std-name-hint.gperf
  2425db76c32085977eff047c982cebab  gcc/cp/std-name-hint.h
  e3798db73e0b3e892e772acbe569a5b8  gcc/cp/tree.cc
--- 5559,5577 ----
  936bd061907a7a899c3285cf17b17674  gcc/cp/mapper-client.cc
  6c77b1fab5f6d146677090285a202a50  gcc/cp/mapper-client.h
  44e22b51797f89c9da996523a6d97f1c  gcc/cp/mapper-resolver.cc
! 8bace54cefb0ac9061a21ae69213043d  gcc/cp/method.cc
! 66373351f0c673774da420706ae7affe  gcc/cp/module.cc
  06f95ada11e42d69946cf7b65d247c53  gcc/cp/name-lookup.cc
  6e376c0a7ec6c4a14de40885e3b1a0cb  gcc/cp/name-lookup.h
  e7fe06956aada61bcaae5168ad47a9c1  gcc/cp/operators.def
  813c253a000ee20d8d6598f56edc400e  gcc/cp/optimize.cc
! dc0b4e265d1b58cf6d4f57156ea05f03  gcc/cp/parser.cc
  e8a3a03873c6294ff25a783941b8d8af  gcc/cp/parser.h
! da7df7109bd077b8400db2c6d0ea54b8  gcc/cp/pt.cc
  a121c0a45933b618832614be1fbfd5c7  gcc/cp/ptree.cc
  ee1ddf1e1b9554bb1a10109ce8c6dee5  gcc/cp/rtti.cc
  a4930c49ed8f9e6b019399bd1faf86d0  gcc/cp/search.cc
! 68083e23936f0dbb6579369080ef114f  gcc/cp/semantics.cc
  b58bf61fbfed45af179b7104e72a9486  gcc/cp/std-name-hint.gperf
  2425db76c32085977eff047c982cebab  gcc/cp/std-name-hint.h
  e3798db73e0b3e892e772acbe569a5b8  gcc/cp/tree.cc
*************** e0a7cab8692eb3cbd4b00c4494e48d70  gcc/di
*** 5866,5876 ****
  b14c12c33aee36a4d29601627a1a67da  gcc/diagnostic-core.h
  be405b20597be971120eee5709db8c4a  gcc/diagnostic-diagram.h
  a24233a009f0c9d29e034e6ba63082de  gcc/diagnostic-event-id.h
! 4d0c02c409f73caed9ed53cfbb5b9346  gcc/diagnostic-format-html.cc
! 9dd0efe581c7fbd4e35dc41591b0893f  gcc/diagnostic-format-html.h
  1093108f43fadce869c3564274772c1b  gcc/diagnostic-format-json.cc
! 345c346afb911b8ee2b2acf7af1f1ff2  gcc/diagnostic-format-sarif.cc
! 0c072eafb3b7693492d8dfa4feecad05  gcc/diagnostic-format-sarif.h
  0be3d31017b5c71132af3b72e12f5de2  gcc/diagnostic-format-text.cc
  66be909d880de2f75a896a45bf395ab6  gcc/diagnostic-format-text.h
  15f344af3b22d6354665985c4e102b1f  gcc/diagnostic-format.h
--- 5868,5878 ----
  b14c12c33aee36a4d29601627a1a67da  gcc/diagnostic-core.h
  be405b20597be971120eee5709db8c4a  gcc/diagnostic-diagram.h
  a24233a009f0c9d29e034e6ba63082de  gcc/diagnostic-event-id.h
! 309c2e004772d0e09c55b191936bca49  gcc/diagnostic-format-html.cc
! 4ba6cee23036b1f335a76b93cd23fa29  gcc/diagnostic-format-html.h
  1093108f43fadce869c3564274772c1b  gcc/diagnostic-format-json.cc
! 222621ee15ad8dc82e7fab2f43da3304  gcc/diagnostic-format-sarif.cc
! 7be541fe41a4744f9206e99f8ad0609e  gcc/diagnostic-format-sarif.h
  0be3d31017b5c71132af3b72e12f5de2  gcc/diagnostic-format-text.cc
  66be909d880de2f75a896a45bf395ab6  gcc/diagnostic-format-text.h
  15f344af3b22d6354665985c4e102b1f  gcc/diagnostic-format.h
*************** e472f6066cc64e9f1cee0136404f0751  gcc/di
*** 5881,5899 ****
  124a9446918f0c1e7a8586ac4aea6729  gcc/diagnostic-macro-unwinding.h
  065e0c81be159417eacd100742107ecc  gcc/diagnostic-metadata.h
  e32f47c03714e4be891aef1903c8a04f  gcc/diagnostic-output-file.h
! 3eaf6892d1bb452e9c092534631fb338  gcc/diagnostic-path-output.cc
! 312dae6bb0d15d051e44b2f61ac34fe1  gcc/diagnostic-path.cc
! c8cf51c44328a35a27753d130a351bd5  gcc/diagnostic-path.h
  57bb21a62fc9a6635baf141982b806b9  gcc/diagnostic-show-locus.cc
  81a24429bc8eb52cbe24d574c6ec7e53  gcc/diagnostic-spec.cc
  375a39d1eff397ae7fcdce6e05c76d50  gcc/diagnostic-spec.h
  dabd477d68c54372f8519e7c917d4a11  gcc/diagnostic-url.h
! 30426474001fe0a6629783aad6e8a163  gcc/diagnostic.cc
  03b04b0fb78353ca76570e5ef92cf756  gcc/diagnostic.def
! d4749d21f4918831776571f1c5d5d07d  gcc/diagnostic.h
! bec68218d528467fd119bf2cd02bc358  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
! bb82bca6383082ead28f6f21f0a6223f  gcc/doc/analyzer.texi
  c3ebdb865864f4dbf15cdac76b30aa00  gcc/doc/avr-mmcu.texi
  628200aba31497f381052220465b8927  gcc/doc/bugreport.texi
  519dad6b92ca7405e11a87efd5ddd705  gcc/doc/cfg.texi
--- 5883,5905 ----
  124a9446918f0c1e7a8586ac4aea6729  gcc/diagnostic-macro-unwinding.h
  065e0c81be159417eacd100742107ecc  gcc/diagnostic-metadata.h
  e32f47c03714e4be891aef1903c8a04f  gcc/diagnostic-output-file.h
! 189c345f14efedfae43b913781845f58  gcc/diagnostic-output-spec.cc
! 44a6737f244d23915aa9f9eda34652da  gcc/diagnostic-output-spec.h
! 8da9e55d72a87bdd590edc4f742cbe31  gcc/diagnostic-path-output.cc
! ee02481c976b80310a7bf4c87e03c540  gcc/diagnostic-path.cc
! 43641b42671856d19a05bae380df062a  gcc/diagnostic-path.h
  57bb21a62fc9a6635baf141982b806b9  gcc/diagnostic-show-locus.cc
  81a24429bc8eb52cbe24d574c6ec7e53  gcc/diagnostic-spec.cc
  375a39d1eff397ae7fcdce6e05c76d50  gcc/diagnostic-spec.h
+ 930431adcfe505679a6c92d3a1d93774  gcc/diagnostic-state-to-dot.cc
+ e9f88195e181627e024a3473770576c0  gcc/diagnostic-state.h
  dabd477d68c54372f8519e7c917d4a11  gcc/diagnostic-url.h
! 3b1db2e02c71441242556b601484eea1  gcc/diagnostic.cc
  03b04b0fb78353ca76570e5ef92cf756  gcc/diagnostic.def
! afcf71ccd13e9ee56e647efa1d375ce7  gcc/diagnostic.h
! e2ff50cf5215e2299270f0da4d4d60d0  gcc/digraph.cc
  18e73120a6e21ceac1adce40777000cf  gcc/digraph.h
! 2e5b1d73b7a82cbe4e9f60583946a21b  gcc/doc/analyzer.texi
  c3ebdb865864f4dbf15cdac76b30aa00  gcc/doc/avr-mmcu.texi
  628200aba31497f381052220465b8927  gcc/doc/bugreport.texi
  519dad6b92ca7405e11a87efd5ddd705  gcc/doc/cfg.texi
*************** acdfc663791e4321372e79932070d05d  gcc/do
*** 5909,5915 ****
  81ae745aed5479afae430c578fa29055  gcc/doc/cppinternals.texi
  1a2d44757bb0f40b09493ac3863eba93  gcc/doc/cppopts.texi
  14b0532614eb25d7d84e7efd6664ecf3  gcc/doc/cppwarnopts.texi
! eb448c51f1d94130b38893c8469412c7  gcc/doc/extend.texi
  ddcdbcb699f5252a1c1219d92d87ed8b  gcc/doc/fragments.texi
  cd346f0c279f68138ef08c7addc796de  gcc/doc/frontends.texi
  a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/doc/gcc.texi
--- 5915,5921 ----
  81ae745aed5479afae430c578fa29055  gcc/doc/cppinternals.texi
  1a2d44757bb0f40b09493ac3863eba93  gcc/doc/cppopts.texi
  14b0532614eb25d7d84e7efd6664ecf3  gcc/doc/cppwarnopts.texi
! f4243bbdf114459407337f312fe859bc  gcc/doc/extend.texi
  ddcdbcb699f5252a1c1219d92d87ed8b  gcc/doc/fragments.texi
  cd346f0c279f68138ef08c7addc796de  gcc/doc/frontends.texi
  a28615d9873d98f0d5f4ef8dd3e4c39d  gcc/doc/gcc.texi
*************** ee4c7654f733cefcb73d4fd24f3e1b82  gcc/do
*** 5933,5947 ****
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  8e229b4231160873fbe34414e9f77cf9  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! b19b6280b81373c8d1a052937145c8d8  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  5200cc28a2ab912efe66f0944995c45b  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
  8258127c283eb86e07e4235453e8f336  gcc/doc/libgdiagnostics/conf.py
  ad0e2d047092c8659655e677a43966ee  gcc/doc/libgdiagnostics/index.rst
  642a964912e66e816e321e71891b81ec  gcc/doc/libgdiagnostics/make.bat
! 80b3df289b601fdf68437b788fcf8039  gcc/doc/libgdiagnostics/topics/compatibility.rst
! 6848bc36bd1b675b84d5b8aec59685d8  gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst
  a7bea9ecf04c0cd9ecf9672ecf8322c5  gcc/doc/libgdiagnostics/topics/diagnostics.rst
  1f63cad855ba6a1f526a9e6f34fad68a  gcc/doc/libgdiagnostics/topics/execution-paths.rst
  250f44ab2a231fb8b791329c27af8d3f  gcc/doc/libgdiagnostics/topics/fix-it-hints.rst
--- 5939,5953 ----
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  8e229b4231160873fbe34414e9f77cf9  gcc/doc/install.texi
  0f98706361e63fac2c35c2c4491eaac4  gcc/doc/install.texi2html
! 1781f942f439a3570cd6bee68326d8af  gcc/doc/invoke.texi
  47f1f55b3595acf670eb6193a0cbd933  gcc/doc/languages.texi
  5200cc28a2ab912efe66f0944995c45b  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
  8258127c283eb86e07e4235453e8f336  gcc/doc/libgdiagnostics/conf.py
  ad0e2d047092c8659655e677a43966ee  gcc/doc/libgdiagnostics/index.rst
  642a964912e66e816e321e71891b81ec  gcc/doc/libgdiagnostics/make.bat
! fc24646d649cc0595f067137ff8c08a1  gcc/doc/libgdiagnostics/topics/compatibility.rst
! df6a90c84d8ae008dc9b1d1231e83a14  gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst
  a7bea9ecf04c0cd9ecf9672ecf8322c5  gcc/doc/libgdiagnostics/topics/diagnostics.rst
  1f63cad855ba6a1f526a9e6f34fad68a  gcc/doc/libgdiagnostics/topics/execution-paths.rst
  250f44ab2a231fb8b791329c27af8d3f  gcc/doc/libgdiagnostics/topics/fix-it-hints.rst
*************** a4ee0bae47797ce73f05daef7a07edd4  gcc/ex
*** 6026,6032 ****
  dee0d85cc89e81b4cc185f1c3102811e  gcc/expmed.h
  de0db91482e3d0889769a83bc7e854dc  gcc/expr.cc
  5480b0f834e382e22c92192d7f5a4744  gcc/expr.h
! 197524ebed39ef2a97ae6bd4b1f00b4f  gcc/ext-dce.cc
  2ecf474a8f5380e5027c5b7a745cd736  gcc/fibonacci_heap.cc
  4e78fbbdb0a8c835b984d732a6d97a7b  gcc/fibonacci_heap.h
  ee644c05e4a3461a8c2f5a4a5ea285bd  gcc/file-find.cc
--- 6032,6038 ----
  dee0d85cc89e81b4cc185f1c3102811e  gcc/expmed.h
  de0db91482e3d0889769a83bc7e854dc  gcc/expr.cc
  5480b0f834e382e22c92192d7f5a4744  gcc/expr.h
! b7ef4a8453eca6dbe12f52da45389cf6  gcc/ext-dce.cc
  2ecf474a8f5380e5027c5b7a745cd736  gcc/fibonacci_heap.cc
  4e78fbbdb0a8c835b984d732a6d97a7b  gcc/fibonacci_heap.h
  ee644c05e4a3461a8c2f5a4a5ea285bd  gcc/file-find.cc
*************** a798cdca802a57ffa3473ab610b37c86  gcc/fo
*** 6043,6049 ****
  62673b998414c05d123a9e3cc51be1d9  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 6e21f4fbfc7e3a7df5658fae27be5215  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6049,6055 ----
  62673b998414c05d123a9e3cc51be1d9  gcc/fold-const.cc
  f23dec03425a07611492fa2c061cd7d2  gcc/fold-const.h
  cd4e6baf5d162fbd41160606055f8297  gcc/fold-mem-offsets.cc
! 28d1eb7b184c94b53688b745f7a478a9  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** db184b6596cd9f39834087b0dc7d0ed8  gcc/fo
*** 6094,6103 ****
  e188a9b3cb73106cab46a15d36a12b66  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 223bf1fa3c929785708f08a09d09d3c3  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
! aea31b73f1b7395d6302c57cbbf4bacf  gcc/fortran/interface.cc
  18ca0ff7b9d543b25078031bfadf0d2f  gcc/fortran/intrinsic.cc
  751fb9c42a3297fe53e0e7de9564bb27  gcc/fortran/intrinsic.h
  e201f79869851c4fac61004ffd907741  gcc/fortran/intrinsic.texi
--- 6100,6109 ----
  e188a9b3cb73106cab46a15d36a12b66  gcc/fortran/frontend-passes.cc
  a39f360f255f1ef6dfd91ccefef63e05  gcc/fortran/gfc-diagnostic.def
  bd08c55098f00394b9922e6163c27b92  gcc/fortran/gfc-internals.texi
! 3ade0ff2b8fa793c92016144184cc6b1  gcc/fortran/gfortran.h
  d29bb6813221f46b4cde9df77292c412  gcc/fortran/gfortran.texi
  af66ab40a5434219772b76ad10035e45  gcc/fortran/gfortranspec.cc
! d3fd647d14d10316a01447090ed2bbac  gcc/fortran/interface.cc
  18ca0ff7b9d543b25078031bfadf0d2f  gcc/fortran/intrinsic.cc
  751fb9c42a3297fe53e0e7de9564bb27  gcc/fortran/intrinsic.h
  e201f79869851c4fac61004ffd907741  gcc/fortran/intrinsic.texi
*************** e0ae917f78fe49a1e67153dca52a68b2  gcc/fo
*** 6111,6128 ****
  2e69cb4e17cc2e89fd21228231798659  gcc/fortran/lang.opt
  9c43410ca32214bfab9763966c01547a  gcc/fortran/lang.opt.urls
  33cf77e4943bfb687d3a0bd5fa94ec58  gcc/fortran/libgfortran.h
! 7c68f69965e5bb49d258d83ab6cb2fdd  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
  8181d5e935b96288d9a51fb8138faefb  gcc/fortran/matchexp.cc
  763c37f838e32f5ed8ad600157a0d951  gcc/fortran/mathbuiltins.def
! 998aff51cf65acc4d9efe5abebaaaff6  gcc/fortran/misc.cc
  3b3c13f513e2236a6456d1d3b112404c  gcc/fortran/module.cc
! 50632a137a18f04dcc1b089dbb5f27e3  gcc/fortran/openmp.cc
  5f5bb791665584c12e186daf259f7cdf  gcc/fortran/options.cc
  4dc9068325ab8f3c2ac3f22ee80283da  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
  8282ea5f4e00d5c64da552ea2f31dcc6  gcc/fortran/primary.cc
! e7c28cced34260d6ac3cf77ca856618f  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
  d78cc6d6b48b8228757fb8b674f6ad9b  gcc/fortran/simplify.cc
--- 6117,6134 ----
  2e69cb4e17cc2e89fd21228231798659  gcc/fortran/lang.opt
  9c43410ca32214bfab9763966c01547a  gcc/fortran/lang.opt.urls
  33cf77e4943bfb687d3a0bd5fa94ec58  gcc/fortran/libgfortran.h
! 9fb964ee8c0ef3d4ffb8f95aa2ad3203  gcc/fortran/match.cc
  047778859aa899389e3b7e65c1439faa  gcc/fortran/match.h
  8181d5e935b96288d9a51fb8138faefb  gcc/fortran/matchexp.cc
  763c37f838e32f5ed8ad600157a0d951  gcc/fortran/mathbuiltins.def
! 6e89e2e347d7f6e1576cbda0e958b5bd  gcc/fortran/misc.cc
  3b3c13f513e2236a6456d1d3b112404c  gcc/fortran/module.cc
! 9fac796127e7dc7f2270e027a9afa6ac  gcc/fortran/openmp.cc
  5f5bb791665584c12e186daf259f7cdf  gcc/fortran/options.cc
  4dc9068325ab8f3c2ac3f22ee80283da  gcc/fortran/parse.cc
  c1b40e866a8bbe611aa65278fe2508d3  gcc/fortran/parse.h
  8282ea5f4e00d5c64da552ea2f31dcc6  gcc/fortran/primary.cc
! 59578048f04703cdbab50ae89154e7a7  gcc/fortran/resolve.cc
  8dc2391850ee95634781b6e296a096f6  gcc/fortran/scanner.cc
  3c39e0eef946c7f557ac375f23b9f3db  gcc/fortran/scanner.h
  d78cc6d6b48b8228757fb8b674f6ad9b  gcc/fortran/simplify.cc
*************** d78cc6d6b48b8228757fb8b674f6ad9b  gcc/fo
*** 6130,6150 ****
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
  50451f5a575ab606948f8e72d8cc4721  gcc/fortran/target-memory.h
! 2606769ec348e86fa60fa39bd6871ddf  gcc/fortran/trans-array.cc
  a4f5f15bbfd3cf3b780e3a8875ebf0df  gcc/fortran/trans-array.h
  134a72b3349d427eccb35198acc48a71  gcc/fortran/trans-common.cc
  d555f911945a83db335013815934e941  gcc/fortran/trans-const.cc
  857805820c2a6ac77d2652c610d23de8  gcc/fortran/trans-const.h
  d8e305ea46f72c347ae93f0ab9d8337a  gcc/fortran/trans-decl.cc
! 39bf1908703f27dd0ba11fe2a220248e  gcc/fortran/trans-expr.cc
  619298ebdb7722b23738a67610a81830  gcc/fortran/trans-intrinsic.cc
  9cf7c294c06fdaea67dcd2b9ff2cf5ad  gcc/fortran/trans-io.cc
! 710d1b981b11b3456d5e23839efa4675  gcc/fortran/trans-openmp.cc
! 0396764dfdf16466c5e59e1744c93a42  gcc/fortran/trans-stmt.cc
  9caf8a2f93e6cf5e2a567a3aa18f957c  gcc/fortran/trans-stmt.h
! 85844940ea98853cc5dae2a42043a2fa  gcc/fortran/trans-types.cc
  422959ab20fd75df3766a03597227fd2  gcc/fortran/trans-types.h
! 54131318d1d1405d58e24ee3cc51e594  gcc/fortran/trans.cc
  54e59c2c0e95e495fc23ebb71f917fc5  gcc/fortran/trans.h
  6f893e67fc7e5f247079bd418e61d1e2  gcc/fortran/trigd_fe.inc
  2ddfa7f2ac232123d67959795d85aaa6  gcc/fortran/types.def
--- 6136,6156 ----
  7fc6fb7f159830fc0d98a9cd72e5cdf9  gcc/fortran/symbol.cc
  c9238712914e77b971fde08221a31bf7  gcc/fortran/target-memory.cc
  50451f5a575ab606948f8e72d8cc4721  gcc/fortran/target-memory.h
! b637bbf1b4362769a8e5bf098ea923f0  gcc/fortran/trans-array.cc
  a4f5f15bbfd3cf3b780e3a8875ebf0df  gcc/fortran/trans-array.h
  134a72b3349d427eccb35198acc48a71  gcc/fortran/trans-common.cc
  d555f911945a83db335013815934e941  gcc/fortran/trans-const.cc
  857805820c2a6ac77d2652c610d23de8  gcc/fortran/trans-const.h
  d8e305ea46f72c347ae93f0ab9d8337a  gcc/fortran/trans-decl.cc
! f2b893974de6e6bfb2084ebaf6f1f144  gcc/fortran/trans-expr.cc
  619298ebdb7722b23738a67610a81830  gcc/fortran/trans-intrinsic.cc
  9cf7c294c06fdaea67dcd2b9ff2cf5ad  gcc/fortran/trans-io.cc
! 5b71ca3372e1452f265beeb8ef8a3853  gcc/fortran/trans-openmp.cc
! fb800e2974a1e338a5366fdb5819d11a  gcc/fortran/trans-stmt.cc
  9caf8a2f93e6cf5e2a567a3aa18f957c  gcc/fortran/trans-stmt.h
! 23c951c4924ba8a16582a8b9e5065a87  gcc/fortran/trans-types.cc
  422959ab20fd75df3766a03597227fd2  gcc/fortran/trans-types.h
! 50e5919b17872bccb0564a8d46c33449  gcc/fortran/trans.cc
  54e59c2c0e95e495fc23ebb71f917fc5  gcc/fortran/trans.h
  6f893e67fc7e5f247079bd418e61d1e2  gcc/fortran/trigd_fe.inc
  2ddfa7f2ac232123d67959795d85aaa6  gcc/fortran/types.def
*************** f574663ce227d0be2e77015c008d708b  gcc/fp
*** 6152,6158 ****
  7d49ef8f960daad31201f864eb1933d9  gcc/function-abi.cc
  12d3c07e3c878f7237f904820da28c93  gcc/function-abi.h
  6e9698e4411a03357b6e2b60bc91c827  gcc/function-tests.cc
! df79cb3564c4cc0893489ca92edc7ebb  gcc/function.cc
  da5d04420f440a4a085dc91d92c6bfbb  gcc/function.h
  3c08c56c1de3b165b954ab5c185284c5  gcc/fwprop.cc
  261433f3124bfa2a1421c42d657e0560  gcc/gcc-ar.cc
--- 6158,6164 ----
  7d49ef8f960daad31201f864eb1933d9  gcc/function-abi.cc
  12d3c07e3c878f7237f904820da28c93  gcc/function-abi.h
  6e9698e4411a03357b6e2b60bc91c827  gcc/function-tests.cc
! 1e983b0fc4c9627399efe21cd7b21863  gcc/function.cc
  da5d04420f440a4a085dc91d92c6bfbb  gcc/function.h
  3c08c56c1de3b165b954ab5c185284c5  gcc/fwprop.cc
  261433f3124bfa2a1421c42d657e0560  gcc/gcc-ar.cc
*************** a97b3578ac581dcde94c740fbde65486  gcc/ge
*** 6211,6217 ****
  2d5f79e0543565e8a2c55a08a6ba8393  gcc/genmodes.cc
  78862d5c4a5e1a707d3e63e4857adb04  gcc/genmultilib
  eb743d2855e55ff1778bae601dc38551  gcc/genopinit.cc
! d23c1b55e0de2e6e8884410e882b1b87  gcc/genoutput.cc
  29ee68ccc9844e3580e3e9f6da577778  gcc/genpeep.cc
  28d50caf61c98bed97742228c437ee13  gcc/genpreds.cc
  7ef07a14a26d6ca95f84a510ac497b42  gcc/genrecog.cc
--- 6217,6223 ----
  2d5f79e0543565e8a2c55a08a6ba8393  gcc/genmodes.cc
  78862d5c4a5e1a707d3e63e4857adb04  gcc/genmultilib
  eb743d2855e55ff1778bae601dc38551  gcc/genopinit.cc
! 9148adb889b52d0f37320b52603ebab6  gcc/genoutput.cc
  29ee68ccc9844e3580e3e9f6da577778  gcc/genpeep.cc
  28d50caf61c98bed97742228c437ee13  gcc/genpreds.cc
  7ef07a14a26d6ca95f84a510ac497b42  gcc/genrecog.cc
*************** da09d1e31d3994eb3d6958074d7b7ce5  gcc/gi
*** 6232,6238 ****
  fea7635818b5d7cefd4c7a0b268a254c  gcc/gimple-crc-optimization.cc
  1e3c7b3ded904be69c3703ac6d27fa44  gcc/gimple-expr.cc
  7b4f02095ce9b7a43bee8570917b9dc7  gcc/gimple-expr.h
! 981494f0e6d65629db4c3af73f29109f  gcc/gimple-fold.cc
  11c53c7404f0a514ba936db118da8027  gcc/gimple-fold.h
  43ad47e8cd99d438040cf6937a3cbe5e  gcc/gimple-harden-conditionals.cc
  78586a1c0ce6834da91809b77f98c6d7  gcc/gimple-harden-control-flow.cc
--- 6238,6244 ----
  fea7635818b5d7cefd4c7a0b268a254c  gcc/gimple-crc-optimization.cc
  1e3c7b3ded904be69c3703ac6d27fa44  gcc/gimple-expr.cc
  7b4f02095ce9b7a43bee8570917b9dc7  gcc/gimple-expr.h
! b7e7d16c1d3f5a2ef24a98ecf3d12f60  gcc/gimple-fold.cc
  11c53c7404f0a514ba936db118da8027  gcc/gimple-fold.h
  43ad47e8cd99d438040cf6937a3cbe5e  gcc/gimple-harden-conditionals.cc
  78586a1c0ce6834da91809b77f98c6d7  gcc/gimple-harden-control-flow.cc
*************** bb02db160d1eb3a985d3b5dfa8e0566c  gcc/gi
*** 6251,6258 ****
  0b6c89d0a615bf5016f4e84ab164a6ca  gcc/gimple-match-exports.cc
  144911a83796283e587e0c84378e118d  gcc/gimple-match-head.cc
  9a17a7550e34f5a6aec955c756b185fc  gcc/gimple-match.h
! 8dfd9f3f97d0202e55771cf7594fbcb3  gcc/gimple-predicate-analysis.cc
! 6c6a46b3936e3dc50695bcab2efd3520  gcc/gimple-predicate-analysis.h
  ef8cac8c03c6284903df21f3faba7014  gcc/gimple-predict.h
  eceaf6fecb6df7f838b427bf4f70eade  gcc/gimple-pretty-print.cc
  1d0e0766111d9af10f6785e9ad0b3675  gcc/gimple-pretty-print.h
--- 6257,6264 ----
  0b6c89d0a615bf5016f4e84ab164a6ca  gcc/gimple-match-exports.cc
  144911a83796283e587e0c84378e118d  gcc/gimple-match-head.cc
  9a17a7550e34f5a6aec955c756b185fc  gcc/gimple-match.h
! 471bfcfc60f0edc8a89b0152f115f7fb  gcc/gimple-predicate-analysis.cc
! 642ffb039cf24eee2646936e4a143135  gcc/gimple-predicate-analysis.h
  ef8cac8c03c6284903df21f3faba7014  gcc/gimple-predict.h
  eceaf6fecb6df7f838b427bf4f70eade  gcc/gimple-pretty-print.cc
  1d0e0766111d9af10f6785e9ad0b3675  gcc/gimple-pretty-print.h
*************** c8dd21ff63045c1a13e516534e9f26c8  gcc/gi
*** 6266,6272 ****
  db61cb44af184c491426f70b14b72f64  gcc/gimple-range-gori.h
  836ca478dda484e78599371c73fd56a4  gcc/gimple-range-infer.cc
  d1b8fdd0fd8c738683e5995bf45cda94  gcc/gimple-range-infer.h
! e90a8c8db3c3bb2c54a6618e8ef278c4  gcc/gimple-range-op.cc
  c33a426eeaa6da07a474caf81b43a278  gcc/gimple-range-op.h
  33d3c148e1b6f1df39688e27f3511fe1  gcc/gimple-range-path.cc
  55a80a9f04099be643d37e29c9ac7d10  gcc/gimple-range-path.h
--- 6272,6278 ----
  db61cb44af184c491426f70b14b72f64  gcc/gimple-range-gori.h
  836ca478dda484e78599371c73fd56a4  gcc/gimple-range-infer.cc
  d1b8fdd0fd8c738683e5995bf45cda94  gcc/gimple-range-infer.h
! 8ce7e8f3a71589b78ed308c68dafb5dc  gcc/gimple-range-op.cc
  c33a426eeaa6da07a474caf81b43a278  gcc/gimple-range-op.h
  33d3c148e1b6f1df39688e27f3511fe1  gcc/gimple-range-path.cc
  55a80a9f04099be643d37e29c9ac7d10  gcc/gimple-range-path.h
*************** a4e263e8871b92796b1fb32a725e3eaa  gcc/gi
*** 6280,6286 ****
  0a74fcfb6f542e62384811b3713681ce  gcc/gimple-ssa-backprop.cc
  3cfaaa2decd6de2542a919cfb8bdb93d  gcc/gimple-ssa-isolate-paths.cc
  b417ca4d3d865879d0e642790dafa8cf  gcc/gimple-ssa-nonnull-compare.cc
! 6ea5745e8124ad0db5a9165a20abac7c  gcc/gimple-ssa-sccopy.cc
  b551cb1f1566bf3aa2bca3816f2b1c98  gcc/gimple-ssa-split-paths.cc
  c7ec9ee38b6e99c1260bd3e794ead05f  gcc/gimple-ssa-sprintf.cc
  827b9a16d251acce8466dcb4fc8420da  gcc/gimple-ssa-store-merging.cc
--- 6286,6292 ----
  0a74fcfb6f542e62384811b3713681ce  gcc/gimple-ssa-backprop.cc
  3cfaaa2decd6de2542a919cfb8bdb93d  gcc/gimple-ssa-isolate-paths.cc
  b417ca4d3d865879d0e642790dafa8cf  gcc/gimple-ssa-nonnull-compare.cc
! 40693399daef32bee2d7035c9bb0bc4d  gcc/gimple-ssa-sccopy.cc
  b551cb1f1566bf3aa2bca3816f2b1c98  gcc/gimple-ssa-split-paths.cc
  c7ec9ee38b6e99c1260bd3e794ead05f  gcc/gimple-ssa-sprintf.cc
  827b9a16d251acce8466dcb4fc8420da  gcc/gimple-ssa-store-merging.cc
*************** b31732d7a4fe3de8e26b483ab3a44651  gcc/gr
*** 6399,6406 ****
  068f8a4c769395b6257f3b291f4d170e  gcc/graphite-sese-to-poly.cc
  5a4c5d1ec85c7a60b7c52eecdf4e0d25  gcc/graphite.cc
  225ab5e9b9291a8c1b81956566cd8bb7  gcc/graphite.h
! c415894565c165a5a458ae776c1a5bf3  gcc/graphviz.cc
! 2959b9ed699583e57ca24ae210c56aec  gcc/graphviz.h
  c8d4eed5e54638b86c75a8e0332077bc  gcc/gsstruct.def
  4f9ffef63d4b3ae5c0c7cafc11816ac2  gcc/gsyms.h
  8585d36b3917e41144ca7ee8a6b5e065  gcc/gsyslimits.h
--- 6405,6412 ----
  068f8a4c769395b6257f3b291f4d170e  gcc/graphite-sese-to-poly.cc
  5a4c5d1ec85c7a60b7c52eecdf4e0d25  gcc/graphite.cc
  225ab5e9b9291a8c1b81956566cd8bb7  gcc/graphite.h
! 5350a023d7ce0f199771e7e9e23a3afc  gcc/graphviz.cc
! c283f802616273a598d446057095f4d1  gcc/graphviz.h
  c8d4eed5e54638b86c75a8e0332077bc  gcc/gsstruct.def
  4f9ffef63d4b3ae5c0c7cafc11816ac2  gcc/gsyms.h
  8585d36b3917e41144ca7ee8a6b5e065  gcc/gsyslimits.h
*************** fef6f27045737cc29ebf2dbbd22dda02  gcc/ip
*** 6455,6461 ****
  b2ecb607534e24bdc2bc2e02ba2199ca  gcc/ipa-icf.h
  afa2616e2d58a9137deaabc102d2d7c1  gcc/ipa-inline-analysis.cc
  8aeea7e05b0080b60353a926b88ee97d  gcc/ipa-inline-transform.cc
! aa900dc6c4c8d7ff0ed09280bbb7a6fe  gcc/ipa-inline.cc
  229bac80ef5400801cf4edfd97790ef8  gcc/ipa-inline.h
  19c0cbbd70e071bd63dbb0527d02423e  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
--- 6461,6467 ----
  b2ecb607534e24bdc2bc2e02ba2199ca  gcc/ipa-icf.h
  afa2616e2d58a9137deaabc102d2d7c1  gcc/ipa-inline-analysis.cc
  8aeea7e05b0080b60353a926b88ee97d  gcc/ipa-inline-transform.cc
! bb4dfd8320ff38191d233ff6ee252c4a  gcc/ipa-inline.cc
  229bac80ef5400801cf4edfd97790ef8  gcc/ipa-inline.h
  19c0cbbd70e071bd63dbb0527d02423e  gcc/ipa-locality-cloning.cc
  e1e331896b86db8a2281657bbb21ac72  gcc/ipa-locality-cloning.h
*************** dc9c6fb11d3b3fffe354eff3daf0454c  gcc/la
*** 6597,6607 ****
  82e3d15b2545a4e7a7397d6396eb74fe  gcc/lcm.cc
  bdf8ae675ae5000d854fe2874116b2f8  gcc/lcm.h
  027270d0be504f25a7efb49e1e3179bb  gcc/libfuncs.h
! 79fe569ebf6fe058b6ca4777d240fa68  gcc/libgdiagnostics++.h
! 50a640f5b9b7333cd83a35cba1aa6af8  gcc/libgdiagnostics.cc
! 5709edc2c86b3b266f851e186a7492ef  gcc/libgdiagnostics.h
! 84f2ddafd88e9e988ae44973bb81f33f  gcc/libgdiagnostics.map
! 3fb132c63fb7252b1081f8d48b376e6d  gcc/libsarifreplay.cc
  5e320a3249f5b8b266e2c69c6282315e  gcc/libsarifreplay.h
  5c6a6e21474ca46c652e3149d4068fe3  gcc/limitx.h
  83de5c6450456e215a5484083afcd32a  gcc/limity.h
--- 6603,6613 ----
  82e3d15b2545a4e7a7397d6396eb74fe  gcc/lcm.cc
  bdf8ae675ae5000d854fe2874116b2f8  gcc/lcm.h
  027270d0be504f25a7efb49e1e3179bb  gcc/libfuncs.h
! 1817a2fa23b2486fb0f646a382b7842b  gcc/libgdiagnostics++.h
! 81b79ac8789ce2e7ce02c3fa3b686bd5  gcc/libgdiagnostics.cc
! 1121750ba89301943c8509140a453448  gcc/libgdiagnostics.h
! 6dcdaf8a5a223ec09482a2bfb0113c8a  gcc/libgdiagnostics.map
! 74df9e3d770412d330dfd475aeb4e80e  gcc/libsarifreplay.cc
  5e320a3249f5b8b266e2c69c6282315e  gcc/libsarifreplay.h
  5c6a6e21474ca46c652e3149d4068fe3  gcc/limitx.h
  83de5c6450456e215a5484083afcd32a  gcc/limity.h
*************** b54054c495232a416b1cdea9032d1d9f  gcc/lo
*** 6621,6638 ****
  755a196fed2cd7b5878159035d75b39b  gcc/lra-assigns.cc
  0232e051e662ebb7fd2fa507d9c581b8  gcc/lra-coalesce.cc
  54e62c1c9cb8ac20e26344c0abc15f9c  gcc/lra-constraints.cc
! 2495ade9709af129ff8d33e71553da76  gcc/lra-eliminations.cc
! d5aab2fda62b4b8a67dcd1bfeff169f5  gcc/lra-int.h
! 9b39c90253128330d1b238b030a40fce  gcc/lra-lives.cc
  f98dc87a80f661782eacaf50d123997d  gcc/lra-remat.cc
! f2a8f0c5c085e7b8fca47ae12fc60944  gcc/lra-spills.cc
  e5fef2ffe59f5bb8bf855af92be9ce6a  gcc/lra.cc
  f34f18b0bf45561aad0763e10bc1ecb1  gcc/lra.h
  47448197971da2e85aadd03dd315e469  gcc/lto-cgraph.cc
  3c0edd5f81587bb2a1bebb7979c19aa8  gcc/lto-compress.cc
  6081736069853cccad4e30dab7992217  gcc/lto-compress.h
! 85f4f18c0f46c0ae649aceb458fe3ed8  gcc/lto-ltrans-cache.cc
! 59c7dce256dc0c0cea1bdc845a5e487e  gcc/lto-ltrans-cache.h
  2761a8599f5c743bf4c67dc2c3c2d347  gcc/lto-opts.cc
  598e2e8346c0154856c5ef27e7649887  gcc/lto-section-in.cc
  f2a9985147f87fd566d4ae2dd8fceabc  gcc/lto-section-names.h
--- 6627,6644 ----
  755a196fed2cd7b5878159035d75b39b  gcc/lra-assigns.cc
  0232e051e662ebb7fd2fa507d9c581b8  gcc/lra-coalesce.cc
  54e62c1c9cb8ac20e26344c0abc15f9c  gcc/lra-constraints.cc
! 386ac744fab32bf32aadbf67c62240df  gcc/lra-eliminations.cc
! c9f048755e3742fbe86e02e2b4b1eb6d  gcc/lra-int.h
! 52ba28cd117bff034bd9a26fe150f692  gcc/lra-lives.cc
  f98dc87a80f661782eacaf50d123997d  gcc/lra-remat.cc
! 7d88a319b2eed09205d9a01cca221eb6  gcc/lra-spills.cc
  e5fef2ffe59f5bb8bf855af92be9ce6a  gcc/lra.cc
  f34f18b0bf45561aad0763e10bc1ecb1  gcc/lra.h
  47448197971da2e85aadd03dd315e469  gcc/lto-cgraph.cc
  3c0edd5f81587bb2a1bebb7979c19aa8  gcc/lto-compress.cc
  6081736069853cccad4e30dab7992217  gcc/lto-compress.h
! e30abe8a6f83280333eda23e196378ad  gcc/lto-ltrans-cache.cc
! ccc169e39c1de2f69a4744154373899f  gcc/lto-ltrans-cache.h
  2761a8599f5c743bf4c67dc2c3c2d347  gcc/lto-opts.cc
  598e2e8346c0154856c5ef27e7649887  gcc/lto-section-in.cc
  f2a9985147f87fd566d4ae2dd8fceabc  gcc/lto-section-names.h
*************** e44c0bf9cc0411d7bd57c6585eb6d0e4  gcc/lt
*** 6666,6672 ****
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! 3f8a9ff9f33398233a1d15c800241ad3  gcc/m2/ChangeLog
  33352ea845a8d2399793299f3e58a218  gcc/m2/Make-lang.in
  93fe99bf456561cd217f1c93d2ab7da7  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
--- 6672,6678 ----
  b417a4bd52371186803e70c49d24764d  gcc/m2/COPYING.RUNTIME
  8f0e2cd40e05189ec81232da84bd6e1a  gcc/m2/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/m2/COPYING3.LIB
! bd69f3a10e8e0f1555dfcc71f4db555d  gcc/m2/ChangeLog
  33352ea845a8d2399793299f3e58a218  gcc/m2/Make-lang.in
  93fe99bf456561cd217f1c93d2ab7da7  gcc/m2/Make-maintainer.in
  6a74129fda00ca52ba9f953538250c45  gcc/m2/NEWS
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7620,7626 ****
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  db2ee1a68662c8370d59f7e4f6cf917b  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! 0625c2ddbba0dbf3c712ba7a87b1d3d8  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
--- 7626,7632 ----
  88e10618d6f39a411b34e2245b93307b  gcc/machmode.def
  db2ee1a68662c8370d59f7e4f6cf917b  gcc/machmode.h
  486412acbbb6de10b080e31410a14f33  gcc/main.cc
! 33a975e0fb2bcf8ebbe0fffcea30e309  gcc/match.pd
  63bf182c7c3a100e101b2129976be89b  gcc/mcf.cc
  795fbbc034a60f5af7e79dbe3bac65a0  gcc/mem-stats-traits.h
  295dcd7618653c13dcf063266752d06f  gcc/mem-stats.h
*************** fcb5b7227342c442bcddbcc06eaddcdc  gcc/op
*** 7701,7723 ****
  58f02a8817c05c6681ba150251b166e8  gcc/optinfo.h
  1c30e8950551cbe97bda991d288b7bb7  gcc/options-urls-cc-gen.awk
  06a83d971fd3a11f54c904ab9260cc09  gcc/opts-common.cc
! 7665155906371f34e166fe02aec0b1b7  gcc/opts-diagnostic.cc
  bd138c731d5ef02ebe19e25375c465c8  gcc/opts-diagnostic.h
  dc49add7ae35ac8842b786b817fd79b3  gcc/opts-global.cc
  079a115ae417106f3e7f42b0272b866d  gcc/opts-jobserver.h
! de2505d2869c6bf58c2c52b6ebaf18ab  gcc/opts.cc
  367fa9ca17175fb2e8651a43bc0d5ca3  gcc/opts.h
  b7a4b3edfca283f972cdeb23102a28a4  gcc/ordered-hash-map-tests.cc
  fccd951e3de91d49d3824e482c12e070  gcc/ordered-hash-map.h
  c77558a1c1f43463b3acae9243006ef9  gcc/output.h
  c9e6163e1eaa8f82c57f03f76e86da75  gcc/pair-fusion.cc
  b2f692287d25760afcef126c010f7078  gcc/pair-fusion.h
! 8af698cb899def4454f4b2b33cf5649a  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  818628b1b793b8f87f62d0c18fd1219a  gcc/pass_manager.h
  cf39cd628f9dc29a9a191f4af2c68346  gcc/passes.cc
! fc39d16481e008cabb9733b116958d1c  gcc/passes.def
  e3f908061f2b051f55381b513a49022b  gcc/path-coverage.cc
  57048d71e78511e69e3d39d60cb2f1b7  gcc/plugin.cc
  995702441547e9826ffaea326d8be617  gcc/plugin.def
  79cd4ea374ded38e9f3ef38c1624db9e  gcc/plugin.h
--- 7707,7731 ----
  58f02a8817c05c6681ba150251b166e8  gcc/optinfo.h
  1c30e8950551cbe97bda991d288b7bb7  gcc/options-urls-cc-gen.awk
  06a83d971fd3a11f54c904ab9260cc09  gcc/opts-common.cc
! 055bde0cea0132b2f8f8ae1a70bf3ab3  gcc/opts-diagnostic.cc
  bd138c731d5ef02ebe19e25375c465c8  gcc/opts-diagnostic.h
  dc49add7ae35ac8842b786b817fd79b3  gcc/opts-global.cc
  079a115ae417106f3e7f42b0272b866d  gcc/opts-jobserver.h
! 54630b31f685d879d0c1878a38f90693  gcc/opts.cc
  367fa9ca17175fb2e8651a43bc0d5ca3  gcc/opts.h
  b7a4b3edfca283f972cdeb23102a28a4  gcc/ordered-hash-map-tests.cc
  fccd951e3de91d49d3824e482c12e070  gcc/ordered-hash-map.h
  c77558a1c1f43463b3acae9243006ef9  gcc/output.h
  c9e6163e1eaa8f82c57f03f76e86da75  gcc/pair-fusion.cc
  b2f692287d25760afcef126c010f7078  gcc/pair-fusion.h
! 2207e1b3f2ea3f9a38dca4896d14b62c  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  818628b1b793b8f87f62d0c18fd1219a  gcc/pass_manager.h
  cf39cd628f9dc29a9a191f4af2c68346  gcc/passes.cc
! 6c37f61a77fb94451aa613a51f15b6a3  gcc/passes.def
  e3f908061f2b051f55381b513a49022b  gcc/path-coverage.cc
+ 9077bd1d4c611da16e24019cc5f1cdcd  gcc/pex.cc
+ 5f3fc8b9c6ba6a91676e512a41e3de7e  gcc/pex.h
  57048d71e78511e69e3d39d60cb2f1b7  gcc/plugin.cc
  995702441547e9826ffaea326d8be617  gcc/plugin.def
  79cd4ea374ded38e9f3ef38c1624db9e  gcc/plugin.h
*************** ed550d9201c53b2e183ac8da7882fb20  gcc/pr
*** 7765,7780 ****
  a6e4e4fab174379976dcb09269c8de98  gcc/print-rtl-function.cc
  a5461dd81ec55dc6f56817a1f356f345  gcc/print-rtl.cc
  63499dea0e911b175def4a9153353027  gcc/print-rtl.h
! 25b31c9113a977129e37056b6c5fd751  gcc/print-tree.cc
! 469848c1e480b033f7ee22f68ec05f94  gcc/print-tree.h
  a5fbacfb851b89168fc63a8d1b2598ef  gcc/profile-count.cc
  127716370a7f778cb89f3e7c4ce094ae  gcc/profile-count.h
  be294583d74c167da1819e51e9001b52  gcc/profile.cc
  d30f617ac9705fc7dc5d14e744fe4ff0  gcc/profile.h
  555a319d44f0f4857aa378a1691e1d27  gcc/range-op-float.cc
! 930dfbfa29eb6bc7e6b33c56109c42a2  gcc/range-op-mixed.h
! 1ec27428c1d18680765a21ac815ffb7e  gcc/range-op-ptr.cc
! 614ecc51d10304272e55c74ddfdae99a  gcc/range-op.cc
  24fea5bf4be00e9dba7bbeb8d52b4677  gcc/range-op.h
  e1edfa2841ce0f9e30db7b34a3a5a6d7  gcc/range.cc
  e1ebdb36533cc50099a4b487e7c70c49  gcc/range.h
--- 7773,7788 ----
  a6e4e4fab174379976dcb09269c8de98  gcc/print-rtl-function.cc
  a5461dd81ec55dc6f56817a1f356f345  gcc/print-rtl.cc
  63499dea0e911b175def4a9153353027  gcc/print-rtl.h
! 4f53079bd53b2c18b204334e3b819cfc  gcc/print-tree.cc
! b92d7f51ae16cdd854cf95fa6ab0f456  gcc/print-tree.h
  a5fbacfb851b89168fc63a8d1b2598ef  gcc/profile-count.cc
  127716370a7f778cb89f3e7c4ce094ae  gcc/profile-count.h
  be294583d74c167da1819e51e9001b52  gcc/profile.cc
  d30f617ac9705fc7dc5d14e744fe4ff0  gcc/profile.h
  555a319d44f0f4857aa378a1691e1d27  gcc/range-op-float.cc
! 6b98a6ea5f4292196168184e5e0f4476  gcc/range-op-mixed.h
! 111e7e65fb598a1d21148e1b0f23744b  gcc/range-op-ptr.cc
! ebaf12cdc36f0053941f30e4fa5a982d  gcc/range-op.cc
  24fea5bf4be00e9dba7bbeb8d52b4677  gcc/range-op.h
  e1edfa2841ce0f9e30db7b34a3a5a6d7  gcc/range.cc
  e1ebdb36533cc50099a4b487e7c70c49  gcc/range.h
*************** ae3ad005e8aa99428875298a3a4a9807  gcc/rt
*** 7818,7824 ****
  66b4e87db60474417ffffe027ae7f92f  gcc/rtl-ssa/blocks.cc
  520011b5e2ce3793d91dd754d2a666ee  gcc/rtl-ssa/blocks.h
  33b2e67a8ebbdcbe29d4b567f6ce3700  gcc/rtl-ssa/change-utils.h
! e647f3e6fa2e04e4752edd000055f636  gcc/rtl-ssa/changes.cc
  c607a19c0aef8e5e1a34995205ca21ad  gcc/rtl-ssa/changes.h
  3247cab7031af7ec0a17f27198004fd5  gcc/rtl-ssa/functions.cc
  ad760b8947b6feeec03df375bb3d68b9  gcc/rtl-ssa/functions.h
--- 7826,7832 ----
  66b4e87db60474417ffffe027ae7f92f  gcc/rtl-ssa/blocks.cc
  520011b5e2ce3793d91dd754d2a666ee  gcc/rtl-ssa/blocks.h
  33b2e67a8ebbdcbe29d4b567f6ce3700  gcc/rtl-ssa/change-utils.h
! e9db7390ca51863b2bc8c41e2282e35b  gcc/rtl-ssa/changes.cc
  c607a19c0aef8e5e1a34995205ca21ad  gcc/rtl-ssa/changes.h
  3247cab7031af7ec0a17f27198004fd5  gcc/rtl-ssa/functions.cc
  ad760b8947b6feeec03df375bb3d68b9  gcc/rtl-ssa/functions.h
*************** c08edc659010d9072c249418c1be7fe6  gcc/rt
*** 7847,7853 ****
  ecb31a48caf7998f695601ec7350bdc0  gcc/run-rtl-passes.cc
  c4bc204b62fdb61848c09abf05a60a9d  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! 9266026ff1d960472109b0aaf6bc4ae3  gcc/rust/ChangeLog
  c2a8648800b13beaa7b2efef8e94ea6f  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
  1bde08bec2946c34ff76bc8cdc25d05c  gcc/rust/ast/rust-ast-builder-type.cc
--- 7855,7861 ----
  ecb31a48caf7998f695601ec7350bdc0  gcc/run-rtl-passes.cc
  c4bc204b62fdb61848c09abf05a60a9d  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! 948f127b0b718905120a5411d2cc0dde  gcc/rust/ChangeLog
  c2a8648800b13beaa7b2efef8e94ea6f  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
  1bde08bec2946c34ff76bc8cdc25d05c  gcc/rust/ast/rust-ast-builder-type.cc
*************** ac4645a6b64765a8b1a069123b36a51d  gcc/ru
*** 8005,8011 ****
  63a28af321731b1ddb6fd4a779bfa851  gcc/rust/checks/errors/borrowck/rust-bir-place.h
  c155995ce485ce0e9a21876183c1a9bb  gcc/rust/checks/errors/borrowck/rust-bir-visitor.h
  7333a5b4ee8d7bed652435c73523a459  gcc/rust/checks/errors/borrowck/rust-bir.h
! 5e2b21dc5728d65e4f86b2b882432ec4  gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
  e30cd7ae36132321a16ee23e46ef569d  gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.h
  8a4b180b21798e53955cc8d26ee08af1  gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
  6998d3562ab4b5a22db0a644a774bf34  gcc/rust/checks/errors/borrowck/rust-borrow-checker.h
--- 8013,8019 ----
  63a28af321731b1ddb6fd4a779bfa851  gcc/rust/checks/errors/borrowck/rust-bir-place.h
  c155995ce485ce0e9a21876183c1a9bb  gcc/rust/checks/errors/borrowck/rust-bir-visitor.h
  7333a5b4ee8d7bed652435c73523a459  gcc/rust/checks/errors/borrowck/rust-bir.h
! c62ad0b7d7912fb0902b5edd26c0239a  gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
  e30cd7ae36132321a16ee23e46ef569d  gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.h
  8a4b180b21798e53955cc8d26ee08af1  gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc
  6998d3562ab4b5a22db0a644a774bf34  gcc/rust/checks/errors/borrowck/rust-borrow-checker.h
*************** e9a5e546c32155ec1d162baf906b3173  gcc/ru
*** 8337,8343 ****
  1157834f858df87f4cff12c780fe7030  gcc/sancov.cc
  f47b1babbf39168c2829bbc0997f6b9b  gcc/sanitizer.def
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
! ffcc8ac34ad1c40fd6aec56f005e22c8  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
  31050442ff986af301d1822bb48a2dc0  gcc/sbitmap.cc
  17496ea3285b5b8563702a8c44caa8bd  gcc/sbitmap.h
--- 8345,8351 ----
  1157834f858df87f4cff12c780fe7030  gcc/sancov.cc
  f47b1babbf39168c2829bbc0997f6b9b  gcc/sanitizer.def
  1c4a31054492029cadf12999aee53d81  gcc/sanopt.cc
! 9ecda8b89aeddbb95a665a7fc6a575e2  gcc/sarif-replay.cc
  a92419791c8e8d842c6ef029d4537463  gcc/sarif-spec-urls.def
  31050442ff986af301d1822bb48a2dc0  gcc/sbitmap.cc
  17496ea3285b5b8563702a8c44caa8bd  gcc/sbitmap.h
*************** d90d59efc5dfd5359241062d80e3e745  gcc/se
*** 8362,8372 ****
  74ebb02c30bec8d1c45c78a387c5ee18  gcc/selftest-logical-location.h
  22224372e5a2696e660289e86b2696a5  gcc/selftest-rtl.cc
  ab96230d11b93b85d4d1b85cc5d494ab  gcc/selftest-rtl.h
! 5bfc4952abe408a262a202b0601d72e8  gcc/selftest-run-tests.cc
  777b0025fe2356f118cb24f2302ae4ff  gcc/selftest-tree.h
  fdc04e5af7ee387dce07c6ba9a99eaa8  gcc/selftest-xml.h
  220320c985328c0546a9a80a7353964e  gcc/selftest.cc
! 77ef0eb0fe55f14cbf7d202f1e79584e  gcc/selftest.h
  71b83bf173726493d9fee558216a2e02  gcc/sese.cc
  62e0bec4b0ac9f8e027af35a2c2e2330  gcc/sese.h
  9123313dafdd85df1e747e738274ee2c  gcc/shortest-paths.h
--- 8370,8380 ----
  74ebb02c30bec8d1c45c78a387c5ee18  gcc/selftest-logical-location.h
  22224372e5a2696e660289e86b2696a5  gcc/selftest-rtl.cc
  ab96230d11b93b85d4d1b85cc5d494ab  gcc/selftest-rtl.h
! 065aeefaea4f9bbf3129cec6d81f4845  gcc/selftest-run-tests.cc
  777b0025fe2356f118cb24f2302ae4ff  gcc/selftest-tree.h
  fdc04e5af7ee387dce07c6ba9a99eaa8  gcc/selftest-xml.h
  220320c985328c0546a9a80a7353964e  gcc/selftest.cc
! fa9a7ef543e20dae72e7b8edfdb02b77  gcc/selftest.h
  71b83bf173726493d9fee558216a2e02  gcc/sese.cc
  62e0bec4b0ac9f8e027af35a2c2e2330  gcc/sese.h
  9123313dafdd85df1e747e738274ee2c  gcc/shortest-paths.h
*************** b1497a03867668af210c32280876fdd7  gcc/sy
*** 8429,8435 ****
  b4bbfe8a8f62eed5c75429762e88d324  gcc/targhooks.cc
  ae57260b8b60d8b8dfaef3556c3ac5e5  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 768637c47d495c2341b88a3b18925b25  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
--- 8437,8443 ----
  b4bbfe8a8f62eed5c75429762e88d324  gcc/targhooks.cc
  ae57260b8b60d8b8dfaef3556c3ac5e5  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! dd86f6c1b4347904ba183005f7b802c4  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** b71437991ec944059c8eab89238b375e  gcc/te
*** 17650,17655 ****
--- 17658,17665 ----
  418bb97e42059c30459b53c6b783f7a7  gcc/testsuite/c-c++-common/asan/pointer-subtract-7.c
  cc00a3c5a3fe4188220028449567b571  gcc/testsuite/c-c++-common/asan/pointer-subtract-8.c
  d89ff70e1d21d4c436a2561d33888f83  gcc/testsuite/c-c++-common/asan/pr106558.c
+ fabe4f563e2a6b04ace68b9b7e010e6b  gcc/testsuite/c-c++-common/asan/pr120608-1.c
+ a81fada6339487ed882e8189aae31718  gcc/testsuite/c-c++-common/asan/pr120608-2.c
  9a0dd3dcef02945c8967f40a29316496  gcc/testsuite/c-c++-common/asan/pr56330.c
  202bae43b2843228776d43c8d07c92c8  gcc/testsuite/c-c++-common/asan/pr59029.c
  65128b17436f6406d9e224257030e000  gcc/testsuite/c-c++-common/asan/pr59063-1.c
*************** ae277375a028cc63db472bcab5bac381  gcc/te
*** 18214,18219 ****
--- 18224,18230 ----
  0c724489142a5ed4513ada6ff6ebaea9  gcc/testsuite/c-c++-common/goacc-gomp/pr93465-1.c
  21763053fb0a3cc446b2e4952923204e  gcc/testsuite/c-c++-common/goacc/Wparentheses-1.c
  38804e577c485537958c84fd18a8c36d  gcc/testsuite/c-c++-common/goacc/acc-icf.c
+ 9703fd0749219513274e64adfc334e7d  gcc/testsuite/c-c++-common/goacc/acc-wait-1.c
  400443740bcbd90b6eda42f14ddb292c  gcc/testsuite/c-c++-common/goacc/asyncwait-1.c
  d426111516a83fc5f035da114398322c  gcc/testsuite/c-c++-common/goacc/asyncwait-5.c
  a2cd1716ba4f647ad86a615b0dd86f7e  gcc/testsuite/c-c++-common/goacc/atomic.c
*************** ad92c723d1e80f05d9f35deb51fa2634  gcc/te
*** 20855,20861 ****
  769d9a1ce7dda86bf62f8cceba27216a  gcc/testsuite/g++.dg/abi/mangle-regparm1a.C
  683d273f7a4481306d20ed785c1d122f  gcc/testsuite/g++.dg/abi/mangle-ttp1.C
  2bf2b2b32ea23abd24bfcabcde7d2a6a  gcc/testsuite/g++.dg/abi/mangle-union1.C
! 5e94edc723dfdbbd971982151251cae3  gcc/testsuite/g++.dg/abi/mangle1.C
  67767c9988084f28a3c29af0c9e34d2f  gcc/testsuite/g++.dg/abi/mangle10.C
  b99e258a9b112a189be8471163121e9a  gcc/testsuite/g++.dg/abi/mangle13.C
  c725405daaacb49e8bb670b03926b8c1  gcc/testsuite/g++.dg/abi/mangle15.C
--- 20866,20872 ----
  769d9a1ce7dda86bf62f8cceba27216a  gcc/testsuite/g++.dg/abi/mangle-regparm1a.C
  683d273f7a4481306d20ed785c1d122f  gcc/testsuite/g++.dg/abi/mangle-ttp1.C
  2bf2b2b32ea23abd24bfcabcde7d2a6a  gcc/testsuite/g++.dg/abi/mangle-union1.C
! 316b6127594bddb5a7fee8d42ceaa057  gcc/testsuite/g++.dg/abi/mangle1.C
  67767c9988084f28a3c29af0c9e34d2f  gcc/testsuite/g++.dg/abi/mangle10.C
  b99e258a9b112a189be8471163121e9a  gcc/testsuite/g++.dg/abi/mangle13.C
  c725405daaacb49e8bb670b03926b8c1  gcc/testsuite/g++.dg/abi/mangle15.C
*************** d38901b61d8e8c42e6c0084cde0eaec0  gcc/te
*** 20930,20935 ****
--- 20941,20947 ----
  d987b63109ee0eb4b7f916f91d8d24be  gcc/testsuite/g++.dg/abi/mangle79.C
  eeee984fc971f0592acc52efb13ea93e  gcc/testsuite/g++.dg/abi/mangle8.C
  91fe59f4b908b8f1ebd09487c43147d8  gcc/testsuite/g++.dg/abi/mangle80.C
+ 243b5d1d894302a08529e7e4300eea4b  gcc/testsuite/g++.dg/abi/mangle81.C
  8c95c7ea3760b8a1e7954b3da9f45a16  gcc/testsuite/g++.dg/abi/mangle9.C
  d85264fae2b4c2eb4d8629cb29c42e90  gcc/testsuite/g++.dg/abi/no-linkage-expr1.C
  0cccf158230e7bf1d438169164c8020a  gcc/testsuite/g++.dg/abi/no-weak1.C
*************** a4e6ecf8eb5d90837d394182e0f66932  gcc/te
*** 21096,21101 ****
--- 21108,21114 ----
  53b12a163fc148ccfa811ba18531ee17  gcc/testsuite/g++.dg/analyzer/pr97116.C
  fd2e08e4f10e3ceec481fed9289f968c  gcc/testsuite/g++.dg/analyzer/pr97489.C
  db2b7f6c1be40cc086aa678eb7d66cad  gcc/testsuite/g++.dg/analyzer/pr99064.C
+ b693ff6f9735fca106feba8f26ea7569  gcc/testsuite/g++.dg/analyzer/state-diagram.C
  93a16b4e27481524ed286fec0ffd5b36  gcc/testsuite/g++.dg/analyzer/std-unexpected.C
  987cfa86290bc36c48063e15a43ae459  gcc/testsuite/g++.dg/analyzer/unique_ptr-1.C
  467b81263f3c9fb6ddf0a2fb9500917a  gcc/testsuite/g++.dg/analyzer/unique_ptr-2.C
*************** b03be3a03970717959df65ccdcbebe88  gcc/te
*** 21135,21140 ****
--- 21148,21154 ----
  7998896b5b941ead8835759e67d0fff5  gcc/testsuite/g++.dg/asan/pr117845-2.C
  bcebd751b296d1287bb9fa7c080ccecb  gcc/testsuite/g++.dg/asan/pr117845.C
  350e8cfd78cd243b5ca66f3b0149e4b7  gcc/testsuite/g++.dg/asan/pr118763.C
+ a012f82a08211153b4c4517641e43c3d  gcc/testsuite/g++.dg/asan/pr120608.C
  e472f2ce37f2b55b1358ec08717d9f08  gcc/testsuite/g++.dg/asan/pr55617.C
  74a04a20e12a8acd0fd7d05742cf8d63  gcc/testsuite/g++.dg/asan/pr62017.C
  505943436d80a41b5e95bf0b67db97cd  gcc/testsuite/g++.dg/asan/pr64937.C
*************** cad4897b69a9dcbf2accb6f76dc6142a  gcc/te
*** 22695,22703 ****
  8481af89099c4675f2edb61ae5b3d5b5  gcc/testsuite/g++.dg/cpp0x/constexpr-ice19.C
  b9f6048a90a69c192d74f1909302134b  gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C
  ab9f33f2432c24146907c124c5aa5f73  gcc/testsuite/g++.dg/cpp0x/constexpr-ice20.C
! 4553e1cebbfc69d4a777335cf211603e  gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C
  8338efcd83a2b6552bc4ad1d47c18171  gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C
! a2444cbecc90b8c642eeb0fb89f00654  gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
  db4c14cc7fdca18c19d67657bdddb5d7  gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C
  72451410d06ce8fa3d0a194cc350261e  gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
  996613e01ba0152564096ee0dd625dd7  gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C
--- 22709,22717 ----
  8481af89099c4675f2edb61ae5b3d5b5  gcc/testsuite/g++.dg/cpp0x/constexpr-ice19.C
  b9f6048a90a69c192d74f1909302134b  gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C
  ab9f33f2432c24146907c124c5aa5f73  gcc/testsuite/g++.dg/cpp0x/constexpr-ice20.C
! b89ab8fc8681bcb1f4c9e745c59cc023  gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C
  8338efcd83a2b6552bc4ad1d47c18171  gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C
! 31d07512ae997885ce1713c969bce7e1  gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
  db4c14cc7fdca18c19d67657bdddb5d7  gcc/testsuite/g++.dg/cpp0x/constexpr-ice5.C
  72451410d06ce8fa3d0a194cc350261e  gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C
  996613e01ba0152564096ee0dd625dd7  gcc/testsuite/g++.dg/cpp0x/constexpr-ice7.C
*************** a9b6dc4f3cf6490d2993bb17a4b87b72  gcc/te
*** 26720,26725 ****
--- 26734,26742 ----
  c3a9b6852b1f09d9ece1fdf2078d65c2  gcc/testsuite/g++.dg/cpp26/constexpr-new1.C
  92cd7c8e3355d7acc8819940fc96bc7d  gcc/testsuite/g++.dg/cpp26/constexpr-new2.C
  dbe4cf9df545b2cb75b00993e494cc66  gcc/testsuite/g++.dg/cpp26/constexpr-new3.C
+ 354260f99fd60e96c277a56929f1d6e9  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C
+ 00668a798f242a6125673c04eb06a10e  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C
+ 9bbb24eae9cc5e4431f138520f489213  gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C
  d69dac44671433f94358ee77163aef3c  gcc/testsuite/g++.dg/cpp26/constexpr-voidptr1.C
  33afee43a2089a3e2bccd50e52d8faa6  gcc/testsuite/g++.dg/cpp26/constexpr-voidptr2.C
  6a32febab2200bb5e0fe63b6825c4e86  gcc/testsuite/g++.dg/cpp26/constexpr-voidptr3.C
*************** d0519edbdf7be9b73cadd101aebf0d60  gcc/te
*** 26743,26749 ****
  63db9f67d075960d87cf10ec80c8c798  gcc/testsuite/g++.dg/cpp26/delete2.C
  fcd9d0d666c1c3882f154900cd8e57fb  gcc/testsuite/g++.dg/cpp26/delete3.C
  b835b9bb00c8b448e2ac56df5e6cae60  gcc/testsuite/g++.dg/cpp26/enum-conv1.C
! 3f483bbcb1d535aa9c7cb56cc358f2df  gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
  e439504634b8fdea668e10d9fc930c63  gcc/testsuite/g++.dg/cpp26/literals1.C
  24ebebb3be412c0e507595cb8c7458f5  gcc/testsuite/g++.dg/cpp26/literals2.C
  1eebd6cbce6cabc0490fdd8bf706934d  gcc/testsuite/g++.dg/cpp26/name-independent-decl1.C
--- 26760,26766 ----
  63db9f67d075960d87cf10ec80c8c798  gcc/testsuite/g++.dg/cpp26/delete2.C
  fcd9d0d666c1c3882f154900cd8e57fb  gcc/testsuite/g++.dg/cpp26/delete3.C
  b835b9bb00c8b448e2ac56df5e6cae60  gcc/testsuite/g++.dg/cpp26/enum-conv1.C
! 4df1d5a12b716975b8933d771a6178f3  gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
  e439504634b8fdea668e10d9fc930c63  gcc/testsuite/g++.dg/cpp26/literals1.C
  24ebebb3be412c0e507595cb8c7458f5  gcc/testsuite/g++.dg/cpp26/literals2.C
  1eebd6cbce6cabc0490fdd8bf706934d  gcc/testsuite/g++.dg/cpp26/name-independent-decl1.C
*************** b9789190917641a7dfa95059b0d37281  gcc/te
*** 26779,26784 ****
--- 26796,26804 ----
  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
+ 31b705d20ef43488e0a0926309fbf495  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
  67dd0d88f5927305cb1388ee2a725071  gcc/testsuite/g++.dg/cpp26/unevalstr1.C
  198bbad6dbabb78a766fa825c0121c10  gcc/testsuite/g++.dg/cpp26/unevalstr2.C
  984d3c2a5f2f39372d6a73f8b77bcee1  gcc/testsuite/g++.dg/cpp26/variadic-comma1.C
*************** cbf5d5a37bc2a85bde738f9433003a39  gcc/te
*** 27367,27376 ****
  9e266e2e7c32bba4e0b7648c83e4833c  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor13.C
  993e4c6829e9ab56db460153dc55bad1  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor14.C
  1020d355cd830dffa45dfd17a95222fa  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor15.C
! 9c33430d64086e1f2700ae64e2829096  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
  619af6d01fa79804784a2c8b0c9dcbee  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor17.C
  18ceb8d2ffe5d8e310f40839d2edf0d5  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor2.C
! 4161e44d5b894de84f1601dd80255a1b  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C
  780076eefadeb33a1dce586533960b80  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C
  1ab49acfb4093ac63d8a1117dc494fcd  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor5.C
  e4a44aaa3ef782710c6fe5bed9f0f6cc  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor6.C
--- 27387,27396 ----
  9e266e2e7c32bba4e0b7648c83e4833c  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor13.C
  993e4c6829e9ab56db460153dc55bad1  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor14.C
  1020d355cd830dffa45dfd17a95222fa  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor15.C
! 53a8d0a6c685819970a9fa554fdf4154  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
  619af6d01fa79804784a2c8b0c9dcbee  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor17.C
  18ceb8d2ffe5d8e310f40839d2edf0d5  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor2.C
! 35d472b389db4ae79d8a0ba112cf7266  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C
  780076eefadeb33a1dce586533960b80  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C
  1ab49acfb4093ac63d8a1117dc494fcd  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor5.C
  e4a44aaa3ef782710c6fe5bed9f0f6cc  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor6.C
*************** e4a44aaa3ef782710c6fe5bed9f0f6cc  gcc/te
*** 27378,27384 ****
  2ace88efd8c64f15ecec7394adb6c643  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor8.C
  c35079b724daf37ab1e1277e8f08b5c0  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor9.C
  bd02bcf8862aba3fa6689c619512c0fc  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic1.C
! 86edd59577529228af8d44051178ad54  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
  9dd9af59811f7e51984420eb1396429f  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic11.C
  15268a28d01e2c5f3b8e199a3c412199  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic12.C
  245e9a62156e3df3195f188342c0442b  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic13.C
--- 27398,27404 ----
  2ace88efd8c64f15ecec7394adb6c643  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor8.C
  c35079b724daf37ab1e1277e8f08b5c0  gcc/testsuite/g++.dg/cpp2a/constexpr-dtor9.C
  bd02bcf8862aba3fa6689c619512c0fc  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic1.C
! bf5c28c84619a07f8720e84cdefac3a6  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
  9dd9af59811f7e51984420eb1396429f  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic11.C
  15268a28d01e2c5f3b8e199a3c412199  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic12.C
  245e9a62156e3df3195f188342c0442b  gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic13.C
*************** ca385abd9d6b36d0667c2ad521a0233e  gcc/te
*** 30892,30898 ****
  4487271d3a3d8cbbe87a8aa0dee4b541  gcc/testsuite/g++.dg/init/value7.C
  8301ee378a2cddfa351a850b83e9542a  gcc/testsuite/g++.dg/init/value8.C
  ac0a59cc779709a0f2049784d3349ce1  gcc/testsuite/g++.dg/init/value9.C
! c5a2ccfd21d2f44046825123706e505a  gcc/testsuite/g++.dg/init/vbase1.C
  f950998991b01d5ad8aa91b1f8d04255  gcc/testsuite/g++.dg/init/vbase2.C
  e4ace0ef4caaae06eef685ccaefd464e  gcc/testsuite/g++.dg/init/vector1.C
  4e0802398e368eb04b3feac9c0b1b5d4  gcc/testsuite/g++.dg/init/void1.C
--- 30912,30918 ----
  4487271d3a3d8cbbe87a8aa0dee4b541  gcc/testsuite/g++.dg/init/value7.C
  8301ee378a2cddfa351a850b83e9542a  gcc/testsuite/g++.dg/init/value8.C
  ac0a59cc779709a0f2049784d3349ce1  gcc/testsuite/g++.dg/init/value9.C
! af7fbde28513cc88fd193281bd476c61  gcc/testsuite/g++.dg/init/vbase1.C
  f950998991b01d5ad8aa91b1f8d04255  gcc/testsuite/g++.dg/init/vbase2.C
  e4ace0ef4caaae06eef685ccaefd464e  gcc/testsuite/g++.dg/init/vector1.C
  4e0802398e368eb04b3feac9c0b1b5d4  gcc/testsuite/g++.dg/init/void1.C
*************** ffdbd39bf7256fe7cdd80a0507ecc133  gcc/te
*** 30976,30982 ****
  af1630ba13bdbd20938ab0c47a373b5a  gcc/testsuite/g++.dg/ipa/ipa-icf-1.C
  7abc84b89d5655129dac92bfe8a5ef42  gcc/testsuite/g++.dg/ipa/ipa-icf-2.C
  ca19634a861e929cd261f6f3a923f8b3  gcc/testsuite/g++.dg/ipa/ipa-icf-3.C
! 8c1a79016f63ba6106b140bbc3aba3af  gcc/testsuite/g++.dg/ipa/ipa-icf-4.C
  890af13d278e4e0706986dbc2c5a1884  gcc/testsuite/g++.dg/ipa/ipa-icf-5.C
  91f7284baf9c02068705da50e95886c9  gcc/testsuite/g++.dg/ipa/ipa-icf-6.C
  baa7a26fbd7f93011660ae486b2d5a03  gcc/testsuite/g++.dg/ipa/ipa-pta-1.C
--- 30996,31002 ----
  af1630ba13bdbd20938ab0c47a373b5a  gcc/testsuite/g++.dg/ipa/ipa-icf-1.C
  7abc84b89d5655129dac92bfe8a5ef42  gcc/testsuite/g++.dg/ipa/ipa-icf-2.C
  ca19634a861e929cd261f6f3a923f8b3  gcc/testsuite/g++.dg/ipa/ipa-icf-3.C
! ea3d28ff5ce397563ae5af9a4cf08821  gcc/testsuite/g++.dg/ipa/ipa-icf-4.C
  890af13d278e4e0706986dbc2c5a1884  gcc/testsuite/g++.dg/ipa/ipa-icf-5.C
  91f7284baf9c02068705da50e95886c9  gcc/testsuite/g++.dg/ipa/ipa-icf-6.C
  baa7a26fbd7f93011660ae486b2d5a03  gcc/testsuite/g++.dg/ipa/ipa-pta-1.C
*************** a8636939c5d030916bbdc239d5e9e9a3  gcc/te
*** 31897,31902 ****
--- 31917,31925 ----
  040be8991ebd5f345ea015fd8710afd5  gcc/testsuite/g++.dg/modules/auto-5_c.C
  b68df902c6a54181691939a43b2744d7  gcc/testsuite/g++.dg/modules/auto-6_a.H
  427dcd6424cdaf1a044b4b2d5267cbf7  gcc/testsuite/g++.dg/modules/auto-6_b.C
+ fc4953758f61818ace23b9509f84bae2  gcc/testsuite/g++.dg/modules/auto-7.h
+ b5098d48df02f895f0e578a0a6ecde73  gcc/testsuite/g++.dg/modules/auto-7_a.H
+ 8df4b11a8e283992ecbb2598a5d92ce6  gcc/testsuite/g++.dg/modules/auto-7_b.C
  53bbe2f7c4d5079131e5a6dea8da20db  gcc/testsuite/g++.dg/modules/bad-mapper-1.C
  429207e0eb777b4a43a566e8777f6503  gcc/testsuite/g++.dg/modules/bad-mapper-2.C
  457c206081cc6757683b25dc791287cd  gcc/testsuite/g++.dg/modules/bad-mapper-3.C
*************** e4b77c409215a0a9d2fc97a366631d1c  gcc/te
*** 32569,32574 ****
--- 32592,32599 ----
  9199065b138fb1fc3c53d3868d5c9458  gcc/testsuite/g++.dg/modules/macro-8_c.C
  48c9a496c5ee8fe511785ca4a81e2f1c  gcc/testsuite/g++.dg/modules/macro-8_d.C
  3834a2aa6874a40737004684bed293ba  gcc/testsuite/g++.dg/modules/main-1.C
+ 69eb2046c77aed38a011666931589d50  gcc/testsuite/g++.dg/modules/main-2.C
+ 10675fa232994b413c22bc953b10d556  gcc/testsuite/g++.dg/modules/main-3.C
  7e55fb2b58ae21062a1aae92abeddaee  gcc/testsuite/g++.dg/modules/map-1.map
  4937456105df94b310b2e5b07d99684e  gcc/testsuite/g++.dg/modules/map-1_a.C
  47dd78dbe2bd86b2a089fcb4568428b6  gcc/testsuite/g++.dg/modules/map-1_b.C
*************** d684f71f3f20bed75ccc9aecab05ecdb  gcc/te
*** 32925,32930 ****
--- 32950,32957 ----
  af1e9e3b0cc46e0d597048ea5dda7431  gcc/testsuite/g++.dg/modules/pr119102_b.C
  d1e2592670bcdeda87ffce22aa27ec30  gcc/testsuite/g++.dg/modules/pr119608_a.C
  42f7d0ad39e2bd3aa2ca1c1f2e1b0410  gcc/testsuite/g++.dg/modules/pr119608_b.C
+ c612aa7562a08eee08fd881b3b27fee6  gcc/testsuite/g++.dg/modules/pr120040_a.C
+ 680ac168b034a19e8070cf8c66cd3edc  gcc/testsuite/g++.dg/modules/pr120040_b.C
  56ba9e2a41b995724a511df79d8df541  gcc/testsuite/g++.dg/modules/pr98531-1.h
  7155fba8679861dc6ac8879b5f49a6eb  gcc/testsuite/g++.dg/modules/pr98531-1_a.H
  db36409e89afb58e627178caf0f3d7d5  gcc/testsuite/g++.dg/modules/pr98531-1_b.C
*************** da0cfcb5ac1aec80b1194aff6f469086  gcc/te
*** 33082,33087 ****
--- 33109,33118 ----
  381497aeb07dcdcf0ac1dff8bae080e4  gcc/testsuite/g++.dg/modules/scc-2.C
  1ea36c9c27e88f193688e35c7e951ff1  gcc/testsuite/g++.dg/modules/shadow-1_a.C
  049e6f7d1e704ee70bcb37a5fe369595  gcc/testsuite/g++.dg/modules/shadow-1_b.C
+ 53de506d5cdbf9ce04c575dd3302dd90  gcc/testsuite/g++.dg/modules/src-loc-1.h
+ 903450e142559451ac9a44c43999cfa9  gcc/testsuite/g++.dg/modules/src-loc-1_a.H
+ 75032200eb312d5290471c55ee50f11f  gcc/testsuite/g++.dg/modules/src-loc-1_b.C
+ 992537fab884d1aa501da374dbaabb89  gcc/testsuite/g++.dg/modules/src-loc-1_c.C
  705fd48d90f803e5220981d3e79d4db7  gcc/testsuite/g++.dg/modules/stat-mem-1.h
  aae07c059c641c03943c0e067167d486  gcc/testsuite/g++.dg/modules/stat-mem-1_a.H
  df985f4dcd12d98035a56d56fcdd7015  gcc/testsuite/g++.dg/modules/stat-mem-1_b.C
*************** abb264131cf69ea3d4038a76ed813597  gcc/te
*** 33325,33330 ****
--- 33356,33363 ----
  d92fe811980f743f6ceae665d0e6d815  gcc/testsuite/g++.dg/modules/typename-1_b.C
  f0018549a1dd967c9debb3cdb1131d36  gcc/testsuite/g++.dg/modules/typename-friend_a.C
  f1d985b13d698bcccc55e9f689df6a56  gcc/testsuite/g++.dg/modules/typename-friend_b.C
+ 95430cb0fdc82d1b20c87acb2f708439  gcc/testsuite/g++.dg/modules/ubsan-1_a.C
+ 40f350225331274c8eb8178ccf2b1fdb  gcc/testsuite/g++.dg/modules/ubsan-1_b.C
  634f316800fb64083c45650e2e916e91  gcc/testsuite/g++.dg/modules/unnamed-1_a.C
  fcd88fa087afa6876483c9180896600f  gcc/testsuite/g++.dg/modules/unnamed-1_b.C
  b56edd1f3ed182e1e681ca48a66740bf  gcc/testsuite/g++.dg/modules/unnamed-2.C
*************** f925dbe1528712dd5921699a83e6b23c  gcc/te
*** 34859,34866 ****
  1f0cba57d6bb8594c938edf51e17e937  gcc/testsuite/g++.dg/parse/linkage2.C
  f860807cf54031b8df626f746711d411  gcc/testsuite/g++.dg/parse/linkage3.C
  8104de8c0208b62f2ca257fc4c007f84  gcc/testsuite/g++.dg/parse/linkage4.C
! b5e2a28d131d33946e3dc97e9b47d7bf  gcc/testsuite/g++.dg/parse/linkage5.C
  ea86d1a073f0bda0eeb3149364adc0f4  gcc/testsuite/g++.dg/parse/linkage6.C
  1f60e536555694022c574aff0f464e09  gcc/testsuite/g++.dg/parse/local-class1.C
  d1474e603dfda7a944b4131661d47d65  gcc/testsuite/g++.dg/parse/local1.C
  8af90d5b10beafe61974e1e52c872741  gcc/testsuite/g++.dg/parse/long1.C
--- 34892,34901 ----
  1f0cba57d6bb8594c938edf51e17e937  gcc/testsuite/g++.dg/parse/linkage2.C
  f860807cf54031b8df626f746711d411  gcc/testsuite/g++.dg/parse/linkage3.C
  8104de8c0208b62f2ca257fc4c007f84  gcc/testsuite/g++.dg/parse/linkage4.C
! 232ea5b868a4c2015e765670abfdbf15  gcc/testsuite/g++.dg/parse/linkage5.C
  ea86d1a073f0bda0eeb3149364adc0f4  gcc/testsuite/g++.dg/parse/linkage6.C
+ dbca39ab1fc41edf6b81909d13a0d37c  gcc/testsuite/g++.dg/parse/linkage7.C
+ bb02d7c56a6e42275331f655236aa4b1  gcc/testsuite/g++.dg/parse/linkage8.C
  1f60e536555694022c574aff0f464e09  gcc/testsuite/g++.dg/parse/local-class1.C
  d1474e603dfda7a944b4131661d47d65  gcc/testsuite/g++.dg/parse/local1.C
  8af90d5b10beafe61974e1e52c872741  gcc/testsuite/g++.dg/parse/long1.C
*************** ae883844cdffe266994223192fd8cd35  gcc/te
*** 37435,37440 ****
--- 37470,37476 ----
  f298eddbaaad3dfdc15f6cf9683ff08a  gcc/testsuite/g++.dg/torture/pr11911.C
  9df51f0b5a7e716286f2e97dfd28d477  gcc/testsuite/g++.dg/torture/pr119610.C
  9cede7e8b587157ccdf0f9f6667d6cc8  gcc/testsuite/g++.dg/torture/pr119778.C
+ a7a00125ef903c9e5ba25788e8c60eab  gcc/testsuite/g++.dg/torture/pr120721.C
  161154ed9f6193a2a7da119e068c3f3f  gcc/testsuite/g++.dg/torture/pr27218.C
  a84e9fff95df4801f8e582fbc33303b8  gcc/testsuite/g++.dg/torture/pr30252.C
  e980bf95890544d46879b89f7aa98df6  gcc/testsuite/g++.dg/torture/pr30567.C
*************** f8e72092c06f4ebdc16407b25d48593a  gcc/te
*** 38266,38271 ****
--- 38302,38309 ----
  5f6adf84c6b049487918b36dbd808b87  gcc/testsuite/g++.dg/ubsan/div-by-zero-2.C
  25697e9d3c9eae68321ae8a6d93e1ddf  gcc/testsuite/g++.dg/ubsan/div-by-zero-3.C
  f37ad4b9712d576fe6db63c0d8c23c18  gcc/testsuite/g++.dg/ubsan/float-cast-overflow-bf.C
+ d3afbc1de579855378953714928162a6  gcc/testsuite/g++.dg/ubsan/module-1-aux.cc
+ 72ede99d236f8831fbf4c4f999a9ead6  gcc/testsuite/g++.dg/ubsan/module-1.C
  c7511655f2d54310866c998269060e60  gcc/testsuite/g++.dg/ubsan/null-1.C
  58dd5b6b76901b231167f7516ed08820  gcc/testsuite/g++.dg/ubsan/null-2.C
  5579e272add390f8945bdcaa9eb5868a  gcc/testsuite/g++.dg/ubsan/null-3.C
*************** d5e518a89029e53244731ceed8c64fc4  gcc/te
*** 39255,39260 ****
--- 39293,39299 ----
  26bafcbe2a9f3729e0b0e2ff8ccf5317  gcc/testsuite/g++.dg/warn/deprecated-2.C
  a0b26ea4922bc88a4f4ca39b3ee18d6f  gcc/testsuite/g++.dg/warn/deprecated-20.C
  d49d9ec1f461eba29eaa5264d9b35572  gcc/testsuite/g++.dg/warn/deprecated-21.C
+ 2d65fcc7a592e874c83b7927e739b934  gcc/testsuite/g++.dg/warn/deprecated-22.C
  482df2a6c06bdf9046c6729484298715  gcc/testsuite/g++.dg/warn/deprecated-3.C
  98c2c2dc0644115f45902f826dc56a04  gcc/testsuite/g++.dg/warn/deprecated-4.C
  9fb0087e50484de53d979d8e849be2eb  gcc/testsuite/g++.dg/warn/deprecated-5.C
*************** f23b91fd4df934b4b8cb89c14e082b05  gcc/te
*** 43018,43023 ****
--- 43057,43069 ----
  0ec10c6dd8c46db7332b15201fba84ba  gcc/testsuite/g++.target/i386/m128-check.h
  a1f73425439294ed2e5c470eb6a67f31  gcc/testsuite/g++.target/i386/m256-check.h
  ae8574e23abf3d9af1504b3bec6f9ec6  gcc/testsuite/g++.target/i386/mangling-alias1.C
+ ae2651261413c9389759f8bfa661ce25  gcc/testsuite/g++.target/i386/memset-pr101366-1.C
+ 57024bf79b03bcb6b285444a8b28b612  gcc/testsuite/g++.target/i386/memset-pr101366-2.C
+ 5f07e75dbd21ca39994a585cee4ca58c  gcc/testsuite/g++.target/i386/memset-pr108585-1a.C
+ 5535ac7439d650c5bb9fab6da81fdb62  gcc/testsuite/g++.target/i386/memset-pr108585-1b.C
+ 4ed896188ea2bea98c965e7e41f3d3d7  gcc/testsuite/g++.target/i386/memset-pr118276-1a.C
+ a467604d2accb345c20c003f878494e4  gcc/testsuite/g++.target/i386/memset-pr118276-1b.C
+ ac490f4c7437432cf3c76a1c44c29a8f  gcc/testsuite/g++.target/i386/memset-pr118276-1c.C
  4e700e994b817984ed104fabbd34d2c4  gcc/testsuite/g++.target/i386/mv-symbols1.C
  c0b24207688618b815731387510d9bed  gcc/testsuite/g++.target/i386/mv-symbols2.C
  9d62ccf3abbeb46b904b5883b04e23eb  gcc/testsuite/g++.target/i386/mv-symbols3.C
*************** b74251af1154060812e45ff5697e903e  gcc/te
*** 43152,43157 ****
--- 43198,43205 ----
  c6fc9957abb94d73bf6685e341312513  gcc/testsuite/g++.target/i386/pr118068.C
  309d3ebda65ef0d79e21d0a9c0310055  gcc/testsuite/g++.target/i386/pr119689.C
  38180dda246555aa4a3e76db7cd452f1  gcc/testsuite/g++.target/i386/pr120036.C
+ 8648be4dade032c24c786b68f4353c67  gcc/testsuite/g++.target/i386/pr120819.C
+ fe0c4541682a8b2806aac4868c0ee61c  gcc/testsuite/g++.target/i386/pr120830.C
  55fb67abf6517f92b1a0240d2c06b5c5  gcc/testsuite/g++.target/i386/pr35513-1.C
  14dde546e4eefec7aa6d1ac41261cb16  gcc/testsuite/g++.target/i386/pr35513-2.C
  1c706f97b6d93c0124dc4a203c98f6d2  gcc/testsuite/g++.target/i386/pr57362.C
*************** afb8b6ab7d54fa8eab8865a52a46caa4  gcc/te
*** 43200,43206 ****
  eafc363e633aef7542e621d7ecaa914e  gcc/testsuite/g++.target/i386/pr99108.C
  3660db29974db1f63f1a1f458c8894db  gcc/testsuite/g++.target/i386/pr99679-1.C
  b3fdfe2866e1905292894d815f1fa291  gcc/testsuite/g++.target/i386/pr99679-2.C
! bb1bb4d82ab7e27c7670e69b269af286  gcc/testsuite/g++.target/i386/shrink_wrap_separate.C
  a621b799eff193996043d9d5462e5c27  gcc/testsuite/g++.target/i386/sse4_1-check.h
  8ac3bf43a1ce0277ed295c7ff1cc85fc  gcc/testsuite/g++.target/i386/sse4_1-pr100637-1b.C
  c06ceb436623685585c49fb701481265  gcc/testsuite/g++.target/i386/sse4_1-pr100637-1w.C
--- 43248,43254 ----
  eafc363e633aef7542e621d7ecaa914e  gcc/testsuite/g++.target/i386/pr99108.C
  3660db29974db1f63f1a1f458c8894db  gcc/testsuite/g++.target/i386/pr99679-1.C
  b3fdfe2866e1905292894d815f1fa291  gcc/testsuite/g++.target/i386/pr99679-2.C
! 34f905a0359d6dd61671b90ee3d5a45a  gcc/testsuite/g++.target/i386/shrink_wrap_separate.C
  a621b799eff193996043d9d5462e5c27  gcc/testsuite/g++.target/i386/sse4_1-check.h
  8ac3bf43a1ce0277ed295c7ff1cc85fc  gcc/testsuite/g++.target/i386/sse4_1-pr100637-1b.C
  c06ceb436623685585c49fb701481265  gcc/testsuite/g++.target/i386/sse4_1-pr100637-1w.C
*************** d396ac30a4549605a8b91e88fb32d4e3  gcc/te
*** 48349,48355 ****
  ae69c46005567e7d1eb865066adcb226  gcc/testsuite/gcc.dg/analyzer/abs-1.c
  2fbe7c43718aa946f2698455261a0c9f  gcc/testsuite/gcc.dg/analyzer/allocation-size-5.c
  ec878e263cce5a120872d1d5af92099c  gcc/testsuite/gcc.dg/analyzer/allocation-size-multiline-4.c
! a1175daef070a7eaed078acb4c54a18e  gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h
  bb69f65fee7b59150ff696d1052e9897  gcc/testsuite/gcc.dg/analyzer/analyzer.exp
  c8fea92fbe2674fd004d27f275db2d9f  gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c
  d780518e28005b87079c2be1a96dab0e  gcc/testsuite/gcc.dg/analyzer/asm-x86-lp64-1.c
--- 48397,48403 ----
  ae69c46005567e7d1eb865066adcb226  gcc/testsuite/gcc.dg/analyzer/abs-1.c
  2fbe7c43718aa946f2698455261a0c9f  gcc/testsuite/gcc.dg/analyzer/allocation-size-5.c
  ec878e263cce5a120872d1d5af92099c  gcc/testsuite/gcc.dg/analyzer/allocation-size-multiline-4.c
! b777059ff5ea7cd45e730f84caf49208  gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h
  bb69f65fee7b59150ff696d1052e9897  gcc/testsuite/gcc.dg/analyzer/analyzer.exp
  c8fea92fbe2674fd004d27f275db2d9f  gcc/testsuite/gcc.dg/analyzer/asm-x86-dyndbg-1.c
  d780518e28005b87079c2be1a96dab0e  gcc/testsuite/gcc.dg/analyzer/asm-x86-lp64-1.c
*************** c3d6877dc6b6aaf933b97e6748b315cc  gcc/te
*** 48584,48589 ****
--- 48632,48646 ----
  8959874363aade3ab965125e11d3ded5  gcc/testsuite/gcc.dg/analyzer/sigsetjmp-6.c
  041939ea34c3dd2bdd2d95257e5520ad  gcc/testsuite/gcc.dg/analyzer/single-field.c
  7c5d373abe7dc75a1f4304f4d2e0548b  gcc/testsuite/gcc.dg/analyzer/sprintf-1.c
+ f20b083d1c56d61fdc4c6cc653d01f45  gcc/testsuite/gcc.dg/analyzer/state-diagram-1-sarif.py
+ 5e6064b6c949b65f200d64194e85ff49  gcc/testsuite/gcc.dg/analyzer/state-diagram-1.c
+ abde205c5f5c45914abf04811fbb5c2a  gcc/testsuite/gcc.dg/analyzer/state-diagram-2.c
+ 2d1c3f36c5428e3dc3a66a4baf126291  gcc/testsuite/gcc.dg/analyzer/state-diagram-3.c
+ fb663b32ae2101d0ee651ad8022f76a9  gcc/testsuite/gcc.dg/analyzer/state-diagram-4.c
+ 36ec6924e080d8cc33c6ef5a8034723b  gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.c
+ 60dba72896ae9f4c697d7ea32e335e57  gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.py
+ 916a1d4582b95890c4031908acb7edfd  gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.c
+ ae45e54ffc42966c81432e4f60b933f5  gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.py
  5c72aedcce8177798415d32e0a8bf938  gcc/testsuite/gcc.dg/analyzer/stdarg-1-ms_abi.c
  ae7b0d56b5a779d9be16f41d3efb6e03  gcc/testsuite/gcc.dg/analyzer/stdarg-1-sysv_abi.c
  83eea51c7616c3097a43f056ac9be295  gcc/testsuite/gcc.dg/analyzer/stdarg-1.c
*************** d9f2439f176b4f73afa0c30baa468855  gcc/te
*** 54746,54755 ****
  72712f41dcc921ba1827000fc0809a9c  gcc/testsuite/gcc.dg/pie-link.c
  000d3a6c8dca7e54f5be771190d10f29  gcc/testsuite/gcc.dg/pie-static-1.c
  be052bceddbf752586b645bc9e048e9c  gcc/testsuite/gcc.dg/pie-static-2.c
! d053e6b980a83c4356d83222795e9847  gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc
! 9b42cfe55bc7eaba9a04fc700efc793c  gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc
! 9e697deb7d8baef7f67f70ea2c455db5  gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc
! 73861ab3558265fdd8d06a87a39a95c0  gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc
  cb4eac35bee8576a953631c035c2ff66  gcc/testsuite/gcc.dg/plugin/copy_from_user-1.c
  47f23deacf7629644591a6e9f024a065  gcc/testsuite/gcc.dg/plugin/cpython-plugin-test-PyList_Append.c
  77898c598fcadce69594a47533fa5d08  gcc/testsuite/gcc.dg/plugin/cpython-plugin-test-PyList_New.c
--- 54803,54812 ----
  72712f41dcc921ba1827000fc0809a9c  gcc/testsuite/gcc.dg/pie-link.c
  000d3a6c8dca7e54f5be771190d10f29  gcc/testsuite/gcc.dg/pie-static-1.c
  be052bceddbf752586b645bc9e048e9c  gcc/testsuite/gcc.dg/pie-static-2.c
! 06fc0933356fe57959666abea2f07f59  gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc
! 4d4e9b9858fe61fe76ea43e13b2b6dc2  gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc
! f256e1fca9dce4089a6d9d913c5f5e6a  gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc
! e894a2297a56ca0e7301582b3b1c8141  gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc
  cb4eac35bee8576a953631c035c2ff66  gcc/testsuite/gcc.dg/plugin/copy_from_user-1.c
  47f23deacf7629644591a6e9f024a065  gcc/testsuite/gcc.dg/plugin/cpython-plugin-test-PyList_Append.c
  77898c598fcadce69594a47533fa5d08  gcc/testsuite/gcc.dg/plugin/cpython-plugin-test-PyList_New.c
*************** e9fd20c6a5ee817fc329cc085c9032eb  gcc/te
*** 60423,60432 ****
  4fbcebb70fe7512862cd2a9642fd2605  gcc/testsuite/gcc.dg/transparent-union-6.c
  8d1595003065ecd1d4556067ec7e25cc  gcc/testsuite/gcc.dg/tree-prof/20041218-1.c
  3efe9018c42617fad26ca176fc3306fd  gcc/testsuite/gcc.dg/tree-prof/20050826-2.c
  fe7a25a8994098f4b71009b9a1aad559  gcc/testsuite/gcc.dg/tree-prof/afdo-inline.c
  6002203bc07005ca0e9c543037930992  gcc/testsuite/gcc.dg/tree-prof/afdo-vpt-earlyinline.c
  7fea89044d1cae3c25a1775dd049cbe7  gcc/testsuite/gcc.dg/tree-prof/bb-reorg.c
! b6efe4d551132d9a7c42ff097c91297d  gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c
  fea6679f47a5ff36663a877937522419  gcc/testsuite/gcc.dg/tree-prof/cmpsf-1.c
  124079e3848ee10f2ebc98be4d07e9f5  gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
  e9f1e3170e9c1bd390f79587f24c6349  gcc/testsuite/gcc.dg/tree-prof/comp-goto-1.c
--- 60480,60492 ----
  4fbcebb70fe7512862cd2a9642fd2605  gcc/testsuite/gcc.dg/transparent-union-6.c
  8d1595003065ecd1d4556067ec7e25cc  gcc/testsuite/gcc.dg/tree-prof/20041218-1.c
  3efe9018c42617fad26ca176fc3306fd  gcc/testsuite/gcc.dg/tree-prof/20050826-2.c
+ 9c537759c05659b9e3cc8ad98d65510a  gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1.c
+ be751d428ac7acd0bb5ba316dc89cbca  gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1b.c
  fe7a25a8994098f4b71009b9a1aad559  gcc/testsuite/gcc.dg/tree-prof/afdo-inline.c
  6002203bc07005ca0e9c543037930992  gcc/testsuite/gcc.dg/tree-prof/afdo-vpt-earlyinline.c
  7fea89044d1cae3c25a1775dd049cbe7  gcc/testsuite/gcc.dg/tree-prof/bb-reorg.c
! ec8df9345f980f5032e03879fbcc65f8  gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c
! ea5950f6fc294482e6c79818fb3837d4  gcc/testsuite/gcc.dg/tree-prof/clone-test.c
  fea6679f47a5ff36663a877937522419  gcc/testsuite/gcc.dg/tree-prof/cmpsf-1.c
  124079e3848ee10f2ebc98be4d07e9f5  gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
  e9f1e3170e9c1bd390f79587f24c6349  gcc/testsuite/gcc.dg/tree-prof/comp-goto-1.c
*************** cf7f678829144365c7c6e3436f2fe6c9  gcc/te
*** 60437,60443 ****
  8a7ed79d9687fd79c9c1f831e7e7995b  gcc/testsuite/gcc.dg/tree-prof/crossmodule-indircall-1a.c
  26029d99148f25b6e5936d8536719f05  gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c
  af6029c2bad38cfb5326e5a120549d06  gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1a.c
! f6ef6a87864011f42b4cb60ecbae48e6  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c
  1a6a44bdec75a8550a766d6afea7e532  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c
  85d5018bec782bddcb3e3782c0be5143  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-topn.c
  f3d50d6757f0db7ac4ee44425c687545  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof.c
--- 60497,60503 ----
  8a7ed79d9687fd79c9c1f831e7e7995b  gcc/testsuite/gcc.dg/tree-prof/crossmodule-indircall-1a.c
  26029d99148f25b6e5936d8536719f05  gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1.c
  af6029c2bad38cfb5326e5a120549d06  gcc/testsuite/gcc.dg/tree-prof/ic-misattribution-1a.c
! 759ac2076697eacbc5538d0c982af377  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c
  1a6a44bdec75a8550a766d6afea7e532  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c
  85d5018bec782bddcb3e3782c0be5143  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-topn.c
  f3d50d6757f0db7ac4ee44425c687545  gcc/testsuite/gcc.dg/tree-prof/indir-call-prof.c
*************** be86bc81622216478087ebb0eb3b5c80  gcc/te
*** 63497,63502 ****
--- 63557,63563 ----
  449a56358af2ecccab64ebf0a2c70ef8  gcc/testsuite/gcc.dg/vect/bb-slp-pr115777.c
  536ff3716470f738cfa7ae45d07e10f8  gcc/testsuite/gcc.dg/vect/bb-slp-pr119181.c
  7985ca78d6f56c0a2c1475513068be88  gcc/testsuite/gcc.dg/vect/bb-slp-pr119960-1.c
+ 63bead846dcbd7cde9d80df1101fda79  gcc/testsuite/gcc.dg/vect/bb-slp-pr120808.c
  d46400927215059ca9b31c5b97f6e386  gcc/testsuite/gcc.dg/vect/bb-slp-pr54400.c
  5472e7bf338627077f4e6ce8cce9944e  gcc/testsuite/gcc.dg/vect/bb-slp-pr58135.c
  7e19c3d3a663aa66906a8c708aec1d4e  gcc/testsuite/gcc.dg/vect/bb-slp-pr65935.c
*************** b87af2befdcd6ef5944c1d0bc07f0c57  gcc/te
*** 64986,64992 ****
  d0fc4055a44603d4a551eb8b3201b367  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa3.c
  7c20340133986a2c41b6c67686e47303  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa4.c
  d6220e03e06d838a0de45843cf47a605  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa5.c
! 2e864ab4bcc93331fcded9fa3597129c  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c
  e3103917941df88fd427f58c02de199c  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa7.c
  a9f60b255bd045a55a1c552ca8a26db4  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c
  0931b2635277269f10668825e1fef46f  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c
--- 65047,65053 ----
  d0fc4055a44603d4a551eb8b3201b367  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa3.c
  7c20340133986a2c41b6c67686e47303  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa4.c
  d6220e03e06d838a0de45843cf47a605  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa5.c
! 57637e8ef1f38c45ddbfbec65c0e7a18  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c
  e3103917941df88fd427f58c02de199c  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa7.c
  a9f60b255bd045a55a1c552ca8a26db4  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa8.c
  0931b2635277269f10668825e1fef46f  gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa9.c
*************** f2115c849db56b36f9016249488854e1  gcc/te
*** 65363,65368 ****
--- 65424,65432 ----
  4a6e93ac791a77eb1a90606f0bac13b9  gcc/testsuite/gcc.dg/vect/vect-reduc-dot-u8a.c
  b65b62bb6371d5775229ef496d236676  gcc/testsuite/gcc.dg/vect/vect-reduc-dot-u8b.c
  55ec9b312052ccb0235403f0877ce3cc  gcc/testsuite/gcc.dg/vect/vect-reduc-epilogue-gaps.c
+ 5a047fffab5ffa5652052278da8f1079  gcc/testsuite/gcc.dg/vect/vect-reduc-fma-1.c
+ 662def9c47c47b6908ba751b0377351d  gcc/testsuite/gcc.dg/vect/vect-reduc-fma-2.c
+ cbcd5638a88db2be71e21c46ac579881  gcc/testsuite/gcc.dg/vect/vect-reduc-fma-3.c
  e6d7cffdfe32895fb6cd02c38d3f7dfa  gcc/testsuite/gcc.dg/vect/vect-reduc-in-order-1.c
  b7b984e0456b49a107ab1fead4038420  gcc/testsuite/gcc.dg/vect/vect-reduc-in-order-2.c
  1eef69f3a699802657df0415b9475266  gcc/testsuite/gcc.dg/vect/vect-reduc-in-order-3.c
*************** de76859b307e32b03a98f03a94e54fe0  gcc/te
*** 66852,66861 ****
--- 66916,66930 ----
  585eda662bdd7f06f3d17aafcefa8670  gcc/testsuite/gcc.target/aarch64/auto-init-padding-8.c
  721a33437def414205b86d642c689ebc  gcc/testsuite/gcc.target/aarch64/auto-init-padding-9.c
  27917d4f989bfdc893eab2963f064cc6  gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only.c
+ b785f49ae012e7412b1a8a0d3047a5b6  gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only_2.c
  7632a80f967a85c739c65907412d3e7a  gcc/testsuite/gcc.target/aarch64/autovec_param_default.c
+ 131877c3b79050f7e92ef232f426c0d2  gcc/testsuite/gcc.target/aarch64/autovec_param_default_2.c
  15466f8f8ba340a60a545826e971f8a7  gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd.c
+ 3679e7c33aa7136c47e84c732616cf36  gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd_2.c
  216ddfcf3c5a91ee9c5b0930b72c3046  gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve.c
+ 5e3bc57edfd17dfc6a62a336868e979d  gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve_2.c
  2e8212454ab53b66dd614df027a20c52  gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only.c
+ c6cf8bf0cb1b39440a64d8f476f6edc2  gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only_2.c
  6be34d1061cc21e45068f5bcf851dd0b  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-1.c
  2e23b12ef8bf5121f832dde1bbc17b30  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-2.c
  47ecf70940c2c8939e2d79a162064898  gcc/testsuite/gcc.target/aarch64/avoid-store-forwarding-3.c
*************** b77d57f6ab3a698dfef1798ec4ada94d  gcc/te
*** 71551,71556 ****
--- 71620,71626 ----
  1644b5aca1029272980fa6486471e83f  gcc/testsuite/gcc.target/aarch64/sve/adr_5.c
  08a30fcbd7cb13074d9f737a36ee873c  gcc/testsuite/gcc.target/aarch64/sve/adr_5_run.c
  a1d9993cfe67282d03182bc25905bd1a  gcc/testsuite/gcc.target/aarch64/sve/adr_6.c
+ efba7357d7c211f0b8d25f18eb365cf6  gcc/testsuite/gcc.target/aarch64/sve/adr_7.c
  62c2fdff5e2575e27bb0a1d20d21aa9e  gcc/testsuite/gcc.target/aarch64/sve/arith_1.c
  efb1c357526ad1218a7cda47ab799c9e  gcc/testsuite/gcc.target/aarch64/sve/asrdiv_1.c
  d21de60c71043234f5e72b2fc5db1cbd  gcc/testsuite/gcc.target/aarch64/sve/asrdiv_2.c
*************** f5f51f0ce22434617d58b4330621ef23  gcc/te
*** 71815,71820 ****
--- 71885,71892 ----
  ff2b9241bd177f9b139fbf6fbf043cb3  gcc/testsuite/gcc.target/aarch64/sve/cost_model_14.c
  d5b139bd861ddd97284d5f818eb70a78  gcc/testsuite/gcc.target/aarch64/sve/cost_model_15.c
  92599cd7aea93c6796fffa0a479dd58c  gcc/testsuite/gcc.target/aarch64/sve/cost_model_16.c
+ b78d0d1274ed1cd074cd6302e8ae2dcc  gcc/testsuite/gcc.target/aarch64/sve/cost_model_17.c
+ 37d810c6bbb9c676752ca4c72f3439ab  gcc/testsuite/gcc.target/aarch64/sve/cost_model_18.c
  e918451f74d084e54a9a7ceb98f0bf8e  gcc/testsuite/gcc.target/aarch64/sve/cost_model_2.c
  8814c7380f5de0a24225ed6e4ac88c89  gcc/testsuite/gcc.target/aarch64/sve/cost_model_3.c
  a8a25f8db5e9498491012098a710bc72  gcc/testsuite/gcc.target/aarch64/sve/cost_model_4.c
*************** e096738dd28b2289464e1c1af2eb63e6  gcc/te
*** 74300,74305 ****
--- 74372,74378 ----
  a5b09578629531d465aefeed46ebae10  gcc/testsuite/gcc.target/aarch64/ubfiz_lsl_1.c
  36ad666b8760a3d2de950ba38d4a02c6  gcc/testsuite/gcc.target/aarch64/ubfx_lsr_1.c
  652ecb3b586494e30accfd65a8789592  gcc/testsuite/gcc.target/aarch64/umaddl_combine_1.c
+ 2632de6f4ddc0eee7d3f74b8d7da2621  gcc/testsuite/gcc.target/aarch64/unroll-vect.c
  14511b62983ad9e3291b049908b6d8d8  gcc/testsuite/gcc.target/aarch64/unsigned-float.c
  5bf9b14f9edfcac479f50a8da124cb46  gcc/testsuite/gcc.target/aarch64/usaba_1.c
  906a218fd0162c7785f09ed6656bec74  gcc/testsuite/gcc.target/aarch64/usadv16qi-dotprod.c
*************** b28f6252aaf3288f7754a0c50786df34  gcc/te
*** 74746,74751 ****
--- 74819,74825 ----
  51a65655bfba373cbacabf27deec612c  gcc/testsuite/gcc.target/arc/mul64.c
  46c5b1c885d49d863f7518670ae85e9c  gcc/testsuite/gcc.target/arc/mulsi3_highpart-1.c
  793d7938e24de8127c5230bc8a1799e9  gcc/testsuite/gcc.target/arc/mulsi3_highpart-2.c
+ 9c0d303a43e545b5f9e03c9a79846ec9  gcc/testsuite/gcc.target/arc/mult-cmp0.c
  a55caab34589aaad4b44c2b23036a38a  gcc/testsuite/gcc.target/arc/mxy.c
  cb20618eea943bb5260b4d5b424f7756  gcc/testsuite/gcc.target/arc/naked-1.c
  77013bd7a2cc422045b496b9aa750111  gcc/testsuite/gcc.target/arc/naked-2.c
*************** c2635eb729f09720a184a5826e218569  gcc/te
*** 74755,74760 ****
--- 74829,74836 ----
  a6f761c17339470bb07c2d99265ec06d  gcc/testsuite/gcc.target/arc/nv-cache.c
  18a4082484710c4349aebc15d3720bf1  gcc/testsuite/gcc.target/arc/or-cnst-size.c
  5a4576d30026a60f39a87cbe7efe00a6  gcc/testsuite/gcc.target/arc/or-cnst-size2.c
+ de759f7221704650463acdd0d5ae5767  gcc/testsuite/gcc.target/arc/overflow-1.c
+ d922a33e54be8b2a8c17b699460c81c4  gcc/testsuite/gcc.target/arc/overflow-2.c
  4d26da527c4326cbce22405e70988c60  gcc/testsuite/gcc.target/arc/pic-1.c
  8ac75d73a43ffeabafa566330b0b646a  gcc/testsuite/gcc.target/arc/pic-2.c
  a6dcc28a587998a1e31f18709aa0f66c  gcc/testsuite/gcc.target/arc/pmpyd.c
*************** a34b4fb61dcd1e5a3c0daf5d7d6fae65  gcc/te
*** 79927,79939 ****
  da9a874cc43d515ca40fe91f469c7339  gcc/testsuite/gcc.target/i386/auto-init-padding-11.c
  473ceb78530da54ed3602515d3b9132d  gcc/testsuite/gcc.target/i386/auto-init-padding-12.c
  4f2518506ddb10348964cfef12cf036f  gcc/testsuite/gcc.target/i386/auto-init-padding-2.c
! 5955fe5e2e6b460774295b57f682aa37  gcc/testsuite/gcc.target/i386/auto-init-padding-3.c
  5808936c24c459a0e1287fdfc80ea90f  gcc/testsuite/gcc.target/i386/auto-init-padding-4.c
  1085d3449618e196dd587e70afc232f0  gcc/testsuite/gcc.target/i386/auto-init-padding-5.c
  32c7c92b291fd1e003108bba56cddeda  gcc/testsuite/gcc.target/i386/auto-init-padding-6.c
  64889694d1cb3280b3aa71fa1424dec5  gcc/testsuite/gcc.target/i386/auto-init-padding-7.c
  6833c0fc00c0e05839ef7fc0ebe6662f  gcc/testsuite/gcc.target/i386/auto-init-padding-8.c
! 549987a73da82c221222811981e79dc3  gcc/testsuite/gcc.target/i386/auto-init-padding-9.c
  6d269f763b677e113f37ab0f5e75583e  gcc/testsuite/gcc.target/i386/avx-1.c
  ce8537ac3337be19a6e276a8fbfccd9e  gcc/testsuite/gcc.target/i386/avx-2.c
  b8752c209e6f3770321077d53e28d157  gcc/testsuite/gcc.target/i386/avx-3.c
--- 80003,80015 ----
  da9a874cc43d515ca40fe91f469c7339  gcc/testsuite/gcc.target/i386/auto-init-padding-11.c
  473ceb78530da54ed3602515d3b9132d  gcc/testsuite/gcc.target/i386/auto-init-padding-12.c
  4f2518506ddb10348964cfef12cf036f  gcc/testsuite/gcc.target/i386/auto-init-padding-2.c
! 71b118c75728f046182e8dd1b4a8494c  gcc/testsuite/gcc.target/i386/auto-init-padding-3.c
  5808936c24c459a0e1287fdfc80ea90f  gcc/testsuite/gcc.target/i386/auto-init-padding-4.c
  1085d3449618e196dd587e70afc232f0  gcc/testsuite/gcc.target/i386/auto-init-padding-5.c
  32c7c92b291fd1e003108bba56cddeda  gcc/testsuite/gcc.target/i386/auto-init-padding-6.c
  64889694d1cb3280b3aa71fa1424dec5  gcc/testsuite/gcc.target/i386/auto-init-padding-7.c
  6833c0fc00c0e05839ef7fc0ebe6662f  gcc/testsuite/gcc.target/i386/auto-init-padding-8.c
! aa5072850d2dd784e94f9294a1d15730  gcc/testsuite/gcc.target/i386/auto-init-padding-9.c
  6d269f763b677e113f37ab0f5e75583e  gcc/testsuite/gcc.target/i386/avx-1.c
  ce8537ac3337be19a6e276a8fbfccd9e  gcc/testsuite/gcc.target/i386/avx-2.c
  b8752c209e6f3770321077d53e28d157  gcc/testsuite/gcc.target/i386/avx-3.c
*************** aa76e419ea439da7ae72280b04d232b8  gcc/te
*** 81335,81343 ****
  252195c21a085a32b6eabfa3110379dd  gcc/testsuite/gcc.target/i386/avx512bw-vec-set-2.c
  16bb16a08e4faedb360f8c53d0f1b03f  gcc/testsuite/gcc.target/i386/avx512bw-vect-simd-11.c
  ddea7551446f3624078280bf402b1246  gcc/testsuite/gcc.target/i386/avx512bw-vect-simd-15.c
! 1a10b49e0a47ebdf8748c52df3108c6b  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c
  b36d91ed2b1544179ebaf8ce02e87137  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c
! 8ae3d7310aa70ab51a46f71ecf59efc5  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c
  6604cbd1523e1681a152d42d3da723ff  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-2.c
  f2c09f0461fc411ac562588f78dbad13  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-1.c
  880140ded63d84cb98c028b6681de716  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
--- 81411,81419 ----
  252195c21a085a32b6eabfa3110379dd  gcc/testsuite/gcc.target/i386/avx512bw-vec-set-2.c
  16bb16a08e4faedb360f8c53d0f1b03f  gcc/testsuite/gcc.target/i386/avx512bw-vect-simd-11.c
  ddea7551446f3624078280bf402b1246  gcc/testsuite/gcc.target/i386/avx512bw-vect-simd-15.c
! 9e778e55081e03b5ed67cd0a2c334a9e  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c
  b36d91ed2b1544179ebaf8ce02e87137  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-2.c
! aa12e2c56f62efc5ed6db99be6a794e1  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c
  6604cbd1523e1681a152d42d3da723ff  gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-2.c
  f2c09f0461fc411ac562588f78dbad13  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-1.c
  880140ded63d84cb98c028b6681de716  gcc/testsuite/gcc.target/i386/avx512bw-vpabsb-2.c
*************** e0b4781ba3e58056c22bc6ed34bf9300  gcc/te
*** 82767,82773 ****
  c8546919944aa8e519a6d7c6609e35a2  gcc/testsuite/gcc.target/i386/avx512fp16-11b.c
  45998199c9d05373b91b703c489b1dab  gcc/testsuite/gcc.target/i386/avx512fp16-12a.c
  14758831e35f6207f1d8a401d5965ad7  gcc/testsuite/gcc.target/i386/avx512fp16-12b.c
! 1eb68d7742137270ee20edec26715aaf  gcc/testsuite/gcc.target/i386/avx512fp16-13.c
  c5c6d65e4830ae5dec75a681e4c32731  gcc/testsuite/gcc.target/i386/avx512fp16-14.c
  5105733c3744e643e48e7e479046d119  gcc/testsuite/gcc.target/i386/avx512fp16-1a.c
  e5318fffe1e2b5367902db745c03823d  gcc/testsuite/gcc.target/i386/avx512fp16-1b.c
--- 82843,82849 ----
  c8546919944aa8e519a6d7c6609e35a2  gcc/testsuite/gcc.target/i386/avx512fp16-11b.c
  45998199c9d05373b91b703c489b1dab  gcc/testsuite/gcc.target/i386/avx512fp16-12a.c
  14758831e35f6207f1d8a401d5965ad7  gcc/testsuite/gcc.target/i386/avx512fp16-12b.c
! ad4f186a71739c69b4cd228c0b249bb1  gcc/testsuite/gcc.target/i386/avx512fp16-13.c
  c5c6d65e4830ae5dec75a681e4c32731  gcc/testsuite/gcc.target/i386/avx512fp16-14.c
  5105733c3744e643e48e7e479046d119  gcc/testsuite/gcc.target/i386/avx512fp16-1a.c
  e5318fffe1e2b5367902db745c03823d  gcc/testsuite/gcc.target/i386/avx512fp16-1b.c
*************** d0c34e512b83cbc46667be5492815364  gcc/te
*** 84285,84290 ****
--- 84361,84367 ----
  afdc9039171e569adb39b65867a89df3  gcc/testsuite/gcc.target/i386/cond_op_shift_w-2.c
  e1be9a615bd653f1910c323be509006e  gcc/testsuite/gcc.target/i386/const-in-bss.c
  09e05c9be2759d0d28e2c1d573b5b5c0  gcc/testsuite/gcc.target/i386/conversion.c
+ 653053493362024a1a4a4e405f95e133  gcc/testsuite/gcc.target/i386/crc-builtin-crc32.c
  46758c775ccdb73df90a9e3cde676f5e  gcc/testsuite/gcc.target/i386/crc32-1.c
  d54f2d3757317775b86d2e38b987ecec  gcc/testsuite/gcc.target/i386/crc32-2.c
  de30da9f8215170a20bb4d88e630e8ff  gcc/testsuite/gcc.target/i386/crc32-3.c
*************** aba6d2eff079b06e7cd71c9e907153e1  gcc/te
*** 84681,84692 ****
  e1e7267fec37636815e8272359b19e18  gcc/testsuite/gcc.target/i386/isa-check.h
  65d088e6c80d576745db2b97808153d0  gcc/testsuite/gcc.target/i386/keylocker-aesdec128kl.c
  3f797e1e0510f8b7a3d1cb266bd34b05  gcc/testsuite/gcc.target/i386/keylocker-aesdec256kl.c
! c1df16373f27617a0c52dc119835a641  gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c
! f1728b5e83b3ce3c8eaebf907d52fe30  gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c
  20cc66c33612b34dc60f7990ce4a8778  gcc/testsuite/gcc.target/i386/keylocker-aesenc128kl.c
  7d6318be1e679ff633411e06bdf9bc8b  gcc/testsuite/gcc.target/i386/keylocker-aesenc256kl.c
! 365be795bdc65acb8232f4fc0f710d08  gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c
! 599484c2f5122d14ad244cba89c2c0e0  gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c
  c6f6aaff47d064fbceed4cfbcb5b9279  gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c
  a468c392fd8838d0198cfb8b367d4b6d  gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c
  78393ec91600382e98db57e560deaea9  gcc/testsuite/gcc.target/i386/keylocker-loadiwkey.c
--- 84758,84769 ----
  e1e7267fec37636815e8272359b19e18  gcc/testsuite/gcc.target/i386/isa-check.h
  65d088e6c80d576745db2b97808153d0  gcc/testsuite/gcc.target/i386/keylocker-aesdec128kl.c
  3f797e1e0510f8b7a3d1cb266bd34b05  gcc/testsuite/gcc.target/i386/keylocker-aesdec256kl.c
! 5b1d9962042c03ee924a65a73c530f65  gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c
! 880e6942c8374aa77e726bf9dcbbe198  gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c
  20cc66c33612b34dc60f7990ce4a8778  gcc/testsuite/gcc.target/i386/keylocker-aesenc128kl.c
  7d6318be1e679ff633411e06bdf9bc8b  gcc/testsuite/gcc.target/i386/keylocker-aesenc256kl.c
! eea09433ae07509586cf81bfe0eba660  gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c
! 16580a1f221bb2dc081d4e87f9e6e3c4  gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c
  c6f6aaff47d064fbceed4cfbcb5b9279  gcc/testsuite/gcc.target/i386/keylocker-encodekey128.c
  a468c392fd8838d0198cfb8b367d4b6d  gcc/testsuite/gcc.target/i386/keylocker-encodekey256.c
  78393ec91600382e98db57e560deaea9  gcc/testsuite/gcc.target/i386/keylocker-loadiwkey.c
*************** cab1fad7719db80bf7a5c712c8e07f67  gcc/te
*** 84807,84812 ****
--- 84884,84891 ----
  11e1d1767b79743e4e65a799f3369907  gcc/testsuite/gcc.target/i386/memcpy-strategy-1.c
  b82d9188c52a269893b5ac6b25f9e515  gcc/testsuite/gcc.target/i386/memcpy-strategy-10.c
  619cbc26dc85de4ded3f5a985d0a23a2  gcc/testsuite/gcc.target/i386/memcpy-strategy-11.c
+ d79cdadfa87b3af1a7c26fb214c09c46  gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c
+ 44dcb4858ee7dffcecaaa96814b9b8c2  gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c
  043547bc2d2818c5fb11e83082688790  gcc/testsuite/gcc.target/i386/memcpy-strategy-2.c
  18088286a0546a409434dcbafef0a896  gcc/testsuite/gcc.target/i386/memcpy-strategy-3.c
  6e857b4eb94b8707c380e73efcbc5a51  gcc/testsuite/gcc.target/i386/memcpy-strategy-4.c
*************** f6fd4449a72ddd84f5687641334109d2  gcc/te
*** 84820,84828 ****
--- 84899,84916 ----
  40cce91585f47cde61390171cd489668  gcc/testsuite/gcc.target/i386/memset-1.c
  d40214a38af3060ba1bba456c7399a32  gcc/testsuite/gcc.target/i386/memset-pr120708-1.c
  131f444cf3fea918073579825312e430  gcc/testsuite/gcc.target/i386/memset-pr120708-2.c
+ 1feb8ee9db635b3c333cd931825cbab7  gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c
+ b970e68287955a210a8f61ee157aee19  gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c
  5d42d8053ea9c0f90ccef1a5662638be  gcc/testsuite/gcc.target/i386/memset-strategy-1.c
  e34fc4954adf255e63dd959604f68e95  gcc/testsuite/gcc.target/i386/memset-strategy-2.c
+ 1acfef678d9eaf584186d2672905976a  gcc/testsuite/gcc.target/i386/memset-strategy-25.c
+ a94047349a1abfeda6fc4e2dcf8263fe  gcc/testsuite/gcc.target/i386/memset-strategy-26.c
+ 7450283d0eb74c8d5f86beff98d12f17  gcc/testsuite/gcc.target/i386/memset-strategy-27.c
+ 97ec7f27bf115a9493769360e8b6297b  gcc/testsuite/gcc.target/i386/memset-strategy-28.c
+ 03b96edbe905a357ae136329638c5370  gcc/testsuite/gcc.target/i386/memset-strategy-29.c
  ab2b88f0bcce4626b92af0e20a2b1f62  gcc/testsuite/gcc.target/i386/memset-strategy-3.c
+ 3c26d2e0b55bd6af880380f3d3baabd9  gcc/testsuite/gcc.target/i386/memset-strategy-30.c
+ 19a8c6e0b9f8f118dc39d2de76b75363  gcc/testsuite/gcc.target/i386/memset-strategy-31.c
  20e5e2cabbded0b26bce978e68dfb2f0  gcc/testsuite/gcc.target/i386/memset-strategy-4.c
  fad1f723fea113cd6e9ed9c154a8ac50  gcc/testsuite/gcc.target/i386/memset-strategy-5.c
  260e12efd7f892d89efa62914317673f  gcc/testsuite/gcc.target/i386/memset-strategy-6.c
*************** b37f306ab147d6fbfd89376226165e2f  gcc/te
*** 84893,84899 ****
  2b02ee46ed233dc14d5b15819cfff28b  gcc/testsuite/gcc.target/i386/mvc14.c
  0dbd1cf7be9a494f5666af53dffb29c8  gcc/testsuite/gcc.target/i386/mvc15.c
  e302a983fa569ca9c52105401b06e054  gcc/testsuite/gcc.target/i386/mvc16.c
! ef7c58db6b2b11956cdae67dd45533ec  gcc/testsuite/gcc.target/i386/mvc17.c
  564e05556bd7de96a3147d7330c78901  gcc/testsuite/gcc.target/i386/mvc2.c
  81972b6ec7b16a2464f2f27fb8863604  gcc/testsuite/gcc.target/i386/mvc3.c
  b1d4c5cfd15d435b380b98085cd82466  gcc/testsuite/gcc.target/i386/mvc4.c
--- 84981,84987 ----
  2b02ee46ed233dc14d5b15819cfff28b  gcc/testsuite/gcc.target/i386/mvc14.c
  0dbd1cf7be9a494f5666af53dffb29c8  gcc/testsuite/gcc.target/i386/mvc15.c
  e302a983fa569ca9c52105401b06e054  gcc/testsuite/gcc.target/i386/mvc16.c
! 31407ab69a80705cefa016441d8da1aa  gcc/testsuite/gcc.target/i386/mvc17.c
  564e05556bd7de96a3147d7330c78901  gcc/testsuite/gcc.target/i386/mvc2.c
  81972b6ec7b16a2464f2f27fb8863604  gcc/testsuite/gcc.target/i386/mvc3.c
  b1d4c5cfd15d435b380b98085cd82466  gcc/testsuite/gcc.target/i386/mvc4.c
*************** ce847ee191adcc1a562b86eae8463fe1  gcc/te
*** 84919,84926 ****
  9204056c1841f39e08a93f36fd4f926c  gcc/testsuite/gcc.target/i386/no-callee-saved-16.c
  603a6e01b2f7a9cfee08f9a76db61c4a  gcc/testsuite/gcc.target/i386/no-callee-saved-17.c
  f6e04015c07dfdbd1fec397006546df4  gcc/testsuite/gcc.target/i386/no-callee-saved-18.c
  ad33c89265b5a7b8d4a875a0abf790b3  gcc/testsuite/gcc.target/i386/no-callee-saved-2.c
! b8869983f4d7802c2c8be19ce2dcdeac  gcc/testsuite/gcc.target/i386/no-callee-saved-3.c
  7c0013e877ad677f03dc9f16afde12ee  gcc/testsuite/gcc.target/i386/no-callee-saved-4.c
  3945dff670a00bd729c9d700c0e429d3  gcc/testsuite/gcc.target/i386/no-callee-saved-5.c
  b72976450abb440a20ee8bbbcbe9d3da  gcc/testsuite/gcc.target/i386/no-callee-saved-6.c
--- 85007,85019 ----
  9204056c1841f39e08a93f36fd4f926c  gcc/testsuite/gcc.target/i386/no-callee-saved-16.c
  603a6e01b2f7a9cfee08f9a76db61c4a  gcc/testsuite/gcc.target/i386/no-callee-saved-17.c
  f6e04015c07dfdbd1fec397006546df4  gcc/testsuite/gcc.target/i386/no-callee-saved-18.c
+ caf6372ce9d8e11a4e4374001d1cbda0  gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
+ 4d13266787ee48d3ccb6ef09a0ac08bc  gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c
+ 4e9d44eb38f6afdbec76073d8f2d172e  gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
+ 557de4c471fba7816994cd7ac615be5a  gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
+ 3d7b300d05bb9b3c1bc384676d0db528  gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
  ad33c89265b5a7b8d4a875a0abf790b3  gcc/testsuite/gcc.target/i386/no-callee-saved-2.c
! 1706fd64433a7760cdc1f03b531cc111  gcc/testsuite/gcc.target/i386/no-callee-saved-3.c
  7c0013e877ad677f03dc9f16afde12ee  gcc/testsuite/gcc.target/i386/no-callee-saved-4.c
  3945dff670a00bd729c9d700c0e429d3  gcc/testsuite/gcc.target/i386/no-callee-saved-5.c
  b72976450abb440a20ee8bbbcbe9d3da  gcc/testsuite/gcc.target/i386/no-callee-saved-6.c
*************** a62f6df63fc4be6e37901b08c83e8ecc  gcc/te
*** 85111,85117 ****
  21342a2d589a99d18c416c9c8cb14e73  gcc/testsuite/gcc.target/i386/pr100722.c
  293660d266715c7814b0758f24d54f69  gcc/testsuite/gcc.target/i386/pr100865-1.c
  5897140defc06e5ec0c1df1ca44dc11b  gcc/testsuite/gcc.target/i386/pr100865-10a.c
! e0e3790cfa1f6811774dcf19a77f25f2  gcc/testsuite/gcc.target/i386/pr100865-10b.c
  f5bc9b077ed43bdc9a703fbae0412df9  gcc/testsuite/gcc.target/i386/pr100865-11a.c
  0386e3fab23fe7e48eee2cfa3b04d7ff  gcc/testsuite/gcc.target/i386/pr100865-11b.c
  e292a240560fbabcde2b3e6709148e38  gcc/testsuite/gcc.target/i386/pr100865-11c.c
--- 85204,85210 ----
  21342a2d589a99d18c416c9c8cb14e73  gcc/testsuite/gcc.target/i386/pr100722.c
  293660d266715c7814b0758f24d54f69  gcc/testsuite/gcc.target/i386/pr100865-1.c
  5897140defc06e5ec0c1df1ca44dc11b  gcc/testsuite/gcc.target/i386/pr100865-10a.c
! 216788a5980b50f5799c0c181e94faa0  gcc/testsuite/gcc.target/i386/pr100865-10b.c
  f5bc9b077ed43bdc9a703fbae0412df9  gcc/testsuite/gcc.target/i386/pr100865-11a.c
  0386e3fab23fe7e48eee2cfa3b04d7ff  gcc/testsuite/gcc.target/i386/pr100865-11b.c
  e292a240560fbabcde2b3e6709148e38  gcc/testsuite/gcc.target/i386/pr100865-11c.c
*************** bfc29b0613a8b50ad05723222e02fca0  gcc/te
*** 85119,85129 ****
  05ff62d2aea9db819682757c26e4d599  gcc/testsuite/gcc.target/i386/pr100865-12b.c
  609a6efc8f26048c66413a6b2cd5337e  gcc/testsuite/gcc.target/i386/pr100865-12c.c
  34a761a63cd2014d84ca26fea2853a7f  gcc/testsuite/gcc.target/i386/pr100865-2.c
! b8b50f6180977b3f28c7afe9ded05d31  gcc/testsuite/gcc.target/i386/pr100865-3.c
  ae222d570e09d9116b7c2f9853f5e702  gcc/testsuite/gcc.target/i386/pr100865-4a.c
! a90afdf44dd3d8d415e8841ab25031cf  gcc/testsuite/gcc.target/i386/pr100865-4b.c
  78ea55b8818c2a0569b83153050c7528  gcc/testsuite/gcc.target/i386/pr100865-5a.c
! f61ed5d74862aeb9b691e538e77da134  gcc/testsuite/gcc.target/i386/pr100865-5b.c
  b1a92e51935fa6dfe87cc1b5591f86cc  gcc/testsuite/gcc.target/i386/pr100865-6a.c
  cd0c1e0c14e0cd797ad6a3fe36f61c41  gcc/testsuite/gcc.target/i386/pr100865-6b.c
  79c69335f7b22344550f6fa784a3c0fd  gcc/testsuite/gcc.target/i386/pr100865-6c.c
--- 85212,85222 ----
  05ff62d2aea9db819682757c26e4d599  gcc/testsuite/gcc.target/i386/pr100865-12b.c
  609a6efc8f26048c66413a6b2cd5337e  gcc/testsuite/gcc.target/i386/pr100865-12c.c
  34a761a63cd2014d84ca26fea2853a7f  gcc/testsuite/gcc.target/i386/pr100865-2.c
! 41996af8c078f368a0eaf732c28fde57  gcc/testsuite/gcc.target/i386/pr100865-3.c
  ae222d570e09d9116b7c2f9853f5e702  gcc/testsuite/gcc.target/i386/pr100865-4a.c
! 7205f8bbba2d63098a67ea2e0f0a2a3a  gcc/testsuite/gcc.target/i386/pr100865-4b.c
  78ea55b8818c2a0569b83153050c7528  gcc/testsuite/gcc.target/i386/pr100865-5a.c
! d251b3b4e25ec1e31408e14d0c051fb6  gcc/testsuite/gcc.target/i386/pr100865-5b.c
  b1a92e51935fa6dfe87cc1b5591f86cc  gcc/testsuite/gcc.target/i386/pr100865-6a.c
  cd0c1e0c14e0cd797ad6a3fe36f61c41  gcc/testsuite/gcc.target/i386/pr100865-6b.c
  79c69335f7b22344550f6fa784a3c0fd  gcc/testsuite/gcc.target/i386/pr100865-6c.c
*************** c9065d2ec6fc0f6750fa18d0a76c0c4c  gcc/te
*** 85618,85624 ****
  d8cca194dc6db82d20ea1426711cc2ea  gcc/testsuite/gcc.target/i386/pr111267.c
  9355c41ef1e78b70305475dee4bed5c8  gcc/testsuite/gcc.target/i386/pr111306.c
  1459550770245224c9edce111674e4e5  gcc/testsuite/gcc.target/i386/pr111340.c
! a231d26ce4244edcd729290ba1c4c8ec  gcc/testsuite/gcc.target/i386/pr111657-1.c
  5792d8414a49aa4afbf19fa324e6fc73  gcc/testsuite/gcc.target/i386/pr111657.c
  a0deeb2fd02e25d52715f4bf6138a2b1  gcc/testsuite/gcc.target/i386/pr111673.c
  d4cd7dbfdbbd5e89e09dc648e484762b  gcc/testsuite/gcc.target/i386/pr111698.c
--- 85711,85717 ----
  d8cca194dc6db82d20ea1426711cc2ea  gcc/testsuite/gcc.target/i386/pr111267.c
  9355c41ef1e78b70305475dee4bed5c8  gcc/testsuite/gcc.target/i386/pr111306.c
  1459550770245224c9edce111674e4e5  gcc/testsuite/gcc.target/i386/pr111340.c
! 18dee00c8a1729c51099d60dc178be86  gcc/testsuite/gcc.target/i386/pr111657-1.c
  5792d8414a49aa4afbf19fa324e6fc73  gcc/testsuite/gcc.target/i386/pr111657.c
  a0deeb2fd02e25d52715f4bf6138a2b1  gcc/testsuite/gcc.target/i386/pr111673.c
  d4cd7dbfdbbd5e89e09dc648e484762b  gcc/testsuite/gcc.target/i386/pr111698.c
*************** ba011de94e8c76e7b3328d4e8e3327b8  gcc/te
*** 85869,85874 ****
--- 85962,85969 ----
  3cfa365a3c52dad131baec47ad46e76d  gcc/testsuite/gcc.target/i386/pr120434-2.c
  252fe8c2e6c536aceb69a6f43a4279b3  gcc/testsuite/gcc.target/i386/pr120553.c
  b8ebdafc2fa7c81ba75987868812e914  gcc/testsuite/gcc.target/i386/pr120689.c
+ 9c574bf548e6423ff47b97232d310a9b  gcc/testsuite/gcc.target/i386/pr120728.c
+ 26580d939ed25dfa9d160c6061a8abe9  gcc/testsuite/gcc.target/i386/pr120741.c
  b03b1d817538a863277c823b5e4cdf75  gcc/testsuite/gcc.target/i386/pr12092-1.c
  f99f88a6e994ad6e55e065e41bc58f8f  gcc/testsuite/gcc.target/i386/pr12329.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
*************** d548b0a42c2a8273243b4f40f7984176  gcc/te
*** 86515,86521 ****
  b8384e79be5b03b1f22407289a440318  gcc/testsuite/gcc.target/i386/pr63910.c
  ac964f4b563acffae35942f124a29c33  gcc/testsuite/gcc.target/i386/pr63947.c
  1b750ef58ac019853f6b938d46949f6f  gcc/testsuite/gcc.target/i386/pr64061.c
! 2c5760f15af5650d70f6f00a2d1a1b27  gcc/testsuite/gcc.target/i386/pr64110.c
  516133a673f4f174a446f2fc7a80e412  gcc/testsuite/gcc.target/i386/pr64114.c
  94d8e5dfaec499764e8cbb0fff1583fb  gcc/testsuite/gcc.target/i386/pr64291-1.c
  2b7674a20e784b4cf390cb695a576dfe  gcc/testsuite/gcc.target/i386/pr64291-2.c
--- 86610,86616 ----
  b8384e79be5b03b1f22407289a440318  gcc/testsuite/gcc.target/i386/pr63910.c
  ac964f4b563acffae35942f124a29c33  gcc/testsuite/gcc.target/i386/pr63947.c
  1b750ef58ac019853f6b938d46949f6f  gcc/testsuite/gcc.target/i386/pr64061.c
! 8ec31d1cc6c39bd19597d47e7851b676  gcc/testsuite/gcc.target/i386/pr64110.c
  516133a673f4f174a446f2fc7a80e412  gcc/testsuite/gcc.target/i386/pr64114.c
  94d8e5dfaec499764e8cbb0fff1583fb  gcc/testsuite/gcc.target/i386/pr64291-1.c
  2b7674a20e784b4cf390cb695a576dfe  gcc/testsuite/gcc.target/i386/pr64291-2.c
*************** bedac99974c4a13a1a78b62b24233122  gcc/te
*** 87392,87400 ****
  6c3a811981bba7062182e9c01219471b  gcc/testsuite/gcc.target/i386/pr90773-12.c
  593c73526bae9b94c84a95ce2bbc7e30  gcc/testsuite/gcc.target/i386/pr90773-13.c
  f7e21a56566f8559fcba70f3cda721fe  gcc/testsuite/gcc.target/i386/pr90773-14.c
! bc6806d14eb4d9fac9f78751c494bb2b  gcc/testsuite/gcc.target/i386/pr90773-15.c
! 06df718acc299d530a1ea5b6fa3f889d  gcc/testsuite/gcc.target/i386/pr90773-16.c
! 22e9c0a2d6c467c1b378db4d4ca5a26c  gcc/testsuite/gcc.target/i386/pr90773-17.c
  91b619d01a947fbd9e263614f1000278  gcc/testsuite/gcc.target/i386/pr90773-18.c
  700d4a7ed37c9f9247b66f3967dc24c1  gcc/testsuite/gcc.target/i386/pr90773-19.c
  f80a713960f0646d35d5cd99ddc87102  gcc/testsuite/gcc.target/i386/pr90773-2.c
--- 87487,87495 ----
  6c3a811981bba7062182e9c01219471b  gcc/testsuite/gcc.target/i386/pr90773-12.c
  593c73526bae9b94c84a95ce2bbc7e30  gcc/testsuite/gcc.target/i386/pr90773-13.c
  f7e21a56566f8559fcba70f3cda721fe  gcc/testsuite/gcc.target/i386/pr90773-14.c
! 0fdb660390b755ba9d18a4a05ed5455a  gcc/testsuite/gcc.target/i386/pr90773-15.c
! 9090e0362d7860afaf0aa65b2b0634ed  gcc/testsuite/gcc.target/i386/pr90773-16.c
! c48294add9b28d052daf4ec43673f18f  gcc/testsuite/gcc.target/i386/pr90773-17.c
  91b619d01a947fbd9e263614f1000278  gcc/testsuite/gcc.target/i386/pr90773-18.c
  700d4a7ed37c9f9247b66f3967dc24c1  gcc/testsuite/gcc.target/i386/pr90773-19.c
  f80a713960f0646d35d5cd99ddc87102  gcc/testsuite/gcc.target/i386/pr90773-2.c
*************** acc82a5b459bf1433e5f0d6d4849c00a  gcc/te
*** 87459,87466 ****
--- 87554,87578 ----
  687f863eea94486d55855598514b0fe5  gcc/testsuite/gcc.target/i386/pr91931.c
  6215e5c1c60551469fcc11ffa5c90472  gcc/testsuite/gcc.target/i386/pr91994.c
  7b2e31351a834503ea31d18b2dbfbe50  gcc/testsuite/gcc.target/i386/pr92080-1.c
+ b954f1adefeb2933a8727f030aaad230  gcc/testsuite/gcc.target/i386/pr92080-10.c
+ a57fa4dbe9117c322d8074bcbdb6ea8d  gcc/testsuite/gcc.target/i386/pr92080-11.c
+ efc3d15d88f41f75da5fd5dafeb0838f  gcc/testsuite/gcc.target/i386/pr92080-12.c
+ e1a47196028cf3d7d1da3ad695db60b3  gcc/testsuite/gcc.target/i386/pr92080-13.c
+ 7c666da60bf0f91a71a0449e0dc05fe9  gcc/testsuite/gcc.target/i386/pr92080-14.c
+ be1e0e8eba7c0a6e5b4edccfb5c6ee30  gcc/testsuite/gcc.target/i386/pr92080-15.c
+ 7e4ed332aefc3d639a093680c490517e  gcc/testsuite/gcc.target/i386/pr92080-16.c
+ af608aa8cd87cda88b12ce3bac34ddc2  gcc/testsuite/gcc.target/i386/pr92080-17.c
+ 0af0fd636c3a72d334625b16a51242d3  gcc/testsuite/gcc.target/i386/pr92080-18.c
+ 494c2614cf731267b1b0f41709bfbca9  gcc/testsuite/gcc.target/i386/pr92080-19.c
  72ca6ad41495194d27cf4156a0bea46d  gcc/testsuite/gcc.target/i386/pr92080-2.c
+ 9f76fe3dbb6aaa484156a9bd978c2795  gcc/testsuite/gcc.target/i386/pr92080-20.c
  73df614139165bdfb32ab10a3c44d83b  gcc/testsuite/gcc.target/i386/pr92080-3.c
+ c3e24199aeda4b65cda3b346d62e1697  gcc/testsuite/gcc.target/i386/pr92080-4.c
+ 702188c1e03fe0a24e85ab24a7f84520  gcc/testsuite/gcc.target/i386/pr92080-5.c
+ 4ea0fd7499220024ceb4177b492f2717  gcc/testsuite/gcc.target/i386/pr92080-6.c
+ 8d0410d59fb75607e5dd3583b871c65a  gcc/testsuite/gcc.target/i386/pr92080-7.c
+ 7c3f24ee792f8822e074a397f720611f  gcc/testsuite/gcc.target/i386/pr92080-8.c
+ c83d1ae642d084fba7770a0f544e0e85  gcc/testsuite/gcc.target/i386/pr92080-9.c
  d5de5038fabac265e5095e101b5eaba4  gcc/testsuite/gcc.target/i386/pr92140.c
  65ef4f6834292cf57241c2aac98ba28b  gcc/testsuite/gcc.target/i386/pr92180.c
  cb7d2b73c1aa814d4874833bf6d514f4  gcc/testsuite/gcc.target/i386/pr92190.c
*************** feab5f45e1e18afc892095125a4b26a2  gcc/te
*** 87607,87613 ****
  0f2eaf1c814cc6f796229e239db8cf94  gcc/testsuite/gcc.target/i386/pr95483-2.c
  732ce5897b50a7bdc89573fcd64bfaf7  gcc/testsuite/gcc.target/i386/pr95483-3.c
  2ae2f5ad6b7aab32a5b5c61ea3ba9083  gcc/testsuite/gcc.target/i386/pr95483-4.c
! d2ae5fbb5b95a1788b56e6179a62c6bd  gcc/testsuite/gcc.target/i386/pr95483-5.c
  ba3da982ef27c8bafb0f0fcdf517161f  gcc/testsuite/gcc.target/i386/pr95483-6.c
  f072219a90178a8fc4afbacca65f147c  gcc/testsuite/gcc.target/i386/pr95483-7.c
  932a73ed81bfc47dbffb9c18480f2f1e  gcc/testsuite/gcc.target/i386/pr95535-1.c
--- 87719,87725 ----
  0f2eaf1c814cc6f796229e239db8cf94  gcc/testsuite/gcc.target/i386/pr95483-2.c
  732ce5897b50a7bdc89573fcd64bfaf7  gcc/testsuite/gcc.target/i386/pr95483-3.c
  2ae2f5ad6b7aab32a5b5c61ea3ba9083  gcc/testsuite/gcc.target/i386/pr95483-4.c
! 7d3f9a924cccb0ac34f142d681ef2b84  gcc/testsuite/gcc.target/i386/pr95483-5.c
  ba3da982ef27c8bafb0f0fcdf517161f  gcc/testsuite/gcc.target/i386/pr95483-6.c
  f072219a90178a8fc4afbacca65f147c  gcc/testsuite/gcc.target/i386/pr95483-7.c
  932a73ed81bfc47dbffb9c18480f2f1e  gcc/testsuite/gcc.target/i386/pr95535-1.c
*************** d380df14afc6d38427db2430bb5640c7  gcc/te
*** 87789,87794 ****
--- 87901,87937 ----
  89c120add0d0cea3a2a86aaa0863dd2e  gcc/testsuite/gcc.target/i386/prefetchi-4.c
  7ac67198871c4cac2af2231517ff5658  gcc/testsuite/gcc.target/i386/prefetchi-5.c
  24ceb6d5f3f5cde4b9d852839bdb98ae  gcc/testsuite/gcc.target/i386/prefetchw-1.c
+ 0bfc10937d08b32485b0d05f857c6d89  gcc/testsuite/gcc.target/i386/preserve-none-1.c
+ c67d46e36d4a7e968e0fcaa3891ff96e  gcc/testsuite/gcc.target/i386/preserve-none-10.c
+ 811a5506483777c40996276aca5ecc5e  gcc/testsuite/gcc.target/i386/preserve-none-11.c
+ 64c5b13a6ffc0b426560cc93070e7303  gcc/testsuite/gcc.target/i386/preserve-none-12.c
+ e48e20c32b11ede1355b06424998d843  gcc/testsuite/gcc.target/i386/preserve-none-13.c
+ 8a0814eb09cb30cd1317bdec233e2e52  gcc/testsuite/gcc.target/i386/preserve-none-14.c
+ 6494b067ec12b0ad23d7341400c53771  gcc/testsuite/gcc.target/i386/preserve-none-15.c
+ 6f0b161e274978fc465705acdebb3969  gcc/testsuite/gcc.target/i386/preserve-none-16.c
+ 2a363e5704fe55548d7ba10d2285e825  gcc/testsuite/gcc.target/i386/preserve-none-17.c
+ 39b85791a1f4d96f8f6146862340680f  gcc/testsuite/gcc.target/i386/preserve-none-18.c
+ 21024146d5998abe9f0de92fd6da0b0f  gcc/testsuite/gcc.target/i386/preserve-none-19.c
+ 4d774ef666e5d98759b5daea23ae8434  gcc/testsuite/gcc.target/i386/preserve-none-2.c
+ d18b3df1e3458bb621e6394d59a53306  gcc/testsuite/gcc.target/i386/preserve-none-20.c
+ 56306971eee8f608a87c6e88e789d411  gcc/testsuite/gcc.target/i386/preserve-none-21.c
+ 7fca32d4ccac7b8ffc8719cb67604ae3  gcc/testsuite/gcc.target/i386/preserve-none-22.c
+ 411c3b60ccb6232ce09f2cc01b9f9eb3  gcc/testsuite/gcc.target/i386/preserve-none-23.c
+ 2fc1e21de8668eb81132effc8f8e0472  gcc/testsuite/gcc.target/i386/preserve-none-24.c
+ 36f2af5f54d89fbd52ffdf607d1db23c  gcc/testsuite/gcc.target/i386/preserve-none-25.c
+ 9d3023190f814ae2fde64e821fac4c21  gcc/testsuite/gcc.target/i386/preserve-none-26.c
+ 5ea7540107de09ca0cacc2dfec3c9ced  gcc/testsuite/gcc.target/i386/preserve-none-27.c
+ 0f9776af8b8488b29fa61bb575a00bba  gcc/testsuite/gcc.target/i386/preserve-none-28.c
+ 5f2905c546cf5433d248b437627259d5  gcc/testsuite/gcc.target/i386/preserve-none-29.c
+ 4d6d3a141ed7d56dbf2ec080c3638899  gcc/testsuite/gcc.target/i386/preserve-none-3.c
+ b501a62760784713bfc543b44dc04688  gcc/testsuite/gcc.target/i386/preserve-none-30a.c
+ 620285a0fd83ac6165eadbe66fc5638c  gcc/testsuite/gcc.target/i386/preserve-none-30b.c
+ 637c2bec6ad35c42f783e0a3b31021f4  gcc/testsuite/gcc.target/i386/preserve-none-4.c
+ aeb341ec372b4ad17f7d946f744a6d78  gcc/testsuite/gcc.target/i386/preserve-none-5.c
+ a694ad147ddc2e431f3caf06ad842b64  gcc/testsuite/gcc.target/i386/preserve-none-6.c
+ fd1343642cf1783c243f12b74e234a34  gcc/testsuite/gcc.target/i386/preserve-none-7.c
+ 46ee3b21d6fbb4874e2cc387dc76894f  gcc/testsuite/gcc.target/i386/preserve-none-8.c
+ dbaa3ccce2e7bd8e259f97b2d272cf9c  gcc/testsuite/gcc.target/i386/preserve-none-9.c
  4561455bd0f6ca8ce0b0f477f2897ee2  gcc/testsuite/gcc.target/i386/ptwrite1.c
  90a00e0f61849345a274cd1b4f96c029  gcc/testsuite/gcc.target/i386/ptwrite2.c
  1c20da95e9e947694dd009c5a701a628  gcc/testsuite/gcc.target/i386/quad-sse.c
*************** c05d22a930ef3f74451ec3e9d4db1b74  gcc/te
*** 87899,87906 ****
  1d13c923e2137e0e9947a181060c5ef9  gcc/testsuite/gcc.target/i386/sha512msg2-2.c
  e0ace5d39e9cc7930c86ec3fac2a2562  gcc/testsuite/gcc.target/i386/sha512rnds2-2.c
  11a4bd4138e7963e0cd81b6e0197cfe6  gcc/testsuite/gcc.target/i386/shift_mask.c
! b575f46102e75c61317492fad36873d8  gcc/testsuite/gcc.target/i386/shrink_wrap_1.c
! 5d296e53766a82f967504d535eb71b05  gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c
  db687b7347e27fd960300505daa014ee  gcc/testsuite/gcc.target/i386/shuf-concat.c
  2a6e1d7c1d6cc43b2c0c5bc706ded8a7  gcc/testsuite/gcc.target/i386/sibcall-1.c
  19523776640101268df1d976cbbc2f7e  gcc/testsuite/gcc.target/i386/sibcall-2.c
--- 88042,88050 ----
  1d13c923e2137e0e9947a181060c5ef9  gcc/testsuite/gcc.target/i386/sha512msg2-2.c
  e0ace5d39e9cc7930c86ec3fac2a2562  gcc/testsuite/gcc.target/i386/sha512rnds2-2.c
  11a4bd4138e7963e0cd81b6e0197cfe6  gcc/testsuite/gcc.target/i386/shift_mask.c
! b39a3b78ac05770ba2a7d8dbc79d20ff  gcc/testsuite/gcc.target/i386/shrink-wrap-separate-mingw.c
! f858aa5fd5dada286b5f5b92a2f85d77  gcc/testsuite/gcc.target/i386/shrink_wrap_1.c
! 7e3a3c43c01a63ddc2a276fb376d9486  gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c
  db687b7347e27fd960300505daa014ee  gcc/testsuite/gcc.target/i386/shuf-concat.c
  2a6e1d7c1d6cc43b2c0c5bc706ded8a7  gcc/testsuite/gcc.target/i386/sibcall-1.c
  19523776640101268df1d976cbbc2f7e  gcc/testsuite/gcc.target/i386/sibcall-2.c
*************** caa0a36ffb354dbc6cd84a8137f4aef9  gcc/te
*** 88629,88635 ****
  aa69c6504471efa5d76824859d0bc6cb  gcc/testsuite/gcc.target/i386/strncmp-1.c
  73e9b60fc5538f3bc3fb2f10203f8cac  gcc/testsuite/gcc.target/i386/strub-pr118006.c
  29df8cde9c78eeac0fa0f5753e430a15  gcc/testsuite/gcc.target/i386/struct-size.c
! 082538977a4692c9eb5cd2472933d4ca  gcc/testsuite/gcc.target/i386/sw-1.c
  cc28001d51678e840c7ed2bf7a78aa0c  gcc/testsuite/gcc.target/i386/switch-exp-transform-1.c
  0832eec5eee080e9dd8b40cb7a18fad8  gcc/testsuite/gcc.target/i386/switch-exp-transform-2.c
  fde1ac7b82e671a22c599f0160131e2d  gcc/testsuite/gcc.target/i386/switch-exp-transform-3.c
--- 88773,88779 ----
  aa69c6504471efa5d76824859d0bc6cb  gcc/testsuite/gcc.target/i386/strncmp-1.c
  73e9b60fc5538f3bc3fb2f10203f8cac  gcc/testsuite/gcc.target/i386/strub-pr118006.c
  29df8cde9c78eeac0fa0f5753e430a15  gcc/testsuite/gcc.target/i386/struct-size.c
! 7ea9518e0ed0cc9deaa7a213d5213da5  gcc/testsuite/gcc.target/i386/sw-1.c
  cc28001d51678e840c7ed2bf7a78aa0c  gcc/testsuite/gcc.target/i386/switch-exp-transform-1.c
  0832eec5eee080e9dd8b40cb7a18fad8  gcc/testsuite/gcc.target/i386/switch-exp-transform-2.c
  fde1ac7b82e671a22c599f0160131e2d  gcc/testsuite/gcc.target/i386/switch-exp-transform-3.c
*************** a5d8400fbc1e042d4b59d52b3b6e800b  gcc/te
*** 93474,93479 ****
--- 93618,93625 ----
  3c447d71c9dbea654422b220051c773d  gcc/testsuite/gcc.target/pru/minrt-3.c
  939b4e76b12f46abc316daa75a1e3d96  gcc/testsuite/gcc.target/pru/mov-0.c
  b1afab226bd7930d036687abb97385f0  gcc/testsuite/gcc.target/pru/mov-m1.c
+ 700a684c637b8155f4f21430ce097a7c  gcc/testsuite/gcc.target/pru/mov64-subreg-1.c
+ 14be4aa3b7ce3dc143d9c097fb22db96  gcc/testsuite/gcc.target/pru/mov64-subreg-2.c
  cf9db000950cefeafc2f12328499ec90  gcc/testsuite/gcc.target/pru/noreturn-prologue-1.c
  d15f267f4021dc301f939d57b5ceb29b  gcc/testsuite/gcc.target/pru/noreturn-prologue-2.c
  42f66870bc5a7dedea2cd9fefcd1ece9  gcc/testsuite/gcc.target/pru/pr106562-1.c
*************** ff856fed5ddef759c9032d497def7520  gcc/te
*** 93762,93767 ****
--- 93908,93915 ----
  81519955d6644acb55c78120405494a5  gcc/testsuite/gcc.target/riscv/arch-7.c
  def4ef484e9166f9a01c65a411a9d916  gcc/testsuite/gcc.target/riscv/arch-8.c
  618e0be396e7e79ffa293a23f42b305d  gcc/testsuite/gcc.target/riscv/arch-9.c
+ d37b490a0532ea8f76a812425d43d972  gcc/testsuite/gcc.target/riscv/arch-rva23s.c
+ cb0683e276e65e19eb1889ad89f776c0  gcc/testsuite/gcc.target/riscv/arch-rvb23s.c
  4b09da836713b995147d1ddf4b15f791  gcc/testsuite/gcc.target/riscv/arch-shlocofideleg.c
  4cc6a17415a162ed3a1f16b10f116eb1  gcc/testsuite/gcc.target/riscv/arch-smcsrind.c
  b5b81669c4bd638c4b3b2a03da3402c7  gcc/testsuite/gcc.target/riscv/arch-smrnmi.c
*************** b2926d7d0c3ebd0521abd5b1bd13e5f8  gcc/te
*** 94572,94578 ****
  2635a8ce323c6f470fcbe6331ea7497b  gcc/testsuite/gcc.target/riscv/pr118410-1.c
  acc8133b241415ea173b4e1e06147a04  gcc/testsuite/gcc.target/riscv/pr118410-2.c
  bf00cac22e30fab76ac74c7b2e5af207  gcc/testsuite/gcc.target/riscv/pr119830.c
! b62a32eafb5e661786b5ef2b03b30be9  gcc/testsuite/gcc.target/riscv/pr119971.c
  d7b10be51739976c3b0ea4b16c390ba8  gcc/testsuite/gcc.target/riscv/pr120137.c
  a21d4b9178b49fb0fb65552af24e2832  gcc/testsuite/gcc.target/riscv/pr120154.c
  ea446029e0fd8e2a167fbb85bdedc0cc  gcc/testsuite/gcc.target/riscv/pr120223.c
--- 94720,94726 ----
  2635a8ce323c6f470fcbe6331ea7497b  gcc/testsuite/gcc.target/riscv/pr118410-1.c
  acc8133b241415ea173b4e1e06147a04  gcc/testsuite/gcc.target/riscv/pr118410-2.c
  bf00cac22e30fab76ac74c7b2e5af207  gcc/testsuite/gcc.target/riscv/pr119830.c
! 3852261f17cf66abc75e896fa7c07501  gcc/testsuite/gcc.target/riscv/pr119971.c
  d7b10be51739976c3b0ea4b16c390ba8  gcc/testsuite/gcc.target/riscv/pr120137.c
  a21d4b9178b49fb0fb65552af24e2832  gcc/testsuite/gcc.target/riscv/pr120154.c
  ea446029e0fd8e2a167fbb85bdedc0cc  gcc/testsuite/gcc.target/riscv/pr120223.c
*************** f95d4e0ecca41e722099be6b52b3efe7  gcc/te
*** 96880,96962 ****
  35044d6a949091b4c23addf451f035ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
  0026b1e2310b7242895d290cff3f1e9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
  2d052315288cbb1a315add9fb76abbc3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vreinterpet-fixed.c
! 94d24273ec3dfa7d40814b97ca7264bb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
! ed91739ea0cbac6f9fabcf7e9ee0a73d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
! 3d9ee26c3bc80d60d4fcee11fb8f5aff  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
! 34169206871806962394e6758c4a8b95  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
! 4ad969a8707d4511adfcd692f8c85e80  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
! 4ad969a8707d4511adfcd692f8c85e80  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
! 2c81e4c029eb17a42f46e29002f74804  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
! f9407db9d5c731e94f73e452b86cd31b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
! b2e154758dd4609c0258083f7398b0de  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
! 76d39ca8673e91883adeedec15d8dfc7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
! 15c336645408feb66efdecbdccd37d0d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
! 5664c536a81cf4cccfd5de70ea8b0e8a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
! 4c284f713528b3c79a76c97bcff0862b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
  1c4119935df2b0a9b4ab87cf47a3cdd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
! 652e4256c195098ff004de183e5d87b4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
! 7d9bacac4cb3075e6e651438b64a1eb0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
! 2bb271c33a8ba9e528f8b21696fc71aa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
! a386d42a89f75878c74496c442f903dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
! 805f35bd3009aba90d21e35b7df16c7b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
! 2a80193387fbe3e19d450805a3c08cb4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
! 0f3867abd68b5b8f31fb5489e8120a41  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
! 2e001ca81233867a673ec30e3905d647  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
! 16b72a043857cab068e08e508618d42a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
! 1c4d67c464978044d1bee527abe15336  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
! 0b950bd448a42e8497d2523f6f760b73  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
! 692d1c1c9345ec28dfc20c3b5bf3fd04  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
! 0edb34b5f84b95688c9fad17bc1647ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c
  dd7808454602536be88e14f7d10f486f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c
  fa4ac03e2d933578c31ca21f07ffc9f1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
  ec224a03154ed25208d9fadaa99e389d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
  a294639dc592d5a79e3ebffd1a593df0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! cb9d37252444eba2d60630d20f442e62  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! a623cb0e43786b01a2ae3e97ce96e4f4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! ffcfbc1f6723d7d564516aba4e75d7ea  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
! e52506a17d9756f5e7ace1dd8d96d887  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
  d1668bd03963304916eb77e5bb9ae2a2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
  12025ed008c85151e36d2b96ecfbf612  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
  888fc2394d3b6f9c7e35950ebe32dbaa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
  38323e2d60e44a0ddabe4f44a4d0d839  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! 483213d83622c1de860fd4ff541754c5  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! dd0b67d34a05d530674fe508aec348ac  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! 46a385189a0a49b2a70800fea5c23d89  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
! 935b44c57c414eccbf398a011d27aa90  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
  cd616239c9c47441ca489ea4964949e2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
  6c4c08f836984218f5c02b2d9c87a193  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
  828039e9c1e96b046bb47c823fd296f4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
  f108a5722bdabafd06db6e85101ecbb0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! 00a4fb9b398f871b2fb627ec3ce85fc8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! ea97fad0adfcd5f7cb145bec6ef558d0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! 6f5e18b259ea9955664dee6a18cd1abe  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
! 02a7d4b4aa751ceac00ae2116ae94d76  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
  865b405c46529b1cfa031526e6550635  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
  8e28677a3b66e91211f40161b6612cd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
  a9a7b200d108af9cade843626a284798  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c
  f556ef945e3c76a7a92d356f4e938183  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c
! a2f59782968b8ce2d3b62f40e39577ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
! 8e309a2a5fc2a653374e3a7ce960d7b8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
! b88ce1975df4eeca6e860047cd092caa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
! 880af5d19409b1c80ee418474f4e6ac7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
  99a98cfbd756fa439da2ae7f2b87f678  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c
  352abf4ca6ef05b6a3991013abc0da7e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c
  b63ce9d06bf3917eba4fab4cce7c2e95  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c
  ae11f45fda59a4dd480816bb0974b884  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c
! dfb9d4cdfea7db8d990f7f9af324a3bd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
! 051a75b8ec6eeda7fb6dc7c01e78a098  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
! d6cc501ccc77f8614125d2ea8b16f8e4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
! 4bdf9a4d174180e890cf2995de6584c1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
  67ab5de1138b35e06133eb6ce99150b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c
  ec8562df80b24e7892b6c369531a3730  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c
  8e73711b84b47950cfdcb9db3de68025  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c
  97fcd42af923bbad5b2011ef4e012a71  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c
! f3ca09b750b08ad13c305ef710bfc218  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
! c1384de933274d148f7a650993444e09  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
! 8fa4a69a7e573634966c3d5b62fe5406  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
! 46a1e4516968d9123400ed0a23d28952  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
! 013e7c44a65d72cfc4021301c6fb56a2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h
! 828411eb10885b0e7e501129c336bde2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
  ccb9cff4438796fd5c2c015df2204a55  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_run.h
  f82d1e3332267f884d6990983f9a5c50  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i16.c
  9f3b8184fd845e5425e43d0e12950ff1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i32.c
--- 97028,97116 ----
  35044d6a949091b4c23addf451f035ed  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-rv64.c
  0026b1e2310b7242895d290cff3f1e9e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vmv-imm-template.h
  2d052315288cbb1a315add9fb76abbc3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vreinterpet-fixed.c
! 5a5c2677b3f4ba03f723fd5717a8f5b6  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
! 9eaf25a81c625134b6ab909d9835ffc9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
! 7627748916fa8442c4996ee421fad2d7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
! 4e79f2320adaa0314f1fd55b6fd577bc  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
! 4dfde55f6e069bc523bbc2fc76772192  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
! ed116c4f631de51cf2f529159fe5be2b  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
! 7d7ac98d52ecfd2edbe272e19bea452e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
! fe29fd37e36557ac8f4f9847b0e1adcd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
! a50f72bc52776a0bd8d721cb4ed28480  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
! 81b1a38be538be17414c4c19076935cd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
! a99188b93839ea6f8bd118dd66772f14  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
! 24de1ab5a0bfa7d27d6ac8253dca1bf0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
! 89b3d4a2405bbd7f73e7a706ecf396dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
  1c4119935df2b0a9b4ab87cf47a3cdd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_data.h
! 8a877888b137cdf6de2dae4c42a62fc4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
! 87c4adf3bb3fa8b556a37c108b196308  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c
! 7eb8dc7e69dd9f6638980e77cd6e6efe  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c
! db6c9fd046686fdd17cc7ffc5fbfe33a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c
! b956406445f74109b1f2a99ee106218c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
! f111fb341a6ca7e95c2fa3bb7c758f27  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
! 93a4d811d524303ed690e8cd8e527806  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
! b2042d3fd17f57d0b81698e6174c2095  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c
! 007ec5abf9cca9e34ba75e11dd5d4f2e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c
! 706fdab09ac27674ccdcb6d34688ccb8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c
! 06e92de882ce989fe90d826f329e1e91  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
! bdefbf3eeea1f08fffd42d2bde350dea  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
! 5a1f7f5afdbbfcecd97cb5d7098ff707  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
! 7da184cf2d6603eeb3aaada1849c1d87  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
! 9c4307fc1db29e045adc4a9f15ddca66  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
! 0515f842a58d067880c5658e5addbece  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
! dcff7589b154cab465b0484df4cf3e9a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
! dfc52616a58f523908e41a5a4e0f72b2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
! 813960aebe71c2622a67c2b2649a8973  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c
  dd7808454602536be88e14f7d10f486f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i16.c
  fa4ac03e2d933578c31ca21f07ffc9f1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i32.c
  ec224a03154ed25208d9fadaa99e389d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i64.c
  a294639dc592d5a79e3ebffd1a593df0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-i8.c
! 5f99c00589b4d4f32eed18f8398c77f8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
! c77905d6588c1a315c61edc1ea4882d3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
! 9b65fa71ced0d5be06477b3ca3bebddf  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
! 01973ff1d0f93e06ab74ae604762103e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
  d1668bd03963304916eb77e5bb9ae2a2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i16.c
  12025ed008c85151e36d2b96ecfbf612  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i32.c
  888fc2394d3b6f9c7e35950ebe32dbaa  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i64.c
  38323e2d60e44a0ddabe4f44a4d0d839  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-i8.c
! 8a39d7e64a46dd723960bffadc3e63f5  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
! 0be9ddfb978024f01c7240fdb30f4979  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
! 2626fb34e6d891aa5b5d94fdb26397f8  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
! dabe3bcc242a421be2686c4364259630  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
  cd616239c9c47441ca489ea4964949e2  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i16.c
  6c4c08f836984218f5c02b2d9c87a193  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i32.c
  828039e9c1e96b046bb47c823fd296f4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i64.c
  f108a5722bdabafd06db6e85101ecbb0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-i8.c
! 0541efe5bd6c3df2621972e034af4e70  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
! f36d88215d41aea8317665598d9f104f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
! 19d77035ace4fc34bb46458a9d3a3dce  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
! 227638aa9db34ca3ff613449893d01b9  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
  865b405c46529b1cfa031526e6550635  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i16.c
  8e28677a3b66e91211f40161b6612cd7  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i32.c
  a9a7b200d108af9cade843626a284798  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i64.c
  f556ef945e3c76a7a92d356f4e938183  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-i8.c
! ec33d6b3a7988cf973111d0e5607c705  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
! c2a225a8f2339e0aa7dcd53f3d611cc3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
! 285dc58e493ca85b84145bec4e1d5d65  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
! 500784491622426d93099cd55044c374  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
  99a98cfbd756fa439da2ae7f2b87f678  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i16.c
  352abf4ca6ef05b6a3991013abc0da7e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i32.c
  b63ce9d06bf3917eba4fab4cce7c2e95  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i64.c
  ae11f45fda59a4dd480816bb0974b884  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-i8.c
! 2248cb5568d1bb8f45a72fd79b9cd11e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
! dc6bf93d15e188921b5cab3461eeae51  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
! b29d64155506de608c570e84df76dfba  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
! d170ab81f6c282c0436d1c1f7a36b973  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
  67ab5de1138b35e06133eb6ce99150b0  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i16.c
  ec8562df80b24e7892b6c369531a3730  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i32.c
  8e73711b84b47950cfdcb9db3de68025  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i64.c
  97fcd42af923bbad5b2011ef4e012a71  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-i8.c
! 3be12556c9a79063d9ac8f586aa1587c  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
! 4bf21d665583aa2f99130efee8b413bb  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
! d75764706cc651d38969853c2ae36ad4  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
! 6af3dab3c5ead6211d31e3610a988903  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
! ba4b12aa252ba0ff346bea46692b4067  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h
! 549c3e9bdfbf61845f01bc62e3dcdb9f  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
  ccb9cff4438796fd5c2c015df2204a55  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_run.h
  f82d1e3332267f884d6990983f9a5c50  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i16.c
  9f3b8184fd845e5425e43d0e12950ff1  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vadd-run-1-i32.c
*************** ab1ea727d2290cb4de9b7e7d2093eec9  gcc/te
*** 97042,97047 ****
--- 97196,97205 ----
  fdff265e90fd902eca5c517ac99fba20  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vrsub-run-1-u32.c
  8fad85d94c2ebb8b2c7a97448400e42d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vrsub-run-1-u64.c
  abd281c20ca983dae4ef633a58d18c7d  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vrsub-run-1-u8.c
+ c49b5794481494dbda1c29ece2adec2e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c
+ df9e0c9800ce12120d8d53bf84d3105e  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c
+ 501ae6cc28ba3b917c2de06df7726a27  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c
+ df6190dacbf26bd43b381290da73d10a  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c
  63ecf62c70647f5af85690b50449a4a3  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-i16.c
  e0a029ed9e4f9f4ab4383ebb4a63f046  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-i32.c
  7ec38b653f84c7041b0b862f361c9822  gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsub-run-1-i64.c
*************** aa3e4f00345b3711bbfa1e907634ef21  gcc/te
*** 100015,100021 ****
  169d707eaa516f15920084e04db14562  gcc/testsuite/gcc.target/s390/vector/vec-extend-1.c
  150569802f570140ee29c25fab8c7abc  gcc/testsuite/gcc.target/s390/vector/vec-extend-2.c
  45d2bf3bb41134f98627857b16cb3af3  gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c
! b33ae2a3cf0aa29c64a964582851eeb8  gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c
  b015126e7fb7ce82a8d5140428c4e192  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
  56c4b1af3959c56145108f2f9535cc8f  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-2.c
  6e67081d0ff79468862afe5e9e976749  gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
--- 100173,100180 ----
  169d707eaa516f15920084e04db14562  gcc/testsuite/gcc.target/s390/vector/vec-extend-1.c
  150569802f570140ee29c25fab8c7abc  gcc/testsuite/gcc.target/s390/vector/vec-extend-2.c
  45d2bf3bb41134f98627857b16cb3af3  gcc/testsuite/gcc.target/s390/vector/vec-extend-3.c
! 72dc5736e07f8fae137490b945aa10e8  gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c
! eea8e6a3c052ed4eea4f064eb34a6934  gcc/testsuite/gcc.target/s390/vector/vec-extract-2.c
  b015126e7fb7ce82a8d5140428c4e192  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
  56c4b1af3959c56145108f2f9535cc8f  gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-2.c
  6e67081d0ff79468862afe5e9e976749  gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
*************** aac15cbd63557a6d4fce6fbf70f1e964  gcc/te
*** 100029,100035 ****
  3f0e273f04c5175b1fdb100976e981c6  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
  36edbd8af8f3368a9b83ac5c88068cfc  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-2.c
  604b357bf5bdc9c25e2e900ed77fd858  gcc/testsuite/gcc.target/s390/vector/vec-scalar-cmp-1.c
! cc7a1ed2835edcf4012504114d5db9f0  gcc/testsuite/gcc.target/s390/vector/vec-set-1.c
  8de36944e18edbbcc735c9baad533f52  gcc/testsuite/gcc.target/s390/vector/vec-shift-1.c
  0abbe44ec35d751d3115d16aa8369ae5  gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
  6fec2a086b59ab219eb8ca3127c359d7  gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
--- 100188,100194 ----
  3f0e273f04c5175b1fdb100976e981c6  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-1.c
  36edbd8af8f3368a9b83ac5c88068cfc  gcc/testsuite/gcc.target/s390/vector/vec-nopeel-2.c
  604b357bf5bdc9c25e2e900ed77fd858  gcc/testsuite/gcc.target/s390/vector/vec-scalar-cmp-1.c
! ac53c0a1cd9b9e491894529575db4008  gcc/testsuite/gcc.target/s390/vector/vec-set-1.c
  8de36944e18edbbcc735c9baad533f52  gcc/testsuite/gcc.target/s390/vector/vec-shift-1.c
  0abbe44ec35d751d3115d16aa8369ae5  gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
  6fec2a086b59ab219eb8ca3127c359d7  gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
*************** ca5ed9b7a4b086d732df1a505d87813b  gcc/te
*** 106159,106164 ****
--- 106318,106324 ----
  d6fad859ae9f254219fe0b62c52472a0  gcc/testsuite/gfortran.dg/arrayio_9.f90
  a7a4d71734bf9559e09017fe4616e065  gcc/testsuite/gfortran.dg/arrayio_derived_1.f90
  2b2c726e08ba1c26507c7392e63e1029  gcc/testsuite/gfortran.dg/arrayio_derived_2.f90
+ eede070a28c17448e8635dfa208829ae  gcc/testsuite/gfortran.dg/asan/array_constructor_1.f90
  084d73893a30ee8bc9420fc82f944f3c  gcc/testsuite/gfortran.dg/asan/asan.exp
  3b8425a2f59699b47aac6da29c11aba9  gcc/testsuite/gfortran.dg/asan/associate_58.f90
  e9f58df1de071d2b106b16b3af8f6764  gcc/testsuite/gfortran.dg/asan/associate_59.f90
*************** cdbe16382c20ff02d5be2370ef235ffd  gcc/te
*** 108945,108950 ****
--- 109105,109111 ----
  111903c327dd54e41500683d65fa43ad  gcc/testsuite/gfortran.dg/goacc-gomp/goacc-gomp.exp
  66b451ac1ef6dc37e41acf5ef7d3a7f8  gcc/testsuite/gfortran.dg/goacc-gomp/mixed-1.f
  2f5688fd6d13ef335191539fb816b1e8  gcc/testsuite/gfortran.dg/goacc-gomp/pr102330-1.f90
+ ca804f2df22c482ff1ff6d8e4e966c95  gcc/testsuite/gfortran.dg/goacc/acc-wait-1.f90
  623dd259c1089424ad39ce48ecf7872f  gcc/testsuite/gfortran.dg/goacc/acc_on_device-1.f95
  1bb13022cfc4df10f7b288df9b2ceaa7  gcc/testsuite/gfortran.dg/goacc/acc_on_device-2-off.f95
  a2598ab12e851a8e120b6b107500d27b  gcc/testsuite/gfortran.dg/goacc/acc_on_device-2.f95
*************** a63ff5460cdc25350f43a09d899581db  gcc/te
*** 110439,110444 ****
--- 110600,110606 ----
  bf9bf5f797c809b218621993da43cbb7  gcc/testsuite/gfortran.dg/interface_60.f90
  85a77119c68cac58df232d99d18cd405  gcc/testsuite/gfortran.dg/interface_61.f90
  bd1bbf51e59c4440656fb9a45b99f6e0  gcc/testsuite/gfortran.dg/interface_62.f90
+ 76682e1bef00b9b6f7bd74baac09b7f4  gcc/testsuite/gfortran.dg/interface_63.f90
  b4d472d28fc0ac004218dc87eb241306  gcc/testsuite/gfortran.dg/interface_7.f90
  9b6e2c6769e8d31142faefbb1e2b8fa0  gcc/testsuite/gfortran.dg/interface_8.f90
  741aacf0bd439f6874a87ea56712aadc  gcc/testsuite/gfortran.dg/interface_9.f90
*************** d8d9fc1bd3990f780a4edabec5168b98  gcc/te
*** 111225,111230 ****
--- 111387,111393 ----
  af0220988dae78874b44c32c38151dba  gcc/testsuite/gfortran.dg/no_unit_error_1.f90
  744d0a7b2bbb9a92d07c6349adea50b1  gcc/testsuite/gfortran.dg/noadv_size.f90
  c58d0becf9ff2fd332bb1bb3252ba243  gcc/testsuite/gfortran.dg/noinline.f90
+ 76bb5adbc8453ce3b3805d9671bb097a  gcc/testsuite/gfortran.dg/non_lvalue_1.f90
  40fc0414c2765c255df26d0c34749b0e  gcc/testsuite/gfortran.dg/non_module_public.f90
  77360dec8f5c7897afaa0c9d1c0c4a0c  gcc/testsuite/gfortran.dg/nonreturning_statements.f90
  6a9f6b9442c4556d3016d04dfbecd983  gcc/testsuite/gfortran.dg/noreturn-1.f90
*************** e79a5fff5c4841ba8e2da41f54be1c1c  gcc/te
*** 111723,111728 ****
--- 111886,111892 ----
  4787146fc7e8109511f0d22d056e2127  gcc/testsuite/gfortran.dg/pr120191_2.f90
  05457962d41eef6a41a3de889144d78a  gcc/testsuite/gfortran.dg/pr120191_3.f90
  b1cb2c9a52574c2df5df49bd13ee7e5d  gcc/testsuite/gfortran.dg/pr120196.f90
+ 94f286710243a0388de6f82a32d72ca5  gcc/testsuite/gfortran.dg/pr120743.f90
  984f8307f36d56a0b48b5acce2dd5eb5  gcc/testsuite/gfortran.dg/pr12884.f
  64075248b9d1bffd6f380bb4e2a6eae0  gcc/testsuite/gfortran.dg/pr15129.f90
  e9cbd51db4e16292fc5dd1fead2e5a49  gcc/testsuite/gfortran.dg/pr15140.f90
*************** fd6ab0a5e316e2999bc498f35a3c0877  gcc/te
*** 113093,113098 ****
--- 113257,113263 ----
  4030940822c0b2a93cef17754637d715  gcc/testsuite/gfortran.dg/select_type_49.f90
  652809f8153234254b8b67a7efca979e  gcc/testsuite/gfortran.dg/select_type_5.f03
  c49dfaa1a2a6089d06b0254006e229bf  gcc/testsuite/gfortran.dg/select_type_50.f90
+ a8352826e9f0fa4c72ba19289828641b  gcc/testsuite/gfortran.dg/select_type_51.f90
  d4874fed6108821dfa28ab998af7855a  gcc/testsuite/gfortran.dg/select_type_6.f03
  3acc63d3709ace8561c2455ee8125fbc  gcc/testsuite/gfortran.dg/select_type_7.f03
  701c50cf2ae8ae92625bdf57c4ff5f6f  gcc/testsuite/gfortran.dg/select_type_8.f03
*************** e98528b30f94b17e98951c75ff2f6251  gcc/te
*** 116936,116941 ****
--- 117101,117107 ----
  35f7b9995956f30c7fecd77f8e603ada  gcc/testsuite/gnat.dg/concat5_pkg1.ads
  c2a9c37d28c367751dc983961cdf3077  gcc/testsuite/gnat.dg/concat5_pkg2.adb
  0097b6fa94f0f4e09014ad30c6bcc195  gcc/testsuite/gnat.dg/concat5_pkg2.ads
+ 4d25b62ad96a6c8da51aef63b2d4ea3e  gcc/testsuite/gnat.dg/concat6.adb
  3e7f9a04f4a3706e783661ca30556322  gcc/testsuite/gnat.dg/concat_length.adb
  1e8fc5e809cc52079a69599d76a132e4  gcc/testsuite/gnat.dg/cond_expr1.adb
  6bf0919f37bc57eb62cf0adbb6d3aed5  gcc/testsuite/gnat.dg/cond_expr2.adb
*************** cdfa97b1a7bac5b60e459fbf3ee9756c  gcc/te
*** 118745,118750 ****
--- 118911,118917 ----
  7f8cba13ebb19736c7d5565686e47063  gcc/testsuite/gnat.dg/sso19_pkg.ads
  ff784f7bca69d0717e740273960b0387  gcc/testsuite/gnat.dg/sso2.adb
  ccf43eb5df39869bb23ff9110d3b93cb  gcc/testsuite/gnat.dg/sso2.ads
+ 2ba1a49876e7f91ccde7f7d0288debb0  gcc/testsuite/gnat.dg/sso20.adb
  6fe64945c0d0238672cdece04341c316  gcc/testsuite/gnat.dg/sso3.adb
  cce4578d630a50acb2e3a4f2535af90b  gcc/testsuite/gnat.dg/sso4.adb
  6547028813699cf5a1bebf9380db3b22  gcc/testsuite/gnat.dg/sso5.adb
*************** cde7364d679bf019115a37fca70a6f52  gcc/te
*** 121364,121370 ****
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
  a658e6e3511698723b87be3277ba706d  gcc/testsuite/lib/go-torture.exp
  450868d4f15f0faade8c693e132ee071  gcc/testsuite/lib/go.exp
! 3a7d5399cb16e6328b4fab6dc88546a0  gcc/testsuite/lib/htmltest.py
  8699bdd60911dccd7ce56e96f4032646  gcc/testsuite/lib/hwasan-dg.exp
  570d1ec9b7a393a25ac703df89bbc0ee  gcc/testsuite/lib/lto.exp
  645e8af17b334c4e279636a7b47dacbe  gcc/testsuite/lib/mike-g++.exp
--- 121531,121537 ----
  628b339f01ad2b5a5afbfe6c0220ad31  gcc/testsuite/lib/go-dg.exp
  a658e6e3511698723b87be3277ba706d  gcc/testsuite/lib/go-torture.exp
  450868d4f15f0faade8c693e132ee071  gcc/testsuite/lib/go.exp
! 569a9bbf0bbca4b3648f90532f4b4b21  gcc/testsuite/lib/htmltest.py
  8699bdd60911dccd7ce56e96f4032646  gcc/testsuite/lib/hwasan-dg.exp
  570d1ec9b7a393a25ac703df89bbc0ee  gcc/testsuite/lib/lto.exp
  645e8af17b334c4e279636a7b47dacbe  gcc/testsuite/lib/mike-g++.exp
*************** a447115837a98ea4ab8390ca3c1d400a  gcc/te
*** 121387,121393 ****
  2d0f3bd65b46db089989d897e60ee550  gcc/testsuite/lib/sarif-replay.exp
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
! b1906d02580c467cf4242e775596ac53  gcc/testsuite/lib/sarif.py
  3bab5edb1612d4cf66f2a8f5c4e2ae61  gcc/testsuite/lib/scanasm.exp
  83e6c25542a5f84dc92619a64a4fe0e7  gcc/testsuite/lib/scandump.exp
  67189798dcf413cd565b99dee45a8f39  gcc/testsuite/lib/scanhtml.exp
--- 121554,121560 ----
  2d0f3bd65b46db089989d897e60ee550  gcc/testsuite/lib/sarif-replay.exp
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
! cea148c7ded81d7fed36acaca1eb153b  gcc/testsuite/lib/sarif.py
  3bab5edb1612d4cf66f2a8f5c4e2ae61  gcc/testsuite/lib/scanasm.exp
  83e6c25542a5f84dc92619a64a4fe0e7  gcc/testsuite/lib/scandump.exp
  67189798dcf413cd565b99dee45a8f39  gcc/testsuite/lib/scanhtml.exp
*************** d857a4331f097987a1bb7433f321c1c0  gcc/te
*** 123791,123798 ****
  eb63c8ccd144fcb7c3f54ce6920d725c  gcc/testsuite/sarif-replay.dg/2.1.0-valid/escaped-braces.sarif
  0cc960ceb5aae05d1918cf826e8a2d24  gcc/testsuite/sarif-replay.dg/2.1.0-valid/malloc-vs-local-4.c.sarif
  58ef936e0f61e7fcd03fa86d5bb33ad5  gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-runs.sarif
  9e0495956d9c9c5b11ebb067092c8d95  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.moved.sarif
! a18a3148013db24887fac699da3c7766  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif
  64db82f344ff8933016b20daf63eb736  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-1.sarif
  e44e7f711326621f8da1e53202252b2f  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-2.sarif
  2a1077e4fb1ab5b1d22508c9bad1d155  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-3.sarif
--- 123958,123967 ----
  eb63c8ccd144fcb7c3f54ce6920d725c  gcc/testsuite/sarif-replay.dg/2.1.0-valid/escaped-braces.sarif
  0cc960ceb5aae05d1918cf826e8a2d24  gcc/testsuite/sarif-replay.dg/2.1.0-valid/malloc-vs-local-4.c.sarif
  58ef936e0f61e7fcd03fa86d5bb33ad5  gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-runs.sarif
+ e1207cfbffed1df00d3b4847dcf55ac9  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-html.py
+ dc142daa06fc4684b34c027dc0d07c37  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py
  9e0495956d9c9c5b11ebb067092c8d95  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.moved.sarif
! 80ba73e82e4c71a1cc93859024b24034  gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif
  64db82f344ff8933016b20daf63eb736  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-1.sarif
  e44e7f711326621f8da1e53202252b2f  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-2.sarif
  2a1077e4fb1ab5b1d22508c9bad1d155  gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-3.sarif
*************** fa5a9840f86de5ad789a8727d33117b0  gcc/te
*** 123852,123860 ****
  005378a67c7a2767ef581cb08d9150fb  gcc/text-art/widget.h
  edcd6b4cfe25a7233b7c7b59f0889ef4  gcc/text-range-label.h
  00cbafca76647e207526939f6ce782be  gcc/timevar.cc
! eb78bf31928298aa4e7de8a68cb0dd5a  gcc/timevar.def
  d1eee141f10cb25a673cf78888396745  gcc/timevar.h
! e19e085df78207688358d6a04434e7a4  gcc/toplev.cc
  1720dc69e58e480830de71ecb3eb364d  gcc/toplev.h
  cbb8fb6fcd7138a90fc489b10fe3c862  gcc/tracer.cc
  a58a166bda01c9a970218d3f6c5e330f  gcc/tracer.h
--- 124021,124029 ----
  005378a67c7a2767ef581cb08d9150fb  gcc/text-art/widget.h
  edcd6b4cfe25a7233b7c7b59f0889ef4  gcc/text-range-label.h
  00cbafca76647e207526939f6ce782be  gcc/timevar.cc
! a88c03e35b27a898cfa4d6810d58410a  gcc/timevar.def
  d1eee141f10cb25a673cf78888396745  gcc/timevar.h
! 9f620fa503fc8b7465e14eb5ab8f9728  gcc/toplev.cc
  1720dc69e58e480830de71ecb3eb364d  gcc/toplev.h
  cbb8fb6fcd7138a90fc489b10fe3c862  gcc/tracer.cc
  a58a166bda01c9a970218d3f6c5e330f  gcc/tracer.h
*************** ffb9a5436754a7e1571b88f970f08891  gcc/tr
*** 123863,123869 ****
  b4a6da1471f279353aaca4956c18cdea  gcc/tree-affine.cc
  bcff760f6710b9047412aba72a381983  gcc/tree-affine.h
  527c9fa3845b2653cafc14c109129179  gcc/tree-assume.cc
! 918b3dce8ecc8579127255abad77605e  gcc/tree-call-cdce.cc
  da458e5a38b79bc75fc738a312e02056  gcc/tree-cfg.cc
  591222e5199894b9b5d23b1822f7e309  gcc/tree-cfg.h
  ca2c309862705e4161a11efb32eb1ebf  gcc/tree-cfgcleanup.cc
--- 124032,124038 ----
  b4a6da1471f279353aaca4956c18cdea  gcc/tree-affine.cc
  bcff760f6710b9047412aba72a381983  gcc/tree-affine.h
  527c9fa3845b2653cafc14c109129179  gcc/tree-assume.cc
! f404fdaff17655204dd0c7824570a081  gcc/tree-call-cdce.cc
  da458e5a38b79bc75fc738a312e02056  gcc/tree-cfg.cc
  591222e5199894b9b5d23b1822f7e309  gcc/tree-cfg.h
  ca2c309862705e4161a11efb32eb1ebf  gcc/tree-cfgcleanup.cc
*************** e046a9c4874579f81515c4b3d9106b63  gcc/tr
*** 123888,123894 ****
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3b55b5e5e173904c824977c38dc00a9c  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! 1a6d10aacc6fc861465d30fba9113894  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
--- 124057,124063 ----
  7e063b1edd28723f3f432596c39cfbee  gcc/tree-hasher.h
  3b55b5e5e173904c824977c38dc00a9c  gcc/tree-if-conv.cc
  002c9568898504ca2025dcacf5151fd6  gcc/tree-if-conv.h
! 1e83c5e73e7eae5e4a025856d084a6a7  gcc/tree-inline.cc
  326f91431bfd3c15d8ddd74699d666e6  gcc/tree-inline.h
  90ca59c0844cd326f35f9cae17ec174b  gcc/tree-into-ssa.cc
  ef1cb0fba517532ecda9f4e0dd5218f7  gcc/tree-into-ssa.h
*************** de65dfb7d298f3e879ec71e5e2e95913  gcc/tr
*** 123906,123912 ****
  b9d636bd9641f3038bbe37a70684e18e  gcc/tree-outof-ssa.h
  9d8acbaaafb1fa52b064abcc90b3b50c  gcc/tree-parloops.cc
  beaa17685ead93eee17f6373d004c4c4  gcc/tree-parloops.h
! 0224dae246531c3f6a9a0a488efc6fbc  gcc/tree-pass.h
  3c7e6c651df0a795a0b1b01ca9c75a4d  gcc/tree-phinodes.cc
  460fc341cb2d78f53e0a27c81de36a7d  gcc/tree-phinodes.h
  10ba4bea4c7470735678acc6088c06d5  gcc/tree-predcom.cc
--- 124075,124081 ----
  b9d636bd9641f3038bbe37a70684e18e  gcc/tree-outof-ssa.h
  9d8acbaaafb1fa52b064abcc90b3b50c  gcc/tree-parloops.cc
  beaa17685ead93eee17f6373d004c4c4  gcc/tree-parloops.h
! ebea01b285bb347999736a8da2d7eb94  gcc/tree-pass.h
  3c7e6c651df0a795a0b1b01ca9c75a4d  gcc/tree-phinodes.cc
  460fc341cb2d78f53e0a27c81de36a7d  gcc/tree-phinodes.h
  10ba4bea4c7470735678acc6088c06d5  gcc/tree-predcom.cc
*************** cf4bde43ab3b843eff45bac243d4116d  gcc/tr
*** 123941,123947 ****
  02e9a1bf25d500979aa57640611d72bc  gcc/tree-ssa-loop-ch.cc
  19ecf917f4744e78f79919216eef6388  gcc/tree-ssa-loop-im.cc
  21088fa37f899ccd0056bf3486157db9  gcc/tree-ssa-loop-ivcanon.cc
! df7cccabb4135a99eecc2460dc05e7bb  gcc/tree-ssa-loop-ivopts.cc
  1f70c217ef5bd5f655512b9232754870  gcc/tree-ssa-loop-ivopts.h
  71ebf1f6c8d82b1fdbca6c7aa3bd14cb  gcc/tree-ssa-loop-manip.cc
  fbcc93539b376489c1256eb8cf2d4800  gcc/tree-ssa-loop-manip.h
--- 124110,124116 ----
  02e9a1bf25d500979aa57640611d72bc  gcc/tree-ssa-loop-ch.cc
  19ecf917f4744e78f79919216eef6388  gcc/tree-ssa-loop-im.cc
  21088fa37f899ccd0056bf3486157db9  gcc/tree-ssa-loop-ivcanon.cc
! 6f944b6f48fab84032e1c0cc82fce13e  gcc/tree-ssa-loop-ivopts.cc
  1f70c217ef5bd5f655512b9232754870  gcc/tree-ssa-loop-ivopts.h
  71ebf1f6c8d82b1fdbca6c7aa3bd14cb  gcc/tree-ssa-loop-manip.cc
  fbcc93539b376489c1256eb8cf2d4800  gcc/tree-ssa-loop-manip.h
*************** da72a60de8a6f51a635ead26120d3cc7  gcc/tr
*** 123960,123969 ****
  482f2356d81c3633ca476cd6628908b8  gcc/tree-ssa-phiprop.cc
  2dc49a3648eb85067602e95bd942eb2a  gcc/tree-ssa-pre.cc
  207e8eba5552b33b5aae2de6e7c1f35d  gcc/tree-ssa-propagate.cc
! 299c5d8dabcb4a4d30bab51fbedc4e68  gcc/tree-ssa-propagate.h
  9515681f0fd9c70f852eb417ea1ff9df  gcc/tree-ssa-reassoc.cc
  258492cd7ef04be49374ea1e670f3b5b  gcc/tree-ssa-reassoc.h
! b15613ad1a2afd3a460a5db9078fce05  gcc/tree-ssa-sccvn.cc
  952cb2484413ce2cf094a52b596dc078  gcc/tree-ssa-sccvn.h
  a27c58eccc3d8929767feb76dc99399f  gcc/tree-ssa-scopedtables.cc
  aa25adbcb019dd38a66ce237df54ae1d  gcc/tree-ssa-scopedtables.h
--- 124129,124138 ----
  482f2356d81c3633ca476cd6628908b8  gcc/tree-ssa-phiprop.cc
  2dc49a3648eb85067602e95bd942eb2a  gcc/tree-ssa-pre.cc
  207e8eba5552b33b5aae2de6e7c1f35d  gcc/tree-ssa-propagate.cc
! fc4f0e674e345822394ee5645ce22429  gcc/tree-ssa-propagate.h
  9515681f0fd9c70f852eb417ea1ff9df  gcc/tree-ssa-reassoc.cc
  258492cd7ef04be49374ea1e670f3b5b  gcc/tree-ssa-reassoc.h
! bdc6a8841437c7f23f31a5441d500984  gcc/tree-ssa-sccvn.cc
  952cb2484413ce2cf094a52b596dc078  gcc/tree-ssa-sccvn.h
  a27c58eccc3d8929767feb76dc99399f  gcc/tree-ssa-scopedtables.cc
  aa25adbcb019dd38a66ce237df54ae1d  gcc/tree-ssa-scopedtables.h
*************** af4c63760c432f66b1c6c8e7e7666699  gcc/tr
*** 123993,124016 ****
  6714826bb9cd5f171a08cbabcb1da8e6  gcc/tree-streamer.h
  c7cfce71bf4903e72ac00b08e215eb2c  gcc/tree-switch-conversion.cc
  ebb8ac3717c1bf5db4371da2f3cf6af7  gcc/tree-switch-conversion.h
! 7286ca79f7a1747d76089d76bc171abd  gcc/tree-tailcall.cc
! 7a3edc7838f7a32dce3ac210a8b7cc75  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
! cc0bdf3f684b251509b8552d2d8549a3  gcc/tree-vect-loop-manip.cc
! 19f5026123eca9156e1123eed49bfabb  gcc/tree-vect-loop.cc
  da6336ee0c69409d59d2599d74cc5717  gcc/tree-vect-patterns.cc
! baa70369c21f662d5e61d1296052d231  gcc/tree-vect-slp-patterns.cc
! c2d8929f6d6edd9804d3f9736a1928ce  gcc/tree-vect-slp.cc
! 7c8165df4959808aa140925b355b1846  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  a4620080dfbf6757116ace6cfaae648f  gcc/tree-vectorizer.cc
! 1e97b9d695553eed3822a8652957ba57  gcc/tree-vectorizer.h
  1bed475667cbd8dee00c3b7da964ca5b  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! 647216b40d8f7602d0c14a3690adaa60  gcc/tree.cc
  2b3067f4ee14760d08fdfee4eb6b8a00  gcc/tree.def
! 6421adb3aed44df1b755d47237c685e4  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
  84205f5a5b424f30ce8c527b234e3f94  gcc/tristate.cc
  ea37ace5dddab6f4b2b9608516bebc35  gcc/tristate.h
--- 124162,124185 ----
  6714826bb9cd5f171a08cbabcb1da8e6  gcc/tree-streamer.h
  c7cfce71bf4903e72ac00b08e215eb2c  gcc/tree-switch-conversion.cc
  ebb8ac3717c1bf5db4371da2f3cf6af7  gcc/tree-switch-conversion.h
! 952baf2ca4a5dd0543af542151502bfc  gcc/tree-tailcall.cc
! a485c788a8567b497442f59077ad5cbc  gcc/tree-vect-data-refs.cc
  5d8bb0df796ceea958fd65c5aedb5bce  gcc/tree-vect-generic.cc
! 65fda28044fc56c04c54a1c20ff53b61  gcc/tree-vect-loop-manip.cc
! 97d02d93bf96a319e860b7a3e441c212  gcc/tree-vect-loop.cc
  da6336ee0c69409d59d2599d74cc5717  gcc/tree-vect-patterns.cc
! c6943415b45e06de6924e0c93b06b502  gcc/tree-vect-slp-patterns.cc
! 7181f44315da19fb2d1b3c4cd5cafdd6  gcc/tree-vect-slp.cc
! 9233a3fce6ccc8736b002ed676691ddc  gcc/tree-vect-stmts.cc
  c8efeee600d612c4bae8dda4bd45ee54  gcc/tree-vector-builder.cc
  258611ff1e83cc7680e8c9f033499665  gcc/tree-vector-builder.h
  a4620080dfbf6757116ace6cfaae648f  gcc/tree-vectorizer.cc
! 67801fd796ab7f3082daef67ce2527aa  gcc/tree-vectorizer.h
  1bed475667cbd8dee00c3b7da964ca5b  gcc/tree-vrp.cc
  a19edad681d27130bd2a0d83768ac946  gcc/tree-vrp.h
! 2f42cbef5fda7fdbd080b8bef8f104d3  gcc/tree.cc
  2b3067f4ee14760d08fdfee4eb6b8a00  gcc/tree.def
! b8e2b6e7e9300c4d04c2ac9455c2beda  gcc/tree.h
  b642c83968cda285afc700da2fb276d5  gcc/treestruct.def
  84205f5a5b424f30ce8c527b234e3f94  gcc/tristate.cc
  ea37ace5dddab6f4b2b9608516bebc35  gcc/tristate.h
*************** dc1a1767ff7dfd18c94f3b0889416869  gcc/ts
*** 124020,124026 ****
  899f310edfcbe0de08b2768cde16445b  gcc/typeclass.h
  d2d91dc800e8c43d824d4dcf180e3a37  gcc/typed-splay-tree.cc
  a4d47cb279dc7287caea65889ed72175  gcc/typed-splay-tree.h
! 293e6a60c3c268d0c0c4c080e2c2d601  gcc/ubsan.cc
  a9422171692d7910cbbb362c686e1a69  gcc/ubsan.h
  04f1055776eb53bdc0ad3db1e5b3531d  gcc/unique-argv.h
  1255497d1969e733354fd083e9048143  gcc/valtrack.cc
--- 124189,124195 ----
  899f310edfcbe0de08b2768cde16445b  gcc/typeclass.h
  d2d91dc800e8c43d824d4dcf180e3a37  gcc/typed-splay-tree.cc
  a4d47cb279dc7287caea65889ed72175  gcc/typed-splay-tree.h
! 7b53196550de0df570b92ae6880c1e8e  gcc/ubsan.cc
  a9422171692d7910cbbb362c686e1a69  gcc/ubsan.h
  04f1055776eb53bdc0ad3db1e5b3531d  gcc/unique-argv.h
  1255497d1969e733354fd083e9048143  gcc/valtrack.cc
*************** df85736a75a28f2d961a417c6edbbeeb  gcc/va
*** 124035,124044 ****
  5ee1b56a5e76c505c40cf28eb30f62e6  gcc/value-range-pretty-print.h
  6b536deb5ade6571e0988bf82fede1e2  gcc/value-range-storage.cc
  0b17e8456f7912204776ffd65ac2da59  gcc/value-range-storage.h
! 897cd00225966503e9200b046db9d262  gcc/value-range.cc
! 5fb6cbdfaeb472367ed05c400ce8d44a  gcc/value-range.h
! deaa5727e1ea5e4802dc5240239a6a3a  gcc/value-relation.cc
! e10bc25b7d5b26ec39898cb88adde4dd  gcc/value-relation.h
  db99ee82ab71b58820d60f9863e62aac  gcc/var-tracking.cc
  8c55316e80e8121cbbb962ad5aa4610e  gcc/varasm.cc
  69f8e035a8548037bc8c8f7f854253c4  gcc/varasm.h
--- 124204,124213 ----
  5ee1b56a5e76c505c40cf28eb30f62e6  gcc/value-range-pretty-print.h
  6b536deb5ade6571e0988bf82fede1e2  gcc/value-range-storage.cc
  0b17e8456f7912204776ffd65ac2da59  gcc/value-range-storage.h
! 2ca94370c8c59acca72a726330e2b778  gcc/value-range.cc
! 0bac3265e62e9b873c256e354f7c6ac7  gcc/value-range.h
! 4fcfb97f5fdee9686317186a141f2b4b  gcc/value-relation.cc
! cd4e6196ea1c7eb134b4d7cbadb9dcb3  gcc/value-relation.h
  db99ee82ab71b58820d60f9863e62aac  gcc/var-tracking.cc
  8c55316e80e8121cbbb962ad5aa4610e  gcc/varasm.cc
  69f8e035a8548037bc8c8f7f854253c4  gcc/varasm.h
*************** e3fa3f45e512510e34655f420629cbd8  gcc/wa
*** 124063,124074 ****
  4fc8c5d5a4dbeb10715da964977f1c81  gcc/wide-int.h
  818a3384157138e5a3f6fbc6368d2b11  gcc/xcoff.h
  d4ca2eb60a15b0128ddab26e5f20b5f2  gcc/xml-printer.h
! ecd3b602aff147f9c34c7b6daa548909  gcc/xml.cc
! 1c8711e8fe0fceb295ee0f98117744e6  gcc/xml.h
! 172b2c568a40257f5c2537762154fa0b  gnattools/ChangeLog
! d8c97efb6bf9731cb774fb1b1b60a266  gnattools/Makefile.in
! 813c7b1a065693bfcbc0b340b658fa5a  gnattools/configure
! b76be6d8444e427c06e4f182aa4a6a18  gnattools/configure.ac
  b02cf121e44636c2a8e605f3463baf06  gotools/ChangeLog
  d0cd4560ae9ca95137adac2f96734dfc  gotools/Makefile.am
  a9620fe98e0c9bf3a5beee26347a0a27  gotools/Makefile.in
--- 124232,124243 ----
  4fc8c5d5a4dbeb10715da964977f1c81  gcc/wide-int.h
  818a3384157138e5a3f6fbc6368d2b11  gcc/xcoff.h
  d4ca2eb60a15b0128ddab26e5f20b5f2  gcc/xml-printer.h
! ca67d74ae827adbfd37f3c19a9a686f7  gcc/xml.cc
! 1d49e1bbea2034d1d534f8ebd4cec583  gcc/xml.h
! 856b464d59decb70e262ff32004f30df  gnattools/ChangeLog
! f568f67baaeb26c2d9a4ad3be7810baa  gnattools/Makefile.in
! d49a3fda7b13992d5397787839bd6dee  gnattools/configure
! 7a7538b90f89734157620208351dd536  gnattools/configure.ac
  b02cf121e44636c2a8e605f3463baf06  gotools/ChangeLog
  d0cd4560ae9ca95137adac2f96734dfc  gotools/Makefile.am
  a9620fe98e0c9bf3a5beee26347a0a27  gotools/Makefile.in
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 133017,133023 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! bbb565e0a30c892c451b2b4fd9c36c05  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
--- 133186,133192 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 0644acc8ab2fe0b6ea654e3f9294dbbb  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  883cfea6de23904b83d6bd58a729c866  libgomp/Makefile.am
  54c7bc8277669e3bf5f1a3db179ae206  libgomp/Makefile.in
*************** fe834e77193cffc9757fa7871241a57b  libgom
*** 133160,133166 ****
  b5ba8a8b2b31f2f9bd9ac0760b81da9f  libgomp/libgomp.h
  50f762df7ab8d23bd5473f223e32cf05  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! 77b29151e111d8b27e8fcb0046fd0e15  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
--- 133329,133335 ----
  b5ba8a8b2b31f2f9bd9ac0760b81da9f  libgomp/libgomp.h
  50f762df7ab8d23bd5473f223e32cf05  libgomp/libgomp.map
  8b2aa50aecad82171348a6918309afd6  libgomp/libgomp.spec.in
! c6dc43e85e38ed58615bcb417d638bdf  libgomp/libgomp.texi
  519d28879206bae759d85cd3bb7b493b  libgomp/libgomp_f.h.in
  fdadcc861565b686070908326f5e5914  libgomp/libgomp_g.h
  a5060d745455b036a62cc46de1fe0576  libgomp/lock.c
*************** a6450e2f5f7558ce92992048a3735241  libgom
*** 133180,133188 ****
  b5f09519ce88ab69eebd367557be039a  libgomp/omp.h.in
  e41ce4d9881cd8bf0280948cc5c90ae9  libgomp/omp_lib.f90.in
  b64dca060dc3e768889b5d0f6086e4d0  libgomp/omp_lib.h.in
! 442785d02c04a38d6b923e1aff5ee030  libgomp/openacc.f90
  0380c0cfc562bb08603d6ff4bb9c8311  libgomp/openacc.h
! 858bdcba6ddb1d7c44faa6e75b0a94e7  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
--- 133349,133357 ----
  b5f09519ce88ab69eebd367557be039a  libgomp/omp.h.in
  e41ce4d9881cd8bf0280948cc5c90ae9  libgomp/omp_lib.f90.in
  b64dca060dc3e768889b5d0f6086e4d0  libgomp/omp_lib.h.in
! 4c345ac8d457324852e73fe101855d28  libgomp/openacc.f90
  0380c0cfc562bb08603d6ff4bb9c8311  libgomp/openacc.h
! ee7467fc60de907fbbc3632234d39a0a  libgomp/openacc_lib.h
  70196de117934b7f120ff364699b0142  libgomp/ordered.c
  5d03c6596f36bc8b6127cd047fb71b81  libgomp/parallel.c
  b62a5d146dc237f28322cddf18c8a8bc  libgomp/plugin/Makefrag.am
*************** cbdcc7dbb1bbfcb008b972db87d6a771  libgom
*** 135534,135539 ****
--- 135703,135710 ----
  1345bcecbe8a5d7df637734f5b43c172  libgomp/testsuite/libgomp.oacc-c/vec.c
  f71531081e68cf72f20e97fa5e84200c  libgomp/testsuite/libgomp.oacc-fortran/abort-1.f90
  c9683c99e94f6e35b6a3266a17594788  libgomp/testsuite/libgomp.oacc-fortran/abort-2.f90
+ b0370b04d6ebb65d934671e44e22129c  libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90
+ bfb5f0855e743de8ab2288f092309e26  libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90
  1045333a95e7f4dd53b3abb3190cc0c3  libgomp/testsuite/libgomp.oacc-fortran/acc-memcpy-2.f90
  23819c21b173d31a96499e53ce2c30bd  libgomp/testsuite/libgomp.oacc-fortran/acc-memcpy.f90
  b679de5ffd18c9aa9dde2bffdaf92c7f  libgomp/testsuite/libgomp.oacc-fortran/acc_get_property.f90
*************** abc3d4588ee1b4576e4493c95b0b0583  libsan
*** 137819,137827 ****
  fcccc17ab9511f4da14279e7828a5ddd  libsanitizer/sanitizer_common/sanitizer_libc.h
  ddfd6af3f87a47b1ce8919e05e930d24  libsanitizer/sanitizer_common/sanitizer_libignore.cpp
  08871b2f457db946621b7b929d40e4c9  libsanitizer/sanitizer_common/sanitizer_libignore.h
! d548dbe3e01cfbec99a852d1f7efda02  libsanitizer/sanitizer_common/sanitizer_linux.cpp
  0e9136f3c4cd9ebab1135b8c7fc95b49  libsanitizer/sanitizer_common/sanitizer_linux.h
! 9513a8f1d32126288f643f4d63acec31  libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
  b744ae519d9a0007389121695e32a90b  libsanitizer/sanitizer_common/sanitizer_linux_s390.cpp
  51d4c37472c1c2c6010e5d1eb5bf340f  libsanitizer/sanitizer_common/sanitizer_list.h
  15f5a30dda04b6f3bc49cb5206d92e7b  libsanitizer/sanitizer_common/sanitizer_local_address_space_view.h
--- 137990,137998 ----
  fcccc17ab9511f4da14279e7828a5ddd  libsanitizer/sanitizer_common/sanitizer_libc.h
  ddfd6af3f87a47b1ce8919e05e930d24  libsanitizer/sanitizer_common/sanitizer_libignore.cpp
  08871b2f457db946621b7b929d40e4c9  libsanitizer/sanitizer_common/sanitizer_libignore.h
! 2b88de7322e61cd7d89c0b59bef0682e  libsanitizer/sanitizer_common/sanitizer_linux.cpp
  0e9136f3c4cd9ebab1135b8c7fc95b49  libsanitizer/sanitizer_common/sanitizer_linux.h
! b1e56ece7ce8aaa37374e2df63d0a192  libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
  b744ae519d9a0007389121695e32a90b  libsanitizer/sanitizer_common/sanitizer_linux_s390.cpp
  51d4c37472c1c2c6010e5d1eb5bf340f  libsanitizer/sanitizer_common/sanitizer_list.h
  15f5a30dda04b6f3bc49cb5206d92e7b  libsanitizer/sanitizer_common/sanitizer_local_address_space_view.h
*************** c20619c1cdd5936e7b8b0c701a9389ef  libsan
*** 137842,137848 ****
  b582d1c8ad1dfab45211cbb7c25cf5f6  libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp
  a4d7b3990585330fb0fbc99e5afaf019  libsanitizer/sanitizer_common/sanitizer_platform_limits_netbsd.cpp
  0865bdc585846a1c9cfa5d1df0517d02  libsanitizer/sanitizer_common/sanitizer_platform_limits_netbsd.h
! 798b0285b482b8fc25da5925d98b05d8  libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
  55a7ec91568b796d067dbe1a86239ef0  libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
  711b54008ada7faff939a95e325b185b  libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.cpp
  ab1ad414331f77e459da9a32b756cbac  libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h
--- 138013,138019 ----
  b582d1c8ad1dfab45211cbb7c25cf5f6  libsanitizer/sanitizer_common/sanitizer_platform_limits_linux.cpp
  a4d7b3990585330fb0fbc99e5afaf019  libsanitizer/sanitizer_common/sanitizer_platform_limits_netbsd.cpp
  0865bdc585846a1c9cfa5d1df0517d02  libsanitizer/sanitizer_common/sanitizer_platform_limits_netbsd.h
! 9b584a4145a19ad68a7b8879798b10c5  libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
  55a7ec91568b796d067dbe1a86239ef0  libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
  711b54008ada7faff939a95e325b185b  libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.cpp
  ab1ad414331f77e459da9a32b756cbac  libsanitizer/sanitizer_common/sanitizer_platform_limits_solaris.h
*************** c924ab59f0a14028d44589b5772ec4a4  libsan
*** 137881,137887 ****
  76324ac84f5eb512c3e2351dbfd9ce24  libsanitizer/sanitizer_common/sanitizer_stoptheworld.h
  c1faa837dd50d9ad2162751a200fa58b  libsanitizer/sanitizer_common/sanitizer_stoptheworld_fuchsia.cpp
  60c0888eff94b59773f87548c52f756a  libsanitizer/sanitizer_common/sanitizer_stoptheworld_fuchsia.h
! 98a554043ebfdd95ff2987dd09c6d64e  libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp
  c22a391491d33bcbef7758f001dc204d  libsanitizer/sanitizer_common/sanitizer_stoptheworld_mac.cpp
  0f7617268ce454b6bb3c1180966d7092  libsanitizer/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp
  bdb416b455b14acf317962318eb84924  libsanitizer/sanitizer_common/sanitizer_stoptheworld_win.cpp
--- 138052,138058 ----
  76324ac84f5eb512c3e2351dbfd9ce24  libsanitizer/sanitizer_common/sanitizer_stoptheworld.h
  c1faa837dd50d9ad2162751a200fa58b  libsanitizer/sanitizer_common/sanitizer_stoptheworld_fuchsia.cpp
  60c0888eff94b59773f87548c52f756a  libsanitizer/sanitizer_common/sanitizer_stoptheworld_fuchsia.h
! 022ee2ebd01a6e9a6587f6890a6f18e1  libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp
  c22a391491d33bcbef7758f001dc204d  libsanitizer/sanitizer_common/sanitizer_stoptheworld_mac.cpp
  0f7617268ce454b6bb3c1180966d7092  libsanitizer/sanitizer_common/sanitizer_stoptheworld_netbsd_libcdep.cpp
  bdb416b455b14acf317962318eb84924  libsanitizer/sanitizer_common/sanitizer_stoptheworld_win.cpp
*************** d680e7307fb59fe24f8431e179191f16  libssp
*** 138069,138075 ****
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 7f6bcd4398c6fe1f35a184175eab5fb9  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 138240,138246 ----
  534c3fb4a88e5c1f70db35c12b7742c3  libssp/vsnprintf-chk.c
  34daeb04a522ee796098df4446d6ce61  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! d8d67922b7510840711096d85a1aa7d3  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** abc6f4755fae8c6e8f45ce5fee798654  libstd
*** 138135,138141 ****
  47c8d77956f3c48e132885f7b30c2cdf  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  07b85b9691cd7b04b3427e50e222f983  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 8d56060d07ceda1d69f68b249d0dc34d  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  f48bfa11a1f6ebbba6b09b9618c997f2  libstdc++-v3/config/allocator/malloc_allocator_base.h
  229729de73da6f9ba6e1bf4c48f51f24  libstdc++-v3/config/allocator/new_allocator_base.h
--- 138306,138312 ----
  47c8d77956f3c48e132885f7b30c2cdf  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  07b85b9691cd7b04b3427e50e222f983  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 709d0243ccb63d01a5531dca5c0caf47  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  f48bfa11a1f6ebbba6b09b9618c997f2  libstdc++-v3/config/allocator/malloc_allocator_base.h
  229729de73da6f9ba6e1bf4c48f51f24  libstdc++-v3/config/allocator/new_allocator_base.h
*************** e3c307e48b9e12b0736fde183ffa8bd7  libstd
*** 138759,138765 ****
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
  195dabcb74f9b313c574745539925b0e  libstdc++-v3/include/bits/charconv.h
  8a303c55e1a9a90d751641a38581e2bc  libstdc++-v3/include/bits/chrono.h
! d3b339d09113fe5e5f1b274c3729fd58  libstdc++-v3/include/bits/chrono_io.h
  2ff73cb405cb01626a751e0fa0f339f3  libstdc++-v3/include/bits/codecvt.h
  23fc42ee8644308c793f44d20f00420e  libstdc++-v3/include/bits/concept_check.h
  e999e0783a5ca2165919f352526501e9  libstdc++-v3/include/bits/cow_string.h
--- 138930,138936 ----
  5384dfbb9eb9731df3aca40e40d55350  libstdc++-v3/include/bits/char_traits.h
  195dabcb74f9b313c574745539925b0e  libstdc++-v3/include/bits/charconv.h
  8a303c55e1a9a90d751641a38581e2bc  libstdc++-v3/include/bits/chrono.h
! fab18ab56be7cffb9e042404cd30b6b6  libstdc++-v3/include/bits/chrono_io.h
  2ff73cb405cb01626a751e0fa0f339f3  libstdc++-v3/include/bits/codecvt.h
  23fc42ee8644308c793f44d20f00420e  libstdc++-v3/include/bits/concept_check.h
  e999e0783a5ca2165919f352526501e9  libstdc++-v3/include/bits/cow_string.h
*************** d5313190529dc17f5c1b224649a2d12c  libstd
*** 138801,138807 ****
  9e782e5da4039aa3230bb96c97245039  libstdc++-v3/include/bits/locale_facets_nonio.tcc
  1d2095e2488ff25b060768c176bc3199  libstdc++-v3/include/bits/localefwd.h
  ebe0e043997d2c8b674df27da18dc48c  libstdc++-v3/include/bits/mask_array.h
! e12645f7a7e11148585fc7ef7d1d8c57  libstdc++-v3/include/bits/max_size_type.h
  9eff13bd13b461742ae4d1e12f0cce28  libstdc++-v3/include/bits/memory_resource.h
  27bdede74800b12180665889a05cca6b  libstdc++-v3/include/bits/memoryfwd.h
  3cdf6345e89c49a55bd7c9be035d3729  libstdc++-v3/include/bits/mofunc_impl.h
--- 138972,138978 ----
  9e782e5da4039aa3230bb96c97245039  libstdc++-v3/include/bits/locale_facets_nonio.tcc
  1d2095e2488ff25b060768c176bc3199  libstdc++-v3/include/bits/localefwd.h
  ebe0e043997d2c8b674df27da18dc48c  libstdc++-v3/include/bits/mask_array.h
! 658b3047e6353061c1887ce9bf41af4b  libstdc++-v3/include/bits/max_size_type.h
  9eff13bd13b461742ae4d1e12f0cce28  libstdc++-v3/include/bits/memory_resource.h
  27bdede74800b12180665889a05cca6b  libstdc++-v3/include/bits/memoryfwd.h
  3cdf6345e89c49a55bd7c9be035d3729  libstdc++-v3/include/bits/mofunc_impl.h
*************** a0ff2aff5e6b290f02129d8fd5066f94  libstd
*** 138821,138827 ****
  053e1de38aef43bbaf1a9a4af1e3ad2f  libstdc++-v3/include/bits/random.h
  924981b1c29c7c7b010418607af71d7b  libstdc++-v3/include/bits/random.tcc
  b0c29f09a819ac9aa11c3507409c11ef  libstdc++-v3/include/bits/range_access.h
! 100702fad84dd63ad4800f6b18e7c6fe  libstdc++-v3/include/bits/ranges_algo.h
  2739c66cfdc38cbad18771e2317ce548  libstdc++-v3/include/bits/ranges_algobase.h
  12404cc111ad47773d8f645e76d111f3  libstdc++-v3/include/bits/ranges_base.h
  586727039587b10b560a902b1c7008b1  libstdc++-v3/include/bits/ranges_cmp.h
--- 138992,138998 ----
  053e1de38aef43bbaf1a9a4af1e3ad2f  libstdc++-v3/include/bits/random.h
  924981b1c29c7c7b010418607af71d7b  libstdc++-v3/include/bits/random.tcc
  b0c29f09a819ac9aa11c3507409c11ef  libstdc++-v3/include/bits/range_access.h
! 2c984db7b8373aa29c3d8c6a836bf55a  libstdc++-v3/include/bits/ranges_algo.h
  2739c66cfdc38cbad18771e2317ce548  libstdc++-v3/include/bits/ranges_algobase.h
  12404cc111ad47773d8f645e76d111f3  libstdc++-v3/include/bits/ranges_base.h
  586727039587b10b560a902b1c7008b1  libstdc++-v3/include/bits/ranges_cmp.h
*************** a229b5c8ad2904a3b3173239225596c4  libstd
*** 138900,138907 ****
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  652419a46dc988dd67c512e4f7d5638a  libstdc++-v3/include/bits/vector.tcc
! 7fbdf321669ceb03b55f94d26dc611b4  libstdc++-v3/include/bits/version.def
! 7db023fb759d8ac790d48b69a50bdf4f  libstdc++-v3/include/bits/version.h
  0db0dfc5d016435e64398e3bb70098d3  libstdc++-v3/include/bits/version.tpl
  6ccd70c0c36dd38ba559c1fc5a05fbd0  libstdc++-v3/include/c/cassert
  c31b54f25b2f8c7ca3ca3eec930d4e1d  libstdc++-v3/include/c/cctype
--- 139071,139078 ----
  3ddbcccf58411251c2825ae41b697844  libstdc++-v3/include/bits/valarray_array.tcc
  a4c99020fc6d28e94d24a3f60a71b6ec  libstdc++-v3/include/bits/valarray_before.h
  652419a46dc988dd67c512e4f7d5638a  libstdc++-v3/include/bits/vector.tcc
! 800b57e2657386298e3444ca09999db2  libstdc++-v3/include/bits/version.def
! c64e1fdc7567a18ca90f22c66e4521d0  libstdc++-v3/include/bits/version.h
  0db0dfc5d016435e64398e3bb70098d3  libstdc++-v3/include/bits/version.tpl
  6ccd70c0c36dd38ba559c1fc5a05fbd0  libstdc++-v3/include/c/cassert
  c31b54f25b2f8c7ca3ca3eec930d4e1d  libstdc++-v3/include/c/cctype
*************** d1730a41b18e21cbac0f5328aad2d223  libstd
*** 139455,139461 ****
  66a9c513e3e5b0698ace3297c819bdcf  libstdc++-v3/include/std/bit
  5651be4f16ccfbe8539766c53154dc20  libstdc++-v3/include/std/bitset
  3fca3267513b72857aff767e71c81692  libstdc++-v3/include/std/charconv
! cb5ee04f24eb3f44950a511e7d8fd2e7  libstdc++-v3/include/std/chrono
  a90e2b9ed2c236c92f3f2387a39a0ac8  libstdc++-v3/include/std/codecvt
  eb6bb045c5ecb789ab3d713b400eaa07  libstdc++-v3/include/std/complex
  c3c1dced3bd41cb17dfb1d65d089f9d3  libstdc++-v3/include/std/concepts
--- 139626,139632 ----
  66a9c513e3e5b0698ace3297c819bdcf  libstdc++-v3/include/std/bit
  5651be4f16ccfbe8539766c53154dc20  libstdc++-v3/include/std/bitset
  3fca3267513b72857aff767e71c81692  libstdc++-v3/include/std/charconv
! 3282d97cb840e6ff9b826fb1a3b5ab27  libstdc++-v3/include/std/chrono
  a90e2b9ed2c236c92f3f2387a39a0ac8  libstdc++-v3/include/std/codecvt
  eb6bb045c5ecb789ab3d713b400eaa07  libstdc++-v3/include/std/complex
  c3c1dced3bd41cb17dfb1d65d089f9d3  libstdc++-v3/include/std/concepts
*************** c5a4df8fdbbe4b3d33d0b52db500e16d  libstd
*** 139519,139525 ****
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  7cdac9ea092e51e067047e2b3fb2060e  libstdc++-v3/include/std/thread
  d2ff7cdca5ef2cee6f02c458a98fa638  libstdc++-v3/include/std/tuple
! 2368606e33813045e9daf0bbdf3ea9e2  libstdc++-v3/include/std/type_traits
  237682577d22ec3f9f5046abf0acd8e7  libstdc++-v3/include/std/typeindex
  520c52362f53e18f20838693cfd131bf  libstdc++-v3/include/std/unordered_map
  c82be32edefaa23cc1228b092d319315  libstdc++-v3/include/std/unordered_set
--- 139690,139696 ----
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  7cdac9ea092e51e067047e2b3fb2060e  libstdc++-v3/include/std/thread
  d2ff7cdca5ef2cee6f02c458a98fa638  libstdc++-v3/include/std/tuple
! 132355638e0a8420500ac29dbfce288d  libstdc++-v3/include/std/type_traits
  237682577d22ec3f9f5046abf0acd8e7  libstdc++-v3/include/std/typeindex
  520c52362f53e18f20838693cfd131bf  libstdc++-v3/include/std/unordered_map
  c82be32edefaa23cc1228b092d319315  libstdc++-v3/include/std/unordered_set
*************** b60f1331eaf500ccce917653c90c02d1  libstd
*** 139608,139614 ****
  2c05bcb0a318121f8deb29df215a1a76  libstdc++-v3/libsupc++/bad_cast.cc
  ed96195b097b5c5644e754342e3159bc  libstdc++-v3/libsupc++/bad_typeid.cc
  d54dac42098e24364e0e8249016c78b8  libstdc++-v3/libsupc++/class_type_info.cc
! 4750a9c27a7c55d2578910cbec3ba47d  libstdc++-v3/libsupc++/compare
  ee57ed7a57d178fce16de2ec28a8340c  libstdc++-v3/libsupc++/cxxabi.h
  563de5baf2c41e9759583af359bb650e  libstdc++-v3/libsupc++/cxxabi_forced.h
  8aae4a67a18f5276de7831d7a44b7b2f  libstdc++-v3/libsupc++/cxxabi_init_exception.h
--- 139779,139785 ----
  2c05bcb0a318121f8deb29df215a1a76  libstdc++-v3/libsupc++/bad_cast.cc
  ed96195b097b5c5644e754342e3159bc  libstdc++-v3/libsupc++/bad_typeid.cc
  d54dac42098e24364e0e8249016c78b8  libstdc++-v3/libsupc++/class_type_info.cc
! ab813a02be8d02420081178cc567cf7f  libstdc++-v3/libsupc++/compare
  ee57ed7a57d178fce16de2ec28a8340c  libstdc++-v3/libsupc++/cxxabi.h
  563de5baf2c41e9759583af359bb650e  libstdc++-v3/libsupc++/cxxabi_forced.h
  8aae4a67a18f5276de7831d7a44b7b2f  libstdc++-v3/libsupc++/cxxabi_init_exception.h
*************** e13535ef9e66ae8a179fd299be9508a4  libstd
*** 139634,139640 ****
  a5f1f7b4dbeacb9e1830fa06b0349f30  libstdc++-v3/libsupc++/eh_exception.cc
  2b1a27df0a30c87d761a6a232b74d703  libstdc++-v3/libsupc++/eh_globals.cc
  4a74242aaafc541ed9e5b7ebcc5ca2d0  libstdc++-v3/libsupc++/eh_personality.cc
! e564f4e12725d547323ce44ef29859f2  libstdc++-v3/libsupc++/eh_ptr.cc
  e96ac716389e508b792c4ff284dccbd4  libstdc++-v3/libsupc++/eh_term_handler.cc
  1a96001501657062b7dc237d9ba79aa0  libstdc++-v3/libsupc++/eh_term_handler.h
  751bf4a2cf3e1923c969ad2e218aa801  libstdc++-v3/libsupc++/eh_terminate.cc
--- 139805,139811 ----
  a5f1f7b4dbeacb9e1830fa06b0349f30  libstdc++-v3/libsupc++/eh_exception.cc
  2b1a27df0a30c87d761a6a232b74d703  libstdc++-v3/libsupc++/eh_globals.cc
  4a74242aaafc541ed9e5b7ebcc5ca2d0  libstdc++-v3/libsupc++/eh_personality.cc
! a30621b152dc03fa44617f1693032354  libstdc++-v3/libsupc++/eh_ptr.cc
  e96ac716389e508b792c4ff284dccbd4  libstdc++-v3/libsupc++/eh_term_handler.cc
  1a96001501657062b7dc237d9ba79aa0  libstdc++-v3/libsupc++/eh_term_handler.h
  751bf4a2cf3e1923c969ad2e218aa801  libstdc++-v3/libsupc++/eh_terminate.cc
*************** e93a6c516a51d1e04b8233a897e3588f  libstd
*** 139643,139652 ****
  925b44e74cdf29e0bf443716d788d8bc  libstdc++-v3/libsupc++/eh_type.cc
  6f2ba32375c733fff701a0cd7d8e0e55  libstdc++-v3/libsupc++/eh_unex_handler.cc
  a703e327cd408b5e3200f542691f8488  libstdc++-v3/libsupc++/enum_type_info.cc
! 956d78306ca1374b77f077dad8fcc8d2  libstdc++-v3/libsupc++/exception
  8054fe12bb18b03b241ea2b0db66b0d0  libstdc++-v3/libsupc++/exception.h
  8cb7ef9933695804f855459d4b0661ec  libstdc++-v3/libsupc++/exception_defines.h
! 7735536dd8c1fa8df641d3ac8e8fdf0c  libstdc++-v3/libsupc++/exception_ptr.h
  031b50d84f4f67234d2b49e49a80206a  libstdc++-v3/libsupc++/function_type_info.cc
  f098af4b3136953260aa1e563ef265d3  libstdc++-v3/libsupc++/fundamental_type_info.cc
  489d888cfad1d3ad98fc33d277619862  libstdc++-v3/libsupc++/guard.cc
--- 139814,139823 ----
  925b44e74cdf29e0bf443716d788d8bc  libstdc++-v3/libsupc++/eh_type.cc
  6f2ba32375c733fff701a0cd7d8e0e55  libstdc++-v3/libsupc++/eh_unex_handler.cc
  a703e327cd408b5e3200f542691f8488  libstdc++-v3/libsupc++/enum_type_info.cc
! 7594e787fe16542e92ed591047ab6af9  libstdc++-v3/libsupc++/exception
  8054fe12bb18b03b241ea2b0db66b0d0  libstdc++-v3/libsupc++/exception.h
  8cb7ef9933695804f855459d4b0661ec  libstdc++-v3/libsupc++/exception_defines.h
! 102d884f9775548509f6e8543864ce9c  libstdc++-v3/libsupc++/exception_ptr.h
  031b50d84f4f67234d2b49e49a80206a  libstdc++-v3/libsupc++/function_type_info.cc
  f098af4b3136953260aa1e563ef265d3  libstdc++-v3/libsupc++/fundamental_type_info.cc
  489d888cfad1d3ad98fc33d277619862  libstdc++-v3/libsupc++/guard.cc
*************** d85f3a53465585d54b96880e79456c79  libstd
*** 139828,139834 ****
  ea41b659ccf9f3e1850802e2fddaba52  libstdc++-v3/src/c++23/print.cc
  15f6b28b71ad24bc5b6d33c21048e59a  libstdc++-v3/src/c++23/stacktrace.cc
  c319163994652e23066095eded5869f0  libstdc++-v3/src/c++23/std-clib.cc.in
! cd32e929910baf186cb585d8c4439e19  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  97527213996a1ca6a0910b1ab5f6c3a3  libstdc++-v3/src/c++26/Makefile.am
  5dd6b2acd5d63f897ba1545bb9a07d25  libstdc++-v3/src/c++26/Makefile.in
--- 139999,140005 ----
  ea41b659ccf9f3e1850802e2fddaba52  libstdc++-v3/src/c++23/print.cc
  15f6b28b71ad24bc5b6d33c21048e59a  libstdc++-v3/src/c++23/stacktrace.cc
  c319163994652e23066095eded5869f0  libstdc++-v3/src/c++23/std-clib.cc.in
! 282c1e35cfc4b408cd31b9b83047ba48  libstdc++-v3/src/c++23/std.cc.in
  ef2786c62e1aa27a5405d7bf70e5212c  libstdc++-v3/src/c++23/std.compat.cc.in
  97527213996a1ca6a0910b1ab5f6c3a3  libstdc++-v3/src/c++26/Makefile.am
  5dd6b2acd5d63f897ba1545bb9a07d25  libstdc++-v3/src/c++26/Makefile.in
*************** e83ffae8f6a01f3ce6a4a13bceaa570b  libstd
*** 139962,139967 ****
--- 140133,140139 ----
  bfc352e556dfd06b9df0befc286c91f5  libstdc++-v3/testsuite/18_support/comparisons/common/1.cc
  1d63003425ec9b778636a9348657cb73  libstdc++-v3/testsuite/18_support/comparisons/object/93479.cc
  eab9e55758287cff0a6db5f20c7e937c  libstdc++-v3/testsuite/18_support/comparisons/object/lwg3530.cc
+ bb688b1bf0bbfcf18f17ecc4aceccfa1  libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc
  7e12bf0ae32a08538ae4ac84eb6cb73f  libstdc++-v3/testsuite/18_support/coroutines/95917.cc
  783af524f848615e0b0b76d03bcc9e9c  libstdc++-v3/testsuite/18_support/coroutines/hash.cc
  1040fa4ccbe7a6bcbdee3bf789197fe8  libstdc++-v3/testsuite/18_support/coroutines/lwg3460.cc
*************** b68d3b924d0ec6839ff81111c3d60e3e  libstd
*** 139978,139983 ****
--- 140150,140156 ----
  cc5dd043c9d14c6d41ee5c1ca240e563  libstdc++-v3/testsuite/18_support/exception_ptr/90295.cc
  8907da30a344e71f1227eec1fae72f2b  libstdc++-v3/testsuite/18_support/exception_ptr/96657.cc
  5ad138fdb1a7eba577340cd01d0f6c41  libstdc++-v3/testsuite/18_support/exception_ptr/current_exception.cc
+ af075b79771eb588ee3a3f323d50c218  libstdc++-v3/testsuite/18_support/exception_ptr/exception_ptr_cast.cc
  ee8560e001acdf60c93f0b858cf08201  libstdc++-v3/testsuite/18_support/exception_ptr/lifespan.cc
  6fe7c52ba7ec7ed537581a961d292a99  libstdc++-v3/testsuite/18_support/exception_ptr/make_exception_ptr.cc
  7a48c334b8f976d3830aa87522a6ebe0  libstdc++-v3/testsuite/18_support/exception_ptr/make_exception_ptr_2.cc
*************** c348ff89d182ca605abdd38410d38e4e  libstd
*** 140681,140686 ****
--- 140854,140860 ----
  35a5a8388dff81d0b60f03635c2412bc  libstdc++-v3/testsuite/20_util/is_class/requirements/explicit_instantiation.cc
  e560ce8df64321f55cb514b3433acccc  libstdc++-v3/testsuite/20_util/is_class/requirements/typedefs.cc
  f4e459f87411ef38d5b77f9cdcea5f4d  libstdc++-v3/testsuite/20_util/is_class/value.cc
+ 7a4a02904581f2f04f786a4fdc0985e1  libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/120717.cc
  59fac3a70025714701beab703b2e0231  libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/memoization.cc
  1352507758e3a1126703dfee6abee68d  libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/memoization_neg.cc
  a65f69464a6a814f65cacc6d13d28a90  libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/value.cc
*************** e7d81d19fa1701f4b7b239e8528e7f53  libstd
*** 144872,144878 ****
  2fc150610ded15046bfce4a02f56d4fe  libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
  d5ead7d283c37eff914130974709f3a1  libstdc++-v3/testsuite/25_algorithms/headers/cstdlib/functions_std.cc
  a23c605624d9254eeb17598e3e952e1c  libstdc++-v3/testsuite/25_algorithms/heap/1.cc
! 90aa3feeacfebcb704e607a4fbc9c30d  libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc
  a345eb9266fc296ae4c7294a1ce6fd15  libstdc++-v3/testsuite/25_algorithms/heap/moveable.cc
  e58c80478bf02f0dd49e5b91c4326c0b  libstdc++-v3/testsuite/25_algorithms/heap/moveable2.cc
  28140f2c7221373324ed1254c62f5aaa  libstdc++-v3/testsuite/25_algorithms/heap/vectorbool.cc
--- 145046,145052 ----
  2fc150610ded15046bfce4a02f56d4fe  libstdc++-v3/testsuite/25_algorithms/headers/algorithm/synopsis.cc
  d5ead7d283c37eff914130974709f3a1  libstdc++-v3/testsuite/25_algorithms/headers/cstdlib/functions_std.cc
  a23c605624d9254eeb17598e3e952e1c  libstdc++-v3/testsuite/25_algorithms/heap/1.cc
! 18247148bbe9135146a5d8115306cc69  libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc
  a345eb9266fc296ae4c7294a1ce6fd15  libstdc++-v3/testsuite/25_algorithms/heap/moveable.cc
  e58c80478bf02f0dd49e5b91c4326c0b  libstdc++-v3/testsuite/25_algorithms/heap/moveable2.cc
  28140f2c7221373324ed1254c62f5aaa  libstdc++-v3/testsuite/25_algorithms/heap/vectorbool.cc
*************** c4d51fca9ad710cbbe5ec668a861ac21  libstd
*** 144885,144891 ****
  696cefedb224df0ed44476d1ecc418af  libstdc++-v3/testsuite/25_algorithms/inplace_merge/49559.cc
  860742fa76242e04de107c8bfb5fea30  libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc
  237d5748a0ddade76621aadbebdbb31e  libstdc++-v3/testsuite/25_algorithms/inplace_merge/constexpr.cc
! 065f9d717483b96038d8b05ff5b7a62a  libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc
  6046bbd6c3e914d5187d45195e5a054c  libstdc++-v3/testsuite/25_algorithms/inplace_merge/moveable.cc
  082fd98cb407de8504a274d370d40f92  libstdc++-v3/testsuite/25_algorithms/inplace_merge/moveable2.cc
  cacf8a0206017b4fcc254abcfd8f037a  libstdc++-v3/testsuite/25_algorithms/inplace_merge/requirements/explicit_instantiation/2.cc
--- 145059,145065 ----
  696cefedb224df0ed44476d1ecc418af  libstdc++-v3/testsuite/25_algorithms/inplace_merge/49559.cc
  860742fa76242e04de107c8bfb5fea30  libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc
  237d5748a0ddade76621aadbebdbb31e  libstdc++-v3/testsuite/25_algorithms/inplace_merge/constexpr.cc
! 9c0260b0640d42cf814005a10adaa5b5  libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc
  6046bbd6c3e914d5187d45195e5a054c  libstdc++-v3/testsuite/25_algorithms/inplace_merge/moveable.cc
  082fd98cb407de8504a274d370d40f92  libstdc++-v3/testsuite/25_algorithms/inplace_merge/moveable2.cc
  cacf8a0206017b4fcc254abcfd8f037a  libstdc++-v3/testsuite/25_algorithms/inplace_merge/requirements/explicit_instantiation/2.cc
*************** bfc0fe0e2bf3a188298e2f8c59a11c25  libstd
*** 145074,145080 ****
  fc5197743bd756be8a94ec05a75a66c5  libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc
  de5bc2f064937a358af6a92925c84d25  libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc
  91114d9c33183df2b667bbd7732c19a7  libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc
! 12530e0c7420ec1ef49e75794efb5c89  libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc
  34ef5373a87c5539aba797972da8db9b  libstdc++-v3/testsuite/25_algorithms/nth_element/moveable.cc
  9d31960c54ebe92e93d690440cbbc57a  libstdc++-v3/testsuite/25_algorithms/nth_element/random_test.cc
  421fe937ace4d92b749cc311dab19e35  libstdc++-v3/testsuite/25_algorithms/nth_element/requirements/explicit_instantiation/2.cc
--- 145248,145254 ----
  fc5197743bd756be8a94ec05a75a66c5  libstdc++-v3/testsuite/25_algorithms/nth_element/58800.cc
  de5bc2f064937a358af6a92925c84d25  libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc
  91114d9c33183df2b667bbd7732c19a7  libstdc++-v3/testsuite/25_algorithms/nth_element/constexpr.cc
! 072b304030e409b5509ce81b192e039a  libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc
  34ef5373a87c5539aba797972da8db9b  libstdc++-v3/testsuite/25_algorithms/nth_element/moveable.cc
  9d31960c54ebe92e93d690440cbbc57a  libstdc++-v3/testsuite/25_algorithms/nth_element/random_test.cc
  421fe937ace4d92b749cc311dab19e35  libstdc++-v3/testsuite/25_algorithms/nth_element/requirements/explicit_instantiation/2.cc
*************** f85527739c22f6990850af90763be435  libstd
*** 145270,145276 ****
  37265ad69c9265f70fcea53333e1710f  libstdc++-v3/testsuite/25_algorithms/sample/2.cc
  2f39e5fff2bde6d594bfef4d07df43b6  libstdc++-v3/testsuite/25_algorithms/sample/3.cc
  ece9a25a8b175fc144eaa3d670f457c2  libstdc++-v3/testsuite/25_algorithms/sample/81221.cc
! 581adbfff04809c660c1820b210b98f6  libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc
  4b86b57fa032c39d07624855123a8805  libstdc++-v3/testsuite/25_algorithms/search/1.cc
  59c71531359e5eec4244bffd6153ac2c  libstdc++-v3/testsuite/25_algorithms/search/78346.cc
  3f6754195d7ac92facc777348d08ae20  libstdc++-v3/testsuite/25_algorithms/search/check_type.cc
--- 145444,145450 ----
  37265ad69c9265f70fcea53333e1710f  libstdc++-v3/testsuite/25_algorithms/sample/2.cc
  2f39e5fff2bde6d594bfef4d07df43b6  libstdc++-v3/testsuite/25_algorithms/sample/3.cc
  ece9a25a8b175fc144eaa3d670f457c2  libstdc++-v3/testsuite/25_algorithms/sample/81221.cc
! 17fa03de2529c39f708ff37141599605  libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc
  4b86b57fa032c39d07624855123a8805  libstdc++-v3/testsuite/25_algorithms/search/1.cc
  59c71531359e5eec4244bffd6153ac2c  libstdc++-v3/testsuite/25_algorithms/search/78346.cc
  3f6754195d7ac92facc777348d08ae20  libstdc++-v3/testsuite/25_algorithms/search/check_type.cc
*************** b2ea87e9205e641b5475df5f3f8d9ac7  libstd
*** 145317,145333 ****
  407d8b99e25d61c6c691dd66db308b9c  libstdc++-v3/testsuite/25_algorithms/shift_left/1.cc
  960464186034ba5de96696d8b4b40874  libstdc++-v3/testsuite/25_algorithms/shift_right/1.cc
  13fef40827fc69a1a6fa8ae8d2d22db6  libstdc++-v3/testsuite/25_algorithms/shuffle/1.cc
! 05c31295a781de31923e5ee955c17d3e  libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc
  fdc8ebf89947b64544c3b407c7df39b9  libstdc++-v3/testsuite/25_algorithms/shuffle/requirements/explicit_instantiation/2.cc
  ff217b553c3adffe4da34e77ba3308cb  libstdc++-v3/testsuite/25_algorithms/shuffle/requirements/explicit_instantiation/pod.cc
  d76872375020f06b1b84a7b659a1e7f3  libstdc++-v3/testsuite/25_algorithms/sort/1.cc
  3daeacb7172387bdc98e71f511ff00c1  libstdc++-v3/testsuite/25_algorithms/sort/34095.cc
  10ffe4f5dd003e2003b6759533ae4e5c  libstdc++-v3/testsuite/25_algorithms/sort/34636.cc
  3f466f639cfd583e3bbd55a98462eea6  libstdc++-v3/testsuite/25_algorithms/sort/35588.cc
  53962be570205dfe17e47184aeb147b3  libstdc++-v3/testsuite/25_algorithms/sort/78991.cc
  7a0cd0d742d2768970bc7e677544259b  libstdc++-v3/testsuite/25_algorithms/sort/check_compare_by_value.cc
  a9e3cb4559c5098d87e08ea2c6db0d04  libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc
! fa8eeed51ee848deafddf77f3c50f389  libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc
  46d4c4a21e7eb8845a7a0b23fc66db78  libstdc++-v3/testsuite/25_algorithms/sort/moveable.cc
  fe1522f8cbdfa2591bdaed9860637c04  libstdc++-v3/testsuite/25_algorithms/sort/random_test.cc
  df0b3711b1f8e8950cf48f7e66952d47  libstdc++-v3/testsuite/25_algorithms/sort/requirements/explicit_instantiation/2.cc
--- 145491,145508 ----
  407d8b99e25d61c6c691dd66db308b9c  libstdc++-v3/testsuite/25_algorithms/shift_left/1.cc
  960464186034ba5de96696d8b4b40874  libstdc++-v3/testsuite/25_algorithms/shift_right/1.cc
  13fef40827fc69a1a6fa8ae8d2d22db6  libstdc++-v3/testsuite/25_algorithms/shuffle/1.cc
! 43f26af530f4768cc438502aa7ba12ea  libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc
  fdc8ebf89947b64544c3b407c7df39b9  libstdc++-v3/testsuite/25_algorithms/shuffle/requirements/explicit_instantiation/2.cc
  ff217b553c3adffe4da34e77ba3308cb  libstdc++-v3/testsuite/25_algorithms/shuffle/requirements/explicit_instantiation/pod.cc
  d76872375020f06b1b84a7b659a1e7f3  libstdc++-v3/testsuite/25_algorithms/sort/1.cc
+ 62282bfed1662d71cf26a6d7a32a6163  libstdc++-v3/testsuite/25_algorithms/sort/118209.cc
  3daeacb7172387bdc98e71f511ff00c1  libstdc++-v3/testsuite/25_algorithms/sort/34095.cc
  10ffe4f5dd003e2003b6759533ae4e5c  libstdc++-v3/testsuite/25_algorithms/sort/34636.cc
  3f466f639cfd583e3bbd55a98462eea6  libstdc++-v3/testsuite/25_algorithms/sort/35588.cc
  53962be570205dfe17e47184aeb147b3  libstdc++-v3/testsuite/25_algorithms/sort/78991.cc
  7a0cd0d742d2768970bc7e677544259b  libstdc++-v3/testsuite/25_algorithms/sort/check_compare_by_value.cc
  a9e3cb4559c5098d87e08ea2c6db0d04  libstdc++-v3/testsuite/25_algorithms/sort/constexpr.cc
! 17aafb9ef8c7391b8b2643adc867467a  libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc
  46d4c4a21e7eb8845a7a0b23fc66db78  libstdc++-v3/testsuite/25_algorithms/sort/moveable.cc
  fe1522f8cbdfa2591bdaed9860637c04  libstdc++-v3/testsuite/25_algorithms/sort/random_test.cc
  df0b3711b1f8e8950cf48f7e66952d47  libstdc++-v3/testsuite/25_algorithms/sort/requirements/explicit_instantiation/2.cc
*************** c2a6e4f5167c14f8a67e8cb05be28dc5  libstd
*** 145340,145346 ****
  46f3cffc66ce9d7c97be80d4fe92249e  libstdc++-v3/testsuite/25_algorithms/sort_heap/requirements/explicit_instantiation/pod.cc
  4163b43bef2855b04d41eb72b825c8dc  libstdc++-v3/testsuite/25_algorithms/stable_partition/1.cc
  2b0dcaff18087a7dde97bf450fe08b34  libstdc++-v3/testsuite/25_algorithms/stable_partition/constexpr.cc
! fc778b86490f2b5068b8f602f5ad2b15  libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc
  742b3b07fb8baeef7435058fe61dc0fb  libstdc++-v3/testsuite/25_algorithms/stable_partition/mem_check.cc
  4b4375fe996a4b0cf55e123b4dd3a799  libstdc++-v3/testsuite/25_algorithms/stable_partition/moveable.cc
  76081569d6a57304527af21415e3cc3e  libstdc++-v3/testsuite/25_algorithms/stable_partition/pr52822.cc
--- 145515,145521 ----
  46f3cffc66ce9d7c97be80d4fe92249e  libstdc++-v3/testsuite/25_algorithms/sort_heap/requirements/explicit_instantiation/pod.cc
  4163b43bef2855b04d41eb72b825c8dc  libstdc++-v3/testsuite/25_algorithms/stable_partition/1.cc
  2b0dcaff18087a7dde97bf450fe08b34  libstdc++-v3/testsuite/25_algorithms/stable_partition/constexpr.cc
! 5099828423c1d199dd963fb9d5b7129d  libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc
  742b3b07fb8baeef7435058fe61dc0fb  libstdc++-v3/testsuite/25_algorithms/stable_partition/mem_check.cc
  4b4375fe996a4b0cf55e123b4dd3a799  libstdc++-v3/testsuite/25_algorithms/stable_partition/moveable.cc
  76081569d6a57304527af21415e3cc3e  libstdc++-v3/testsuite/25_algorithms/stable_partition/pr52822.cc
*************** b3f58b622470c2e75b734eba5c7ee60a  libstd
*** 145354,145360 ****
  11e30b9f75705d643766da7bc074d7e7  libstdc++-v3/testsuite/25_algorithms/stable_sort/check_compare_by_value.cc
  440e95c61a795a58b7f29a01fe85b441  libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc
  09797652d5c2649f6e49be9c2d8e6af0  libstdc++-v3/testsuite/25_algorithms/stable_sort/constexpr.cc
! 74d6c7951edb22e0547191e44acee335  libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc
  89814dfdbc4b2679fe1e9694bbe3b862  libstdc++-v3/testsuite/25_algorithms/stable_sort/mem_check.cc
  5eb05937e1a13c8389594438d2251b68  libstdc++-v3/testsuite/25_algorithms/stable_sort/moveable.cc
  bfa5e3860296b4181f34cde9caeac92f  libstdc++-v3/testsuite/25_algorithms/stable_sort/moveable2.cc
--- 145529,145535 ----
  11e30b9f75705d643766da7bc074d7e7  libstdc++-v3/testsuite/25_algorithms/stable_sort/check_compare_by_value.cc
  440e95c61a795a58b7f29a01fe85b441  libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc
  09797652d5c2649f6e49be9c2d8e6af0  libstdc++-v3/testsuite/25_algorithms/stable_sort/constexpr.cc
! 3bea884094020e3e9c97c42be74ebaff  libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc
  89814dfdbc4b2679fe1e9694bbe3b862  libstdc++-v3/testsuite/25_algorithms/stable_sort/mem_check.cc
  5eb05937e1a13c8389594438d2251b68  libstdc++-v3/testsuite/25_algorithms/stable_sort/moveable.cc
  bfa5e3860296b4181f34cde9caeac92f  libstdc++-v3/testsuite/25_algorithms/stable_sort/moveable2.cc
*************** a87e1152f6bc2804b93ce070a51eeb54  libstd
*** 149159,149165 ****
  61d414725d4c256089a1075c566c8b58  libstdc++-v3/testsuite/std/time/day/1.cc
  9b5b79c912b11d4f48e1fb35fb111742  libstdc++-v3/testsuite/std/time/day/io.cc
  1cfa2f31c3dde7297b8ca55ba69d3f47  libstdc++-v3/testsuite/std/time/exceptions.cc
! b839172ef2937439d7712c266d633e0b  libstdc++-v3/testsuite/std/time/format/empty_spec.cc
  90714e66b9741259bb9b9cd2ea23288c  libstdc++-v3/testsuite/std/time/format/format.cc
  06b738d93b3d78681b0da48efd0a60bf  libstdc++-v3/testsuite/std/time/format/localized.cc
  9cd4d6791c125e40939cae77277f928d  libstdc++-v3/testsuite/std/time/format/pr117085.cc
--- 149334,149341 ----
  61d414725d4c256089a1075c566c8b58  libstdc++-v3/testsuite/std/time/day/1.cc
  9b5b79c912b11d4f48e1fb35fb111742  libstdc++-v3/testsuite/std/time/day/io.cc
  1cfa2f31c3dde7297b8ca55ba69d3f47  libstdc++-v3/testsuite/std/time/exceptions.cc
! 67e6a630100edee0131be3df15de99b4  libstdc++-v3/testsuite/std/time/format/data_not_present_neg.cc
! 4f253228dd524225aeec83d818d60c60  libstdc++-v3/testsuite/std/time/format/empty_spec.cc
  90714e66b9741259bb9b9cd2ea23288c  libstdc++-v3/testsuite/std/time/format/format.cc
  06b738d93b3d78681b0da48efd0a60bf  libstdc++-v3/testsuite/std/time/format/localized.cc
  9cd4d6791c125e40939cae77277f928d  libstdc++-v3/testsuite/std/time/format/pr117085.cc
*************** b839172ef2937439d7712c266d633e0b  libstd
*** 149167,149173 ****
  107c8c7bd6daa477dad84b5cfee3eacf  libstdc++-v3/testsuite/std/time/format/pr119517.cc
  99dced26d110a5aeb88482eb2d9e7961  libstdc++-v3/testsuite/std/time/format/pr120114.cc
  f496430452bd60cbce2feef18bc17a51  libstdc++-v3/testsuite/std/time/format/pr120481.cc
! d648ddf7be7edcdba01c3293195d5a8a  libstdc++-v3/testsuite/std/time/format/precision.cc
  ac8733e3ca2758248129cb382c496ee0  libstdc++-v3/testsuite/std/time/format/whitespace.cc
  2be47743c9d490923037b020cfc220b7  libstdc++-v3/testsuite/std/time/freestanding.cc
  e1b4a0af956607fcdfe6d75e391ae49c  libstdc++-v3/testsuite/std/time/hh_mm_ss/1.cc
--- 149343,149349 ----
  107c8c7bd6daa477dad84b5cfee3eacf  libstdc++-v3/testsuite/std/time/format/pr119517.cc
  99dced26d110a5aeb88482eb2d9e7961  libstdc++-v3/testsuite/std/time/format/pr120114.cc
  f496430452bd60cbce2feef18bc17a51  libstdc++-v3/testsuite/std/time/format/pr120481.cc
! 800dbe8fc0f3de0665195494ae0661c0  libstdc++-v3/testsuite/std/time/format/precision.cc
  ac8733e3ca2758248129cb382c496ee0  libstdc++-v3/testsuite/std/time/format/whitespace.cc
  2be47743c9d490923037b020cfc220b7  libstdc++-v3/testsuite/std/time/freestanding.cc
  e1b4a0af956607fcdfe6d75e391ae49c  libstdc++-v3/testsuite/std/time/hh_mm_ss/1.cc
*************** bbbd22e9353d1437c3adc6e0ff6b5a3a  libstd
*** 149931,149937 ****
  b42a4c3e06ba1cc6a691782e7e7471a8  libstdc++-v3/testsuite/util/statistic/sample_mean.hpp
  e40ab277ce041f5e5e285fc7d50cb06f  libstdc++-v3/testsuite/util/statistic/sample_mean_confidence_checker.hpp
  f2b0e4d916814dffed575ea22219e282  libstdc++-v3/testsuite/util/statistic/sample_variance.hpp
! e6f20cdd0565758ddfc709021eccfe0c  libstdc++-v3/testsuite/util/testsuite_abi.cc
  115aa7d14fbe6ab56dfbe3ea70aae859  libstdc++-v3/testsuite/util/testsuite_abi.h
  48ffba86c4669f3a97144b731fcff6cd  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  5181eaba4b9bb86b0b6e535b11d64fe3  libstdc++-v3/testsuite/util/testsuite_allocator.cc
--- 150107,150113 ----
  b42a4c3e06ba1cc6a691782e7e7471a8  libstdc++-v3/testsuite/util/statistic/sample_mean.hpp
  e40ab277ce041f5e5e285fc7d50cb06f  libstdc++-v3/testsuite/util/statistic/sample_mean_confidence_checker.hpp
  f2b0e4d916814dffed575ea22219e282  libstdc++-v3/testsuite/util/statistic/sample_variance.hpp
! 478323a0373daac1fab449b6bb4af6a6  libstdc++-v3/testsuite/util/testsuite_abi.cc
  115aa7d14fbe6ab56dfbe3ea70aae859  libstdc++-v3/testsuite/util/testsuite_abi.h
  48ffba86c4669f3a97144b731fcff6cd  libstdc++-v3/testsuite/util/testsuite_abi_check.cc
  5181eaba4b9bb86b0b6e535b11d64fe3  libstdc++-v3/testsuite/util/testsuite_allocator.cc
diff -Nrcpad gcc-16-20250622/contrib/ChangeLog gcc-16-20250629/contrib/ChangeLog
*** gcc-16-20250622/contrib/ChangeLog	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/ChangeLog	Sun Jun 29 22:32:24 2025
***************
*** 1,3 ****
--- 1,22 ----
+ 2025-06-26  Alex Coplan  <alex.coplan@arm.com>
+ 
+ 	* mklog.py (main): New.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	PR testsuite/116163
+ 	PR sarif-replay/120792
+ 	* dg-lint/dg-lint: Add -fdiagnostics-add-output.
+ 	* dg-lint/libgdiagnostics.py: Add
+ 	diagnostic_manager_add_sink_from_spec.
+ 	(Manager.add_sink_from_spec): New.
+ 
+ 2025-06-23  Andrew Burgess  <aburgess@redhat.com>
+ 
+ 	* dg-extract-results.py: Handle GDB's unexpected core file count.
+ 	* dg-extract-results.sh: Likewise.
+ 
  2025-05-27  Jan Hubicka  <hubicka@ucw.cz>
  
  	* gen_autofdo_event.py: Add support for AMD Zen 3 and
diff -Nrcpad gcc-16-20250622/contrib/dg-extract-results.py gcc-16-20250629/contrib/dg-extract-results.py
*** gcc-16-20250622/contrib/dg-extract-results.py	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/dg-extract-results.py	Sun Jun 29 22:32:24 2025
*************** class Prog:
*** 146,152 ****
              '# of unresolved testcases\t',
              '# of unsupported tests\t\t',
              '# of paths in test names\t',
!             '# of duplicate test names\t'
          ]
          self.runs = dict()
  
--- 146,153 ----
              '# of unresolved testcases\t',
              '# of unsupported tests\t\t',
              '# of paths in test names\t',
!             '# of duplicate test names\t',
!             '# of unexpected core files\t'
          ]
          self.runs = dict()
  
diff -Nrcpad gcc-16-20250622/contrib/dg-extract-results.sh gcc-16-20250629/contrib/dg-extract-results.sh
*** gcc-16-20250622/contrib/dg-extract-results.sh	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/dg-extract-results.sh	Sun Jun 29 22:32:24 2025
*************** BEGIN {
*** 403,409 ****
    variant="$VAR"
    tool="$TOOL"
    passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kpasscnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; dgerrorcnt=0;
!   pathcnt=0; dupcnt=0
    curvar=""; insummary=0
  }
  /^Running target /		{ curvar = \$3; next }
--- 403,409 ----
    variant="$VAR"
    tool="$TOOL"
    passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kpasscnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; dgerrorcnt=0;
!   pathcnt=0; dupcnt=0; corecnt=0
    curvar=""; insummary=0
  }
  /^Running target /		{ curvar = \$3; next }
*************** BEGIN {
*** 420,425 ****
--- 420,426 ----
  /^# of unsupported tests/	{ if (insummary == 1) unsupcnt += \$5; next; }
  /^# of paths in test names/	{ if (insummary == 1) pathcnt += \$7; next; }
  /^# of duplicate test names/	{ if (insummary == 1) dupcnt += \$6; next; }
+ /^# of unexpected core files/	{ if (insummary == 1) corecnt += \$6; next; }
  /^$/				{ if (insummary == 1)
  				    { insummary = 0; curvar = "" }
  				  next
*************** END {
*** 439,444 ****
--- 440,446 ----
    if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt)
    if (pathcnt != 0) printf ("# of paths in test names\t%d\n", pathcnt)
    if (dupcnt != 0) printf ("# of duplicate test names\t%d\n", dupcnt)
+   if (corecnt != 0) printf ("# of unexpected core files\t%d\n", corecnt)
  }
  EOF
  
*************** cat << EOF > $TOTAL_AWK
*** 460,466 ****
  BEGIN {
    tool="$TOOL"
    passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; dgerrorcnt=0
!   pathcnt=0; dupcnt=0
  }
  /^# of DejaGnu errors/		{ dgerrorcnt += \$5 }
  /^# of expected passes/		{ passcnt += \$5 }
--- 462,468 ----
  BEGIN {
    tool="$TOOL"
    passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; dgerrorcnt=0
!   pathcnt=0; dupcnt=0; corecnt=0
  }
  /^# of DejaGnu errors/		{ dgerrorcnt += \$5 }
  /^# of expected passes/		{ passcnt += \$5 }
*************** BEGIN {
*** 474,479 ****
--- 476,482 ----
  /^# of unsupported tests/	{ unsupcnt += \$5 }
  /^# of paths in test names/	{ pathcnt += \$7 }
  /^# of duplicate test names/	{ dupcnt += \$6 }
+ /^# of unexpected core files/	{ corecnt += \$6 }
  END {
    printf ("\n\t\t=== %s Summary ===\n\n", tool)
    if (dgerrorcnt != 0) printf ("# of DejaGnu errors\t\t%d\n", dgerrorcnt)
*************** END {
*** 488,493 ****
--- 491,497 ----
    if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt)
    if (pathcnt != 0) printf ("# of paths in test names\t%d\n", pathcnt)
    if (dupcnt != 0) printf ("# of duplicate test names\t%d\n", dupcnt)
+   if (corecnt != 0) printf ("# of unexpected core files\t%d\n", corecnt)
  }
  EOF
  
diff -Nrcpad gcc-16-20250622/contrib/dg-lint/dg-lint gcc-16-20250629/contrib/dg-lint/dg-lint
*** gcc-16-20250622/contrib/dg-lint/dg-lint	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/dg-lint/dg-lint	Sun Jun 29 22:32:24 2025
*************** def skip_file(filename):
*** 380,388 ****
--- 380,396 ----
  def main(argv):
      parser = argparse.ArgumentParser()#usage=__doc__)
      parser.add_argument('paths', nargs='+', type=pathlib.Path)
+     parser.add_argument('-fdiagnostics-add-output', action='append')
      opts = parser.parse_args(argv[1:])
  
      ctxt = Context()
+     control_mgr = libgdiagnostics.Manager()
+     control_mgr.add_text_sink()
+     for scheme in opts.fdiagnostics_add_output:
+         ctxt.mgr.add_sink_from_spec("-fdiagnostics-add-output=",
+                                     scheme,
+                                     control_mgr)
+ 
      for path in opts.paths:
          if path.is_dir():
              for dirpath, dirnames, filenames in os.walk(path):
diff -Nrcpad gcc-16-20250622/contrib/dg-lint/libgdiagnostics.py gcc-16-20250629/contrib/dg-lint/libgdiagnostics.py
*** gcc-16-20250622/contrib/dg-lint/libgdiagnostics.py	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/dg-lint/libgdiagnostics.py	Sun Jun 29 22:32:24 2025
*************** cdll.diagnostic_add_fix_it_hint_replace.
*** 124,129 ****
--- 124,136 ----
         ctypes.c_char_p]
  cdll.diagnostic_add_fix_it_hint_replace.restype = None
  
+ cdll.diagnostic_manager_add_sink_from_spec.argtypes \
+     = [c_diagnostic_manager_ptr,
+        ctypes.c_char_p,
+        ctypes.c_char_p,
+        c_diagnostic_manager_ptr]
+ cdll.diagnostic_manager_add_sink_from_spec.restype = ctypes.c_int
+ 
  # Helper functions
  
  def _to_utf8(s: str):
*************** class Manager:
*** 156,161 ****
--- 163,178 ----
                                                 c_stderr,
                                                 DIAGNOSTIC_COLORIZE_IF_TTY)
  
+     def add_sink_from_spec(self, option_name: str, scheme: str, control_mgr):
+         assert self.c_mgr
+         assert control_mgr.c_mgr
+         res = cdll.diagnostic_manager_add_sink_from_spec (self.c_mgr,
+                                                           _to_utf8(option_name),
+                                                           _to_utf8(scheme),
+                                                           control_mgr.c_mgr)
+         if res:
+             raise RuntimeError()
+ 
      def get_file(self, path: str, sarif_lang: str = None):
          assert self.c_mgr
          assert path
diff -Nrcpad gcc-16-20250622/contrib/mklog.py gcc-16-20250629/contrib/mklog.py
*** gcc-16-20250622/contrib/mklog.py	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/contrib/mklog.py	Sun Jun 29 22:32:24 2025
*************** def skip_line_in_changelog(line):
*** 360,366 ****
      return FIRST_LINE_OF_END_RE.match(line) is None
  
  
! if __name__ == '__main__':
      extra_args = os.getenv('GCC_MKLOG_ARGS')
      if extra_args:
          sys.argv += json.loads(extra_args)
--- 360,366 ----
      return FIRST_LINE_OF_END_RE.match(line) is None
  
  
! def main():
      extra_args = os.getenv('GCC_MKLOG_ARGS')
      if extra_args:
          sys.argv += json.loads(extra_args)
*************** if __name__ == '__main__':
*** 389,394 ****
--- 389,395 ----
      if args.input == '-':
          args.input = None
      if args.directory:
+         global root
          root = args.directory
  
      data = open(args.input, newline='\n') if args.input else sys.stdin
*************** if __name__ == '__main__':
*** 447,449 ****
--- 448,453 ----
                  f.write('\n'.join(end))
          else:
              print(output, end='')
+ 
+ if __name__ == '__main__':
+     main()
diff -Nrcpad gcc-16-20250622/gcc/ChangeLog gcc-16-20250629/gcc/ChangeLog
*** gcc-16-20250622/gcc/ChangeLog	Sun Jun 22 22:32:17 2025
--- gcc-16-20250629/gcc/ChangeLog	Sun Jun 29 22:32:24 2025
***************
*** 1,3 ****
--- 1,1075 ----
+ 2025-06-28  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR debug/120849
+ 	* print-tree.cc (debug): New.
+ 	* print-tree.h (debug): Likewise.
+ 
+ 2025-06-28  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/120856
+ 	* config/avr/avr.cc (avr_hard_regno_mode_ok) [-mno-lra]: Deny
+ 	hard regs >= 4 bytes that overlap Y.
+ 
+ 2025-06-28  Jan Hubicka  <hubicka@ucw.cz>
+ 	    Kugan Vivekanandarajah   <kvivekananda@nvidia.com>
+ 
+ 	* auto-profile.cc (get_original_name): Only strip suffixes introduced
+ 	after auto-fdo annotation.
+ 	(string_table::get_index_by_decl):  Simplify.
+ 	(string_table::add_name): New member function.
+ 	(string_table::read): Micro-optimize allocation.
+ 	(function_instance::get_function_instance_by_decl): Dump reasons
+ 	for failure; try to compensate lost discriminators.
+ 	(function_instance::merge): Simplify sanity check; do not check
+ 	for realized flag; fix merging of targets.
+ 	(function_instance::offline_if_in_set): Simplify.
+ 	(function_instance::dump): Sanity check that names are consistent.
+ 	(autofdo_source_profile::offline_external_functions): Also handle
+ 	stripping suffixes.
+ 	(walk_block): Move up in source.
+ 	(autofdo_source_profile::offline_unrealized_inlines): Also compute
+ 	realized functions.
+ 	(autofdo_source_profile::get_function_instance_by_name_index): Simplify.
+ 	(autofdo_source_profile::add_function_instance): Simplify.
+ 	(autofdo_source_profile::read): Do not strip suffxies; error on duplicates.
+ 	(mark_realized_functions): Remove.
+ 	(auto_profile): Do not call mark_realized_functions.
+ 	* passes.def: Move auto_profile_offline before free_lang_data.
+ 
+ 2025-06-27  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gimple-fold.cc (fold_const_aggregate_ref_1) <COMPONENT_REF>:
+ 	Bail out immediately if the reference has reverse storage order.
+ 	* tree-ssa-sccvn.cc (fully_constant_vn_reference_p): Likewise.
+ 
+ 2025-06-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120777
+ 	* gimple-fold.cc (gimple_get_virt_method_for_vtable): Revert
+ 	2018-09-18 changes.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/98735
+ 	PR c++/118904
+ 	* tree.cc (struct identifier_hash): New type.
+ 	(struct identifier_count_traits): New traits.
+ 	(internal_label_nums): New hash map.
+ 	(generate_internal_label): New function.
+ 	(prefix_for_internal_label): New function.
+ 	* tree.h (IDENTIFIER_INTERNAL_P): New macro.
+ 	(generate_internal_label): Declare.
+ 	(prefix_for_internal_label): Declare.
+ 	* ubsan.cc (ubsan_ids): Remove.
+ 	(ubsan_type_descriptor): Use generate_internal_label.
+ 	(ubsan_create_data): Likewise.
+ 
+ 2025-06-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (function_instance::set_name,
+ 	function_instance::set_realized, function_instnace::realized_p,
+ 	function_instance::set_in_worklist,
+ 	function_instance::clear_in_worklist,
+ 	function_instance::in_worklist_p): New member functions.
+ 	(function_instance::in_worklist, function_instance::realized_):
+ 	new.
+ 	(get_relative_location_for_locus): Break out from ....
+ 	(get_relative_location_for_stmt): ... here.
+ 	(function_instance::~function_instance): Sanity check that
+ 	removed function is not in worklist.
+ 	(function_instance::merge): Do not offline realized instances.
+ 	(function_instance::offline): Make private; add duplicate functions
+ 	to worklist rather then merging immediately.
+ 	(function_instance::offline_if_in_set):  Cleanup.
+ 	(function_instance::remove_external_functions): Likewise.
+ 	(function_instance::offline_if_not_realized): New member function.
+ 	(autofdo_source_profile::offline_external_functions): Handle delayed
+ 	functions.
+ 	(autofdo_source_profile::offline_unrealized_inlines): New member function.
+ 	(walk_block): New function.
+ 	(mark_realized_functions): New function.
+ 	(afdo_annotate_cfg): Fix dump.
+ 	(auto_profile): Mark realized functions and offline rest; do not compute
+ 	fn summary.
+ 
+ 2025-06-27  Georg-Johann Lay  <avr@gjlay.de>
+ 
+ 	PR target/113934
+ 	* config/avr/avr.opt (-mlra): Turn on per default.
+ 
+ 2025-06-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120808
+ 	* tree-vect-slp-patterns.cc (vect_match_expression_p):
+ 	Take a code_helper and also match calls.
+ 	(addsub_pattern::recognize): Handle .FMA/.FMS pairs
+ 	in addition to PLUS/MINUS.
+ 	(addsub_pattern::build): Adjust.
+ 
+ 2025-06-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vectorizer.h (vect_chooses_same_modes_p): New
+ 	overload.
+ 	* tree-vect-stmts.cc (vect_chooses_same_modes_p): Likewise.
+ 	* tree-vect-loop.cc (vect_analyze_loop): Prune epilogue
+ 	analysis further when not using partial vectors.
+ 
+ 2025-06-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-loop.cc (vect_analyze_loop): Consider AVX512
+ 	style masking when computing supports_partial_vectors.
+ 
+ 2025-06-27  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* doc/extend.texi: Fix typo in unsed attribute docs.
+ 
+ 2025-06-27  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120830
+ 	* config/i386/i386-features.cc (ix86_get_vector_cse_mode): Handle
+ 	vector broadcast source.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (elimination_2sp_occurred_p): Rename
+ 	from...
+ 	(elimination_fp2sp_occured_p): ... this.  Adjust all uses.
+ 	(lra_eliminate_regs_1): Don't require a from-frame-pointer
+ 	elimination to set it.
+ 	(update_reg_eliminate): Likewise to test it.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (lra_eliminate_regs_1): Adjust autoinc
+ 	addresses that are MEMs.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (lra_update_fp2sp_elimination): Reorder
+ 	and regroup related statements.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (lra_update_fp2sp_elimination):
+ 	Avoid sp offsets in further fp2sp eliminations...
+ 	(update_reg_eliminate): ... and restore to_rtx before assert
+ 	checking.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (lra_update_fp2sp_elimination):
+ 	Compute complete live ranges and recompute slots' live ranges
+ 	if needed.
+ 	* lra-lives.cc (lra_reset_live_range_list): New.
+ 	(lra_complete_live_ranges): New.
+ 	* lra-spills.cc (assign_spill_hard_regs): Reject empty live
+ 	ranges.
+ 	(add_pseudo_to_slot): Likewise.
+ 	(lra_recompute_slots_live_ranges): New.
+ 	* lra-int.h (lra_reset_live_range_list): Declare.
+ 	(lra_complete_live_ranges): Declare.
+ 	(lra_recompute_slots_live_ranges): Declare.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* genoutput.cc (scan_operands): Make MATCH_SCRATCHes eliminable.
+ 
+ 2025-06-27  Alexandre Oliva  <oliva@adacore.com>
+ 
+ 	PR rtl-optimization/120424
+ 	* lra-eliminations.cc (lra_update_fp2sp_elimination):
+ 	Inactivate the unused fp2sp elimination right away.
+ 
+ 2025-06-26  Dimitar Dimitrov  <dimitar@dinux.eu>
+ 
+ 	* config/pru/pru.md (reg move splitter): New splitter for 64-bit
+ 	register moves into two 32-bit moves.
+ 	(const_int move splitter): New splitter for 64-bit constant
+ 	integer moves into two 32-bit moves.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic.h (diagnostic_context::set_permissive_option): New.
+ 	(diagnostic_context::set_fatal_errors): New.
+ 	(diagnostic_context::set_internal_error_callback): New.
+ 	(diagnostic_context::set_adjust_diagnostic_info_callback): New.
+ 	(diagnostic_context::inhibit_notes): New.
+ 	(diagnostic_context::m_opt_permissive): Make private.
+ 	(diagnostic_context::m_fatal_errors): Likewise.
+ 	(diagnostic_context::m_internal_error): Likewise.
+ 	(diagnostic_context::m_adjust_diagnostic_info): Likewise.
+ 	(diagnostic_context::m_inhibit_notes_p): Likewise.
+ 	(diagnostic_inhibit_notes): Delete.
+ 	* opts.cc (common_handle_option): Use
+ 	diagnostic_context::set_fatal_errors.
+ 	* toplev.cc (internal_error_function): Use
+ 	diagnostic_context::set_internal_error_callback.
+ 	(general_init): Likewise.
+ 	(process_options): Use diagnostic_context::inhibit_notes.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/120809
+ 	* diagnostic-format-html.cc
+ 	(html_builder::maybe_make_state_diagram): Bulletproof against the
+ 	SVG generation failing.
+ 	* xml.cc (xml::printer::push_element): Assert that the ptr is
+ 	nonnull.
+ 	(xml::printer::append): Likewise.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* diagnostic-output-spec.cc (sarif_scheme_handler::make_sink):
+ 	Split out creation of sarif_generation_options and
+ 	sarif_serialization_format into...
+ 	(sarif_scheme_handler::make_sarif_gen_opts): ...this...
+ 	(sarif_scheme_handler::make_sarif_serialization_object): ...and
+ 	this.
+ 
+ 2025-06-26  Paul-Antoine Arras  <parras@baylibre.com>
+ 
+ 	PR target/120828
+ 	* config/riscv/riscv-v.cc (prepare_ternary_operands): Handle the
+ 	vector-scalar case.
+ 
+ 2025-06-26  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	PR target/120719
+ 	* config/i386/i386.md (crc_rev<SWI124:mode>si4): New expander.
+ 
+ 2025-06-26  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* config/riscv/riscv.md: Fix build issue.
+ 
+ 2025-06-26  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* lto-ltrans-cache.h (class ltrans_file_cache): Remove member prefix.
+ 	* lto-ltrans-cache.cc (ltrans_file_cache::ltrans_file_cache): Do
+ 	not initialize member prefix.
+ 
+ 2025-06-26  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* config/riscv/riscv.md: Add comment and reorder include
+ 	files.
+ 
+ 2025-06-26  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* tree-vect-stmts.cc (supportable_indirect_convert_operation):
+ 	Remove an unused shadowed variable.
+ 
+ 2025-06-26  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* tree-vect-slp.cc (cond_expr_maps): Remove.
+ 
+ 2025-06-26  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (function_instance::merge): Add TODO.
+ 	(autofdo_source_profile::offline_external_functions):
+ 	Do not use range for on the worklist.
+ 	* timevar.def (TV_IPA_AUTOFDO_OFFLINE): New timevar.
+ 
+ 2025-06-26  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (name_index_set, name_index_map): New types.
+ 	(dump_afdo_loc): New function.
+ 	(dump_inline_stack): Simplify.
+ 	(function_instance::merge): Merge recursively inlined functions;
+ 	offline if necessary; collect new fnctions.
+ 	(function_instance::offline): New member function.
+ 	(function_instance::offline_if_in_set): New member function.
+ 	(function_instance::remove_external_functions): New member function.
+ 	(function_instance::dump): New member function.
+ 	(function_instance::debug): New member function.
+ 	(function_instance::dump_inline_stack): New member function.
+ 	(function_instance::find_icall_target_map): Use removed_icall_target.
+ 	(function_instance::remove_icall_target): Only mark icall target removed.
+ 	(autofdo_source_profile::offline_external_functions): New function.
+ 	(function_instance::read_function_instance): Record inlined_to pointers;
+ 	use -1 for unknown head counts.
+ 	(autofdo_source_profile::get_function_instance_by_name_index): New
+ 	function.
+ 	(autofdo_source_profile::add_function_instance): New member function.
+ 	(autofdo_source_profile::read): Do not leak memory; fix formatting.
+ 	(read_profile): Fix formatting.
+ 	(afdo_annotate_cfg): LIkewise.
+ 	(class pass_ipa_auto_profile_offline): New pass.
+ 	(make_pass_ipa_auto_profile_offline): New function.
+ 	* passes.def (pass_ipa_auto_profile_offline): Add
+ 	* tree-pass.h (make_pass_ipa_auto_profile): Declare
+ 
+ 2025-06-26  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120819
+ 	* config/i386/i386-features.cc (ix86_broadcast_inner): Also handle
+ 	all 1s float vector constant.
+ 
+ 2025-06-26  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120816
+ 	* config/i386/i386-features.cc (remove_redundant_vector_load):
+ 	Handle REG_EH_REGION note in DEF_INSN.
+ 
+ 2025-06-26  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/119628
+ 	* config/i386/i386-expand.cc (ix86_expand_call): Call
+ 	ix86_type_no_callee_saved_registers_p instead of looking up
+ 	no_callee_saved_registers attribute.
+ 	* config/i386/i386-options.cc (ix86_set_func_type): Look up
+ 	preserve_none attribute.  Check preserve_none attribute for
+ 	interrupt attribute.  Don't check no_caller_saved_registers nor
+ 	no_callee_saved_registers conflicts here.
+ 	(ix86_set_func_type): Check no_callee_saved_registers before
+ 	checking no_caller_saved_registers attribute.
+ 	(ix86_set_current_function): Allow SSE with
+ 	no_caller_saved_registers attribute.
+ 	(ix86_handle_call_saved_registers_attribute): Check preserve_none,
+ 	no_callee_saved_registers and no_caller_saved_registers conflicts.
+ 	(ix86_gnu_attributes): Add preserve_none attribute.
+ 	* config/i386/i386-protos.h (ix86_type_no_callee_saved_registers_p):
+ 	New.
+ 	* config/i386/i386.cc
+ 	(x86_64_preserve_none_int_parameter_registers): New.
+ 	(ix86_using_red_zone): Don't use red-zone when there are no
+ 	caller-saved registers with SSE.
+ 	(ix86_type_no_callee_saved_registers_p): New.
+ 	(ix86_function_ok_for_sibcall): Also check TYPE_PRESERVE_NONE
+ 	and call ix86_type_no_callee_saved_registers_p instead of looking
+ 	up no_callee_saved_registers attribute.
+ 	(ix86_comp_type_attributes): Call
+ 	ix86_type_no_callee_saved_registers_p instead of looking up
+ 	no_callee_saved_registers attribute.  Return 0 if preserve_none
+ 	attribute doesn't match in 64-bit mode.
+ 	(ix86_function_arg_regno_p): For cfun with TYPE_PRESERVE_NONE,
+ 	use x86_64_preserve_none_int_parameter_registers.
+ 	(init_cumulative_args): Set preserve_none_abi.
+ 	(function_arg_64): Use x86_64_preserve_none_int_parameter_registers
+ 	with preserve_none attribute.
+ 	(setup_incoming_varargs_64): Use
+ 	x86_64_preserve_none_int_parameter_registers with preserve_none
+ 	attribute.
+ 	(ix86_save_reg): Treat TYPE_PRESERVE_NONE like
+ 	TYPE_NO_CALLEE_SAVED_REGISTERS.
+ 	(ix86_nsaved_sseregs): Allow saving XMM registers for
+ 	no_caller_saved_registers attribute.
+ 	(ix86_compute_frame_layout): Likewise.
+ 	(x86_this_parameter): Use
+ 	x86_64_preserve_none_int_parameter_registers with preserve_none
+ 	attribute.
+ 	* config/i386/i386.h (ix86_args): Add preserve_none_abi.
+ 	(call_saved_registers_type): Add TYPE_PRESERVE_NONE.
+ 	(machine_function): Change call_saved_registers to 3 bits.
+ 	* doc/extend.texi: Add preserve_none attribute.  Update
+ 	no_caller_saved_registers attribute to remove -mgeneral-regs-only
+ 	restriction.
+ 
+ 2025-06-25  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	* config/i386/i386-features.cc (ix86_place_single_vector_set):
+ 	Add debug dump.
+ 	(replace_vector_const): Likewise.
+ 	(remove_redundant_vector_load): Likewise.
+ 
+ 2025-06-25  Luis Silva  <luiss@synopsys.com>
+ 
+ 	* config/arc/arc.md (<su_optab>mulvsi4): New define_expand.
+ 	(<su_optab>mulsi3_Vcmp): New define_insn.
+ 
+ 2025-06-25  Luis Silva  <luiss@synopsys.com>
+ 
+ 	* config/arc/arc.cc (arc_select_cc_mode): Handle multiplication
+ 	results compared against zero, selecting CC_Zmode.
+ 	* config/arc/arc.md (*mulsi3_cmp0): New define_insn.
+ 	(*mulsi3_cmp0_noout): New define_insn.
+ 
+ 2025-06-25  Shahab Vahedi  <shahab@synopsys.com>
+ 
+ 	* config/arc/arc.md (subsi3_v, subvsi4, subsi3_c): New patterns.
+ 
+ 2025-06-25  Shahab Vahedi  <shahab@synopsys.com>
+ 
+ 	* config/arc/arc-modes.def (CC_V): New mode.
+ 	* config/arc/arc-protos.h (arc_gen_unlikely_cbranch): New
+ 	function declaration.
+ 	* config/arc/arc.cc (arc_gen_unlikely_cbranch): New
+ 	function.
+ 	(get_arc_condition_code): Handle new mode.
+ 	* config/arc/arc.md (addvsi3_v, addvsi4, addsi3_c, uaddvsi4): New
+ 	patterns.
+ 	* config/arc/predicates.md (proper_comparison_operator): Handel
+ 	the new V_mode.
+ 	(equality_comparison_operator): Likewise.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* diagnostic-path-output.cc (path_label::get_effects): Mark as
+ 	final override.
+ 	* diagnostic-format-html.cc
+ 	(html_output_format::after_diagnostic): Likewise.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* gimple-range-op.cc
+ 	(gimple_range_op_handler::maybe_builtin_call): Use
+ 	CFN_BUILT_IN_ISINF instead of BUILT_IN_ISINF.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* value-relation.h (class dom_oracle): Mark member function
+ 	next_relation as override.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* tree-ssa-propagate.h (class substitute_and_fold_engine): Mark
+ 	member functions value_of_expr and range_of_expr as override.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* range-op-mixed.h (class operator_plus): Mark member function
+ 	overflow_free_p as final override.
+ 	(class operator_minus): Likewise.
+ 	(class operator_mult): Likewise.
+ 	* range-op-ptr.cc (class pointer_plus_operator): Mark member
+ 	function lhs_op1_relation as final override.
+ 	* range-op.cc (class operator_div::): Mark member functions
+ 	op2_range and update_bitmask as final override.
+ 	(class operator_logical_and): Mark member functions fold_range,
+ 	op1_range and op2_range as final override.  Remove unnecessary
+ 	virtual.
+ 	(class operator_logical_or): Likewise.
+ 	(class operator_logical_not): Mark member functions fold_range and
+ 	op1_range as final override.  Remove unnecessary virtual.
+ 	formatting easier.
+ 	(class operator_absu): Mark member functions wi_fold as final
+ 	override.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* gimple-ssa-sccopy.cc (class pass_sccopy): Mark member functions
+ 	gate and execute as final override.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* avoid-store-forwarding.cc (class
+ 	pass_rtl_avoid_store_forwarding): Mark member function gate as
+ 	final override.
+ 
+ 2025-06-25  Andrew MacLeod  <amacleod@redhat.com>
+ 
+ 	* value-relation.cc (relation_to_code): Remove.
+ 
+ 2025-06-25  Andrew MacLeod  <amacleod@redhat.com>
+ 
+ 	* value-range.cc (frange::verify_range): Constify.
+ 	(irange::verify_range): Constify.
+ 	* value-range.h (vrange::verify_range): New.
+ 	(irange::verify_range): Make public.
+ 	(prange::verify_range): Make public.
+ 	(prange::verify_range): Make public.
+ 	(value_range::verify_range): New.
+ 
+ 2025-06-25  Andrew MacLeod  <amacleod@redhat.com>
+ 
+ 	* value-range.cc (irange::get_bitmask): Return original mask if
+ 	result is unknown.
+ 	(assert_snap_result): New.
+ 	(test_irange_snap_bounds): New.
+ 	(range_tests_misc): Call test_irange_snap_bounds.
+ 
+ 2025-06-25  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/109892
+ 	* tree-vect-loop.cc (check_reduction_path): Handle fma.
+ 	(vectorizable_reduction): Apply FOLD_LEFT_REDUCTION code
+ 	generation constraints.
+ 
+ 2025-06-25  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120808
+ 	* tree-vectorizer.h (compatible_calls_p): Add flag to
+ 	indicate a FMA/FMS pair is allowed.
+ 	* tree-vect-slp.cc (compatible_calls_p): Likewise.
+ 	(vect_build_slp_tree_1): Allow mixed .FMA/.FMS as two-operator.
+ 	(vect_build_slp_tree_2): Handle calls in two-operator SLP build.
+ 	* tree-vect-slp-patterns.cc (compatible_complex_nodes_p):
+ 	Adjust.
+ 
+ 2025-06-25  Alfie Richards  <alfie.richards@arm.com>
+ 
+ 	* tree-ssa-loop-ivopts.cc (constant_multiple_of): Change
+ 	tree_to_aff_combination to tree_to_aff_combination_expand and add
+ 	parameter to take ivopts_data.
+ 	(get_computation_aff_1): Change parameters and calls to include
+ 	ivopts_data.
+ 	(get_computation_aff): Ditto.
+ 	(get_computation_at) Ditto.:
+ 	(get_debug_computation_at) Ditto.:
+ 	(get_computation_cost) Ditto.:
+ 	(rewrite_use_nonlinear_expr) Ditto.:
+ 	(rewrite_use_address) Ditto.:
+ 	(rewrite_use_compare) Ditto.:
+ 	(remove_unused_ivs) Ditto.:
+ 
+ 2025-06-25  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR rtl-optimization/120745
+ 	* rtl-ssa/changes.cc (process_uses_of_deleted_def): Rewrite to
+ 	handle deletions of non-degenerate phis.
+ 
+ 2025-06-25  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120815
+ 	* common/config/i386/i386-common.cc (processor_alias_table):
+ 	Replace CPU_SLM/PTA_NEHALEM with CPU_HASWELL/PTA_HASWELL for
+ 	PROCESSOR_INTEL.
+ 	* config/i386/i386-options.cc (processor_cost_table): Replace
+ 	intel_cost with alderlake_cost.
+ 	* config/i386/x86-tune-costs.h (intel_cost): Removed.
+ 	* config/i386/x86-tune-sched.cc (ix86_issue_rate): Treat
+ 	PROCESSOR_INTEL like PROCESSOR_ALDERLAKE.
+ 	(ix86_adjust_cost): Likewise.
+ 	* doc/invoke.texi: Update -mtune=intel for Diamond Rapids and
+ 	Clearwater Forest.
+ 
+ 2025-06-25  Haochen Jiang  <haochen.jiang@intel.com>
+ 
+ 	* config/i386/i386.h (PTA_ALDERLAKE): Use PTA_GOLDMONT_PLUS
+ 	as base to remove PTA_CLDEMOTE.
+ 	(PTA_SIERRAFOREST): Add PTA_CLDEMOTE since PTA_ALDERLAKE
+ 	does not include that anymore.
+ 	* doc/invoke.texi: Update texi file.
+ 
+ 2025-06-25  Jiawei  <jiawei@iscas.ac.cn>
+ 
+ 	* common/config/riscv/riscv-common.cc: New Profiles.
+ 
+ 2025-06-25  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* common.opt: (fauto-profile-inlining): New
+ 	* doc/invoke.texi (-fauto-profile-inlining): Document.
+ 	* ipa-inline.cc (inline_functions_by_afdo): Check
+ 	flag_auto_profile.
+ 	(early_inliner): Also do inline_functions_by_afdo with
+ 	!flag_early_inlining.
+ 
+ 2025-06-25  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc: Update toplevel comment.
+ 	(early_inline): Remove.
+ 	(auto_profile): Don't do early inlining.
+ 
+ 2025-06-24  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* config/gcn/gcn-opts.h (TARGET_GLC_NAME): Fix and extend the
+ 	description in the comment.
+ 	* config/gcn/gcn.cc (print_operand): Extend the comment about
+ 	'G' and 'g'.
+ 	* config/gcn/gcn.md: Use 'glc' instead of %G where appropriate.
+ 
+ 2025-06-24  Paul-Antoine Arras  <parras@baylibre.com>
+ 
+ 	PR target/119100
+ 	* config/riscv/autovec-opt.md (*<optab>_vf_<mode>): Handle both add and
+ 	acc FMA variants.
+ 	* config/riscv/vector.md (*pred_mul_<optab><mode>_scalar_undef): New.
+ 
+ 2025-06-24  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	* config/i386/i386.md
+ 	(@pro_epilogue_adjust_stack_add_nocc<mode>): Add type attribute.
+ 	(pro_epilogue_adjust_stack_add_nocc peephole2 pattern):
+ 	Convert pro_epilogue_adjust_stack_add_nocc variant to
+ 	pro_epilogue_adjust_stack_add when FLAGS_REG is dead.
+ 
+ 2025-06-24  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-vect-stmts.cc (vectorizable_load): Remove non-SLP
+ 	paths and propagate out ncopies == 1.
+ 
+ 2025-06-24  Marc Poulhiès  <poulhies@adacore.com>
+ 
+ 	* diagnostic-state-to-dot.cc (get_color_for_dynalloc_state):
+ 	Rename argument dynalloc_state to dynalloc_st.
+ 	(add_title_tr): Rename argument style to styl.
+ 	(on_xml_node): Rename local variable dynalloc_state to dynalloc_st.
+ 
+ 2025-06-24  Yuao Ma  <c8ef@outlook.com>
+ 
+ 	* tree-call-cdce.cc (edom_only_function): Remove atan.
+ 
+ 2025-06-24  Juergen Christ  <jchrist@linux.ibm.com>
+ 
+ 	* config/s390/vector.md (VF): Don't restrict modes.
+ 	(VEC_SET_SINGLEFLOAT): Ditto.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* config/aarch64/aarch64.cc (aarch64_override_options_internal): Set
+ 	value of parameter based on option.
+ 	* config/aarch64/aarch64.opt (autovec-preference): New.
+ 	* doc/invoke.texi (autovec-preference): Document it.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* config/aarch64/aarch64.opt (max-vectorization): New.
+ 	* config/aarch64/aarch64.cc (aarch64_override_options_internal): Save
+ 	and restore option.
+ 	Implement it through vect-scalar-cost-multiplier.
+ 	(aarch64_attributes): Default to off.
+ 	* common/config/aarch64/aarch64-common.cc (aarch64_handle_option):
+ 	Initialize option.
+ 	* doc/extend.texi (max-vectorization): Document attribute.
+ 	* doc/invoke.texi (max-vectorization): Document flag.
+ 
+ 2025-06-24  hongtao.liu  <hongtao.liu@intel.com>
+ 
+ 	PR target/115842
+ 	* tree-ssa-loop-ivopts.cc (determine_group_iv_cost_address):
+ 	Don't recalculate inv_expr when group-candidate cost
+ 	calucalution.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* doc/extend.texi: Document pragma unroll interaction with vectorizer.
+ 	* tree-vectorizer.h (LOOP_VINFO_USER_UNROLL): New.
+ 	(class _loop_vec_info): Add user_unroll.
+ 	* tree-vect-loop.cc (vect_analyze_loop_1): Set
+ 	suggested_unroll_factor and retry.
+ 	(_loop_vec_info::_loop_vec_info): Initialize user_unroll.
+ 	(vect_transform_loop): Clear the loop->unroll value if the pragma was
+ 	used.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* tree-vect-loop-manip.cc (vect_gen_vector_loop_niters,
+ 	vect_gen_vector_loop_niters_mult_vf): Remove uses of log_vf.
+ 
+ 2025-06-24  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/92080
+ 	* config/i386/i386-expand.cc (ix86_expand_call): Set
+ 	recursive_function to true for recursive call.
+ 	* config/i386/i386-features.cc (ix86_place_single_vector_set):
+ 	Add an argument for inner scalar, default to nullptr.  Set the
+ 	source from inner scalar if not nullptr.
+ 	(ix86_get_vector_load_mode): Renamed to ...
+ 	(ix86_get_vector_cse_mode): This.  Add an argument for scalar mode
+ 	and handle integer and float scalar modes.
+ 	(replace_vector_const): Add an argument for scalar mode and pass
+ 	it to ix86_get_vector_load_mode.
+ 	(x86_cse_kind): New.
+ 	(redundant_load): Likewise.
+ 	(ix86_broadcast_inner): Likewise.
+ 	(remove_redundant_vector_load): Also support const0_rtx and
+ 	constm1_rtx broadcasts.  Handle vector broadcasts from constant
+ 	and variable scalars.
+ 	* config/i386/i386.h (machine_function): Add recursive_function.
+ 
+ 2025-06-24  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/70308
+ 	PR target/101366
+ 	PR target/102294
+ 	PR target/108585
+ 	PR target/118276
+ 	PR target/119596
+ 	PR target/119703
+ 	PR target/119704
+ 	* config/i386/x86-tune-costs.h (generic_memcpy): Updated.
+ 	(generic_memset): Likewise.
+ 	(generic_cost): Change CLEAR_RATIO to 10.
+ 
+ 2025-06-24  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* tree-inline.cc (expand_call_inline): Preserve discriminator.
+ 
+ 2025-06-24  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (afdo_set_bb_count): Dump also 0 count stmts.
+ 	(afdo_annotate_cfg): Fix conditional for block having non-zero static
+ 	profile.
+ 
+ 2025-06-24  Lili Cui  <lili.cui@intel.com>
+ 
+ 	PR target/120741
+ 	* config/i386/i386.cc (ix86_expand_prologue):
+ 	Remove 1 assertion.
+ 
+ 2025-06-24  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR target/118241
+ 	* config/riscv/predicates.md: Fix comment typo in recent change.
+ 
+ 2025-06-23  Sam James  <sam@gentoo.org>
+ 	    Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR rtl-optimization/120795
+ 	* ext-dce.cc (ext_dce_try_optimize_insn): Enable rescan in
+ 	remove_reg_equal_equiv_notes call.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	PR testsuite/116163
+ 	PR sarif-replay/120792
+ 	* Makefile.in (OBJS-libcommon): Add diagnostic-output-spec.o.
+ 	* diagnostic-format-html.cc (html_builder::html_builder): Ensure
+ 	title is non-empty.
+ 	* diagnostic-output-spec.cc: New file, taken from material in
+ 	opts-diagnostic.cc.
+ 	* diagnostic-output-spec.h: New file.
+ 	* diagnostic.cc (diagnostic_context::set_main_input_filename):
+ 	New.
+ 	* diagnostic.h (diagnostic_context::set_main_input_filename): New
+ 	decl.
+ 	* doc/libgdiagnostics/topics/compatibility.rst
+ 	(LIBGDIAGNOSTICS_ABI_2): New.
+ 	* doc/libgdiagnostics/topics/diagnostic-manager.rst
+ 	(diagnostic_manager_add_sink_from_spec): New.
+ 	(diagnostic_manager_set_analysis_target): New.
+ 	* libgdiagnostics++.h (manager::add_sink_from_spec): New.
+ 	(manager::set_analysis_target): New.
+ 	* libgdiagnostics.cc: Include "diagnostic-output-spec.h".
+ 	(struct spec_context): New.
+ 	(diagnostic_manager_add_sink_from_spec): New.
+ 	(diagnostic_manager_set_analysis_target): New.
+ 	* libgdiagnostics.h
+ 	(LIBDIAGNOSTICS_HAVE_diagnostic_manager_add_sink_from_spec): New
+ 	define.
+ 	(diagnostic_manager_add_sink_from_spec): New decl.
+ 	(LIBDIAGNOSTICS_HAVE_diagnostic_manager_set_analysis_target): New
+ 	define.
+ 	(diagnostic_manager_set_analysis_target): New decl.
+ 	* libgdiagnostics.map (LIBGDIAGNOSTICS_ABI_2): New.
+ 	* libsarifreplay.cc (sarif_replayer::handle_artifact_obj): Looks
+ 	for "analysisTarget" in roles and call set_analysis_target using
+ 	the artifact if found.
+ 	* opts-diagnostic.cc: Refactor, moving material to
+ 	diagnostic-output-spec.cc.
+ 	(struct opt_spec_context): New.
+ 	(handle_OPT_fdiagnostics_add_output_): Use opt_spec_context.
+ 	(handle_OPT_fdiagnostics_set_output_): Likewise.
+ 	* sarif-replay.cc: Define INCLUDE_STRING.
+ 	(struct options): Add m_extra_output_specs.
+ 	(usage_msg): Add -fdiagnostics-add-output=SCHEME.
+ 	(str_starts_with): New.
+ 	(parse_options): Add -fdiagnostics-add-output=SCHEME.
+ 	(main): Likewise.
+ 	* selftest-run-tests.cc (selftest::run_tests): Call
+ 	diagnostic_output_spec_cc_tests rather than
+ 	opts_diagnostic_cc_tests.
+ 	* selftest.h (selftest::diagnostic_output_spec_cc_tests):
+ 	Replace...
+ 	(selftest::opts_diagnostic_cc_tests): ...this.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* Makefile.in (ANALYZER_OBJS): Add
+ 	analyzer/ana-state-to-diagnostic-state.o.
+ 	(OBJS): Move graphviz.o to...
+ 	(OBJS-libcommon): ...here.  Add diagnostic-state-to-dot.o and pex.o.
+ 	* diagnostic-format-html.cc: Include "diagnostic-state.h" and
+ 	"graphviz.h".
+ 	(html_generation_options::html_generation_options): Initialize the
+ 	new flags.
+ 	(HTML_SCRIPT): Add function "get_any_state_diagram".  Use it
+ 	when changing current focus id to update the visibility of the
+ 	pertinent diagram, if any.
+ 	(print_pre_source): New.
+ 	(html_builder::maybe_make_state_diagram): New.
+ 	(html_path_label_writer::html_path_label_writer): Add "path" param.
+ 	Initialize m_path and m_curr_event_id.
+ 	(html_path_label_writer::begin_label): Store current event id.
+ 	(html_path_label_writer::end_label): Attempt to make a state
+ 	diagram and add it if successful.
+ 	(html_path_label_writer::get_element_id): New.
+ 	(html_path_label_writer::m_path): New field.
+ 	(html_path_label_writer::m_curr_event_id): New field.
+ 	(html_builder::make_element_for_diagnostic): Pass path to label
+ 	writer.
+ 	* diagnostic-format-html.h
+ 	(html_generation_options::m_show_state_diagrams): New field.
+ 	(html_generation_options::m_show_state_diagram_xml): New field.
+ 	(html_generation_options::m_show_state_diagram_dot_src): New field.
+ 	* diagnostic-format-sarif.cc: Include "xml.h".
+ 	(populate_thread_flow_location_object): If requested, attempt to
+ 	generate xml state and add it to the proeprty bag as
+ 	"gcc/diagnostic_event/xml_state" in xml source form.
+ 	(sarif_generation_options::sarif_generation_options): Initialize
+ 	m_xml_state.
+ 	* diagnostic-format-sarif.h
+ 	(sarif_generation_options::m_xml_state): New field.
+ 	* diagnostic-path.cc: Define INCLUDE_MAP.  Include "xml.h".
+ 	(diagnostic_event::maybe_make_xml_state): New.
+ 	* diagnostic-path.h (class xml::document): New forward decl.
+ 	(diagnostic_event::maybe_make_xml_state): New vfunc decl.
+ 	* diagnostic-state-to-dot.cc: New file.
+ 	* diagnostic-state.h: New file.
+ 	* digraph.cc: Define INCLUDE_STRING and INCLUDE_VECTOR.
+ 	* doc/analyzer.texi: Document state diagrams in html output.
+ 	(__analyzer_dump_dot): New.
+ 	(__analyzer_dump_xml): New.
+ 	* doc/invoke.texi (sarif): Add "xml-state" key.
+ 	(experimental-html): Add keys "show-state-diagrams",
+ 	"show-state-diagrams-dot-src" and "show-state-diagrams-xml".
+ 	* graphviz.cc: Define INCLUDE_MAP, INCLUDE_STRING, and
+ 	INCLUDE_VECTOR.  Include "xml.h", "xml-printer.h", "pex.h" and
+ 	"selftest.h".
+ 	(graphviz_out::graphviz_out): Extract...
+ 	(dot::writer::writer): ...this.
+ 	(graphviz_out::write_indent): Convert to...
+ 	(dot::writer::write_indent): ...this.
+ 	(graphviz_out::print): Use get_pp.
+ 	(graphviz_out::println): Likewise.
+ 	(graphviz_out::begin_tr): Likewise.
+ 	(graphviz_out::end_tr): Likewise.
+ 	(graphviz_out::begin_td): Likewise.
+ 	(graphviz_out::end_td): Likewise.
+ 	(graphviz_out::begin_trtd): Likewise.
+ 	(graphviz_out::end_tdtr): Likewise.
+ 	(dot::ast_node::dump): New.
+ 	(dot::id::id): New.
+ 	(dot::id::print): New.
+ 	(dot::id::is_identifier_p): New.
+ 	(dot::kv_pair::print): New.
+ 	(dot::attr_list::print): New.
+ 	(dot::stmt_list::print): New.
+ 	(dot::stmt_list::add_edge): New.
+ 	(dot::stmt_list::add_attr): New.
+ 	(dot::graph::print): New.
+ 	(dot::stmt_with_attr_list::set_label): New.
+ 	(dot::node_stmt::print): New.
+ 	(dot::attr_stmt::print): New.
+ 	(dot::kv_stmt::print): New.
+ 	(dot::node_id::print): New.
+ 	(dot::port::print): New.
+ 	(dot::edge_stmt::print): New.
+ 	(dot::subgraph::print): New.
+ 	(dot::make_svg_document_buffer_from_graph): New.
+ 	(dot::make_svg_from_graph): New.
+ 	(selftest:test_ids): New.
+ 	(selftest:test_trivial_graph): New.
+ 	(selftest:test_layout_example): New.
+ 	(selftest:graphviz_cc_tests): New.
+ 	* graphviz.h (xml::node): New forward decl.
+ 	(class graphviz_out): Split out into...
+ 	(class dot::writer): ...this new class
+ 	(struct dot::ast_node): New.
+ 	(struct dot::id): New.
+ 	(struct dot::kv_pair): New.
+ 	(struct dot::attr_list): New.
+ 	(struct dot::stmt_list): New.
+ 	(struct dot::graph): New.
+ 	(struct dot::stmt): New.
+ 	(struct dot::stmt_with_attr_list): New.
+ 	(struct dot::node_stmt): New.
+ 	(struct dot::attr_stmt): New.
+ 	(struct dot::kv_stmt): New.
+ 	(enum class dot::compass_pt): New.
+ 	(struct dot::port): New.
+ 	(struct dot::node_id): New.
+ 	(struct dot::edge_stmt): New.
+ 	(struct dot::subgraph): New.
+ 	(dot::make_svg_from_graph): New.
+ 	* opts-diagnostic.cc (sarif_scheme_handler::make_sink): Add
+ 	"xml-state" flag.
+ 	(html_scheme_handler::make_sink): Add flags "show-state-diagrams",
+ 	"show-state-diagram-dot-src", and "show-state-diagram-xml".
+ 	* pex.cc: New file.
+ 	* pex.h: New file.
+ 	* selftest-run-tests.cc (selftest::run_tests): Call
+ 	graphviz_cc_tests.
+ 	* selftest.h (selftest::graphviz_cc_tests): New decl.
+ 	* xml.cc (xml::node_with_children::add_comment): New.
+ 	(xml::node_with_children::find_child_element): New.
+ 	(xml::element::get_attr): New.
+ 	(xml::comment::write_as_xml): New.
+ 	(selftest::test_printer): Add coverage of find_child_element and
+ 	get_attr.
+ 	(selftest::test_comment): New.
+ 	(selftest::xml_cc_tests): Call test_comment.
+ 	* xml.h: New forward decls.
+ 	(xml::node::dyn_cast_text): Use nullptr.
+ 	(xml::node::dyn_cast_element): New vfunc.
+ 	(xml::node_with_children::add_comment): New decl.
+ 	(xml::node_with_children::find_child_element): New decl.
+ 	(xml::element::dyn_cast_element): New vfunc impl.
+ 	(xml::element::get_attr): New decl.
+ 	(struct xml::comment): New xml::node subclass.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* diagnostic-format-html.cc (html_token_printer::print_tokens):
+ 	Handle pp_token::kind::event_id.
+ 	(selftest::test_token_printer): Add coverage of printing an event
+ 	id.
+ 
+ 2025-06-23  Pan Li  <pan2.li@intel.com>
+ 
+ 	* config/riscv/riscv-v.cc (expand_vx_binary_vec_dup_vec): Add
+ 	new case US_PLUS.
+ 	(expand_vx_binary_vec_vec_dup): Ditto.
+ 	* config/riscv/riscv.cc (riscv_rtx_costs): Ditto.
+ 	* config/riscv/vector-iterators.md: Add new op us_plus.
+ 
+ 2025-06-23  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/120608
+ 	* tree-tailcall.cc (empty_eh_cleanup): Ignore .ASAN_MARK (POISON)
+ 	internal calls for the cfun->has_musttail case and diag_musttail.
+ 	(find_tail_calls): Likewise.
+ 
+ 2025-06-23  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/120608
+ 	* cfgexpand.cc: Include rtl-iter.h.
+ 	(expand_gimple_tailcall): Add ASAN_EPILOG_SEQ argument, if non-NULL
+ 	and expand_gimple_stmt emitted a tail call, emit a copy of that
+ 	insn sequence before the call sequence.
+ 	(expand_gimple_basic_block): Remove DISABLE_TAIL_CALLS argument, add
+ 	ASAN_EPILOG_SEQ argument.  Disable tail call flag only on non-musttail
+ 	calls if that flag is set, pass it to expand_gimple_tailcall.
+ 	(pass_expand::execute): Pass VAR_RET_SEQ directly as last
+ 	expand_gimple_basic_block argument rather than its comparison with
+ 	NULL.
+ 
+ 2025-06-23  Pengfei Li  <Pengfei.Li2@arm.com>
+ 
+ 	* tree-vect-data-refs.cc (vect_peeling_supportable): Return new
+ 	enum values to indicate if combined peeling and versioning can
+ 	potentially support vectorization.
+ 	(vect_enhance_data_refs_alignment): Support combined peeling and
+ 	versioning in vectorization analysis.
+ 	* tree-vect-loop-manip.cc (vect_create_cond_for_align_checks):
+ 	Add a new type of runtime check for mutually aligned DRs.
+ 	* tree-vect-loop.cc (_loop_vec_info::_loop_vec_info): Set
+ 	default value of allow_mutual_alignment in the initializer list.
+ 	* tree-vectorizer.h (enum peeling_support): Define type of
+ 	peeling support for function vect_peeling_supportable.
+ 	(LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT): New access macro.
+ 
+ 2025-06-23  Mikael Morin  <morin-mikael@orange.fr>
+ 
+ 	* match.pd (`-(-X)`, `~(~X)`, `conj(conj(X))`): Add a
+ 	NON_LVALUE_EXPR wrapper to the simplification of doubled unary
+ 	operators NEGATE_EXPR, BIT_NOT_EXPR and CONJ_EXPR.
+ 
+ 2025-06-23  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120729
+ 	* gimple-predicate-analysis.h (uninit_analysis::prune_phi_opnds):
+ 	Add argument of work budget remaining.
+ 	* gimple-predicate-analysis.cc (uninit_analysis::prune_phi_opnds):
+ 	Likewise.  Maintain and honor it throughout the recursion.
+ 	* params.opt (uninit-max-prune-work): New.
+ 	* doc/invoke.texi (uninit-max-prune-work): Document.
+ 
+ 2025-06-23  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR rtl-optimization/120721
+ 	* function.cc (instantiate_virtual_regs_in_insn): Use force_subreg
+ 	instead of simplify_gen_subreg when instantiating an rvalue SUBREG.
+ 
+ 2025-06-23  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120728
+ 	* config/i386/i386.cc (ix86_get_ssemov): Use vmovdqu16/vmovdqu8
+ 	only with EVEX register operands.
+ 
+ 2025-06-23  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	* config/i386/i386-options.cc (processor_cost_table): Add a
+ 	PROCESSOR_XXX comment to each entry.
+ 
+ 2025-06-22  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	PR target/119830
+ 	* config/riscv/riscv.cc (riscv_build_integer_1): Make arithmetic in bclr case
+ 	clean for 32 bit hosts.
+ 
+ 2025-06-22  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR rtl-optimization/120550
+ 	* ext-dce.cc (ext_dce_try_optimize_insn): Drop REG_EQUAL/REG_EQUIV
+ 	notes on modified insns.
+ 
+ 2025-06-22  Takayuki 'January June' Suwa  <jjsuwa_sys3175@yahoo.co.jp>
+ 
+ 	* config/xtensa/xtensa.h (TARGET_DEPBITS): New macro.
+ 	* config/xtensa/xtensa.md (insvsi): New insn pattern.
+ 
+ 2025-06-22  Takayuki 'January June' Suwa  <jjsuwa_sys3175@yahoo.co.jp>
+ 
+ 	* config/xtensa/xtensa.cc (xtensa_zero_call_used_regs):
+ 	New prototype and function.
+ 	(TARGET_ZERO_CALL_USED_REGS): Define macro.
+ 
+ 2025-06-22  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (update_count_by_afdo_count): Make static;
+ 	add variant accepting profile_count.
+ 	(afdo_find_equiv_class): Use update_count_by_afdo_count.
+ 	(afdo_propagate_edge): Likewise.
+ 	(afdo_propagate): Likewise.
+ 	(afdo_calculate_branch_prob): Fix handling of all_known.
+ 	(afdo_annotate_cfg): Annotate by 0 where both afdo and static
+ 	profile agrees.
+ 
+ 2025-06-22  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (afdo_set_bb_count): Dump inline stacks
+ 	and reasons when lookup failed.
+ 	(afdo_set_bb_count): Record info about BBs with zero AFDO count.
+ 	(afdo_annotate_cfg): Set profile to global0_afdo if there are
+ 	no samples in profile.
+ 
+ 2025-06-22  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* ipa-profile.cc (ipa_profile): Use widest_int to avoid
+ 	possible overflows.
+ 
+ 2025-06-22  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* auto-profile.cc (autofdo::afdo_count_scale): New.
+ 	(autofdo_source_profile::update_inlined_ind_target): Scale
+ 	counts.
+ 	(autofdo_source_profile::read): Set scale and dump
+ 	statistics.
+ 	(afdo_indirect_call): Scale.
+ 	(afdo_set_bb_count): Scale.
+ 	(afdo_find_equiv_class): Fix dumps.
+ 	(afdo_annotate_cfg): Scale.
+ 
+ 2025-06-22  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* cgraph.cc (cgraph_node::make_profile_global0): Support
+ 	GUESSED_GLOBAL0_AFDO
+ 	* ipa-cp.cc (update_profiling_info): Use
+ 	GUESSED_GLOBAL0_AFDO.
+ 	* profile-count.cc (profile_probability::dump): Use
+ 	quality ().
+ 	(profile_probability::stream_in): Use m_adjusted_quality.
+ 	(profile_probability::stream_out): Use m_adjusted_quality.
+ 	(profile_count::combine_with_ipa_count): Use quality ().
+ 	(profile_probability::sqrt): Likewise.
+ 	* profile-count.h (enum profile_quality): Add
+ 	GUESSED_GLOBAL0_AFDO; reoder GUESSED_GLOBAL0_ADJUSTED and
+ 	GUESSED_GLOBAL0.
+ 	(profile_probability): Add min_quality; replase m_quality
+ 	by m_adjused_quality; add set_quality; update all users
+ 	of quality.
+ 	(profile_count): Set n_bits to 60; make m_quality 4 bits;
+ 	update uses of quality.
+ 	(profile_count::afdo_zero, profile_count::globa0afdo): New.
+ 
  2025-06-21  Jan Hubicka  <hubicka@ucw.cz>
  
  	* tree-inline.cc (copy_cfg_body): Fix profile of split functions.
diff -Nrcpad gcc-16-20250622/gcc/DATESTAMP gcc-16-20250629/gcc/DATESTAMP
*** gcc-16-20250622/gcc/DATESTAMP	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/DATESTAMP	Sun Jun 29 22:32:25 2025
***************
*** 1 ****
! 20250622
--- 1 ----
! 20250629
diff -Nrcpad gcc-16-20250622/gcc/Makefile.in gcc-16-20250629/gcc/Makefile.in
*** gcc-16-20250622/gcc/Makefile.in	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/Makefile.in	Sun Jun 29 22:32:25 2025
*************** C_COMMON_OBJS = c-family/c-common.o c-fa
*** 1325,1330 ****
--- 1325,1331 ----
  # Analyzer object files
  ANALYZER_OBJS = \
  	analyzer/access-diagram.o \
+ 	analyzer/ana-state-to-diagnostic-state.o \
  	analyzer/analysis-plan.o \
  	analyzer/analyzer.o \
  	analyzer/analyzer-language.o \
*************** OBJS = \
*** 1537,1543 ****
  	godump.o \
  	graph.o \
  	graphds.o \
- 	graphviz.o \
  	graphite.o \
  	graphite-isl-ast-to-gimple.o \
  	graphite-dependences.o \
--- 1538,1543 ----
*************** OBJS-libcommon = diagnostic-spec.o diagn
*** 1858,1867 ****
--- 1858,1870 ----
  	diagnostic-format-text.o \
  	diagnostic-global-context.o \
  	diagnostic-macro-unwinding.o \
+ 	diagnostic-output-spec.o \
  	diagnostic-path.o \
  	diagnostic-path-output.o \
  	diagnostic-show-locus.o \
+ 	diagnostic-state-to-dot.o \
  	edit-context.o \
+ 	graphviz.o pex.o \
  	pretty-print.o intl.o \
  	json.o json-parsing.o \
  	xml.o \
diff -Nrcpad gcc-16-20250622/gcc/ada/ChangeLog gcc-16-20250629/gcc/ada/ChangeLog
*** gcc-16-20250622/gcc/ada/ChangeLog	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/ada/ChangeLog	Sun Jun 29 22:32:25 2025
***************
*** 1,3 ****
--- 1,31 ----
+ 2025-06-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	PR ada/120854
+ 	* sem_eval.adb (Get_String_Val): Be prepared for an integer literal
+ 	after a serious error is detected, and raise PE on other nodes.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* gcc-interface/misc.cc (gnat_init): Use
+ 	diagnostic_context::set_internal_error_callback.
+ 
+ 2025-06-22  Nicolas Boulenguez  <nicolas@debian.org>
+ 
+ 	PR ada/120106
+ 	* gcc-interface/Make-lang.in: Set GNAT{MAKE,BIND,LINK_LS}_FOR_HOST
+ 	from GNAT{MAKE,BIND} instead of using hardcoded commands.
+ 
+ 2025-06-22  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* Make-generated.in: Remove obsolete stuff.
+ 
+ 2025-06-22  Nicolas Boulenguez  <nicolas@debian.org>
+ 
+ 	PR ada/120106
+ 	PR ada/120106
+ 	* Make-generated.in: Use GNATMAKE_FOR_BUILD instead of gnatmake.
+ 	* gcc-interface/Makefile.in: Likewise.
+ 
  2025-06-17  Eric Botcazou  <ebotcazou@adacore.com>
  
  	PR ada/120665
diff -Nrcpad gcc-16-20250622/gcc/ada/gcc-interface/Make-lang.in gcc-16-20250629/gcc/ada/gcc-interface/Make-lang.in
*** gcc-16-20250622/gcc/ada/gcc-interface/Make-lang.in	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/ada/gcc-interface/Make-lang.in	Sun Jun 29 22:32:25 2025
*************** ada.serial = gnat1$(exeext)
*** 185,190 ****
--- 185,195 ----
  # variable conveys what we need for this, set to "g++" if not bootstrapping,
  # ".../xg++" otherwise.
  
+ GNATMAKE_FOR_HOST = $(GNATMAKE)
+ GNATBIND_FOR_HOST = $(GNATBIND)
+ GNATLINK_FOR_HOST = $(subst gnatmake,gnatlink,$(GNATMAKE))
+ GNATLS_FOR_HOST   = $(subst gnatmake,gnatls,$(GNATMAKE))
+ 
  # There are too many Ada sources to check against here.  Let's
  # always force the recursive make.
  ifeq ($(build), $(host))
*************** ifeq ($(build), $(host))
*** 214,233 ****
          CXX="$(CXX)" \
          $(COMMON_FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS) \
          ADA_INCLUDES="-I../generated -I$(RTS_DIR)/../adainclude -I$(RTS_DIR)" \
!         GNATMAKE="gnatmake" \
!         GNATBIND="gnatbind" \
!         GNATLINK="gnatlink" \
          LIBGNAT=""
    endif
  else
    # Build is different from host so we are either building a canadian cross
    # or a cross-native compiler. We provide defaults for tools targeting the
!   # host platform, but they can be overriden by just setting <tool>_FOR_HOST
    # variables.
-   GNATMAKE_FOR_HOST=$(host_noncanonical)-gnatmake
-   GNATBIND_FOR_HOST=$(host_noncanonical)-gnatbind
-   GNATLINK_FOR_HOST=$(host_noncanonical)-gnatlink
-   GNATLS_FOR_HOST=$(host_noncanonical)-gnatls
  
    ifeq ($(host), $(target))
      # This is a cross native. All the sources are taken from the currently
--- 219,234 ----
          CXX="$(CXX)" \
          $(COMMON_FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS) \
          ADA_INCLUDES="-I../generated -I$(RTS_DIR)/../adainclude -I$(RTS_DIR)" \
!         GNATMAKE="$(GNATMAKE_FOR_HOST)" \
!         GNATBIND="$(GNATBIND_FOR_HOST)" \
!         GNATLINK="$(GNATLINK_FOR_HOST)" \
          LIBGNAT=""
    endif
  else
    # Build is different from host so we are either building a canadian cross
    # or a cross-native compiler. We provide defaults for tools targeting the
!   # host platform, but they can be overridden by just setting <tool>_FOR_HOST
    # variables.
  
    ifeq ($(host), $(target))
      # This is a cross native. All the sources are taken from the currently
diff -Nrcpad gcc-16-20250622/gcc/ada/gcc-interface/misc.cc gcc-16-20250629/gcc/ada/gcc-interface/misc.cc
*** gcc-16-20250622/gcc/ada/gcc-interface/misc.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/ada/gcc-interface/misc.cc	Sun Jun 29 22:32:25 2025
*************** gnat_init (void)
*** 377,383 ****
    line_table->default_range_bits = 0;
  
    /* Register our internal error function.  */
!   global_dc->m_internal_error = &internal_error_function;
  
    return true;
  }
--- 377,383 ----
    line_table->default_range_bits = 0;
  
    /* Register our internal error function.  */
!   global_dc->set_internal_error_callback (&internal_error_function);
  
    return true;
  }
diff -Nrcpad gcc-16-20250622/gcc/ada/sem_eval.adb gcc-16-20250629/gcc/ada/sem_eval.adb
*** gcc-16-20250622/gcc/ada/sem_eval.adb	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/ada/sem_eval.adb	Sun Jun 29 22:32:25 2025
*************** package body Sem_Eval is
*** 5287,5295 ****
     begin
        if Nkind (N) in N_String_Literal | N_Character_Literal then
           return N;
!       else
!          pragma Assert (Is_Entity_Name (N));
           return Get_String_Val (Constant_Value (Entity (N)));
        end if;
     end Get_String_Val;
  
--- 5287,5302 ----
     begin
        if Nkind (N) in N_String_Literal | N_Character_Literal then
           return N;
!       elsif Is_Entity_Name (N) then
           return Get_String_Val (Constant_Value (Entity (N)));
+       elsif Nkind (N) = N_Integer_Literal then
+          pragma Assert (Serious_Errors_Detected /= 0);
+          return
+            Make_Character_Literal (Sloc (N),
+              Chars              => Error_Name,
+              Char_Literal_Value => Intval (N));
+       else
+          raise Program_Error;
        end if;
     end Get_String_Val;
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/ChangeLog gcc-16-20250629/gcc/analyzer/ChangeLog
*** gcc-16-20250622/gcc/analyzer/ChangeLog	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/ChangeLog	Sun Jun 29 22:32:26 2025
***************
*** 1,3 ****
--- 1,135 ----
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* region-model.cc
+ 	(exception_thrown_from_unrecognized_call::print): Add
+ 	"final override" to vfunc.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* ana-state-to-diagnostic-state.cc: New file.
+ 	* ana-state-to-diagnostic-state.h: New file.
+ 	* checker-event.cc: Include "xml.h".
+ 	(checker_event::checker_event): Initialize m_path.
+ 	(checker_event::prepare_for_emission): Store the path pointer into
+ 	m_path.
+ 	(checker_event::maybe_make_xml_state): New.
+ 	(function_entry_event::function_entry_event): Add "state" param
+ 	and use it to initialize m_state.
+ 	(superedge_event::get_program_state): New.
+ 	(call_event::get_program_state): New.
+ 	(warning_event::get_program_state): New.
+ 	* checker-event.h (checker_event::get_program_state): New vfunc.
+ 	(checker_event::maybe_make_xml_state): New decl.
+ 	(checker_event::m_path): New field.
+ 	(statement_event::get_program_state): New vfunc impl.
+ 	(function_entry_event::function_entry_event): Add "state" param.
+ 	(function_entry_event::get_program_state): New vfunc impl.
+ 	(function_entry_event::m_state): New field.
+ 	(state_change_event::get_program_state): New vfunc impl.
+ 	(superedge_event::get_program_state): New vfunc decl.
+ 	(warning_event::warning_event): Add "program_state_" param and
+ 	copy it.
+ 	(warning_event::get_program_state): New vfunc decl.
+ 	(warning_event::m_program_state): New field.
+ 	* checker-path.h (checker_path::checker_path): Add ext_state param.
+ 	(checker_path::get_ext_state): New accessor.
+ 	(checker_path::m_ext_state): New field.
+ 	* common.h: Define INCLUDE_MAP and INCLUDE_STRING.
+ 	* diagnostic-manager.cc (saved_diagnostic::operator==): Don't
+ 	deduplicate dump_path_diagnostic instances.
+ 	(diagnostic_manager::emit_saved_diagnostic): Pass ext_state to
+ 	checker_path ctor.
+ 	* engine.cc:
+ 	(impl_region_model_context::on_state_leak): Pass old and new state
+ 	to state_machine::on_leak.
+ 	(exploded_node::on_stmt_pre): Implement __analyzer_dump_xml and
+ 	__analyzer_dump_dot.
+ 	* exploded-graph.h (impl_region_model_context::get_state): New.
+ 	* infinite-recursion.cc
+ 	(recursive_function_entry_event::recursive_function_entry_event):
+ 	Add "dst_state" param and pass to function_entry_event ctor.
+ 	(infinite_recursion_diagnostic::add_function_entry_event): Pass state
+ 	to event ctor.
+ 	* kf-analyzer.cc: Include "analyzer/program-state.h"
+ 	(dump_path_diagnostic::dump_path_diagnostic): Add "state" param.
+ 	(dump_path_diagnostic::get_final_state): New.
+ 	(dump_path_diagnostic::m_state): New field.
+ 	(kf_analyzer_dump_path::impl_call_pre): Pass state to warning.
+ 	* pending-diagnostic.cc
+ 	(pending_diagnostic::add_function_entry_event): Pass state to
+ 	function_entry_event.
+ 	(pending_diagnostic::add_final_event): Likewise to warning_event.
+ 	* pending-diagnostic.h (pending_diagnostic::get_final_state): New
+ 	vfunc decl.
+ 	* program-state.cc: Include "diagnostic-state.h", "graphviz.h" and
+ 	"analyzer/ana-state-to-diagnostic-state.h".
+ 	(program_state::dump_dot): New.
+ 	* program-state.h: Include "text-art/tree-widget.h" and
+ 	"analyzer/store.h".
+ 	(class xml::document): New forward decl.
+ 	(make_xml): New.
+ 	(dump_xml_to_pp): New.
+ 	(dump_xml_to_file): New.
+ 	(dump_xml): New.
+ 	(dump_dot): New.
+ 	* record-layout.cc (record_layout::record_layout): Make param
+ 	const_tree.
+ 	* record-layout.h (item::item): Likewise.
+ 	(item::m_field): Likewise.
+ 	(record_layout::record_layout): Likewise.
+ 	(record_layout::begin): New.
+ 	(record_layout::end): New.
+ 	* region-model.cc
+ 	(exposure_through_uninit_copy::complain_about_fully_uninit_item):
+ 	Use const_tree.
+ 	(exposure_through_uninit_copy::complain_about_partially_uninit_item):
+ 	Likewise.
+ 	* region-model.h (region_model_context::get_state): New vfunc.
+ 	(noop_region_model_context::get_state): New.
+ 	(region_model_context_decorator::get_state): New.
+ 	* sm-fd.cc (fd_leak::fd_leak): Add "final_state" param and capture
+ 	it if present.
+ 	(fd_leak::get_final_state): New.
+ 	(fd_leak::m_final_state): New.
+ 	(fd_state_machine::on_open): Pass nullptr for new "final_state"
+ 	param.
+ 	(fd_state_machine::on_creat): Likewise.
+ 	(fd_state_machine::on_socket): Likewise.
+ 	(fd_state_machine::on_accept): Likewise.
+ 	(fd_state_machine::on_leak): Add state params and pass new state
+ 	as final state to fd_leak ctor.
+ 	* sm-file.cc: Include "analyzer/program-state.h".
+ 	(file_leak::file_leak): Add "final_state" param and capture it if
+ 	present.
+ 	(file_leak::get_final_state): New.
+ 	(file_leak::m_final_state): New.
+ 	(fileptr_state_machine::on_leak): Add state params and pass new
+ 	state as final state to fd_leak ctor.
+ 	* sm-malloc.cc: Include
+ 	"analyzer/ana-state-to-diagnostic-state.h".
+ 	(malloc_leak::malloc_leak): Add "final_state" param and use it.
+ 	(malloc_leak::get_final_state): New vfunc impl.
+ 	(malloc_leak::m_final_state): New field.
+ 	(malloc_state_machine::on_leak): Add state params; capture final
+ 	state.
+ 	(malloc_state_machine::add_state_to_xml): New.
+ 	* sm.cc (state_machine::on_leak): Add "old_state" and "new_state"
+ 	params.  Use nullptr.
+ 	(state_machine::add_state_to_xml): New.
+ 	(state_machine::add_global_state_to_xml): New.
+ 	* sm.h (class xml_state): New forward decl.
+ 	(state_machine::on_leak): Add state params.
+ 	(state_machine::add_state_to_xml): New vfunc decl.
+ 	(state_machine::add_global_state_to_xml): New vfunc decl.
+ 	* store.h (bit_range::operator<): New.
+ 	* varargs.cc (va_list_leak::va_list_leak): Add final_state param
+ 	and capture it if non-null.
+ 	(va_list_leak::get_final_state): New.
+ 	(va_list_leak::m_final_state): New.
+ 	(va_list_state_machine::on_leak): Add state params and pass final
+ 	state to va_list_leak ctor.
+ 
  2025-06-18  David Malcolm  <dmalcolm@redhat.com>
  
  	* checker-event.h (checker_event::get_kind): New accessor.
diff -Nrcpad gcc-16-20250622/gcc/analyzer/ana-state-to-diagnostic-state.cc gcc-16-20250629/gcc/analyzer/ana-state-to-diagnostic-state.cc
*** gcc-16-20250622/gcc/analyzer/ana-state-to-diagnostic-state.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/analyzer/ana-state-to-diagnostic-state.cc	Sun Jun 29 22:32:26 2025
***************
*** 0 ****
--- 1,786 ----
+ /* Converting ana::program_state to XML state documents.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #define INCLUDE_ALGORITHM
+ #define INCLUDE_MAP
+ #define INCLUDE_SET
+ #include "analyzer/common.h"
+ 
+ #include "xml.h"
+ #include "xml-printer.h"
+ 
+ #include "analyzer/region-model.h"
+ #include "analyzer/program-state.h"
+ #include "analyzer/record-layout.h"
+ #include "analyzer/ana-state-to-diagnostic-state.h"
+ 
+ #if ENABLE_ANALYZER
+ 
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic ignored "-Wformat"
+ #endif
+ 
+ namespace ana {
+ 
+ static void
+ set_wi_attr (xml::element &e,
+ 	     const char *attr_name,
+ 	     const wide_int_ref &w,
+ 	     signop sgn)
+ {
+   pretty_printer pp;
+   pp_wide_int (&pp, w, sgn);
+   e.set_attr (attr_name, pp_formatted_text (&pp));
+ }
+ 
+ static void
+ set_type_attr (xml::element &e, const_tree type)
+ {
+   gcc_assert (type);
+   pretty_printer pp;
+   pp_format_decoder (&pp) = default_tree_printer;
+   pp_printf (&pp, "%T", type);
+   e.set_attr ("type", pp_formatted_text (&pp));
+ }
+ 
+ static void
+ set_bits_attr (xml::element &e,
+ 	       bit_range bits)
+ {
+   pretty_printer pp;
+   bits.dump_to_pp (&pp);
+   e.set_attr ("bits", pp_formatted_text (&pp));
+ }
+ 
+ static void
+ set_region_id_attr (xml::element &e,
+ 		    const region &reg)
+ {
+   e.set_attr ("region_id", std::to_string (reg.get_id ()));
+ }
+ 
+ // class xml_state : public xml::document
+ 
+ xml_state::xml_state (const program_state &state,
+ 		      const extrinsic_state &ext_state)
+ : xml::document (),
+   m_state (state),
+   m_ext_state (ext_state),
+   m_mgr (*ext_state.get_engine ()->get_model_manager ()),
+   m_root (nullptr)
+ {
+   auto root = std::make_unique<xml::element> ("state-diagram", false);
+   m_root = root.get ();
+   add_child (std::move (root));
+ 
+   /* Find pointers to heap-allocated regions, and record their types,
+      so that we have a user-friendly way of showing the memory
+      (by field, rather than by byte offset).  */
+   for (auto cluster_iter : *state.m_region_model->get_store ())
+     for (auto binding_iter : *cluster_iter.second)
+       {
+ 	const svalue *svalue = binding_iter.second;
+ 	if (const region *reg = svalue->maybe_get_region ())
+ 	  if (svalue->get_type () && !reg->get_type ())
+ 	    {
+ 	      tree pointed_to_type = TREE_TYPE (svalue->get_type ());
+ 	      if (!VOID_TYPE_P (pointed_to_type))
+ 		m_types_for_untyped_regions[reg] = pointed_to_type;
+ 	    }
+       }
+ 
+   /* TODO: look for vtable pointers at the top of dynamically-allocated
+      regions and use that type as a fallback.  */
+ 
+   /* Find regions of interest.
+      Create elements per region, and build into hierarchy.
+      Add edges for pointers.  */
+ 
+   /* Create stack, from top to bottom.  */
+   for (int i = state.m_region_model->get_stack_depth () - 1; i >= 0; --i)
+     {
+       const frame_region *reg = state.m_region_model->get_frame_at_index (i);
+       get_or_create_element (*reg);
+     }
+ 
+   /* Create bound memory.  */
+   for (auto iter : *state.m_region_model->get_store ())
+     {
+       const bool create_all = false; // "true" for verbose, for debugging
+       create_elements_for_binding_cluster (*iter.second, create_all);
+     }
+ 
+   /* TODO: Constraints.  */
+ 
+   /* Annotate with information from state machines.  */
+   {
+     int i;
+     sm_state_map *smap;
+     FOR_EACH_VEC_ELT (state.m_checker_states, i, smap)
+       {
+ 	auto &sm = ext_state.get_sm (i);
+ 	for (const auto &iter : *smap)
+ 	  sm.add_state_to_xml (*this, *iter.first, iter.second.m_state);
+ 	if (auto s = smap->get_global_state ())
+ 	  sm.add_global_state_to_xml (*this, s);
+       }
+   }
+ }
+ 
+ xml::element &
+ xml_state::get_or_create_element (const region &reg)
+ {
+   auto existing = m_region_to_element_map.find (&reg);
+   if (existing != m_region_to_element_map.end ())
+     return *existing->second;
+ 
+   auto &e = create_and_add_element (reg);
+   m_region_to_element_map[&reg] = &e;
+   return e;
+ }
+ 
+ xml::element&
+ xml_state::create_and_add_element (const region &reg)
+ {
+   auto e = create_element (reg);
+   xml::element &result = *e;
+   if (auto parent_reg = reg.get_parent_region ())
+     {
+       auto parent_element = &get_or_create_element (*parent_reg);
+       parent_element->add_child (std::move (e));
+     }
+     else
+       m_root->add_child (std::move (e));
+   return result;
+ }
+ 
+ std::unique_ptr<xml::element>
+ xml_state::make_memory_space_element (const char *label)
+ {
+   auto e = std::make_unique<xml::element> ("memory-space", false);
+   e->set_attr ("label", label);
+   return e;
+ }
+ 
+ std::unique_ptr<xml::element>
+ xml_state::create_element (const region &reg)
+ {
+   std::unique_ptr<xml::element> e;
+   switch (reg.get_kind ())
+     {
+     default:
+       gcc_unreachable ();
+ 
+     case RK_FRAME:
+       {
+ 	e = std::make_unique<xml::element> ("stack-frame", false);
+ 	const frame_region &frame_reg
+ 	  = static_cast<const frame_region &> (reg);
+ 	{
+ 	  pretty_printer pp;
+ 	  pp_format_decoder (&pp) = default_tree_printer;
+ 	  pp_printf (&pp, "%E", frame_reg.get_fndecl ());
+ 	  e->set_attr ("function", pp_formatted_text (&pp));
+ 	}
+       }
+       break;
+     case RK_GLOBALS:
+       e = make_memory_space_element ("Globals");
+       break;
+     case RK_CODE:
+       e = make_memory_space_element ("Code");
+       break;
+     case RK_FUNCTION:
+       e = std::make_unique<xml::element> ("function", false);
+       // TODO
+       break;
+     case RK_LABEL:
+       e = std::make_unique<xml::element> ("label", false);
+       // TODO
+       break;
+     case RK_STACK:
+       e = std::make_unique<xml::element> ("stack", false);
+       break;
+     case RK_HEAP:
+       e = make_memory_space_element ("Heap");
+       break;
+     case RK_THREAD_LOCAL:
+       e = make_memory_space_element ("Thread-local");
+       break;
+     case RK_ROOT:
+       e = std::make_unique<xml::element> ("memory-regions", false);
+       break;
+     case RK_SYMBOLIC:
+       e = std::make_unique<xml::element> ("symbolic-region", false);
+       // TODO
+       break;
+     case RK_DECL:
+       {
+ 	e = std::make_unique<xml::element> ("variable", false);
+ 	const decl_region &decl_reg
+ 	  = static_cast<const decl_region &> (reg);
+ 	{
+ 	  pretty_printer pp;
+ 	  pp_format_decoder (&pp) = default_tree_printer;
+ 	  pp_printf (&pp, "%E", decl_reg.get_decl ());
+ 	  e->set_attr ("name", pp_formatted_text (&pp));
+ 	}
+ 	set_type_attr (*e, TREE_TYPE (decl_reg.get_decl ()));
+       }
+       break;
+     case RK_FIELD:
+       e = std::make_unique<xml::element> ("field", false);
+       break;
+     case RK_ELEMENT:
+       e = std::make_unique<xml::element> ("element", false);
+       break;
+     case RK_OFFSET:
+       e = std::make_unique<xml::element> ("offset-region", false);
+       // TODO
+       break;
+     case RK_SIZED:
+       e = std::make_unique<xml::element> ("sized-region", false);
+       // TODO
+       break;
+     case RK_CAST:
+       e = std::make_unique<xml::element> ("cast-region", false);
+       // TODO
+       break;
+     case RK_HEAP_ALLOCATED:
+       e = std::make_unique<xml::element> ("heap-buffer", false);
+       set_attr_for_dynamic_extents (reg, *e);
+       break;
+     case RK_ALLOCA:
+       e = std::make_unique<xml::element> ("alloca-buffer", false);
+       set_attr_for_dynamic_extents (reg, *e);
+       break;
+     case RK_STRING:
+       e = std::make_unique<xml::element> ("string-region", false);
+       // TODO
+       break;
+     case RK_BIT_RANGE:
+       e = std::make_unique<xml::element> ("RK_BIT_RANGE", false); // TODO
+       break;
+     case RK_VAR_ARG:
+       e = std::make_unique<xml::element> ("RK_VAR_ARG", false); // TODO
+       break;
+     case RK_ERRNO:
+       e = std::make_unique<xml::element> ("errno", false);
+       break;
+     case RK_PRIVATE:
+       e = std::make_unique<xml::element> ("RK_PRIVATE", false); // TODO
+       break;
+     case RK_UNKNOWN:
+       e = std::make_unique<xml::element> ("RK_UNKNOWN", false); // TODO
+       break;
+     }
+   gcc_assert (e);
+ 
+   set_region_id_attr (*e, reg);
+ 
+   if (reg.get_base_region () == &reg)
+     if (!reg.get_type ())
+       {
+ 	auto search
+ 	  = m_types_for_untyped_regions.find (&reg);
+ 	if (search != m_types_for_untyped_regions.end ())
+ 	  {
+ 	    tree type_to_use = search->second;
+ 	    set_type_attr (*e, type_to_use);
+ 	  }
+       }
+ 
+   return e;
+ }
+ 
+ void
+ xml_state::create_elements_for_binding_cluster (const binding_cluster &cluster,
+ 						bool create_all)
+ {
+   /* TODO:
+      - symbolic bindings
+      - get current svalue, so as to get "zeros" and "uninitialized".  */
+ 
+   concrete_bindings_t conc_bindings;
+   for (auto iter : cluster)
+     {
+       const binding_key *key = iter.first;
+       const svalue *svalue = iter.second;
+       if (auto conc_key = key->dyn_cast_concrete_binding ())
+ 	conc_bindings[conc_key->get_bit_range ()] = svalue;
+       if (const region *reg = svalue->maybe_get_region ())
+ 	get_or_create_element (*reg);
+     }
+ 
+   auto &e = get_or_create_element (*cluster.get_base_region ());
+ 
+   e.add_child (create_element_for_conc_bindings (conc_bindings));
+ 
+   const region *typed_reg = cluster.get_base_region ();
+   if (!typed_reg->get_type ())
+     {
+       auto search
+ 	= m_types_for_untyped_regions.find (cluster.get_base_region ());
+       if (search != m_types_for_untyped_regions.end ())
+ 	{
+ 	  tree type_to_use = search->second;
+ 	  typed_reg = m_mgr.get_cast_region (typed_reg, type_to_use);
+ 	}
+     }
+ 
+   if (typed_reg->get_type ())
+     populate_element_for_typed_region (e,
+ 				       *typed_reg,
+ 				       conc_bindings,
+ 				       create_all);
+   else
+     {
+       // TODO
+     }
+ }
+ 
+ std::unique_ptr<xml::element>
+ xml_state::create_element_for_conc_bindings (const concrete_bindings_t &conc_bindings)
+ {
+   auto e = std::make_unique<xml::element> ("concrete-bindings", false);
+   for (auto iter : conc_bindings)
+     {
+       const bit_range bits = iter.first;
+       const svalue *sval = iter.second;
+       auto binding_element
+ 	= std::make_unique<xml::element> ("binding", false);
+       set_bits_attr (*binding_element, bits);
+       {
+ 	pretty_printer pp;
+ 	pp_format_decoder (&pp) = default_tree_printer;
+ 	sval->dump_to_pp (&pp, true);
+ 	binding_element->set_attr ("value", pp_formatted_text (&pp));
+ 	if (auto svalue_element = create_element_for_svalue (sval))
+ 	  binding_element->add_child (std::move (svalue_element));
+       }
+       e->add_child (std::move (binding_element));
+     }
+   return e;
+ }
+ 
+ // Try to get the bit_range of REG within its base region
+ bool
+ xml_state::get_bit_range_within_base_region (const region &reg,
+ 					     bit_range &out)
+ {
+   region_offset start_offset = reg.get_offset (&m_mgr);
+   if (!start_offset.concrete_p ())
+     return false;
+   region_offset next_offset = reg.get_next_offset (&m_mgr);
+   if (!next_offset.concrete_p ())
+     return false;
+   out = bit_range (start_offset.get_bit_offset (),
+ 		   next_offset.get_bit_offset ()
+ 		   - start_offset.get_bit_offset ());
+   return true;
+ }
+ 
+ void
+ xml_state::populate_element_for_typed_region (xml::element &e,
+ 					      const region &reg,
+ 					      const concrete_bindings_t &conc_bindings,
+ 					      bool create_all)
+ {
+   const_tree reg_type = reg.get_type ();
+   gcc_assert (reg_type);
+   set_type_attr (e, reg_type);
+ 
+   bit_range bits (0, 0);
+   if (get_bit_range_within_base_region (reg, bits))
+     {
+       set_bits_attr (e, bits);
+ 
+       auto search = conc_bindings.find (bits);
+       if (search != conc_bindings.end ())
+ 	{
+ 	  const svalue *bound_sval = search->second;
+ 	  if (auto svalue_element = create_element_for_svalue (bound_sval))
+ 	    {
+ 	      xml::printer xp (e);
+ 	      xp.push_tag ("value-of-region");
+ 	      xp.append (std::move (svalue_element));
+ 	    }
+ 	}
+     }
+ 
+   switch (TREE_CODE (reg_type))
+     {
+     default:
+       break;
+ 
+     case ARRAY_TYPE:
+       {
+ 	tree domain = TYPE_DOMAIN (reg_type);
+ 	if (!domain)
+ 	  return;
+ 	const_tree max_idx = TYPE_MAX_VALUE (domain);
+ 	if (!max_idx)
+ 	  return;
+ 	if (TREE_CODE (max_idx) != INTEGER_CST)
+ 	  return;
+ 	const_tree min_idx = TYPE_MIN_VALUE (domain);
+ 	if (TREE_CODE (min_idx) != INTEGER_CST)
+ 	  return;
+ 	for (offset_int idx = wi::to_offset (min_idx);
+ 	     idx <= wi::to_offset (max_idx);
+ 	     ++idx)
+ 	  {
+ 	    const_tree element_type = TREE_TYPE (reg_type);
+ 	    const svalue *sval_index
+ 	      = m_mgr.get_or_create_int_cst (domain, idx);
+ 	    const region *child_reg
+ 	      = m_mgr.get_element_region (&reg,
+ 					  const_cast<tree> (element_type),
+ 					  sval_index);
+ 	    if (show_child_element_for_child_region_p (*child_reg,
+ 						       conc_bindings,
+ 						       create_all))
+ 	      {
+ 		// Here "element" is in the xml sense
+ 		auto child_element
+ 		  = std::make_unique<xml::element> ("element", false);
+ 		set_wi_attr (*child_element, "index", idx, UNSIGNED);
+ 		set_region_id_attr (*child_element, *child_reg);
+ 		// Recurse:
+ 		gcc_assert (element_type);
+ 		populate_element_for_typed_region (*child_element,
+ 						   *child_reg,
+ 						   conc_bindings,
+ 						   create_all);
+ 		e.add_child (std::move (child_element));
+ 	      }
+ 	  }
+       }
+       break;
+ 
+     case RECORD_TYPE:
+       {
+ 	const record_layout layout (reg_type);
+ 	for (auto item : layout)
+ 	  {
+ 	    if (item.m_is_padding)
+ 	      {
+ 		const bit_range bits (0, item.m_bit_range.m_size_in_bits);
+ 		const region *child_reg
+ 		  = m_mgr.get_bit_range (&reg, NULL_TREE, bits);
+ 		if (show_child_element_for_child_region_p (*child_reg,
+ 							   conc_bindings,
+ 							   create_all))
+ 		  {
+ 		    auto child_element
+ 		      = std::make_unique<xml::element> ("padding", false);
+ 		    set_wi_attr (*child_element, "num_bits",
+ 				 item.m_bit_range.m_size_in_bits, SIGNED);
+ 		    e.add_child (std::move (child_element));
+ 		  }
+ 	      }
+ 	    else
+ 	      {
+ 		const region *child_reg
+ 		  = m_mgr.get_field_region (&reg,
+ 					    const_cast<tree> (item.m_field));
+ 		if (show_child_element_for_child_region_p (*child_reg,
+ 							   conc_bindings,
+ 							   create_all))
+ 		  {
+ 		    auto child_element
+ 		      = std::make_unique<xml::element> ("field", false);
+ 		    {
+ 		      pretty_printer pp;
+ 		      pp_format_decoder (&pp) = default_tree_printer;
+ 		      pp_printf (&pp, "%D", item.m_field);
+ 		      child_element->set_attr ("name",
+ 					       pp_formatted_text (&pp));
+ 		    }
+ 		    set_region_id_attr (*child_element, *child_reg);
+ 		    // Recurse:
+ 		    populate_element_for_typed_region (*child_element,
+ 						       *child_reg,
+ 						       conc_bindings,
+ 						       create_all);
+ 		    e.add_child (std::move (child_element));
+ 		  }
+ 	      }
+ 	  }
+       }
+       break;
+     }
+ }
+ 
+ void
+ xml_state::set_attr_for_dynamic_extents (const region &reg, xml::element &e)
+ {
+   const svalue *sval = m_state.m_region_model->get_dynamic_extents (&reg);
+   if (sval)
+     {
+       pretty_printer pp;
+       pp_format_decoder (&pp) = default_tree_printer;
+       if (auto cst = sval->maybe_get_constant ())
+ 	pp_wide_int (&pp, wi::to_wide (cst), UNSIGNED);
+       else
+ 	sval->dump_to_pp (&pp, true);
+       e.set_attr ("dynamic-extents", pp_formatted_text (&pp));
+     }
+ }
+ 
+ bool
+ xml_state::
+ show_child_element_for_child_region_p (const region &reg,
+ 				       const concrete_bindings_t &conc_bindings,
+ 				       bool create_all)
+ {
+   if (create_all)
+     return true;
+   bit_range reg_bits (0, 0);
+   if (!get_bit_range_within_base_region (reg, reg_bits))
+     return true;
+ 
+   /* Is any of "bits" bound?
+      TODO: ideally there would be a more efficient way to do this, using
+      spatial relationships.  */
+   for (auto iter : conc_bindings)
+     {
+       const bit_range bound_bits = iter.first;
+       if (bound_bits.intersects_p (reg_bits))
+ 	return true;
+     }
+   return false;
+ }
+ 
+ std::unique_ptr<xml::element>
+ xml_state::create_element_for_svalue (const svalue *sval)
+ {
+   if (!sval)
+     return nullptr;
+ 
+   std::unique_ptr<xml::element> result;
+   switch (sval->get_kind ())
+     {
+     default:
+       gcc_unreachable ();
+     case SK_REGION:
+       {
+ 	const region_svalue *region_sval = (const region_svalue *)sval;
+ 	result
+ 	  = std::make_unique<xml::element> ("pointer-to-region", false);
+ 	set_region_id_attr (*result, *region_sval->get_pointee ());
+       }
+       break;
+     case SK_CONSTANT:
+       {
+ 	const constant_svalue *constant_sval = (const constant_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("constant", false);
+ 	pretty_printer pp;
+ 	pp_format_decoder (&pp) = default_tree_printer;
+ 	pp_printf (&pp, "%E", constant_sval->get_constant ());
+ 	result->set_attr ("value", pp_formatted_text (&pp));
+       }
+       break;
+     case SK_UNKNOWN:
+       result = std::make_unique<xml::element> ("unknown", false);
+       break;
+     case SK_POISONED:
+       {
+ 	const poisoned_svalue *poisoned_sval = (const poisoned_svalue *)sval;
+ 	switch (poisoned_sval->get_poison_kind ())
+ 	  {
+ 	  default:
+ 	    gcc_unreachable ();
+ 	  case poison_kind::uninit:
+ 	    result = std::make_unique<xml::element> ("uninitialized", false);
+ 	    break;
+ 	  case poison_kind::freed:
+ 	    result = std::make_unique<xml::element> ("freed", false);
+ 	    break;
+ 	  case poison_kind::deleted:
+ 	    result = std::make_unique<xml::element> ("deleted", false);
+ 	    break;
+ 	  case poison_kind::popped_stack:
+ 	    result = std::make_unique<xml::element> ("popped-stack", false);
+ 	    break;
+ 	  }
+       }
+       break;
+     case SK_SETJMP:
+       {
+ 	//const setjmp_svalue *setjmp_sval = (const setjmp_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("setjmp-buffer", false);
+ 	// TODO
+       }
+       break;
+     case SK_INITIAL:
+       {
+ 	const initial_svalue *initial_sval = (const initial_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("initial-value-of", false);
+ 	set_region_id_attr (*result, *initial_sval->get_region ());
+       }
+       break;
+     case SK_UNARYOP:
+       {
+ 	const unaryop_svalue *unaryop_sval = (const unaryop_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("unary-op", false);
+ 	result->set_attr ("op", get_tree_code_name (unaryop_sval->get_op ()));
+ 	result->add_child
+ 	  (create_element_for_svalue (unaryop_sval->get_arg ()));
+       }
+       break;
+     case SK_BINOP:
+       {
+ 	const binop_svalue *binop_sval = (const binop_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("binary-op", false);
+ 	result->set_attr ("op", get_tree_code_name (binop_sval->get_op ()));
+ 	result->add_child (create_element_for_svalue (binop_sval->get_arg0 ()));
+ 	result->add_child (create_element_for_svalue (binop_sval->get_arg1 ()));
+       }
+       break;
+     case SK_SUB:
+       {
+ 	//const sub_svalue *sub_sval = (const sub_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("subregion-value", false);
+ 	// TODO
+       }
+       break;
+     case SK_REPEATED:
+       {
+ 	const repeated_svalue *repeated_sval = (const repeated_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("repeated-value", false);
+ 	result->add_child
+ 	  (create_element_for_svalue (repeated_sval->get_outer_size ()));
+ 	result->add_child
+ 	  (create_element_for_svalue (repeated_sval->get_inner_svalue ()));
+       }
+       break;
+     case SK_BITS_WITHIN:
+       {
+ 	const bits_within_svalue *bits_within_sval
+ 	  = (const bits_within_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("bits-within", false);
+ 	set_bits_attr (*result, bits_within_sval->get_bits ());
+ 	result->add_child
+ 	  (create_element_for_svalue (bits_within_sval->get_inner_svalue ()));
+       }
+       break;
+     case SK_UNMERGEABLE:
+       {
+ 	const unmergeable_svalue *unmergeable_sval
+ 	  = (const unmergeable_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("unmergeable", false);
+ 	result->add_child
+ 	  (create_element_for_svalue (unmergeable_sval->get_arg ()));
+       }
+       break;
+     case SK_PLACEHOLDER:
+       {
+ 	const placeholder_svalue *placeholder_sval
+ 	  = (const placeholder_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("placeholder", false);
+ 	result->set_attr ("name", placeholder_sval->get_name ());
+       }
+       break;
+     case SK_WIDENING:
+       {
+ 	//const widening_svalue *widening_sval = (const widening_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("iterating-value", false);
+ 	// TODO
+       }
+       break;
+     case SK_COMPOUND:
+       {
+ 	//const compound_svalue *compound_sval = (const compound_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("compound-value", false);
+ 	// TODO
+       }
+       break;
+     case SK_CONJURED:
+       {
+ 	//const conjured_svalue *conjured_sval = (const conjured_svalue *)sval;
+ 	result = std::make_unique<xml::element> ("conjured-value", false);
+ 	// TODO
+       }
+       break;
+     case SK_ASM_OUTPUT:
+       {
+ 	/* const asm_output_svalue *asm_output_sval
+ 	   = (const asm_output_svalue *)sval; */
+ 	result = std::make_unique<xml::element> ("asm-output", false);
+ 	// TODO
+       }
+       break;
+     case SK_CONST_FN_RESULT:
+       {
+ 	/* const const_fn_result_svalue *const_fn_result_sval
+ 	   = (const const_fn_result_svalue *)sval; */
+ 	result = std::make_unique<xml::element> ("const-fn-result", false);
+ 	// TODO
+       }
+     }
+ 
+   if (result)
+     {
+       if (sval->get_type ())
+ 	set_type_attr (*result, sval->get_type ());
+ 
+       pretty_printer pp;
+       pp_format_decoder (&pp) = default_tree_printer;
+       sval->dump_to_pp (&pp, true);
+       result->set_attr ("dump-text", pp_formatted_text (&pp));
+     }
+ 
+   return result;
+ }
+ 
+ std::unique_ptr<xml::document>
+ program_state::make_xml (const extrinsic_state &ext_state) const
+ {
+   return std::make_unique<xml_state> (*this, ext_state);
+ }
+ 
+ void
+ program_state::dump_xml_to_pp (const extrinsic_state &ext_state,
+ 			       pretty_printer *pp) const
+ {
+   auto doc = make_xml (ext_state);
+   doc->write_as_xml (pp, 0, true);
+ }
+ 
+ void
+ program_state::dump_xml_to_file (const extrinsic_state &ext_state,
+ 				 FILE *outf) const
+ {
+   pretty_printer pp;
+   pp.set_output_stream (outf);
+   dump_xml_to_pp (ext_state, &pp);
+   pp_flush (&pp);
+ }
+ 
+ void
+ program_state::dump_xml (const extrinsic_state &ext_state) const
+ {
+   dump_xml_to_file (ext_state, stderr);
+ }
+ 
+ } // namespace ana
+ 
+ #endif /* #if ENABLE_ANALYZER */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/ana-state-to-diagnostic-state.h gcc-16-20250629/gcc/analyzer/ana-state-to-diagnostic-state.h
*** gcc-16-20250622/gcc/analyzer/ana-state-to-diagnostic-state.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/analyzer/ana-state-to-diagnostic-state.h	Sun Jun 29 22:32:26 2025
***************
*** 0 ****
--- 1,89 ----
+ /* XML documents for dumping state in an easier-to-read form.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #ifndef GCC_ANALYZER_ANA_STATE_TO_XML_STATE_H
+ #define GCC_ANALYZER_ANA_STATE_TO_XML_STATE_H
+ 
+ #include "xml.h"
+ 
+ namespace ana {
+ 
+ class xml_state : public xml::document
+ {
+ public:
+   xml_state (const program_state &state,
+ 	     const extrinsic_state &ext_state);
+ 
+   xml::element &
+   get_or_create_element (const region &reg);
+ 
+ private:
+   xml::element&
+   create_and_add_element (const region &reg);
+ 
+   static std::unique_ptr<xml::element>
+   make_memory_space_element (const char *label);
+ 
+   std::unique_ptr<xml::element>
+   create_element (const region &reg);
+ 
+   /* Spatially sorted concrete bindings.  */
+   typedef std::map<bit_range, const svalue *> concrete_bindings_t;
+ 
+   void
+   create_elements_for_binding_cluster (const binding_cluster &cluster,
+ 				       bool create_all);
+ 
+   std::unique_ptr<xml::element>
+   create_element_for_conc_bindings (const concrete_bindings_t &conc_bindings);
+ 
+   // Try to get the bit_range of REG within its base region
+   bool
+   get_bit_range_within_base_region (const region &reg,
+ 				    bit_range &out);
+ 
+   void
+   populate_element_for_typed_region (xml::element &e,
+ 				     const region &reg,
+ 				     const concrete_bindings_t &conc_bindings,
+ 				     bool create_all);
+ 
+   void
+   set_attr_for_dynamic_extents (const region &reg, xml::element &e);
+ 
+   bool
+   show_child_element_for_child_region_p (const region &reg,
+ 					 const concrete_bindings_t &conc_bindings,
+ 					 bool create_all);
+ 
+   std::unique_ptr<xml::element>
+   create_element_for_svalue (const svalue *sval);
+ 
+   const program_state &m_state;
+   const extrinsic_state &m_ext_state;
+   region_model_manager &m_mgr;
+   xml::element *m_root;
+   std::map<const region *, xml::element *> m_region_to_element_map;
+   std::map<const region *, tree> m_types_for_untyped_regions;
+ };
+ 
+ } // namespace ana
+ 
+ #endif /* GCC_ANALYZER_ANA_STATE_TO_XML_STATE_H */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/checker-event.cc gcc-16-20250629/gcc/analyzer/checker-event.cc
*** gcc-16-20250622/gcc/analyzer/checker-event.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/checker-event.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 28,33 ****
--- 28,34 ----
  #include "inlining-iterator.h"
  #include "tree-logical-location.h"
  #include "diagnostic-format-sarif.h"
+ #include "xml.h"
  
  #include "analyzer/analyzer-logging.h"
  #include "analyzer/sm.h"
*************** event_kind_to_string (enum event_kind ek
*** 106,112 ****
  
  checker_event::checker_event (enum event_kind kind,
  			      const event_loc_info &loc_info)
! : m_kind (kind), m_loc (loc_info.m_loc),
    m_original_fndecl (loc_info.m_fndecl),
    m_effective_fndecl (loc_info.m_fndecl),
    m_original_depth (loc_info.m_depth),
--- 107,114 ----
  
  checker_event::checker_event (enum event_kind kind,
  			      const event_loc_info &loc_info)
! : m_path (nullptr),
!   m_kind (kind), m_loc (loc_info.m_loc),
    m_original_fndecl (loc_info.m_fndecl),
    m_effective_fndecl (loc_info.m_fndecl),
    m_original_depth (loc_info.m_depth),
*************** checker_event::debug () const
*** 211,220 ****
     pertinent data within the sm-state).  */
  
  void
! checker_event::prepare_for_emission (checker_path *,
  				     pending_diagnostic *pd,
  				     diagnostic_event_id_t emission_id)
  {
    m_pending_diagnostic = pd;
    m_emission_id = emission_id;
  
--- 213,223 ----
     pertinent data within the sm-state).  */
  
  void
! checker_event::prepare_for_emission (checker_path *path,
  				     pending_diagnostic *pd,
  				     diagnostic_event_id_t emission_id)
  {
+   m_path = path;
    m_pending_diagnostic = pd;
    m_emission_id = emission_id;
  
*************** checker_event::prepare_for_emission (che
*** 222,227 ****
--- 225,253 ----
    print_desc (*pp.get ());
  }
  
+ std::unique_ptr<xml::document>
+ checker_event::maybe_make_xml_state (bool debug) const
+ {
+   const program_state *state = get_program_state ();
+   if (!state)
+     return nullptr;
+ 
+   gcc_assert (m_path);
+   const extrinsic_state &ext_state = m_path->get_ext_state ();
+ 
+   auto result = state->make_xml (ext_state);
+ 
+   if (debug)
+     {
+       pretty_printer pp;
+       text_art::theme *theme = global_dc->get_diagram_theme ();
+       text_art::dump_to_pp (*state, theme, &pp);
+       result->add_comment (pp_formatted_text (&pp));
+     }
+ 
+   return result;
+ }
+ 
  /* class debug_event : public checker_event.  */
  
  /* Implementation of diagnostic_event::print_desc vfunc for
*************** region_creation_event_debug::print_desc
*** 344,355 ****
  
  /* class function_entry_event : public checker_event.  */
  
! function_entry_event::function_entry_event (const program_point &dst_point)
  : checker_event (event_kind::function_entry,
  		 event_loc_info (dst_point.get_supernode
  				   ()->get_start_location (),
  				 dst_point.get_fndecl (),
! 				 dst_point.get_stack_depth ()))
  {
  }
  
--- 370,383 ----
  
  /* class function_entry_event : public checker_event.  */
  
! function_entry_event::function_entry_event (const program_point &dst_point,
! 					    const program_state &state)
  : checker_event (event_kind::function_entry,
  		 event_loc_info (dst_point.get_supernode
  				   ()->get_start_location (),
  				 dst_point.get_fndecl (),
! 				 dst_point.get_stack_depth ())),
!   m_state (state)
  {
  }
  
*************** superedge_event::should_filter_p (int ve
*** 557,562 ****
--- 585,596 ----
    return false;
  }
  
+ const program_state *
+ superedge_event::get_program_state () const
+ {
+   return &m_eedge.m_dest->get_state ();
+ }
+ 
  /* superedge_event's ctor.  */
  
  superedge_event::superedge_event (enum event_kind kind,
*************** call_event::get_callee_fndecl () const
*** 869,874 ****
--- 903,916 ----
    return m_dest_snode->m_fun->decl;
  }
  
+ const program_state *
+ call_event::get_program_state () const
+ {
+   /* Use the state at the source (at the caller),
+      rather than the one at the dest, which has a frame for the callee.  */
+   return &m_eedge.m_src->get_state ();
+ }
+ 
  /* class return_event : public superedge_event.  */
  
  /* return_event's ctor.  */
*************** warning_event::get_meaning () const
*** 1213,1218 ****
--- 1255,1269 ----
    return meaning (VERB_danger, NOUN_unknown);
  }
  
+ const program_state *
+ warning_event::get_program_state () const
+ {
+   if (m_program_state)
+     return m_program_state.get ();
+   else
+     return &m_enode->get_state ();
+ }
+ 
  } // namespace ana
  
  #endif /* #if ENABLE_ANALYZER */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/checker-event.h gcc-16-20250629/gcc/analyzer/checker-event.h
*** gcc-16-20250622/gcc/analyzer/checker-event.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/checker-event.h	Sun Jun 29 22:32:26 2025
*************** public:
*** 128,133 ****
--- 128,139 ----
    virtual bool is_function_entry_p () const  { return false; }
    virtual bool is_return_p () const  { return false; }
  
+   virtual const program_state *
+   get_program_state () const { return nullptr; }
+ 
+   std::unique_ptr<xml::document>
+   maybe_make_xml_state (bool debug) const final override;
+ 
    /* For use with %@.  */
    const diagnostic_event_id_t *get_id_ptr () const
    {
*************** protected:
*** 144,149 ****
--- 150,156 ----
  		 const event_loc_info &loc_info);
  
   private:
+   const checker_path *m_path;
    const enum event_kind m_kind;
   protected:
    location_t m_loc;
*************** public:
*** 225,230 ****
--- 232,243 ----
  
    void print_desc (pretty_printer &) const final override;
  
+   const program_state *
+   get_program_state () const final override
+   {
+     return &m_dst_state;
+   }
+ 
    const gimple * const m_stmt;
    const program_state m_dst_state;
  };
*************** private:
*** 335,351 ****
  class function_entry_event : public checker_event
  {
  public:
!   function_entry_event (const event_loc_info &loc_info)
!   : checker_event (event_kind::function_entry, loc_info)
    {
    }
  
!   function_entry_event (const program_point &dst_point);
  
    void print_desc (pretty_printer &pp) const override;
    meaning get_meaning () const override;
  
    bool is_function_entry_p () const final override { return true; }
  };
  
  /* Subclass of checker_event describing a state change.  */
--- 348,376 ----
  class function_entry_event : public checker_event
  {
  public:
!   function_entry_event (const event_loc_info &loc_info,
! 			const program_state &state)
!   : checker_event (event_kind::function_entry, loc_info),
!     m_state (state)
    {
    }
  
!   function_entry_event (const program_point &dst_point,
! 			const program_state &state);
  
    void print_desc (pretty_printer &pp) const override;
    meaning get_meaning () const override;
  
    bool is_function_entry_p () const final override { return true; }
+ 
+   const program_state *
+   get_program_state () const final override
+   {
+     return &m_state;
+   }
+ 
+ private:
+   const program_state &m_state;
  };
  
  /* Subclass of checker_event describing a state change.  */
*************** public:
*** 366,371 ****
--- 391,402 ----
    void print_desc (pretty_printer &pp) const final override;
    meaning get_meaning () const override;
  
+   const program_state *
+   get_program_state () const final override
+   {
+     return &m_dst_state;
+   }
+ 
    const function *get_dest_function () const
    {
      return m_dst_state.get_current_function ();
*************** public:
*** 408,413 ****
--- 439,447 ----
  
    bool should_filter_p (int verbosity) const;
  
+   const program_state *
+   get_program_state () const override;
+ 
   protected:
    superedge_event (enum event_kind kind, const exploded_edge &eedge,
  		   const event_loc_info &loc_info);
*************** public:
*** 518,523 ****
--- 552,560 ----
  
    bool is_call_p () const final override;
  
+   const program_state *
+   get_program_state () const final override;
+ 
  protected:
    tree get_caller_fndecl () const;
    tree get_callee_fndecl () const;
*************** public:
*** 792,807 ****
    warning_event (const event_loc_info &loc_info,
  		 const exploded_node *enode,
  		 const state_machine *sm,
! 		 tree var, state_machine::state_t state)
    : checker_event (event_kind::warning, loc_info),
      m_enode (enode),
      m_sm (sm), m_var (var), m_state (state)
    {
    }
  
    void print_desc (pretty_printer &pp) const final override;
    meaning get_meaning () const override;
  
    const exploded_node *get_exploded_node () const { return m_enode; }
  
  private:
--- 829,850 ----
    warning_event (const event_loc_info &loc_info,
  		 const exploded_node *enode,
  		 const state_machine *sm,
! 		 tree var, state_machine::state_t state,
! 		 const program_state *program_state_ = nullptr)
    : checker_event (event_kind::warning, loc_info),
      m_enode (enode),
      m_sm (sm), m_var (var), m_state (state)
    {
+     if (program_state_)
+       m_program_state = std::make_unique<program_state> (*program_state_);
    }
  
    void print_desc (pretty_printer &pp) const final override;
    meaning get_meaning () const override;
  
+   const program_state *
+   get_program_state () const final override;
+ 
    const exploded_node *get_exploded_node () const { return m_enode; }
  
  private:
*************** private:
*** 809,814 ****
--- 852,860 ----
    const state_machine *m_sm;
    tree m_var;
    state_machine::state_t m_state;
+   /* Optional copy of program state, for when this is different from
+      m_enode's state:  */
+   std::unique_ptr<program_state> m_program_state;
  };
  
  } // namespace ana
diff -Nrcpad gcc-16-20250622/gcc/analyzer/checker-path.h gcc-16-20250629/gcc/analyzer/checker-path.h
*** gcc-16-20250622/gcc/analyzer/checker-path.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/checker-path.h	Sun Jun 29 22:32:26 2025
*************** class checker_path : public diagnostic_p
*** 32,39 ****
--- 32,41 ----
  {
  public:
    checker_path (const logical_location_manager &logical_loc_mgr,
+ 		const extrinsic_state &ext_state,
  		logger *logger)
    : diagnostic_path (logical_loc_mgr),
+     m_ext_state (ext_state),
      m_thread ("main"),
      m_logger (logger)
    {}
*************** public:
*** 59,64 ****
--- 61,68 ----
      return m_thread;
    }
  
+   const extrinsic_state &get_ext_state () const { return m_ext_state; }
+ 
    checker_event *get_checker_event (int idx)
    {
      return m_events[idx];
*************** public:
*** 140,145 ****
--- 144,151 ----
  private:
    DISABLE_COPY_AND_ASSIGN(checker_path);
  
+   const extrinsic_state &m_ext_state;
+ 
    simple_diagnostic_thread m_thread;
  
    /* The events that have occurred along this path.  */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/common.h gcc-16-20250629/gcc/analyzer/common.h
*** gcc-16-20250622/gcc/analyzer/common.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/common.h	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 22,27 ****
--- 22,29 ----
  #define GCC_ANALYZER_COMMON_H
  
  #include "config.h"
+ #define INCLUDE_MAP
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
diff -Nrcpad gcc-16-20250622/gcc/analyzer/diagnostic-manager.cc gcc-16-20250629/gcc/analyzer/diagnostic-manager.cc
*** gcc-16-20250622/gcc/analyzer/diagnostic-manager.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/diagnostic-manager.cc	Sun Jun 29 22:32:26 2025
*************** saved_diagnostic::operator== (const save
*** 687,692 ****
--- 687,697 ----
    for (unsigned i = 0; i < m_notes.length (); i++)
      if (!m_notes[i]->equal_p (*other.m_notes[i]))
        return false;
+ 
+   // Don't deduplicate dump_path_diagnostic instances
+   if (!strcmp (m_d->get_kind (), "dump_path_diagnostic"))
+     return this == &other;
+ 
    return (m_sm == other.m_sm
  	  /* We don't compare m_enode.  */
  	  && m_snode == other.m_snode
*************** diagnostic_manager::emit_saved_diagnosti
*** 1581,1586 ****
--- 1586,1592 ----
    /* This is the diagnostic_path subclass that will be built for
       the diagnostic.  */
    checker_path emission_path (get_logical_location_manager (),
+ 			      eg.get_ext_state (),
  			      get_logger ());
  
    /* Populate emission_path with a full description of EPATH.  */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/engine.cc gcc-16-20250629/gcc/analyzer/engine.cc
*** gcc-16-20250622/gcc/analyzer/engine.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/engine.cc	Sun Jun 29 22:32:26 2025
*************** impl_region_model_context::on_state_leak
*** 925,931 ****
      }
  
    tree leaked_tree_for_diag = fixup_tree_for_diagnostic (leaked_tree);
!   std::unique_ptr<pending_diagnostic> pd = sm.on_leak (leaked_tree_for_diag);
    if (pd)
      {
        pending_location ploc (m_enode_for_diag,
--- 925,933 ----
      }
  
    tree leaked_tree_for_diag = fixup_tree_for_diagnostic (leaked_tree);
!   std::unique_ptr<pending_diagnostic> pd = sm.on_leak (leaked_tree_for_diag,
! 						       m_old_state,
! 						       m_new_state);
    if (pd)
      {
        pending_location ploc (m_enode_for_diag,
*************** exploded_node::on_stmt_pre (exploded_gra
*** 1578,1583 ****
--- 1580,1595 ----
  	  state->dump (eg.get_ext_state (), true);
  	  return;
  	}
+       else if (is_special_named_call_p (call, "__analyzer_dump_xml", 0))
+ 	{
+ 	  state->dump_xml (eg.get_ext_state ());
+ 	  return;
+ 	}
+       else if (is_special_named_call_p (call, "__analyzer_dump_dot", 0))
+ 	{
+ 	  state->dump_dot (eg.get_ext_state ());
+ 	  return;
+ 	}
        else if (is_special_named_call_p (call, "__analyzer_dump_state", 2))
  	{
  	  state->impl_call_analyzer_dump_state (call, eg.get_ext_state (),
diff -Nrcpad gcc-16-20250622/gcc/analyzer/exploded-graph.h gcc-16-20250629/gcc/analyzer/exploded-graph.h
*** gcc-16-20250622/gcc/analyzer/exploded-graph.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/exploded-graph.h	Sun Jun 29 22:32:26 2025
*************** class impl_region_model_context : public
*** 112,117 ****
--- 112,119 ----
    const gimple *get_stmt () const override { return m_stmt; }
    const exploded_graph *get_eg () const override { return m_eg; }
  
+   const program_state *get_state () const override { return m_new_state; }
+ 
    void maybe_did_work () override;
    bool checking_for_infinite_loop_p () const override { return false; }
    void on_unusable_in_infinite_loop () override {}
diff -Nrcpad gcc-16-20250622/gcc/analyzer/infinite-recursion.cc gcc-16-20250629/gcc/analyzer/infinite-recursion.cc
*** gcc-16-20250622/gcc/analyzer/infinite-recursion.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/infinite-recursion.cc	Sun Jun 29 22:32:26 2025
*************** public:
*** 108,116 ****
      {
      public:
        recursive_function_entry_event (const program_point &dst_point,
  				      const infinite_recursion_diagnostic &pd,
  				      bool topmost)
!       : function_entry_event (dst_point),
  	m_pd (pd),
  	m_topmost (topmost)
        {
--- 108,117 ----
      {
      public:
        recursive_function_entry_event (const program_point &dst_point,
+ 				      const program_state &dst_state,
  				      const infinite_recursion_diagnostic &pd,
  				      bool topmost)
!       : function_entry_event (dst_point, dst_state),
  	m_pd (pd),
  	m_topmost (topmost)
        {
*************** public:
*** 148,162 ****
        {
  	gcc_assert (m_prev_entry_event == NULL);
  	std::unique_ptr<checker_event> prev_entry_event
! 	  = std::make_unique <recursive_function_entry_event> (dst_point,
! 							       *this, false);
  	m_prev_entry_event = prev_entry_event.get ();
  	emission_path->add_event (std::move (prev_entry_event));
        }
      else if (eedge.m_dest == m_new_entry_enode)
        emission_path->add_event
  	(std::make_unique<recursive_function_entry_event>
! 	   (dst_point, *this, true));
      else
        pending_diagnostic::add_function_entry_event (eedge, emission_path);
    }
--- 149,165 ----
        {
  	gcc_assert (m_prev_entry_event == NULL);
  	std::unique_ptr<checker_event> prev_entry_event
! 	  = std::make_unique <recursive_function_entry_event>
! 	      (dst_point,
! 	       dst_node->get_state (),
! 	       *this, false);
  	m_prev_entry_event = prev_entry_event.get ();
  	emission_path->add_event (std::move (prev_entry_event));
        }
      else if (eedge.m_dest == m_new_entry_enode)
        emission_path->add_event
  	(std::make_unique<recursive_function_entry_event>
! 	 (dst_point, dst_node->get_state (), *this, true));
      else
        pending_diagnostic::add_function_entry_event (eedge, emission_path);
    }
diff -Nrcpad gcc-16-20250622/gcc/analyzer/kf-analyzer.cc gcc-16-20250629/gcc/analyzer/kf-analyzer.cc
*** gcc-16-20250622/gcc/analyzer/kf-analyzer.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/kf-analyzer.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 28,33 ****
--- 28,34 ----
  #include "analyzer/region-model.h"
  #include "analyzer/pending-diagnostic.h"
  #include "analyzer/call-details.h"
+ #include "analyzer/program-state.h"
  
  #if ENABLE_ANALYZER
  
*************** class dump_path_diagnostic
*** 260,265 ****
--- 261,271 ----
    : public pending_diagnostic_subclass<dump_path_diagnostic>
  {
  public:
+   dump_path_diagnostic (const program_state &state)
+   : m_state (state)
+   {
+   }
+ 
    int get_controlling_option () const final override
    {
      return 0;
*************** public:
*** 280,285 ****
--- 286,300 ----
    {
      return true;
    }
+ 
+   const program_state *
+   get_final_state () const final override
+   {
+     return &m_state;
+   }
+ 
+ private:
+   program_state m_state;
  };
  
  /* Handle calls to "__analyzer_dump_path" by queuing a diagnostic at this
*************** public:
*** 297,303 ****
      region_model_context *ctxt = cd.get_ctxt ();
      if (!ctxt)
        return;
!     ctxt->warn (std::make_unique<dump_path_diagnostic> ());
    }
  };
  
--- 312,319 ----
      region_model_context *ctxt = cd.get_ctxt ();
      if (!ctxt)
        return;
!     if (const program_state *state = ctxt->get_state ())
!       ctxt->warn (std::make_unique<dump_path_diagnostic> (*state));
    }
  };
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/pending-diagnostic.cc gcc-16-20250629/gcc/analyzer/pending-diagnostic.cc
*** gcc-16-20250622/gcc/analyzer/pending-diagnostic.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/pending-diagnostic.cc	Sun Jun 29 22:32:26 2025
*************** pending_diagnostic::add_function_entry_e
*** 185,191 ****
  {
    const exploded_node *dst_node = eedge.m_dest;
    const program_point &dst_point = dst_node->get_point ();
!   emission_path->add_event (std::make_unique<function_entry_event> (dst_point));
  }
  
  /* Base implementation of pending_diagnostic::add_call_event.
--- 185,194 ----
  {
    const exploded_node *dst_node = eedge.m_dest;
    const program_point &dst_point = dst_node->get_point ();
!   const program_state &dst_state = dst_node->get_state ();
!   emission_path->add_event
!     (std::make_unique<function_entry_event> (dst_point,
! 					     dst_state));
  }
  
  /* Base implementation of pending_diagnostic::add_call_event.
*************** pending_diagnostic::add_final_event (con
*** 241,247 ****
      (std::make_unique<warning_event>
       (loc_info,
        enode,
!       sm, var, state));
  }
  
  } // namespace ana
--- 244,251 ----
      (std::make_unique<warning_event>
       (loc_info,
        enode,
!       sm, var, state,
!       get_final_state ()));
  }
  
  } // namespace ana
diff -Nrcpad gcc-16-20250622/gcc/analyzer/pending-diagnostic.h gcc-16-20250629/gcc/analyzer/pending-diagnostic.h
*** gcc-16-20250622/gcc/analyzer/pending-diagnostic.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/pending-diagnostic.h	Sun Jun 29 22:32:26 2025
*************** class pending_diagnostic
*** 364,369 ****
--- 364,375 ----
  				tree var, state_machine::state_t state,
  				checker_path *emission_path);
  
+   virtual const program_state *
+   get_final_state () const
+   {
+     return nullptr;
+   }
+ 
    /* Vfunc for determining that this pending_diagnostic supercedes OTHER,
       and that OTHER should therefore not be emitted.
       They have already been tested for being at the same stmt.  */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/program-state.cc gcc-16-20250629/gcc/analyzer/program-state.cc
*** gcc-16-20250622/gcc/analyzer/program-state.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/program-state.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 28,33 ****
--- 28,35 ----
  #include "cgraph.h"
  #include "digraph.h"
  #include "diagnostic-event-id.h"
+ #include "diagnostic-state.h"
+ #include "graphviz.h"
  
  #include "text-art/tree-widget.h"
  #include "text-art/dump.h"
*************** along with GCC; see the file COPYING3.
*** 48,53 ****
--- 50,56 ----
  #include "analyzer/state-purge.h"
  #include "analyzer/call-summary.h"
  #include "analyzer/analyzer-selftests.h"
+ #include "analyzer/ana-state-to-diagnostic-state.h"
  
  #if ENABLE_ANALYZER
  
*************** program_state::make_dump_widget (const t
*** 1224,1229 ****
--- 1227,1244 ----
    return state_widget;
  }
  
+ void
+ program_state::dump_dot (const extrinsic_state &ext_state) const
+ {
+   auto doc = make_xml (ext_state);
+   auto graph = make_dot_graph_from_xml_state (*doc);
+ 
+   pretty_printer pp;
+   dot::writer w (pp);
+   graph->print (w);
+   pp_flush (&pp);
+ }
+ 
  /* Update this program_state to reflect a top-level call to FUN.
     The params will have initial_svalues.  */
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/program-state.h gcc-16-20250629/gcc/analyzer/program-state.h
*** gcc-16-20250622/gcc/analyzer/program-state.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/program-state.h	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 22,27 ****
--- 22,32 ----
  #define GCC_ANALYZER_PROGRAM_STATE_H
  
  #include "text-art/widget.h"
+ #include "text-art/tree-widget.h"
+ 
+ #include "analyzer/store.h"
+ 
+ namespace xml { class document; }
  
  namespace ana {
  
*************** public:
*** 243,248 ****
--- 248,259 ----
    void dump (const extrinsic_state &ext_state, bool simple) const;
    void dump () const;
  
+   std::unique_ptr<xml::document> make_xml (const extrinsic_state &ext_state) const;
+   void dump_xml_to_pp (const extrinsic_state &ext_state, pretty_printer *pp) const;
+   void dump_xml_to_file (const extrinsic_state &ext_state, FILE *outf) const;
+   void dump_xml (const extrinsic_state &ext_state) const;
+   void dump_dot (const extrinsic_state &ext_state) const;
+ 
    std::unique_ptr<json::object>
    to_json (const extrinsic_state &ext_state) const;
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/record-layout.cc gcc-16-20250629/gcc/analyzer/record-layout.cc
*** gcc-16-20250622/gcc/analyzer/record-layout.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/record-layout.cc	Sun Jun 29 22:32:26 2025
*************** namespace ana {
*** 30,36 ****
  
  /* class record_layout.  */
  
! record_layout::record_layout (tree record_type)
  {
    gcc_assert (TREE_CODE (record_type) == RECORD_TYPE);
  
--- 30,36 ----
  
  /* class record_layout.  */
  
! record_layout::record_layout (const_tree record_type)
  {
    gcc_assert (TREE_CODE (record_type) == RECORD_TYPE);
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/record-layout.h gcc-16-20250629/gcc/analyzer/record-layout.h
*** gcc-16-20250622/gcc/analyzer/record-layout.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/record-layout.h	Sun Jun 29 22:32:26 2025
*************** public:
*** 36,42 ****
    {
    public:
      item (const bit_range &br,
! 	  tree field,
  	  bool is_padding)
      : m_bit_range (br),
        m_field (field),
--- 36,42 ----
    {
    public:
      item (const bit_range &br,
! 	  const_tree field,
  	  bool is_padding)
      : m_bit_range (br),
        m_field (field),
*************** public:
*** 69,85 ****
      }
  
      bit_range m_bit_range;
!     tree m_field;
      bool m_is_padding;
    };
  
!   record_layout (tree record_type);
  
    void dump_to_pp (pretty_printer *pp) const;
    DEBUG_FUNCTION void dump () const;
  
    const record_layout::item *get_item_at (bit_offset_t offset) const;
  
  private:
    void maybe_pad_to (bit_offset_t next_offset);
  
--- 69,88 ----
      }
  
      bit_range m_bit_range;
!     const_tree m_field;
      bool m_is_padding;
    };
  
!   record_layout (const_tree record_type);
  
    void dump_to_pp (pretty_printer *pp) const;
    DEBUG_FUNCTION void dump () const;
  
    const record_layout::item *get_item_at (bit_offset_t offset) const;
  
+   auto begin () const { return m_items.begin (); }
+   auto end () const { return m_items.end (); }
+ 
  private:
    void maybe_pad_to (bit_offset_t next_offset);
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/region-model.cc gcc-16-20250629/gcc/analyzer/region-model.cc
*** gcc-16-20250622/gcc/analyzer/region-model.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/region-model.cc	Sun Jun 29 22:32:26 2025
*************** public:
*** 2090,2096 ****
    {
    }
  
!   void print (pretty_printer *pp) const
    {
      if (m_fndecl)
        pp_printf (pp, "if %qD throws an exception...", m_fndecl);
--- 2090,2096 ----
    {
    }
  
!   void print (pretty_printer *pp) const final override
    {
      if (m_fndecl)
        pp_printf (pp, "if %qD throws an exception...", m_fndecl);
*************** private:
*** 7798,7804 ****
    static void
    complain_about_fully_uninit_item (const record_layout::item &item)
    {
!     tree field = item.m_field;
      bit_size_t num_bits = item.m_bit_range.m_size_in_bits;
      if (item.m_is_padding)
        {
--- 7798,7804 ----
    static void
    complain_about_fully_uninit_item (const record_layout::item &item)
    {
!     const_tree field = item.m_field;
      bit_size_t num_bits = item.m_bit_range.m_size_in_bits;
      if (item.m_is_padding)
        {
*************** private:
*** 7859,7865 ****
    static void
    complain_about_partially_uninit_item (const record_layout::item &item)
    {
!     tree field = item.m_field;
      if (item.m_is_padding)
        inform (DECL_SOURCE_LOCATION (field),
  	      "padding after field %qD is partially uninitialized",
--- 7859,7865 ----
    static void
    complain_about_partially_uninit_item (const record_layout::item &item)
    {
!     const_tree field = item.m_field;
      if (item.m_is_padding)
        inform (DECL_SOURCE_LOCATION (field),
  	      "padding after field %qD is partially uninitialized",
diff -Nrcpad gcc-16-20250622/gcc/analyzer/region-model.h gcc-16-20250629/gcc/analyzer/region-model.h
*** gcc-16-20250622/gcc/analyzer/region-model.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/region-model.h	Sun Jun 29 22:32:26 2025
*************** class region_model_context
*** 928,933 ****
--- 928,935 ----
  
    virtual const exploded_graph *get_eg () const = 0;
  
+   virtual const program_state *get_state () const = 0;
+ 
    /* Hooks for detecting infinite loops.  */
    virtual void maybe_did_work () = 0;
    virtual bool checking_for_infinite_loop_p () const = 0;
*************** public:
*** 989,994 ****
--- 991,998 ----
  
    const gimple *get_stmt () const override { return NULL; }
    const exploded_graph *get_eg () const override { return NULL; }
+   const program_state *get_state () const override { return nullptr; }
+ 
    void maybe_did_work () override {}
    bool checking_for_infinite_loop_p () const override { return false; }
    void on_unusable_in_infinite_loop () override {}
*************** class region_model_context_decorator : p
*** 1167,1172 ****
--- 1171,1184 ----
  	return nullptr;
    }
  
+   const program_state *get_state () const override
+   {
+     if (m_inner)
+       return m_inner->get_state ();
+     else
+       return nullptr;
+   }
+ 
    void maybe_did_work () override
    {
      if (m_inner)
diff -Nrcpad gcc-16-20250622/gcc/analyzer/sm-fd.cc gcc-16-20250629/gcc/analyzer/sm-fd.cc
*** gcc-16-20250622/gcc/analyzer/sm-fd.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/sm-fd.cc	Sun Jun 29 22:32:26 2025
*************** public:
*** 116,122 ****
  		     const svalue *rhs) const final override;
  
    bool can_purge_p (state_t s) const final override;
!   std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
  
    bool is_unchecked_fd_p (state_t s) const;
    bool is_valid_fd_p (state_t s) const;
--- 116,126 ----
  		     const svalue *rhs) const final override;
  
    bool can_purge_p (state_t s) const final override;
! 
!   std::unique_ptr<pending_diagnostic>
!   on_leak (tree var,
! 	   const program_state *old_state,
! 	   const program_state *new_state) const final override;
  
    bool is_unchecked_fd_p (state_t s) const;
    bool is_valid_fd_p (state_t s) const;
*************** protected:
*** 477,483 ****
  class fd_leak : public fd_diagnostic
  {
  public:
!   fd_leak (const fd_state_machine &sm, tree arg) : fd_diagnostic (sm, arg) {}
  
    const char *
    get_kind () const final override
--- 481,494 ----
  class fd_leak : public fd_diagnostic
  {
  public:
!   fd_leak (const fd_state_machine &sm, tree arg,
! 	   const program_state *final_state)
!   : fd_diagnostic (sm, arg),
!     m_final_state ()
!   {
!     if (final_state)
!       m_final_state = std::make_unique<program_state> (*final_state);
!   }
  
    const char *
    get_kind () const final override
*************** public:
*** 543,550 ****
--- 554,568 ----
      return true;
    }
  
+   const program_state *
+   get_final_state () const final override
+   {
+     return m_final_state.get ();
+   }
+ 
  private:
    diagnostic_event_id_t m_open_event;
+   std::unique_ptr<program_state> m_final_state;
  };
  
  class fd_access_mode_mismatch : public fd_param_diagnostic
*************** fd_state_machine::on_open (sm_context &s
*** 1528,1534 ****
    else
      {
        sm_ctxt.warn (node, stmt, NULL_TREE,
! 		    std::make_unique<fd_leak> (*this, NULL_TREE));
      }
  }
  
--- 1546,1552 ----
    else
      {
        sm_ctxt.warn (node, stmt, NULL_TREE,
! 		    std::make_unique<fd_leak> (*this, NULL_TREE, nullptr));
      }
  }
  
*************** fd_state_machine::on_creat (sm_context &
*** 1541,1547 ****
      sm_ctxt.on_transition (node, stmt, lhs, m_start, m_unchecked_write_only);
    else
      sm_ctxt.warn (node, stmt, NULL_TREE,
! 		  std::make_unique<fd_leak> (*this, NULL_TREE));
  }
  
  void
--- 1559,1565 ----
      sm_ctxt.on_transition (node, stmt, lhs, m_start, m_unchecked_write_only);
    else
      sm_ctxt.warn (node, stmt, NULL_TREE,
! 		  std::make_unique<fd_leak> (*this, NULL_TREE, nullptr));
  }
  
  void
*************** fd_state_machine::on_socket (const call_
*** 1792,1798 ****
  	}
        else
  	sm_ctxt.warn (node, &call, NULL_TREE,
! 		      std::make_unique<fd_leak> (*this, NULL_TREE));
      }
    else
      {
--- 1810,1816 ----
  	}
        else
  	sm_ctxt.warn (node, &call, NULL_TREE,
! 		      std::make_unique<fd_leak> (*this, NULL_TREE, nullptr));
      }
    else
      {
*************** fd_state_machine::on_accept (const call_
*** 2185,2191 ****
  	}
        else
  	sm_ctxt.warn (node, &call, NULL_TREE,
! 		      std::make_unique<fd_leak> (*this, NULL_TREE));
      }
    else
      {
--- 2203,2209 ----
  	}
        else
  	sm_ctxt.warn (node, &call, NULL_TREE,
! 		      std::make_unique<fd_leak> (*this, NULL_TREE, nullptr));
      }
    else
      {
*************** fd_state_machine::can_purge_p (state_t s
*** 2321,2329 ****
  }
  
  std::unique_ptr<pending_diagnostic>
! fd_state_machine::on_leak (tree var) const
  {
!   return std::make_unique<fd_leak> (*this, var);
  }
  } // namespace
  
--- 2339,2349 ----
  }
  
  std::unique_ptr<pending_diagnostic>
! fd_state_machine::on_leak (tree var,
! 			   const program_state *,
! 			   const program_state *new_state) const
  {
!   return std::make_unique<fd_leak> (*this, var, new_state);
  }
  } // namespace
  
diff -Nrcpad gcc-16-20250622/gcc/analyzer/sm-file.cc gcc-16-20250629/gcc/analyzer/sm-file.cc
*** gcc-16-20250622/gcc/analyzer/sm-file.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/sm-file.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 30,35 ****
--- 30,36 ----
  #include "analyzer/analyzer-selftests.h"
  #include "analyzer/call-string.h"
  #include "analyzer/program-point.h"
+ #include "analyzer/program-state.h"
  #include "analyzer/store.h"
  #include "analyzer/region-model.h"
  #include "analyzer/call-details.h"
*************** public:
*** 72,78 ****
  		     const svalue *rhs) const final override;
  
    bool can_purge_p (state_t s) const final override;
!   std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
  
    /* State for a FILE * returned from fopen that hasn't been checked for
       NULL.
--- 73,83 ----
  		     const svalue *rhs) const final override;
  
    bool can_purge_p (state_t s) const final override;
! 
!   std::unique_ptr<pending_diagnostic>
!   on_leak (tree var,
! 	   const program_state *old_state,
! 	   const program_state *new_state) const final override;
  
    /* State for a FILE * returned from fopen that hasn't been checked for
       NULL.
*************** private:
*** 226,234 ****
  class file_leak : public file_diagnostic
  {
  public:
!   file_leak (const fileptr_state_machine &sm, tree arg)
!     : file_diagnostic (sm, arg)
!   {}
  
    const char *get_kind () const final override { return "file_leak"; }
  
--- 231,244 ----
  class file_leak : public file_diagnostic
  {
  public:
!   file_leak (const fileptr_state_machine &sm, tree arg,
! 	     const program_state *final_state)
!   : file_diagnostic (sm, arg),
!     m_final_state ()
!   {
!     if (final_state)
!       m_final_state = std::make_unique<program_state> (*final_state);
!   }
  
    const char *get_kind () const final override { return "file_leak"; }
  
*************** public:
*** 286,293 ****
--- 296,310 ----
      return true;
    }
  
+   const program_state *
+   get_final_state () const final override
+   {
+     return m_final_state.get ();
+   }
+ 
  private:
    diagnostic_event_id_t m_fopen_event;
+   std::unique_ptr<program_state> m_final_state;
  };
  
  /* fileptr_state_machine's ctor.  */
*************** fileptr_state_machine::can_purge_p (stat
*** 492,500 ****
     state 'unchecked' and 'nonnull'.  */
  
  std::unique_ptr<pending_diagnostic>
! fileptr_state_machine::on_leak (tree var) const
  {
!   return std::make_unique<file_leak> (*this, var);
  }
  
  } // anonymous namespace
--- 509,519 ----
     state 'unchecked' and 'nonnull'.  */
  
  std::unique_ptr<pending_diagnostic>
! fileptr_state_machine::on_leak (tree var,
! 				const program_state *,
! 				const program_state *new_state) const
  {
!   return std::make_unique<file_leak> (*this, var, new_state);
  }
  
  } // anonymous namespace
diff -Nrcpad gcc-16-20250622/gcc/analyzer/sm-malloc.cc gcc-16-20250629/gcc/analyzer/sm-malloc.cc
*** gcc-16-20250622/gcc/analyzer/sm-malloc.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/sm-malloc.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 23,28 ****
--- 23,29 ----
  #include "diagnostic-event-id.h"
  #include "stringpool.h"
  #include "attribs.h"
+ #include "xml-printer.h"
  
  #include "analyzer/analyzer-logging.h"
  #include "analyzer/sm.h"
*************** along with GCC; see the file COPYING3.
*** 37,42 ****
--- 38,44 ----
  #include "analyzer/checker-event.h"
  #include "analyzer/exploded-graph.h"
  #include "analyzer/inlining-iterator.h"
+ #include "analyzer/ana-state-to-diagnostic-state.h"
  
  #if ENABLE_ANALYZER
  
*************** public:
*** 403,409 ****
  		     const frame_region *) const final override;
  
    bool can_purge_p (state_t s) const final override;
!   std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
  
    bool reset_when_passed_to_unknown_fn_p (state_t s,
  					  bool is_mutable) const final override;
--- 405,415 ----
  		     const frame_region *) const final override;
  
    bool can_purge_p (state_t s) const final override;
! 
!   std::unique_ptr<pending_diagnostic>
!   on_leak (tree var,
! 	   const program_state *old_state,
! 	   const program_state *new_state) const final override;
  
    bool reset_when_passed_to_unknown_fn_p (state_t s,
  					  bool is_mutable) const final override;
*************** public:
*** 429,434 ****
--- 435,445 ----
        const svalue *new_ptr_sval,
        const extrinsic_state &ext_state) const;
  
+   void
+   add_state_to_xml (xml_state &out_xml,
+ 		    const svalue &sval,
+ 		    state_machine::state_t state) const final override;
+ 
    standard_deallocator_set m_free;
    standard_deallocator_set m_scalar_delete;
    standard_deallocator_set m_vector_delete;
*************** private:
*** 1414,1421 ****
  class malloc_leak : public malloc_diagnostic
  {
  public:
!   malloc_leak (const malloc_state_machine &sm, tree arg)
!   : malloc_diagnostic (sm, arg) {}
  
    const char *get_kind () const final override { return "malloc_leak"; }
  
--- 1425,1438 ----
  class malloc_leak : public malloc_diagnostic
  {
  public:
!   malloc_leak (const malloc_state_machine &sm, tree arg,
! 	       const program_state *final_state)
!   : malloc_diagnostic (sm, arg),
!     m_final_state ()
!   {
!     if (final_state)
!       m_final_state = std::make_unique<program_state> (*final_state);
!   }
  
    const char *get_kind () const final override { return "malloc_leak"; }
  
*************** public:
*** 1475,1482 ****
--- 1492,1506 ----
      return true;
    }
  
+   const program_state *
+   get_final_state () const final override
+   {
+     return m_final_state.get ();
+   }
+ 
  private:
    diagnostic_event_id_t m_alloc_event;
+   std::unique_ptr<program_state> m_final_state;
  };
  
  class free_of_non_heap : public malloc_diagnostic
*************** malloc_state_machine::can_purge_p (state
*** 2589,2597 ****
     'nonnull').  */
  
  std::unique_ptr<pending_diagnostic>
! malloc_state_machine::on_leak (tree var) const
  {
!   return std::make_unique<malloc_leak> (*this, var);
  }
  
  /* Implementation of state_machine::reset_when_passed_to_unknown_fn_p vfunc
--- 2613,2623 ----
     'nonnull').  */
  
  std::unique_ptr<pending_diagnostic>
! malloc_state_machine::on_leak (tree var,
! 			       const program_state *,
! 			       const program_state *new_state) const
  {
!   return std::make_unique<malloc_leak> (*this, var, new_state);
  }
  
  /* Implementation of state_machine::reset_when_passed_to_unknown_fn_p vfunc
*************** malloc_state_machine::transition_ptr_sva
*** 2700,2705 ****
--- 2726,2755 ----
    smap->set_state (model, new_ptr_sval, m_free.m_nonnull, NULL, ext_state);
  }
  
+ void
+ malloc_state_machine::add_state_to_xml (xml_state &out_xml,
+ 					const svalue &sval,
+ 					state_machine::state_t state) const
+ {
+   if (const region *reg = sval.maybe_get_region ())
+     {
+       auto &reg_element = out_xml.get_or_create_element (*reg);
+       auto alloc_state = as_a_allocation_state (state);
+       gcc_assert (alloc_state);
+ 
+       reg_element.set_attr ("dynamic-alloc-state", state->get_name ());
+       if (alloc_state->m_deallocators)
+ 	{
+ 	  pretty_printer pp;
+ 	  alloc_state->m_deallocators->dump_to_pp (&pp);
+ 	  reg_element.set_attr ("expected-deallocators", pp_formatted_text (&pp));
+ 	}
+       if (alloc_state->m_deallocator)
+ 	reg_element.set_attr ("deallocator",
+ 			      alloc_state->m_deallocator->m_name);
+     }
+ }
+ 
  } // anonymous namespace
  
  /* Internal interface to this file. */
diff -Nrcpad gcc-16-20250622/gcc/analyzer/sm.cc gcc-16-20250629/gcc/analyzer/sm.cc
*** gcc-16-20250622/gcc/analyzer/sm.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/sm.cc	Sun Jun 29 22:32:26 2025
*************** state_machine::get_state_by_name (const
*** 116,124 ****
  /* Base implementation of state_machine::on_leak.  */
  
  std::unique_ptr<pending_diagnostic>
! state_machine::on_leak (tree var ATTRIBUTE_UNUSED) const
  {
!   return NULL;
  }
  
  /* Dump a multiline representation of this state machine to PP.  */
--- 116,126 ----
  /* Base implementation of state_machine::on_leak.  */
  
  std::unique_ptr<pending_diagnostic>
! state_machine::on_leak (tree var ATTRIBUTE_UNUSED,
! 			const program_state *old_state ATTRIBUTE_UNUSED,
! 			const program_state *new_state ATTRIBUTE_UNUSED) const
  {
!   return nullptr;
  }
  
  /* Dump a multiline representation of this state machine to PP.  */
*************** state_machine::to_json () const
*** 158,163 ****
--- 160,180 ----
    return sm_obj;
  }
  
+ void
+ state_machine::add_state_to_xml (xml_state &out_xml,
+ 				 const svalue &sval,
+ 				 state_machine::state_t state) const
+ {
+   // no-op
+ }
+ 
+ void
+ state_machine::add_global_state_to_xml (xml_state &out_xml,
+ 					state_machine::state_t state) const
+ {
+   // no-op
+ }
+ 
  /* class sm_context.  */
  
  const region_model *
diff -Nrcpad gcc-16-20250622/gcc/analyzer/sm.h gcc-16-20250629/gcc/analyzer/sm.h
*** gcc-16-20250622/gcc/analyzer/sm.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/sm.h	Sun Jun 29 22:32:26 2025
*************** namespace ana {
*** 28,33 ****
--- 28,34 ----
  class state_machine;
  class sm_context;
  class pending_diagnostic;
+ class xml_state;
  
  extern bool any_pointer_p (tree expr);
  extern bool any_pointer_p (const svalue *sval);
*************** public:
*** 136,142 ****
  
    /* Called when VAR leaks (and !can_purge_p).  */
    virtual std::unique_ptr<pending_diagnostic>
!   on_leak (tree var ATTRIBUTE_UNUSED) const;
  
    /* Return true if S should be reset to "start" for values passed (or reachable
       from) calls to unknown functions.  IS_MUTABLE is true for pointers as
--- 137,145 ----
  
    /* Called when VAR leaks (and !can_purge_p).  */
    virtual std::unique_ptr<pending_diagnostic>
!   on_leak (tree var ATTRIBUTE_UNUSED,
! 	   const program_state *old_state,
! 	   const program_state *new_state) const;
  
    /* Return true if S should be reset to "start" for values passed (or reachable
       from) calls to unknown functions.  IS_MUTABLE is true for pointers as
*************** public:
*** 184,189 ****
--- 187,201 ----
  
    state_t get_start_state () const { return m_start; }
  
+   virtual void
+   add_state_to_xml (xml_state &out_xml,
+ 		    const svalue &sval,
+ 		    state_machine::state_t state) const;
+ 
+   virtual void
+   add_global_state_to_xml (xml_state &out_xml,
+ 			   state_machine::state_t state) const;
+ 
  protected:
    state_t add_state (const char *name);
    state_t add_custom_state (state *s)
diff -Nrcpad gcc-16-20250622/gcc/analyzer/store.h gcc-16-20250629/gcc/analyzer/store.h
*** gcc-16-20250622/gcc/analyzer/store.h	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/store.h	Sun Jun 29 22:32:26 2025
*************** struct bit_range
*** 299,304 ****
--- 299,314 ----
  
    bool as_byte_range (byte_range *out) const;
  
+   bool
+   operator< (const bit_range &other) const
+   {
+     if (m_start_bit_offset < other.m_start_bit_offset)
+       return true;
+     if (m_start_bit_offset > other.m_start_bit_offset)
+       return false;
+     return (m_size_in_bits < other.m_size_in_bits);
+   }
+ 
    bit_offset_t m_start_bit_offset;
    bit_size_t m_size_in_bits;
  };
diff -Nrcpad gcc-16-20250622/gcc/analyzer/varargs.cc gcc-16-20250629/gcc/analyzer/varargs.cc
*** gcc-16-20250622/gcc/analyzer/varargs.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/analyzer/varargs.cc	Sun Jun 29 22:32:26 2025
*************** public:
*** 205,211 ****
    {
      return s != m_started;
    }
!   std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
  
    /* State for a va_list that is the result of a va_start or va_copy.  */
    state_t m_started;
--- 205,215 ----
    {
      return s != m_started;
    }
! 
!   std::unique_ptr<pending_diagnostic>
!   on_leak (tree var,
! 	   const program_state *old_state,
! 	   const program_state *new_state) const final override;
  
    /* State for a va_list that is the result of a va_start or va_copy.  */
    state_t m_started;
*************** class va_list_leak : public va_list_sm_d
*** 460,469 ****
  {
  public:
    va_list_leak (const va_list_state_machine &sm,
! 		const svalue *ap_sval, tree ap_tree)
    : va_list_sm_diagnostic (sm, ap_sval, ap_tree),
!     m_start_event_fnname (NULL)
    {
    }
  
    int get_controlling_option () const final override
--- 464,477 ----
  {
  public:
    va_list_leak (const va_list_state_machine &sm,
! 		const svalue *ap_sval, tree ap_tree,
! 		const program_state *final_state)
    : va_list_sm_diagnostic (sm, ap_sval, ap_tree),
!     m_start_event_fnname (NULL),
!     m_final_state ()
    {
+     if (final_state)
+       m_final_state = std::make_unique<program_state> (*final_state);
    }
  
    int get_controlling_option () const final override
*************** public:
*** 524,532 ****
--- 532,547 ----
      return true;
    }
  
+   const program_state *
+   get_final_state () const final override
+   {
+     return m_final_state.get ();
+   }
+ 
  private:
    diagnostic_event_id_t m_start_event;
    const char *m_start_event_fnname;
+   std::unique_ptr<program_state> m_final_state;
  };
  
  /* Update state machine for a "va_start" call.  */
*************** va_list_state_machine::on_va_end (sm_con
*** 633,641 ****
     (for complaining about leaks of values in state 'started').  */
  
  std::unique_ptr<pending_diagnostic>
! va_list_state_machine::on_leak (tree var) const
  {
!   return std::make_unique<va_list_leak> (*this, nullptr, var);
  }
  
  } // anonymous namespace
--- 648,658 ----
     (for complaining about leaks of values in state 'started').  */
  
  std::unique_ptr<pending_diagnostic>
! va_list_state_machine::on_leak (tree var,
! 				const program_state *,
! 				const program_state *new_state) const
  {
!   return std::make_unique<va_list_leak> (*this, nullptr, var, new_state);
  }
  
  } // anonymous namespace
diff -Nrcpad gcc-16-20250622/gcc/auto-profile.cc gcc-16-20250629/gcc/auto-profile.cc
*** gcc-16-20250622/gcc/auto-profile.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/auto-profile.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 61,67 ****
  
     There are three phases in AutoFDO:
  
!    Phase 1: Read profile from the profile data file.
       The following info is read from the profile datafile:
          * string_table: a map between function name and its index.
          * autofdo_source_profile: a map from function_instance name to
--- 61,68 ----
  
     There are three phases in AutoFDO:
  
!    Phase 1: At startup.
!      Read profile from the profile data file.
       The following info is read from the profile datafile:
          * string_table: a map between function name and its index.
          * autofdo_source_profile: a map from function_instance name to
*************** along with GCC; see the file COPYING3.
*** 76,98 ****
       standalone symbol, or a clone of a function that is inlined into another
       function.
  
!    Phase 2: Early inline + value profile transformation.
!      Early inline uses autofdo_source_profile to find if a callsite is:
          * inlined in the profiled binary.
          * callee body is hot in the profiling run.
       If both condition satisfies, early inline will inline the callsite
       regardless of the code growth.
-      Phase 2 is an iterative process. During each iteration, we also check
-      if an indirect callsite is promoted and inlined in the profiling run.
-      If yes, vpt will happen to force promote it and in the next iteration,
-      einline will inline the promoted callsite in the next iteration.
  
!    Phase 3: Annotate control flow graph.
!      AutoFDO uses a separate pass to:
          * Annotate basic block count
          * Estimate branch probability
  
!    After the above 3 phases, all profile is readily annotated on the GCC IR.
     AutoFDO tries to reuse all FDO infrastructure as much as possible to make
     use of the profile. E.g. it uses existing mechanism to calculate the basic
     block/edge frequency, as well as the cgraph node/edge count.
--- 77,120 ----
       standalone symbol, or a clone of a function that is inlined into another
       function.
  
!    Phase 2: In afdo_offline pass.
!      Remove function instances from other translation units
!      and offline all cross-translation unit inlining done during train
!      run compilation.  This is necessary to not lose profiles with
!      LTO train run.
! 
!    Phase 3: During early optimization.
!      AFDO inline + value profile transformation.
!      This happens during early optimization.
!      During early inlning AFDO inliner is executed which
!      uses autofdo_source_profile to find if a callsite is:
          * inlined in the profiled binary.
          * callee body is hot in the profiling run.
       If both condition satisfies, early inline will inline the callsite
       regardless of the code growth.
  
!      Performing this early has benefit of doing early optimizations
!      before read IPA passe and getting more "context sensitivity" of
!      the profile read.  Profile of inlined functions may differ
!      significantly form one inline instance to another and from the
!      offline version.
! 
!      This is controlled by -fauto-profile-inlinig and is independent
!      of -fearly-inlining.
! 
!    Phase 4: In AFDO pass.
!      Offline all functions that has been inlined in the
!      train run but were not inlined in early inlining nor AFDO
!      inline.
! 
!    Phase 5: In AFDO pass.
!      Annotate control flow graph.
          * Annotate basic block count
          * Estimate branch probability
+ 	* Use earlier static profile to fill in the gaps
+ 	  if AFDO profile is ambigous
  
!    After the above 5 phases, all profile is readily annotated on the GCC IR.
     AutoFDO tries to reuse all FDO infrastructure as much as possible to make
     use of the profile. E.g. it uses existing mechanism to calculate the basic
     block/edge frequency, as well as the cgraph node/edge count.
*************** typedef std::map<unsigned, gcov_type> ic
*** 138,143 ****
--- 160,169 ----
     to direct call.  */
  typedef std::set<gimple *> stmt_set;
  
+ /* Set and map used to translate name indexes.  */
+ typedef hash_set<int_hash <int, -1, -2>> name_index_set;
+ typedef hash_map<int_hash <int, -1, -2>, int> name_index_map;
+ 
  /* Represent count info of an inline stack.  */
  class count_info
  {
*************** public:
*** 185,190 ****
--- 211,225 ----
    /* Read profile, return TRUE on success.  */
    bool read ();
  
+   /* Return number of entries.  */
+   size_t num_entries ()
+   {
+     return vector_.length ();
+   }
+ 
+   /* Add new name and return its index.  */
+   int add_name (char *);
+ 
  private:
    typedef std::map<const char *, unsigned, string_compare> string_index_map;
    string_vector vector_;
*************** public:
*** 219,229 ****
--- 254,271 ----
    {
      return name_;
    }
+   int
+   set_name (int index)
+   {
+     return name_ = index;
+   }
    gcov_type
    total_count () const
    {
      return total_count_;
    }
+ 
+   /* Return head count or -1 if unknown.  */
    gcov_type
    head_count () const
    {
*************** public:
*** 237,243 ****
  
    /* Merge profile of clones.  Note that cloning hasnt been performed when
       we annotate the CFG (at this stage).  */
!   void merge (function_instance *other);
  
    /* Store the profile info for LOC in INFO. Return TRUE if profile info
       is found.  */
--- 279,302 ----
  
    /* Merge profile of clones.  Note that cloning hasnt been performed when
       we annotate the CFG (at this stage).  */
!   void merge (function_instance *other,
! 	      vec <function_instance *> &new_functions);
! 
!   /* Look for inline instancs that was not realized and
!      remove them while possibly merging them to offline variants.  */
!   void offline_if_not_realized (vec <function_instance *> &new_functions);
! 
!   /* Offline all inlined functions with name in SEEN.
!      If new toplevel functions are created, add them to NEW_FUNCTIONS.  */
!   void offline_if_in_set (name_index_set &seen,
! 			  vec <function_instance *> &new_functions);
! 
!   /* Walk inlined functions and if their name is not in SEEN
!      remove it.  */
! 
!   void remove_external_functions (name_index_set &seen,
! 				  name_index_map &to_symbol_name,
! 				  vec <function_instance *> &new_functions);
  
    /* Store the profile info for LOC in INFO. Return TRUE if profile info
       is found.  */
*************** public:
*** 254,259 ****
--- 313,391 ----
    /* Mark LOC as annotated.  */
    void mark_annotated (location_t loc);
  
+   void dump (FILE *f, int indent = 0, bool nested = false) const;
+ 
+   void dump_inline_stack (FILE *f) const;
+ 
+   DEBUG_FUNCTION void debug () const;
+ 
+   /* Mark function as removed from indir target list.  */
+   void
+   remove_icall_target ()
+   {
+     removed_icall_target_ = true;
+   }
+ 
+   /* Reutrn true if function is removed from indir target list.  */
+   bool
+   removed_icall_target ()
+   {
+     return removed_icall_target_;
+   }
+ 
+   /* Set inlined_to pointer.  */
+   void
+   set_inlined_to (function_instance *inlined_to)
+   {
+     gcc_checking_assert (inlined_to != this);
+     inlined_to_ = inlined_to;
+   }
+ 
+   /* Return pointer to the function instance this function is inlined
+      to or NULL if it is outer instance.  */
+   function_instance *
+   inlined_to () const
+   {
+     return inlined_to_;
+   }
+ 
+   /* Mark function as realized.  */
+   void
+   set_realized ()
+   {
+     realized_ = true;
+   }
+ 
+   /* Return true if function is realized.  */
+   bool
+   realized_p ()
+   {
+     return realized_;
+   }
+ 
+   /* Mark function as in_worklist.  */
+   void
+   set_in_worklist ()
+   {
+     gcc_checking_assert (!inlined_to_ && !in_worklist_p ());
+     in_worklist_ = true;
+   }
+ 
+   void
+   clear_in_worklist ()
+   {
+     gcc_checking_assert (!inlined_to_ && in_worklist_p ());
+     in_worklist_ = false;
+   }
+ 
+ 
+   /* Return true if function is in_worklist.  */
+   bool
+   in_worklist_p ()
+   {
+     return in_worklist_;
+   }
+ 
  private:
    /* Callsite, represented as (decl_lineno, callee_function_name_index).  */
    typedef std::pair<unsigned, unsigned> callsite;
*************** private:
*** 262,268 ****
    typedef std::map<callsite, function_instance *> callsite_map;
  
    function_instance (unsigned name, gcov_type head_count)
!       : name_ (name), total_count_ (0), head_count_ (head_count)
    {
    }
  
--- 394,402 ----
    typedef std::map<callsite, function_instance *> callsite_map;
  
    function_instance (unsigned name, gcov_type head_count)
!       : name_ (name), total_count_ (0), head_count_ (head_count),
!       removed_icall_target_ (false), realized_ (false),
!       in_worklist_ (false), inlined_to_ (NULL)
    {
    }
  
*************** private:
*** 283,288 ****
--- 417,441 ----
  
    /* Map from source location to count_info.  */
    position_count_map pos_counts;
+ 
+   /* True if function was removed from indir target list.  */
+   bool removed_icall_target_;
+ 
+   /* True if function exists in IL.  I.e. for toplevel instance we
+      have corresponding symbol and for inline instance we inlined
+      to it.  */
+   bool realized_;
+ 
+   /* Ture if function is in worklist for merging/offlining.  */
+   bool in_worklist_;
+ 
+   /* Pointer to outer function instance or NULL if this
+      is a toplevel one.  */
+   function_instance *inlined_to_;
+ 
+   /* Turn inline instance to offline.  */
+   static bool offline (function_instance *fn,
+ 		       vec <function_instance *> &new_functions);
  };
  
  /* Profile for all functions.  */
*************** public:
*** 305,310 ****
--- 458,468 ----
    /* For a given DECL, returns the top-level function_instance.  */
    function_instance *get_function_instance_by_decl (tree decl) const;
  
+   /* For a given name index, returns the top-level function_instance.  */
+   function_instance *get_function_instance_by_name_index (int) const;
+ 
+   void add_function_instance (function_instance *);
+ 
    /* Find count_info for a given gimple STMT. If found, store the count_info
       in INFO and return true; otherwise return false.
       NODE can be used to specify particular inline clone.  */
*************** public:
*** 326,331 ****
--- 484,494 ----
  				  cgraph_node *node);
  
    void remove_icall_target (cgraph_edge *e);
+ 
+   /* Offline all functions not defined in the current translation unit.  */
+   void offline_external_functions ();
+ 
+   void offline_unrealized_inlines ();
  private:
    /* Map from function_instance name index (in string_table) to
       function_instance.  */
*************** private:
*** 342,347 ****
--- 505,512 ----
    get_function_instance_by_inline_stack (const inline_stack &stack) const;
  
    name_function_instance_map map_;
+ 
+   auto_vec <function_instance *> duplicate_functions_;
  };
  
  /* Store the strings read from the profile data file.  */
*************** static gcov_type afdo_count_scale = 1;
*** 362,377 ****
  
  /* Helper functions.  */
  
  /* Return the original name of NAME: strip the suffix that starts
!    with '.' Caller is responsible for freeing RET.  */
  
  static char *
! get_original_name (const char *name)
  {
!   char *ret = xstrdup (name);
!   char *find = strchr (ret, '.');
!   if (find != NULL)
!     *find = 0;
    return ret;
  }
  
--- 527,576 ----
  
  /* Helper functions.  */
  
+ 
  /* Return the original name of NAME: strip the suffix that starts
!    with '.' for names that are generetad after auto-profile pass.
!    This is to match profiled names with the names in the IR at this stage.
!    Note that we only have to strip sufix and not in the middle.
!    Caller is responsible for freeing RET.  */
  
  static char *
! get_original_name (const char *name, bool alloc = true)
  {
!   char *ret = alloc ? xstrdup (name) : const_cast<char *> (name);
!   char *last_dot = strrchr (ret, '.');
!   if (last_dot == NULL)
!     return ret;
!   bool only_digits = true;
!   char *ptr = last_dot;
!   while (*(++ptr) != 0)
!     if (*ptr < '0' || *ptr > '9')
!       {
! 	only_digits = false;
! 	break;
!       }
!   if (only_digits)
!     *last_dot = 0;
!   char *next_dot = strrchr (ret, '.');
!   /* if nested function such as foo.0, return foo.0  */
!   if (next_dot == NULL)
!     {
!       *last_dot = '.';
!       return ret;
!     }
!   /* Suffixes of clones that compiler generates after auto-profile.  */
!   const char *suffixes[] = {"isra", "constprop", "lto_priv", "part", "cold"};
!   for (unsigned i = 0; i < sizeof (suffixes); ++i)
!     {
!       if (strncmp (next_dot + 1, suffixes[i], strlen (suffixes[i])) == 0)
! 	{
! 	  *next_dot = 0;
! 	  return get_original_name (ret, false);
! 	}
!     }
!   /* Otherwise, it is for clones such as .omp_fn.N that was done before
!      auto-profile and should be kept as it is.  */
!   *last_dot = '.';
    return ret;
  }
  
*************** get_function_decl_from_block (tree block
*** 400,405 ****
--- 599,615 ----
    return BLOCK_ABSTRACT_ORIGIN (block);
  }
  
+ /* Dump LOC to F.  */
+ 
+ static void
+ dump_afdo_loc (FILE *f, unsigned loc)
+ {
+   if (loc & 65535)
+     fprintf (f, "%i.%i", loc >> 16, loc & 65535);
+   else
+     fprintf (f, "%i", loc >> 16);
+ }
+ 
  /* Dump STACK to F.  */
  
  static void
*************** dump_inline_stack (FILE *f, inline_stack
*** 408,418 ****
    bool first = true;
    for (decl_lineno &p : *stack)
      {
!       fprintf(f, "%s%s:%i.%i",
! 	      first ? "" : "; ",
! 	      IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p.first)),
! 	      p.second >> 16,
! 	      p.second & 65535);
        first = false;
      }
    fprintf (f, "\n");
--- 618,627 ----
    bool first = true;
    for (decl_lineno &p : *stack)
      {
!       fprintf (f, "%s%s:",
! 	       first ? "" : "; ",
! 	       IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p.first)));
!       dump_afdo_loc (f, p.second);
        first = false;
      }
    fprintf (f, "\n");
*************** get_inline_stack_in_node (location_t loc
*** 470,494 ****
    while (node);
  }
  
! /* Return STMT's combined location, which is a 32bit integer in which
!    higher 16 bits stores the line offset of LOC to the start lineno
!    of DECL, The lower 16 bits stores the discriminator.  */
  
  static unsigned
! get_relative_location_for_stmt (tree fn, gimple *stmt)
  {
-   location_t locus = gimple_location (stmt);
    if (LOCATION_LOCUS (locus) == UNKNOWN_LOCATION)
      return UNKNOWN_LOCATION;
  
!   for (tree block = gimple_block (stmt); block && (TREE_CODE (block) == BLOCK);
         block = BLOCK_SUPERCONTEXT (block))
!     if (LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) != UNKNOWN_LOCATION)
        return get_combined_location (locus,
                                      get_function_decl_from_block (block));
    return get_combined_location (locus, fn);
  }
  
  /* Member functions for string_table.  */
  
  /* Deconstructor.  */
--- 679,715 ----
    while (node);
  }
  
! /* Return combined location of LOCUS within BLOCK that is in
!    function FN.
! 
!    This is a 32bit integer in which higher 16 bits stores the line offset of
!    LOC to the start lineno of DECL, The lower 16 bits stores the
!    discriminator.  */
  
  static unsigned
! get_relative_location_for_locus (tree fn, tree block, location_t locus)
  {
    if (LOCATION_LOCUS (locus) == UNKNOWN_LOCATION)
      return UNKNOWN_LOCATION;
  
!   for (; block && (TREE_CODE (block) == BLOCK);
         block = BLOCK_SUPERCONTEXT (block))
!     if (inlined_function_outer_scope_p (block))
        return get_combined_location (locus,
                                      get_function_decl_from_block (block));
    return get_combined_location (locus, fn);
  }
  
+ /* Return combined location of STMT in function FN.  */
+ 
+ static unsigned
+ get_relative_location_for_stmt (tree fn, gimple *stmt)
+ {
+   return get_relative_location_for_locus
+ 	  (fn, LOCATION_BLOCK (gimple_location (stmt)),
+ 	   gimple_location (stmt));
+ }
+ 
  /* Member functions for string_table.  */
  
  /* Deconstructor.  */
*************** string_table::get_index (const char *nam
*** 521,533 ****
  int
  string_table::get_index_by_decl (tree decl) const
  {
!   char *name
!       = get_original_name (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
    int ret = get_index (name);
-   free (name);
-   if (ret != -1)
-     return ret;
-   ret = get_index (lang_hooks.dwarf_name (decl, 0));
    if (ret != -1)
      return ret;
    if (DECL_FROM_INLINE (decl))
--- 742,749 ----
  int
  string_table::get_index_by_decl (tree decl) const
  {
!   const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
    int ret = get_index (name);
    if (ret != -1)
      return ret;
    if (DECL_FROM_INLINE (decl))
*************** string_table::get_name (int index) const
*** 545,550 ****
--- 761,776 ----
    return vector_[index];
  }
  
+ /* Add new name SRRING and return its index.  */
+ 
+ int
+ string_table::add_name (char *string)
+ {
+   vector_.safe_push (string);
+   map_[vector_.last ()] = vector_.length () - 1;
+   return vector_.length () - 1;
+ }
+ 
  /* Read the string table. Return TRUE if reading is successful.  */
  
  bool
*************** string_table::read ()
*** 556,564 ****
    gcov_read_unsigned ();
    /* Read in the file name table.  */
    unsigned string_num = gcov_read_unsigned ();
    for (unsigned i = 0; i < string_num; i++)
      {
!       vector_.safe_push (get_original_name (gcov_read_string ()));
        map_[vector_.last ()] = i;
      }
    return true;
--- 782,791 ----
    gcov_read_unsigned ();
    /* Read in the file name table.  */
    unsigned string_num = gcov_read_unsigned ();
+   vector_.reserve (string_num);
    for (unsigned i = 0; i < string_num; i++)
      {
!       vector_.quick_push (xstrdup (gcov_read_string ()));
        map_[vector_.last ()] = i;
      }
    return true;
*************** string_table::read ()
*** 568,573 ****
--- 795,801 ----
  
  function_instance::~function_instance ()
  {
+   gcc_assert (!in_worklist_p ());
    for (callsite_map::iterator iter = callsites.begin ();
         iter != callsites.end (); ++iter)
      delete iter->second;
*************** function_instance::get_function_instance
*** 588,627 ****
        if (ret != callsites.end ())
          return ret->second;
      }
!   func_name_idx
!       = afdo_string_table->get_index (lang_hooks.dwarf_name (decl, 0));
!   if (func_name_idx != -1)
      {
!       callsite_map::const_iterator ret
!           = callsites.find (std::make_pair (lineno, func_name_idx));
!       if (ret != callsites.end ())
!         return ret->second;
      }
    if (DECL_FROM_INLINE (decl))
!     return get_function_instance_by_decl (lineno, DECL_ABSTRACT_ORIGIN (decl));
  
    return NULL;
  }
  
! /* Merge profile of clones.  Note that cloning hasnt been performed when
     we annotate the CFG (at this stage).  */
  
! void function_instance::merge (function_instance *other)
  {
    total_count_ += other->total_count_;
!   head_count_ += other->head_count_;
  
    for (callsite_map::const_iterator iter = other->callsites.begin ();
         iter != other->callsites.end (); ++iter)
!     if (callsites.count (iter->first) == 0)
!       callsites[iter->first] = iter->second;
  
    for (position_count_map::const_iterator iter = other->pos_counts.begin ();
         iter != other->pos_counts.end (); ++iter)
      if (pos_counts.count (iter->first) == 0)
        pos_counts[iter->first] = iter->second;
      else
!       pos_counts[iter->first].count += iter->second.count;
  }
  
  /* Return profile info for LOC in INFO.  */
--- 816,1215 ----
        if (ret != callsites.end ())
          return ret->second;
      }
!   if (dump_file)
      {
!       for (auto const &iter : callsites)
! 	if (iter.first.first == lineno)
! 	  {
! 	    fprintf (dump_file, "Looking for %s:",
! 		     IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
! 	    dump_afdo_loc (dump_file, lineno);
! 	    fprintf (dump_file, " in ");
! 	    this->dump_inline_stack (dump_file);
! 	    fprintf (dump_file, " has mismatching call at smae loc to %s\n",
! 		     afdo_string_table->get_name (iter.first.second));
! 	  }
      }
+   /* ??? If this is used to determine count, we will end up over-eastimating it
+      if offlined function has multiple callers.  */
    if (DECL_FROM_INLINE (decl))
!     {
!       function_instance
!        	*ret =  get_function_instance_by_decl (lineno,
! 						DECL_ABSTRACT_ORIGIN (decl));
!       if (ret && dump_file)
! 	fprintf (dump_file, "Passing to offline instance:%s\n",
! 		 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
!       return ret;
!     }
  
    return NULL;
  }
  
! /* Merge profile of OTHER to THIS.  Note that cloning hasnt been performed when
     we annotate the CFG (at this stage).  */
  
! void
! function_instance::merge (function_instance *other,
! 			  vec <function_instance *> &new_functions)
  {
+   /* Do not merge to itself and only merge functions of same name.  */
+   gcc_checking_assert (other != this && other->name () == name ());
    total_count_ += other->total_count_;
!   if (other->total_count () && total_count () && other->head_count () == -1)
!     head_count_ = -1;
!   else if (head_count_ != -1)
!     head_count_ += other->head_count_;
  
+   bool changed = true;
+ 
+   while (changed)
+     {
+       changed = false;
+       /* If both function instances agree on particular inlined function,
+ 	 merge profiles. Otherwise offline the instance.  */
+       for (callsite_map::const_iterator iter = other->callsites.begin ();
+ 	   iter != other->callsites.end ();)
+ 	if (callsites.count (iter->first) == 0)
+ 	  {
+ 	    function_instance *f = iter->second;
+ 	    if (dump_file)
+ 	      {
+ 		fprintf (dump_file, "  Mismatch in inlined functions;"
+ 			 " offlining in merge source:");
+ 		f->dump_inline_stack (dump_file);
+ 		fprintf (dump_file, "\n");
+ 	      }
+ 	    /* We already merged outer part of the function acounting
+ 	       the inlined calll; compensate.  */
+ 	    for (function_instance *s = this; s; s = s->inlined_to ())
+ 	      {
+ 		s->total_count_ -= f->total_count ();
+ 		gcc_checking_assert (s->total_count_ >= 0);
+ 	      }
+ 	    other->callsites.erase (iter);
+ 	    function_instance::offline (f, new_functions);
+ 	    /* Start from begining as merging might have offlined
+ 	       some functions in the case of recursive inlining.  */
+ 	    iter = other->callsites.begin ();
+ 	  }
+ 	else
+ 	  ++iter;
+       for (callsite_map::const_iterator iter = callsites.begin ();
+ 	   iter != callsites.end ();)
+ 	if (other->callsites.count (iter->first) == 0)
+ 	  {
+ 	    function_instance *f = iter->second;
+ 	    if (dump_file)
+ 	      {
+ 		fprintf (dump_file, "  Mismatch in inlined functions;"
+ 			 " offlining in merge destination:");
+ 		f->dump_inline_stack (dump_file);
+ 		fprintf (dump_file, "\n");
+ 	      }
+ 	    callsites.erase (iter);
+ 	    function_instance::offline (f, new_functions);
+ 	    iter = callsites.begin ();
+ 	    changed = true;
+ 	  }
+ 	else
+ 	  ++iter;
+     }
    for (callsite_map::const_iterator iter = other->callsites.begin ();
         iter != other->callsites.end (); ++iter)
!     {
!       if (dump_file)
! 	{
! 	  fprintf (dump_file, "    Merging profile for inlined function\n"
! 		   "      from: ");
! 	  iter->second->dump_inline_stack (dump_file);
! 	  fprintf (dump_file, " total:%" PRIu64 "\n      to  : ",
! 		   (int64_t)iter->second->total_count ());
! 	  callsites[iter->first]->dump_inline_stack (dump_file);
! 	  fprintf (dump_file, " total:%" PRIu64 "\n",
! 		   (int64_t)callsites[iter->first]->total_count ());
! 	}
! 
!       callsites[iter->first]->merge (iter->second, new_functions);
!     }
  
    for (position_count_map::const_iterator iter = other->pos_counts.begin ();
         iter != other->pos_counts.end (); ++iter)
      if (pos_counts.count (iter->first) == 0)
        pos_counts[iter->first] = iter->second;
      else
!       {
!         pos_counts[iter->first].count += iter->second.count;
! 	for (icall_target_map::const_iterator titer
! 	       = iter->second.targets.begin ();
! 	     titer != iter->second.targets.end (); ++titer)
! 	  if (pos_counts[iter->first].targets.count (titer->first) == 0)
! 	    pos_counts[iter->first].targets[titer->first]
! 	      = titer->second;
! 	  else
! 	    pos_counts[iter->first].targets[titer->first]
! 	      += titer->second;
!       }
! }
! 
! /* Make inline function FN offline.
!    If tolevel function of same name already exists, then merge profiles.
!    Otherwise turn FN toplevel.  Return true if new toplevel function
!    was introduced.
!    If new toplevel functions are created and NEW_FUNCTIONS != NULL,
!    add them to NEW_FUNCTIONS.
! 
!    TODO: When offlining indirect call we lose information about the
!    call target.  It should be possible to add it into
!    targets histogram.  */
! 
! bool
! function_instance::offline (function_instance *fn,
! 			    vec <function_instance *> &new_functions)
! {
!   gcc_checking_assert (fn->inlined_to ());
!   for (function_instance *s = fn->inlined_to (); s; s = s->inlined_to ())
!     {
!       s->total_count_ -= fn->total_count ();
!       gcc_checking_assert (s->total_count_ >= 0);
!     }
!   function_instance *to
!     = afdo_source_profile->get_function_instance_by_name_index (fn->name ());
!   fn->set_inlined_to (NULL);
!   /* If there is offline function of same name, we need to merge profile.
!      Delay this by adding function to a worklist so we do not run into
!      problem with recursive inlining.  */
!   if (to)
!     {
!       if (fn->in_worklist_p ())
! 	return false;
!       fn->set_in_worklist ();
!       new_functions.safe_push (fn);
!       if (dump_file)
! 	{
! 	  fprintf (dump_file, "  Recoding duplicate: ");
! 	  to->dump_inline_stack (dump_file);
! 	  fprintf (dump_file, "\n");
! 	}
!       return true;
!     }
!   if (dump_file)
!     {
!       fprintf (dump_file, "  Added as offline instance: ");
!       fn->dump_inline_stack (dump_file);
!       fprintf (dump_file, "\n");
!     }
!   if (fn->total_count ())
!     fn->head_count_ = -1;
!   afdo_source_profile->add_function_instance (fn);
!   fn->set_in_worklist ();
!   new_functions.safe_push (fn);
!   return true;
! }
! 
! /* Offline all inlined functions with name in SEEN.
!    If new toplevel functions are created, add them to NEW_FUNCTIONS.  */
! 
! void
! function_instance::offline_if_in_set (name_index_set &seen,
! 				      vec <function_instance *> &new_functions)
! {
!   for (callsite_map::const_iterator iter = callsites.begin ();
!        iter != callsites.end ();)
!     if (seen.contains (iter->first.second))
!       {
! 	function_instance *f = iter->second;
! 	if (dump_file)
! 	  {
! 	    fprintf (dump_file, "Offlining function inlined to other module: ");
! 	    f->dump_inline_stack (dump_file);
! 	    fprintf (dump_file, "\n");
! 	  }
! 	iter = callsites.erase (iter);
! 	function_instance::offline (f, new_functions);
! 	/* Start from begining as merging might have offlined
! 	   some functions in the case of recursive inlining.  */
! 	iter = callsites.begin ();
!       }
!     else
!       {
! 	iter->second->offline_if_in_set (seen, new_functions);
! 	++iter;
!       }
! }
! 
! /* Walk inlined functions and if their name is not in SEEN
!    remove it.  Also rename function names as given by
!    to_symbol_name map.  */
! 
! void
! function_instance::remove_external_functions
! 	(name_index_set &seen,
!          name_index_map &to_symbol_name,
!          vec <function_instance *> &new_functions)
! {
!   auto_vec <callsite, 20> to_rename;
!   for (callsite_map::const_iterator iter = callsites.begin ();
!        iter != callsites.end ();)
!     if (!seen.contains (iter->first.second))
!       {
! 	function_instance *f = iter->second;
! 	if (dump_file)
! 	  {
! 	    fprintf (dump_file, "  Removing external inline: ");
! 	    f->dump_inline_stack (dump_file);
! 	    fprintf (dump_file, "\n");
! 	  }
! 	iter = callsites.erase (iter);
! 	f->set_inlined_to (NULL);
! 	f->offline_if_in_set (seen, new_functions);
! 	delete f;
!       }
!     else
!       {
! 	gcc_checking_assert ((int)iter->first.second
! 			     == iter->second->name ());
! 	int *newn = to_symbol_name.get (iter->first.second);
! 	if (newn)
! 	  {
! 	    gcc_checking_assert (iter->second->inlined_to ());
! 	    to_rename.safe_push (iter->first);
! 	  }
! 	iter->second->remove_external_functions
! 	  (seen, to_symbol_name, new_functions);
! 	++iter;
!       }
!   for (auto &key : to_rename)
!     {
!       auto iter = callsites.find (key);
!       callsite key2 = key;
!       key2.second = *to_symbol_name.get (key.second);
!       callsites[key2] = iter->second;
!       iter->second->set_name (key2.second);
!       callsites.erase (iter);
!     }
!   auto_vec <int, 20> target_to_rename;
!   for (auto &iter : pos_counts)
!     {
!       for (auto const &titer : iter.second.targets)
! 	{
! 	  int *ren = to_symbol_name.get (titer.first);
! 	  if (ren)
! 	    target_to_rename.safe_push (titer.first);
! 	}
!       while (target_to_rename.length ())
! 	{
! 	  int key = target_to_rename.pop ();
! 	  int key2 = *to_symbol_name.get (key);
! 	  auto i = iter.second.targets.find (key);
! 	  if (iter.second.targets.count (key2) == 0)
! 	    iter.second.targets[key2] = i->second;
! 	  else
! 	    iter.second.targets[key2] += i->second;
! 	  iter.second.targets.erase (i);
! 	}
!     }
! }
! 
! /* Look for inline instances that was not realized and
!    remove them while possibly merging them to offline variants.  */
! 
! void
! function_instance::offline_if_not_realized
! 	(vec <function_instance *> &new_functions)
! {
!   for (callsite_map::const_iterator iter = callsites.begin ();
!        iter != callsites.end ();)
!     if (!iter->second->realized_p ())
!       {
! 	function_instance *f = iter->second;
! 	if (dump_file)
! 	  {
! 	    fprintf (dump_file, "Offlining unrealized inline ");
! 	    f->dump_inline_stack (dump_file);
! 	    fprintf (dump_file, "\n");
! 	  }
! 	iter = callsites.erase (iter);
! 	offline (f, new_functions);
!       }
!     else
!       {
! 	iter->second->offline_if_not_realized (new_functions);
! 	++iter;
!       }
! }
! 
! /* Dump instance to F indented by INDENT.  */
! 
! void
! function_instance::dump (FILE *f, int indent, bool nested) const
! {
!   if (!nested)
!     fprintf (f, "%*s%s total:%" PRIu64 " head:%" PRId64 "\n",
! 	     indent, "", afdo_string_table->get_name (name ()),
! 	     (int64_t)total_count (), (int64_t)head_count ());
!   else
!     fprintf (f, " total:%" PRIu64 "\n", (int64_t)total_count ());
!   for (auto const &iter : pos_counts)
!     {
!       fprintf (f, "%*s", indent + 2, "");
!       dump_afdo_loc (f, iter.first);
!       fprintf (f, ": %" PRIu64, (int64_t)iter.second.count);
! 
!       for (auto const &titer : iter.second.targets)
! 	fprintf (f, "  %s:%" PRIu64,
! 		 afdo_string_table->get_name (titer.first),
! 		 (int64_t)titer.second);
!       fprintf (f,"\n");
!     }
!   for (auto const &iter : callsites)
!     {
!       fprintf (f, "%*s", indent + 2, "");
!       dump_afdo_loc (f, iter.first.first);
!       fprintf (f, ": %s", afdo_string_table->get_name (iter.first.second));
!       iter.second->dump (f, indent + 2, true);
!       gcc_checking_assert ((int)iter.first.second == iter.second->name ());
!     }
! }
! 
! /* Dump inline path.  */
! 
! void
! function_instance::dump_inline_stack (FILE *f) const
! {
!   auto_vec <callsite, 20> stack;
!   const function_instance *p = this, *s = inlined_to ();
!   while (s)
!     {
!       bool found = false;
!       for (callsite_map::const_iterator iter = s->callsites.begin ();
! 	   iter != s->callsites.end (); ++iter)
! 	if (iter->second == p)
! 	  {
! 	    gcc_checking_assert (!found
! 				 && (int)iter->first.second == p->name ());
! 	    stack.safe_push ({iter->first.first, s->name ()});
! 	    found = true;
! 	  }
!       gcc_checking_assert (found);
!       p = s;
!       s = s->inlined_to ();
!     }
!   for (callsite &s: stack)
!     {
!       fprintf (f, "%s:", afdo_string_table->get_name (s.second));
!       dump_afdo_loc (f, s.first);
!       fprintf (f, " ");
!     }
!   fprintf (f, "%s", afdo_string_table->get_name (name ()));
! }
! 
! /* Dump instance to stderr.  */
! 
! void
! function_instance::debug () const
! {
!   dump (stderr);
  }
  
  /* Return profile info for LOC in INFO.  */
*************** function_instance::find_icall_target_map
*** 651,658 ****
      {
        unsigned callee = iter->second->name ();
        /* Check if callsite location match the stmt.  */
!       if (iter->first.first != stmt_offset)
!         continue;
        struct cgraph_node *node = cgraph_node::get_for_asmname (
            get_identifier (afdo_string_table->get_name (callee)));
        if (node == NULL)
--- 1239,1247 ----
      {
        unsigned callee = iter->second->name ();
        /* Check if callsite location match the stmt.  */
!       if (iter->first.first != stmt_offset
! 	  || iter->second->removed_icall_target ())
! 	continue;
        struct cgraph_node *node = cgraph_node::get_for_asmname (
            get_identifier (afdo_string_table->get_name (callee)));
        if (node == NULL)
*************** function_instance::remove_icall_target (
*** 671,683 ****
    unsigned stmt_offset = get_relative_location_for_stmt (fn, stmt);
    int n = 0;
  
!   for (callsite_map::const_iterator iter = callsites.begin ();
!        iter != callsites.end ();)
!     if (iter->first.first != stmt_offset)
!       ++iter;
!     else
        {
! 	iter = callsites.erase (iter);
  	n++;
        }
    /* TODO: If we add support for multiple targets, we may want to
--- 1260,1269 ----
    unsigned stmt_offset = get_relative_location_for_stmt (fn, stmt);
    int n = 0;
  
!   for (auto iter : callsites)
!     if (iter.first.first == stmt_offset)
        {
! 	iter.second->remove_icall_target ();
  	n++;
        }
    /* TODO: If we add support for multiple targets, we may want to
*************** function_instance::remove_icall_target (
*** 685,690 ****
--- 1271,1594 ----
    gcc_assert (n);
  }
  
+ /* Offline all functions not defined in the current unit.
+    We will not be able to early inline them.
+    Doint so early will get VPT decisions more realistic.  */
+ 
+ void
+ autofdo_source_profile::offline_external_functions ()
+ {
+   /* First check all available definitions and mark their names as
+      visible.  */
+   cgraph_node *node;
+   name_index_set seen;
+   name_index_map to_symbol_name;
+ 
+   /* Add renames erasing suffixes produced by late clones, such as
+      .isra, .ipcp.  */
+   for (size_t i = 1; i < afdo_string_table->num_entries (); i++)
+     {
+       const char *n1 = afdo_string_table->get_name (i);
+       char *n2 = get_original_name (n1);
+       if (!strcmp (n1, n2))
+ 	{
+ 	  free (n2);
+ 	  /* Watch for duplicate entries.
+ 	     This seems to happen in practice and may be useful to distingush
+ 	     multiple static symbols of the same name, but we do not realy
+ 	     have a way to differentiate them in get_name lookup.  */
+ 	  int index = afdo_string_table->get_index (n1);
+ 	  if (index != (int)i)
+ 	    {
+ 	      if (dump_file)
+ 		fprintf (dump_file,
+ 			 "string table in auto-profile contains"
+ 			 " duplicated name %s", n1);
+ 	      to_symbol_name.put (i, index);
+ 	    }
+ 	  continue;
+ 	}
+       if (dump_file)
+ 	fprintf (dump_file, "Adding rename removing clone suffxes %s -> %s\n",
+ 		 n1, n2);
+       int index = afdo_string_table->get_index (n2);
+       if (index != -1)
+ 	free (n2);
+       else
+ 	index = afdo_string_table->add_name (n2);
+       to_symbol_name.put (i, index);
+     }
+   FOR_EACH_DEFINED_FUNCTION (node)
+     {
+       const char *name
+ 	  = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl));
+       const char *dwarf_name = lang_hooks.dwarf_name (node->decl, 0);
+       int index = afdo_string_table->get_index (name);
+ 
+       /* Inline function may be identified by its dwarf names;
+ 	 rename them to symbol names.  With LTO dwarf names are
+ 	 lost in free_lange_data.  */
+       if (strcmp (name, dwarf_name))
+ 	{
+ 	  int index2 = afdo_string_table->get_index (dwarf_name);
+ 	  if (index2 != -1)
+ 	    {
+ 	      if (index == -1)
+ 		index = afdo_string_table->add_name (xstrdup (name));
+ 	      if (dump_file)
+ 		{
+ 		  fprintf (dump_file, "Adding dwarf->symbol rename %s -> %s\n",
+ 			   afdo_string_table->get_name (index2), name);
+ 		  if (to_symbol_name.get (index2))
+ 		    fprintf (dump_file, "Dwarf name is not unique");
+ 		}
+ 	      to_symbol_name.put (index2, index);
+ 	      seen.add (index2);
+ 	    }
+ 	}
+       if (index != -1)
+ 	{
+ 	  if (dump_file)
+ 	    fprintf (dump_file, "%s is defined in node %s\n",
+ 		     afdo_string_table->get_name (index),
+ 		     node->dump_name ());
+ 	  seen.add (index);
+ 	}
+       else
+ 	{
+ 	  if (dump_file)
+ 	    {
+ 	      fprintf (dump_file,
+ 		       "Node %s not in auto profile (%s neither %s)\n",
+ 		       node->dump_name (),
+ 		       name,
+ 		       dwarf_name);
+ 	    }
+ 	}
+     }
+ 
+   for (auto iter : to_symbol_name)
+     {
+       /* In case dwarf name was duplicated and later renamed,
+ 	 handle both.  No more than one hop shold be needed.  */
+       int *newn = to_symbol_name.get (iter.second);
+       if (newn)
+ 	iter.second = *newn;
+       gcc_checking_assert (!to_symbol_name.get (iter.second));
+       if (seen.contains (iter.second))
+ 	seen.add (iter.first);
+     }
+ 
+   /* Now process all tolevel (offline) function instances.
+ 
+      If instance has no definition in this translation unit,
+      first offline all inlined functions which are defined here
+      (so we do not lose porfile due to cross-module inlining
+      done by link-time optimizers).
+ 
+      If instance has a definition, look into all inlined functions
+      and remove external ones (result of cross-module inlining).
+ 
+      TODO: after early-inlining we ought to offline all functions
+      that were not inlined.  */
+   vec <function_instance *>&fns = duplicate_functions_;
+   /* Poppulate worklist with all functions to process.  Processing
+      may introduce new functions by offlining.  */
+   for (auto const &iter : map_)
+     {
+       iter.second->set_in_worklist ();
+       fns.safe_push (iter.second);
+     }
+   while (fns.length ())
+     {
+       function_instance *f = fns.pop ();
+       int index = f->name ();
+       gcc_checking_assert (f->in_worklist_p ());
+ 
+       /* If map has different function_instance of same name, then
+ 	 this is a duplicated entry which needs to be merged.  */
+       if (map_.count (index) && map_[index] != f)
+ 	{
+ 	  if (dump_file)
+ 	    {
+ 	      fprintf (dump_file, "Merging duplicate instance: ");
+ 	      f->dump_inline_stack (dump_file);
+ 	      fprintf (dump_file, "\n");
+ 	    }
+ 	  map_[index]->merge (f, fns);
+ 	  gcc_checking_assert (!f->inlined_to ());
+ 	  f->clear_in_worklist ();
+ 	  delete f;
+ 	}
+       /* If name was not seen in the symbol table, remove it.  */
+       else if (!seen.contains (index))
+ 	{
+ 	  f->offline_if_in_set (seen, fns);
+ 	  f->clear_in_worklist ();
+ 	  if (dump_file)
+ 	    fprintf (dump_file, "Removing external %s\n",
+ 		     afdo_string_table->get_name (f->name ()));
+ 	  map_.erase (f->name ());
+ 	  delete f;
+ 	}
+       /* If this is offline function instance seen in this
+ 	 translation unit offline external inlines and possibly
+ 	 rename from dwarf name.  */
+       else
+ 	{
+ 	  f->remove_external_functions (seen, to_symbol_name, fns);
+ 	  f->clear_in_worklist ();
+ 	  int *newn = to_symbol_name.get (index);
+ 	  if (newn)
+ 	    {
+ 	      gcc_checking_assert (*newn != index);
+ 	      f->set_name (*newn);
+ 	      if (map_.count (*newn))
+ 		{
+ 		  if (dump_file)
+ 		    fprintf (dump_file, "Merging duplicate symbol %s\n",
+ 			     afdo_string_table->get_name (f->name ()));
+ 		  function_instance *to = map_[*newn];
+ 		  gcc_checking_assert (!map_.count (index) || map_[index] == f);
+ 		  if (to != f)
+ 		    {
+ 		      to->merge (f, fns);
+ 		      delete f;
+ 		    }
+ 		  if (map_.count (index))
+ 		    map_.erase (index);
+ 		}
+ 	      else
+ 		{
+ 		  auto iter = map_.find (index);
+ 		  map_[*newn] = iter->second;
+ 		  map_.erase (iter);
+ 		}
+ 	    }
+ 	}
+     }
+   if (dump_file)
+     for (auto const &iter : map_)
+       {
+ 	seen.contains (iter.second->name ());
+ 	iter.second->dump (dump_file);
+       }
+ }
+ 
+ /* Walk scope block BLOCK and mark all inlined functions as realized.  */
+ 
+ static void
+ walk_block (tree fn, function_instance *s, tree block)
+ {
+   if (inlined_function_outer_scope_p (block))
+     {
+       unsigned loc = get_relative_location_for_locus
+ 		      (fn, BLOCK_SUPERCONTEXT (block),
+ 		       BLOCK_SOURCE_LOCATION (block));
+       function_instance *ns
+ 	= s->get_function_instance_by_decl
+ 		  (loc, BLOCK_ABSTRACT_ORIGIN (block));
+       if (!ns)
+ 	{
+ 	  if (dump_file)
+ 	    {
+ 	      fprintf (dump_file, " Failed to find inlined instance:");
+ 	      s->dump_inline_stack (dump_file);
+ 	      fprintf (dump_file, ":");
+ 	      dump_afdo_loc (dump_file, loc);
+ 	      fprintf (dump_file, " %s\n",
+ 		       IDENTIFIER_POINTER
+ 			 (DECL_ASSEMBLER_NAME (BLOCK_ABSTRACT_ORIGIN (block))));
+ 	    }
+ 	  return;
+ 	}
+       s = ns;
+       if (dump_file)
+ 	{
+ 	  fprintf (dump_file, " Marking realized inline: ");
+ 	  s->dump_inline_stack (dump_file);
+ 	  fprintf (dump_file, "\n");
+ 	}
+       s->set_realized ();
+     }
+   for (tree t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
+     walk_block (fn, s, t);
+ }
+ 
+ /* Offline all inline functions that are not marked as realized.
+    This will merge their profile into offline versions where available.
+    Also remove all functions we will no longer use.  */
+ 
+ void
+ autofdo_source_profile::offline_unrealized_inlines ()
+ {
+   auto_vec <function_instance *>fns;
+   /* Poppulate worklist with all functions to process.  Processing
+      may introduce new functions by offlining.  */
+   for (auto const &iter : map_)
+     {
+       fns.safe_push (iter.second);
+       iter.second->set_in_worklist ();
+     }
+   while (fns.length ())
+     {
+       function_instance *f = fns.pop ();
+       int index = f->name ();
+       bool in_map = map_.count (index);
+       if (in_map)
+ 	for (cgraph_node *n = cgraph_node::get_for_asmname
+ 		  (get_identifier (afdo_string_table->get_name (index)));n;)
+ 	  {
+ 	    if (n->definition)
+ 	      {
+ 		if (dump_file)
+ 		  fprintf (dump_file, "Marking realized %s\n",
+ 			   afdo_string_table->get_name (index));
+ 		f->set_realized ();
+ 		if (DECL_INITIAL (n->decl) != error_mark_node)
+ 		  walk_block (n->decl, f, DECL_INITIAL (n->decl));
+ 	      }
+ 	    if (n->next_sharing_asm_name)
+ 	      n = as_a <cgraph_node *>(n->next_sharing_asm_name);
+ 	    else
+ 	      break;
+ 	  }
+       f->offline_if_not_realized (fns);
+       gcc_checking_assert ((in_map || !f->realized_p ())
+ 			   && f->in_worklist_p ());
+ 
+       /* If this is duplicated instance, merge it into one in map.  */
+       if (in_map && map_[index] != f)
+ 	{
+ 	  if (dump_file)
+ 	    {
+ 	      fprintf (dump_file, "Merging duplicate instance: ");
+ 	      f->dump_inline_stack (dump_file);
+ 	      fprintf (dump_file, "\n");
+ 	    }
+ 	  map_[index]->merge (f, fns);
+ 	  f->clear_in_worklist ();
+ 	  gcc_checking_assert (!f->inlined_to ());
+ 	  delete f;
+ 	}
+       /* If function is not in symbol table, remove it.  */
+       else if (!f->realized_p ())
+ 	{
+ 	  if (dump_file)
+ 	    fprintf (dump_file, "Removing optimized out function %s\n",
+ 		     afdo_string_table->get_name (f->name ()));
+ 	  map_.erase (index);
+ 	  f->clear_in_worklist ();
+ 	  delete f;
+ 	}
+       else
+ 	f->clear_in_worklist ();
+     }
+   if (dump_file)
+     for (auto const &iter : map_)
+       iter.second->dump (dump_file);
+ }
+ 
  /* Read the profile and create a function_instance with head count as
     HEAD_COUNT. Recursively read callsites to create nested function_instances
     too. STACK is used to track the recursive creation process.  */
*************** function_instance::read_function_instanc
*** 724,729 ****
--- 1628,1635 ----
    unsigned num_pos_counts = gcov_read_unsigned ();
    unsigned num_callsites = gcov_read_unsigned ();
    function_instance *s = new function_instance (name, head_count);
+   if (!stack->is_empty ())
+     s->set_inlined_to (stack->last ());
    stack->safe_push (s);
  
    for (unsigned i = 0; i < num_pos_counts; i++)
*************** function_instance::read_function_instanc
*** 749,755 ****
      {
        unsigned offset = gcov_read_unsigned ();
        function_instance *callee_function_instance
!           = read_function_instance (stack, 0);
        s->callsites[std::make_pair (offset, callee_function_instance->name ())]
            = callee_function_instance;
      }
--- 1655,1661 ----
      {
        unsigned offset = gcov_read_unsigned ();
        function_instance *callee_function_instance
!           = read_function_instance (stack, -1);
        s->callsites[std::make_pair (offset, callee_function_instance->name ())]
            = callee_function_instance;
      }
*************** autofdo_source_profile::get_function_ins
*** 778,783 ****
--- 1684,1709 ----
    return ret == map_.end () ? NULL : ret->second;
  }
  
+ /* For a given NAME_INDEX, returns the top-level function_instance.  */
+ 
+ function_instance *
+ autofdo_source_profile::get_function_instance_by_name_index (int name_index)
+        	const
+ {
+   name_function_instance_map::const_iterator ret = map_.find (name_index);
+   return ret == map_.end () ? NULL : ret->second;
+ }
+ 
+ /* Add function instance FN.  */
+ 
+ void
+ autofdo_source_profile::add_function_instance (function_instance *fn)
+ {
+   int index = fn->name ();
+   gcc_checking_assert (map_.count (index) == 0);
+   map_[index] = fn;
+ }
+ 
  /* Find count_info for a given gimple STMT. If found, store the count_info
     in INFO and return true; otherwise return false.  */
  
*************** autofdo_source_profile::read ()
*** 966,971 ****
--- 1892,1900 ----
        return false;
      }
  
+   gcc_checking_assert (!afdo_source_profile);
+   afdo_source_profile = this;
+ 
    /* Skip the length of the section.  */
    gcov_read_unsigned ();
  
*************** autofdo_source_profile::read ()
*** 980,1005 ****
        function_instance::function_instance_stack stack;
        function_instance *s = function_instance::read_function_instance (
            &stack, gcov_read_counter ());
!       int fun_id = afdo_string_table->get_index
! 	      (afdo_string_table->get_name (s->name ()));
        /* If function_instace with get_original_name (without the clone
  	 suffix) exixts, merge the function instances.  */
        if (map_.count (fun_id) == 0)
  	map_[fun_id] = s;
        else
! 	{
!  	  /* Since this is invoked very early, before the pass
! 	     manager, we need to set up the dumping explicitly.  This is
!      	     similar to the handling in finish_optimization_passes.  */
! 	  if (dump_enabled_p ())
! 	    {
! 	      dump_user_location_t loc
! 		      = dump_user_location_t::from_location_t (input_location);
! 	      dump_printf_loc (MSG_NOTE, loc, "Merging profile for %s\n",
! 			    afdo_string_table->get_name (s->name ()));
! 	    }
! 	  map_[fun_id]->merge (s);
! 	}
      }
    /* Scale up the profile, but leave some bits in case some counts gets
       bigger than sum_max eventually.  */
--- 1909,1923 ----
        function_instance::function_instance_stack stack;
        function_instance *s = function_instance::read_function_instance (
            &stack, gcov_read_counter ());
!       int fun_id = s->name ();
        /* If function_instace with get_original_name (without the clone
  	 suffix) exixts, merge the function instances.  */
        if (map_.count (fun_id) == 0)
  	map_[fun_id] = s;
        else
! 	fatal_error (UNKNOWN_LOCATION,
! 		     "auto-profile contains duplicated function instance %s",
! 		     afdo_string_table->get_name (s->name ()));
      }
    /* Scale up the profile, but leave some bits in case some counts gets
       bigger than sum_max eventually.  */
*************** autofdo_source_profile::read ()
*** 1011,1017 ****
      fprintf (dump_file, "Max count in profile %" PRIu64 "\n"
  			"Setting scale %" PRIu64 "\n"
  			"Scaled max count %" PRIu64 "\n"
! 			"Hot count threshold %" PRIu64 "\n",
  	     (int64_t)afdo_profile_info->sum_max,
  	     (int64_t)afdo_count_scale,
  	     (int64_t)(afdo_profile_info->sum_max * afdo_count_scale),
--- 1929,1935 ----
      fprintf (dump_file, "Max count in profile %" PRIu64 "\n"
  			"Setting scale %" PRIu64 "\n"
  			"Scaled max count %" PRIu64 "\n"
! 			"Hot count threshold %" PRIu64 "\n\n",
  	     (int64_t)afdo_profile_info->sum_max,
  	     (int64_t)afdo_count_scale,
  	     (int64_t)(afdo_profile_info->sum_max * afdo_count_scale),
*************** autofdo_source_profile::get_function_ins
*** 1031,1045 ****
  {
    name_function_instance_map::const_iterator iter = map_.find (
        afdo_string_table->get_index_by_decl (stack[stack.length () - 1].first));
!   if (iter == map_.end())
!     return NULL;
    function_instance *s = iter->second;
!   for (unsigned i = stack.length() - 1; i > 0; i--)
      {
!       s = s->get_function_instance_by_decl (
!           stack[i].second, stack[i - 1].first);
        if (s == NULL)
!         return NULL;
      }
    return s;
  }
--- 1949,1984 ----
  {
    name_function_instance_map::const_iterator iter = map_.find (
        afdo_string_table->get_index_by_decl (stack[stack.length () - 1].first));
!   if (iter == map_.end ())
!     {
!       if (dump_file)
! 	fprintf (dump_file, "No offline instance for %s\n",
! 		 IDENTIFIER_POINTER
! 		   (DECL_ASSEMBLER_NAME (stack[stack.length () - 1].first)));
!       return NULL;
!     }
    function_instance *s = iter->second;
!   for (unsigned i = stack.length () - 1; i > 0; i--)
      {
!       function_instance *os = s;
!       s = s->get_function_instance_by_decl (stack[i].second,
! 					    stack[i - 1].first);
!       /* Try lost locus.  */
!       if (!s)
! 	s = os->get_function_instance_by_decl (stack[i].second & ~65535,
! 						stack[i - 1].first);
        if (s == NULL)
! 	{
! 	  if (dump_file)
! 	    {
! 	      fprintf (dump_file, "No instance for %s at loc ",
! 		       IDENTIFIER_POINTER
! 			(DECL_ASSEMBLER_NAME (stack[i - 1].first)));
! 	      dump_afdo_loc (dump_file, stack[i].second);
! 	      fprintf (dump_file, "\n");
! 	    }
! 	  return NULL;
! 	}
      }
    return s;
  }
*************** read_profile (void)
*** 1091,1097 ****
  
    /* string_table.  */
    afdo_string_table = new string_table ();
!   if (!afdo_string_table->read())
      {
        error ("cannot read string table from %s", auto_profile_file);
        return;
--- 2030,2036 ----
  
    /* string_table.  */
    afdo_string_table = new string_table ();
!   if (!afdo_string_table->read ())
      {
        error ("cannot read string table from %s", auto_profile_file);
        return;
*************** afdo_set_bb_count (basic_block bb, hash_
*** 1315,1321 ****
  	{
  	  if (info.count > max_count)
  	    max_count = info.count;
! 	  if (dump_file && info.count)
  	    {
  	      fprintf (dump_file, "  count %" PRIu64 " in stmt: ",
  		       (int64_t)info.count);
--- 2254,2260 ----
  	{
  	  if (info.count > max_count)
  	    max_count = info.count;
! 	  if (dump_file)
  	    {
  	      fprintf (dump_file, "  count %" PRIu64 " in stmt: ",
  		       (int64_t)info.count);
*************** afdo_annotate_cfg (void)
*** 2075,2081 ****
    if (s == NULL)
      {
        if (dump_file)
! 	fprintf (dump_file, "No afdo profile for %s",
  		 cgraph_node::get (current_function_decl)->dump_name ());
        return;
      }
--- 3014,3020 ----
    if (s == NULL)
      {
        if (dump_file)
! 	fprintf (dump_file, "No afdo profile for %s\n",
  		 cgraph_node::get (current_function_decl)->dump_name ());
        return;
      }
*************** afdo_annotate_cfg (void)
*** 2085,2092 ****
    loop_optimizer_init (0);
  
    if (dump_file)
!     fprintf (dump_file, "\n\nAnnotating BB profile of %s\n",
! 	     cgraph_node::get (current_function_decl)->dump_name ());
  
    /* In the first pass only store non-zero counts.  */
    gcov_type head_count = s->head_count () * autofdo::afdo_count_scale;
--- 3024,3036 ----
    loop_optimizer_init (0);
  
    if (dump_file)
!     {
!       fprintf (dump_file, "\n\nAnnotating BB profile of %s\n",
! 	       cgraph_node::get (current_function_decl)->dump_name ());
!       fprintf (dump_file, "\n");
!       s->dump (dump_file);
!       fprintf (dump_file, "\n");
!     }
  
    /* In the first pass only store non-zero counts.  */
    gcov_type head_count = s->head_count () * autofdo::afdo_count_scale;
*************** afdo_annotate_cfg (void)
*** 2108,2114 ****
       afdo samples, but if even static profile agrees with 0,
       consider it final so propagation works better.  */
    for (basic_block bb : zero_bbs)
!     if (bb->count.nonzero_p ())
        {
  	update_count_by_afdo_count (&bb->count, 0);
  	set_bb_annotated (bb, &annotated_bb);
--- 3052,3058 ----
       afdo samples, but if even static profile agrees with 0,
       consider it final so propagation works better.  */
    for (basic_block bb : zero_bbs)
!     if (!bb->count.nonzero_p ())
        {
  	update_count_by_afdo_count (&bb->count, 0);
  	set_bb_annotated (bb, &annotated_bb);
*************** afdo_annotate_cfg (void)
*** 2153,2159 ****
      }
  
    /* Update profile.  */
!   if (head_count)
    {
      update_count_by_afdo_count (&ENTRY_BLOCK_PTR_FOR_FN (cfun)->count,
  				head_count);
--- 3097,3103 ----
      }
  
    /* Update profile.  */
!   if (head_count > 0)
    {
      update_count_by_afdo_count (&ENTRY_BLOCK_PTR_FOR_FN (cfun)->count,
  				head_count);
*************** afdo_annotate_cfg (void)
*** 2200,2207 ****
  	cfun->cfg->full_profile = false;
        }
  
!   cgraph_node::get(current_function_decl)->count
!       = ENTRY_BLOCK_PTR_FOR_FN(cfun)->count;
    update_max_bb_count ();
    profile_status_for_fn (cfun) = PROFILE_READ;
    if (flag_value_profile_transformations)
--- 3144,3151 ----
  	cfun->cfg->full_profile = false;
        }
  
!   cgraph_node::get (current_function_decl)->count
!       = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
    update_max_bb_count ();
    profile_status_for_fn (cfun) = PROFILE_READ;
    if (flag_value_profile_transformations)
*************** afdo_annotate_cfg (void)
*** 2217,2234 ****
    free_dominance_info (CDI_POST_DOMINATORS);
  }
  
- /* Wrapper function to invoke early inliner.  */
- 
- static unsigned int
- early_inline ()
- {
-   compute_fn_summary (cgraph_node::get (current_function_decl), true);
-   unsigned int todo = early_inliner (cfun);
-   if (todo & TODO_update_ssa_any)
-     update_ssa (TODO_update_ssa);
-   return todo;
- }
- 
  /* Use AutoFDO profile to annoate the control flow graph.
     Return the todo flag.  */
  
--- 3161,3166 ----
*************** auto_profile (void)
*** 2242,2247 ****
--- 3174,3180 ----
  
    init_node_map (true);
    profile_info = autofdo::afdo_profile_info;
+   afdo_source_profile->offline_unrealized_inlines ();
  
    FOR_EACH_FUNCTION (node)
    {
*************** auto_profile (void)
*** 2254,2272 ****
  
      push_cfun (DECL_STRUCT_FUNCTION (node->decl));
  
-     unsigned int todo = early_inline ();
      autofdo::afdo_annotate_cfg ();
      compute_function_frequency ();
  
-     /* Local pure-const may imply need to fixup the cfg.  */
-     todo |= execute_fixup_cfg ();
-     if (todo & TODO_cleanup_cfg)
-       cleanup_tree_cfg ();
- 
      free_dominance_info (CDI_DOMINATORS);
      free_dominance_info (CDI_POST_DOMINATORS);
      cgraph_edge::rebuild_edges ();
-     compute_fn_summary (cgraph_node::get (current_function_decl), true);
      pop_cfun ();
    }
  
--- 3187,3198 ----
*************** make_pass_ipa_auto_profile (gcc::context
*** 2446,2448 ****
--- 3372,3419 ----
  {
    return new pass_ipa_auto_profile (ctxt);
  }
+ 
+ namespace
+ {
+ 
+ const pass_data pass_data_ipa_auto_profile_offline = {
+   SIMPLE_IPA_PASS, "afdo_offline", /* name */
+   OPTGROUP_NONE,           /* optinfo_flags */
+   TV_IPA_AUTOFDO_OFFLINE,  /* tv_id */
+   0,                       /* properties_required */
+   0,                       /* properties_provided */
+   0,                       /* properties_destroyed */
+   0,                       /* todo_flags_start */
+   0,                       /* todo_flags_finish */
+ };
+ 
+ class pass_ipa_auto_profile_offline : public simple_ipa_opt_pass
+ {
+ public:
+   pass_ipa_auto_profile_offline (gcc::context *ctxt)
+       : simple_ipa_opt_pass (pass_data_ipa_auto_profile_offline, ctxt)
+   {
+   }
+ 
+   /* opt_pass methods: */
+   bool
+   gate (function *) final override
+   {
+     return flag_auto_profile;
+   }
+   unsigned int
+   execute (function *) final override
+   {
+     if (autofdo::afdo_source_profile)
+       autofdo::afdo_source_profile->offline_external_functions ();
+     return 0;
+   }
+ }; // class pass_ipa_auto_profile
+ 
+ } // anon namespace
+ 
+ simple_ipa_opt_pass *
+ make_pass_ipa_auto_profile_offline (gcc::context *ctxt)
+ {
+   return new pass_ipa_auto_profile_offline (ctxt);
+ }
diff -Nrcpad gcc-16-20250622/gcc/avoid-store-forwarding.cc gcc-16-20250629/gcc/avoid-store-forwarding.cc
*** gcc-16-20250622/gcc/avoid-store-forwarding.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/avoid-store-forwarding.cc	Sun Jun 29 22:32:26 2025
*************** public:
*** 80,91 ****
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *)
      {
        return flag_avoid_store_forwarding && optimize >= 1;
      }
  
!   virtual unsigned int execute (function *) override;
  }; // class pass_rtl_avoid_store_forwarding
  
  /* Handler for finding and avoiding store forwardings.  */
--- 80,91 ----
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *) final override
      {
        return flag_avoid_store_forwarding && optimize >= 1;
      }
  
!   virtual unsigned int execute (function *) final override;
  }; // class pass_rtl_avoid_store_forwarding
  
  /* Handler for finding and avoiding store forwardings.  */
diff -Nrcpad gcc-16-20250622/gcc/c/ChangeLog gcc-16-20250629/gcc/c/ChangeLog
*** gcc-16-20250622/gcc/c/ChangeLog	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/c/ChangeLog	Sun Jun 29 22:32:26 2025
***************
*** 1,3 ****
--- 1,7 ----
+ 2025-06-23  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-parser.cc (OACC_WAIT_CLAUSE_MASK): Add if clause.
+ 
  2025-06-12  Jakub Jelinek  <jakub@redhat.com>
  
  	* c-lang.h (union lang_type::maybe_objc_info): New type.
diff -Nrcpad gcc-16-20250622/gcc/c/c-parser.cc gcc-16-20250629/gcc/c/c-parser.cc
*** gcc-16-20250622/gcc/c/c-parser.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/c/c-parser.cc	Sun Jun 29 22:32:26 2025
*************** c_parser_oacc_update (c_parser *parser)
*** 22501,22507 ****
  */
  
  #define OACC_WAIT_CLAUSE_MASK						\
! 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC) )
  
  static tree
  c_parser_oacc_wait (location_t loc, c_parser *parser, char *p_name)
--- 22501,22508 ----
  */
  
  #define OACC_WAIT_CLAUSE_MASK						\
! 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
! 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF) )
  
  static tree
  c_parser_oacc_wait (location_t loc, c_parser *parser, char *p_name)
diff -Nrcpad gcc-16-20250622/gcc/c-family/ChangeLog gcc-16-20250629/gcc/c-family/ChangeLog
*** gcc-16-20250622/gcc/c-family/ChangeLog	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/c-family/ChangeLog	Sun Jun 29 22:32:26 2025
***************
*** 1,3 ****
--- 1,18 ----
+ 2025-06-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120777
+ 	* c-cppbuiltin.cc (c_cpp_builtins): Predefine
+ 	__cpp_constexpr_virtual_inheritance=202506L for C++26.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* c-opts.cc (c_common_diagnostics_set_defaults): Use
+ 	diagnostic_context::set_permissive_option.
+ 
+ 2025-06-23  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-omp.cc (c_finish_oacc_wait): Handle if clause.
+ 
  2025-06-16  Jason Merrill  <jason@redhat.com>
  
  	* c.opt: Add -Wsfinae-incomplete.
diff -Nrcpad gcc-16-20250622/gcc/c-family/c-cppbuiltin.cc gcc-16-20250629/gcc/c-family/c-cppbuiltin.cc
*** gcc-16-20250622/gcc/c-family/c-cppbuiltin.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/c-family/c-cppbuiltin.cc	Sun Jun 29 22:32:26 2025
*************** c_cpp_builtins (cpp_reader *pfile)
*** 1094,1099 ****
--- 1094,1100 ----
  	  cpp_define (pfile, "__cpp_variadic_friend=202403L");
  	  cpp_define (pfile, "__cpp_pack_indexing=202311L");
  	  cpp_define (pfile, "__cpp_pp_embed=202502L");
+ 	  cpp_define (pfile, "__cpp_constexpr_virtual_inheritance=202506L");
  	}
        if (flag_concepts && cxx_dialect > cxx14)
  	cpp_define (pfile, "__cpp_concepts=202002L");
diff -Nrcpad gcc-16-20250622/gcc/c-family/c-omp.cc gcc-16-20250629/gcc/c-family/c-omp.cc
*** gcc-16-20250622/gcc/c-family/c-omp.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/c-family/c-omp.cc	Sun Jun 29 22:32:26 2025
*************** c_finish_oacc_wait (location_t loc, tree
*** 52,59 ****
    vec_alloc (args, nparms + 2);
    stmt = builtin_decl_explicit (BUILT_IN_GOACC_WAIT);
  
!   if (omp_find_clause (clauses, OMP_CLAUSE_ASYNC))
!     t = OMP_CLAUSE_ASYNC_EXPR (clauses);
    else
      t = build_int_cst (integer_type_node, GOMP_ASYNC_SYNC);
  
--- 52,59 ----
    vec_alloc (args, nparms + 2);
    stmt = builtin_decl_explicit (BUILT_IN_GOACC_WAIT);
  
!   if ((t = omp_find_clause (clauses, OMP_CLAUSE_ASYNC)))
!     t = OMP_CLAUSE_ASYNC_EXPR (t);
    else
      t = build_int_cst (integer_type_node, GOMP_ASYNC_SYNC);
  
*************** c_finish_oacc_wait (location_t loc, tree
*** 71,76 ****
--- 71,81 ----
  
    stmt = build_call_expr_loc_vec (loc, stmt, args);
  
+   t = omp_find_clause (clauses, OMP_CLAUSE_IF);
+   if (t)
+     stmt = build3_loc (input_location, COND_EXPR, void_type_node,
+ 		       OMP_CLAUSE_IF_EXPR (t), stmt, NULL_TREE);
+ 
    vec_free (args);
  
    return stmt;
diff -Nrcpad gcc-16-20250622/gcc/c-family/c-opts.cc gcc-16-20250629/gcc/c-family/c-opts.cc
*** gcc-16-20250622/gcc/c-family/c-opts.cc	Sun Jun 22 22:32:18 2025
--- gcc-16-20250629/gcc/c-family/c-opts.cc	Sun Jun 29 22:32:26 2025
*************** void
*** 192,198 ****
  c_common_diagnostics_set_defaults (diagnostic_context *context)
  {
    diagnostic_text_finalizer (context) = c_diagnostic_text_finalizer;
!   context->m_opt_permissive = OPT_fpermissive;
  }
  
  /* Input charset configuration for diagnostics.  */
--- 192,198 ----
  c_common_diagnostics_set_defaults (diagnostic_context *context)
  {
    diagnostic_text_finalizer (context) = c_diagnostic_text_finalizer;
!   context->set_permissive_option (OPT_fpermissive);
  }
  
  /* Input charset configuration for diagnostics.  */
diff -Nrcpad gcc-16-20250622/gcc/cfgexpand.cc gcc-16-20250629/gcc/cfgexpand.cc
*** gcc-16-20250622/gcc/cfgexpand.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cfgexpand.cc	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 75,80 ****
--- 75,81 ----
  #include "builtins.h"
  #include "opts.h"
  #include "gimple-range.h"
+ #include "rtl-iter.h"
  
  /* Some systems use __main in a way incompatible with its use in gcc, in these
     cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
*************** expand_gimple_stmt (gimple *stmt)
*** 4458,4466 ****
     tailcall) and the normal result happens via a sqrt instruction.  */
  
  static basic_block
! expand_gimple_tailcall (basic_block bb, gcall *stmt, bool *can_fallthru)
  {
!   rtx_insn *last2, *last;
    edge e;
    edge_iterator ei;
    profile_probability probability;
--- 4459,4468 ----
     tailcall) and the normal result happens via a sqrt instruction.  */
  
  static basic_block
! expand_gimple_tailcall (basic_block bb, gcall *stmt, bool *can_fallthru,
! 			rtx_insn *asan_epilog_seq)
  {
!   rtx_insn *last2, *last, *first = get_last_insn ();
    edge e;
    edge_iterator ei;
    profile_probability probability;
*************** expand_gimple_tailcall (basic_block bb,
*** 4477,4482 ****
--- 4479,4536 ----
    return NULL;
  
   found:
+ 
+   if (asan_epilog_seq)
+     {
+       /* We need to emit a copy of the asan_epilog_seq before
+ 	 the insns emitted by expand_gimple_stmt above.  The sequence
+ 	 can contain labels, which need to be remapped.  */
+       hash_map<rtx, rtx> label_map;
+       start_sequence ();
+       emit_note (NOTE_INSN_DELETED);
+       for (rtx_insn *insn = asan_epilog_seq; insn; insn = NEXT_INSN (insn))
+ 	switch (GET_CODE (insn))
+ 	  {
+ 	  case INSN:
+ 	  case CALL_INSN:
+ 	  case JUMP_INSN:
+ 	    emit_copy_of_insn_after (insn, get_last_insn ());
+ 	    break;
+ 	  case CODE_LABEL:
+ 	    label_map.put ((rtx) insn, (rtx) emit_label (gen_label_rtx ()));
+ 	    break;
+ 	  case BARRIER:
+ 	    emit_barrier ();
+ 	    break;
+ 	  default:
+ 	    gcc_unreachable ();
+ 	  }
+       for (rtx_insn *insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ 	if (JUMP_P (insn))
+ 	  {
+ 	    subrtx_ptr_iterator::array_type array;
+ 	    FOR_EACH_SUBRTX_PTR (iter, array, &PATTERN (insn), ALL)
+ 	      {
+ 		rtx *loc = *iter;
+ 		if (LABEL_REF_P (*loc))
+ 		  {
+ 		    rtx *lab = label_map.get ((rtx) label_ref_label (*loc));
+ 		    gcc_assert (lab);
+ 		    set_label_ref_label (*loc, as_a <rtx_insn *> (*lab));
+ 		  }
+ 	      }
+ 	    if (JUMP_LABEL (insn))
+ 	      {
+ 		rtx *lab = label_map.get (JUMP_LABEL (insn));
+ 		gcc_assert (lab);
+ 		JUMP_LABEL (insn) = *lab;
+ 	      }
+ 	  }
+       asan_epilog_seq = NEXT_INSN (get_insns ());
+       end_sequence ();
+       emit_insn_before (asan_epilog_seq, NEXT_INSN (first));
+     }
+ 
    /* ??? Wouldn't it be better to just reset any pending stack adjust?
       Any instructions emitted here are about to be deleted.  */
    do_pending_stack_adjust ();
*************** reorder_operands (basic_block bb)
*** 6142,6148 ****
  /* Expand basic block BB from GIMPLE trees to RTL.  */
  
  static basic_block
! expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
  {
    gimple_stmt_iterator gsi;
    gimple *stmt = NULL;
--- 6196,6202 ----
  /* Expand basic block BB from GIMPLE trees to RTL.  */
  
  static basic_block
! expand_gimple_basic_block (basic_block bb, rtx_insn *asan_epilog_seq)
  {
    gimple_stmt_iterator gsi;
    gimple *stmt = NULL;
*************** expand_gimple_basic_block (basic_block b
*** 6447,6460 ****
  	{
  	  gcall *call_stmt = dyn_cast <gcall *> (stmt);
  	  if (call_stmt
  	      && gimple_call_tail_p (call_stmt)
! 	      && disable_tail_calls)
  	    gimple_call_set_tail (call_stmt, false);
  
  	  if (call_stmt && gimple_call_tail_p (call_stmt))
  	    {
  	      bool can_fallthru;
! 	      new_bb = expand_gimple_tailcall (bb, call_stmt, &can_fallthru);
  	      if (new_bb)
  		{
  		  if (can_fallthru)
--- 6501,6516 ----
  	{
  	  gcall *call_stmt = dyn_cast <gcall *> (stmt);
  	  if (call_stmt
+ 	      && asan_epilog_seq
  	      && gimple_call_tail_p (call_stmt)
! 	      && !gimple_call_must_tail_p (call_stmt))
  	    gimple_call_set_tail (call_stmt, false);
  
  	  if (call_stmt && gimple_call_tail_p (call_stmt))
  	    {
  	      bool can_fallthru;
! 	      new_bb = expand_gimple_tailcall (bb, call_stmt, &can_fallthru,
! 					       asan_epilog_seq);
  	      if (new_bb)
  		{
  		  if (can_fallthru)
*************** pass_expand::execute (function *fun)
*** 7227,7233 ****
    head_end_for_bb.create (last_basic_block_for_fn (fun));
    FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
  		  next_bb)
!     bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
    disable_ranger (fun);
    FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
  		  next_bb)
--- 7283,7289 ----
    head_end_for_bb.create (last_basic_block_for_fn (fun));
    FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
  		  next_bb)
!     bb = expand_gimple_basic_block (bb, var_ret_seq);
    disable_ranger (fun);
    FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
  		  next_bb)
diff -Nrcpad gcc-16-20250622/gcc/cobol/Make-lang.in gcc-16-20250629/gcc/cobol/Make-lang.in
*** gcc-16-20250622/gcc/cobol/Make-lang.in	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/Make-lang.in	Sun Jun 29 22:32:26 2025
*************** cobol.srcman:
*** 353,358 ****
--- 353,365 ----
  
  cobol.mostlyclean:
  
+ gcobol.clean:
+ # This is intended for non-general use.  It is a last-ditch effort to flush
+ # out all oject files and executable code for gcobol and libgcobol, causing 
+ # a complete rebuild of all executable code.
+ 	rm -fr gcobol cobol1 cobol/*		\
+ 	../*/libgcobol/*
+ 
  cobol.clean:
  	rm -fr gcobol cobol1 cobol/*
  
diff -Nrcpad gcc-16-20250622/gcc/cobol/except.cc gcc-16-20250629/gcc/cobol/except.cc
*** gcc-16-20250622/gcc/cobol/except.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/except.cc	Sun Jun 29 22:32:26 2025
*************** cbl_enabled_exceptions_t::dump() const {
*** 99,109 ****
    }
    int i = 1;
    for( auto& elem : *this ) {
!     dbgmsg("cbl_enabled_exceptions_t: %2d  {%s, %s, %zu}",
             i++,
             elem.location? "with location" : "  no location", 
             ec_type_str(elem.ec),
!            elem.file );
    }
    std::swap(debug, yydebug);
  }
--- 99,109 ----
    }
    int i = 1;
    for( auto& elem : *this ) {
!     dbgmsg("cbl_enabled_exceptions_t: %2d  {%s, %s, %lu}",
             i++,
             elem.location? "with location" : "  no location", 
             ec_type_str(elem.ec),
!            gb4(elem.file) );
    }
    std::swap(debug, yydebug);
  }
diff -Nrcpad gcc-16-20250622/gcc/cobol/genapi.cc gcc-16-20250629/gcc/cobol/genapi.cc
*** gcc-16-20250622/gcc/cobol/genapi.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/genapi.cc	Sun Jun 29 22:32:26 2025
*************** extern int yylineno;
*** 60,66 ****
  #define TSI_BACK (tsi_last(current_function->statement_list_stack.back()))
  
  extern char *cobol_name_mangler(const char *cobol_name);
! static tree gg_attribute_bit_get(struct cbl_field_t *var, cbl_field_attr_t bits);
  
  static tree label_list_out_goto;
  static tree label_list_out_label;
--- 60,67 ----
  #define TSI_BACK (tsi_last(current_function->statement_list_stack.back()))
  
  extern char *cobol_name_mangler(const char *cobol_name);
! static tree gg_attribute_bit_get( struct cbl_field_t *var,
!                                   cbl_field_attr_t bits);
  
  static tree label_list_out_goto;
  static tree label_list_out_label;
*************** treeplet_fill_source(TREEPLET &treeplet,
*** 125,132 ****
  
  tree file_static_variable(tree type, const char *v)
    {
!   // This routine returns a reference to an already-defined file_static variable
!   // You need to know the type that was used for the definition.
    return gg_declare_variable(type, v, NULL, vs_file_static);
    }
  
--- 126,133 ----
  
  tree file_static_variable(tree type, const char *v)
    {
!   // This routine returns a reference to an already-defined file_static
!   // variable. You need to know the type that was used for the definition.
    return gg_declare_variable(type, v, NULL, vs_file_static);
    }
  
*************** static void move_helper(tree        size
*** 142,150 ****
  // set using -f-trace-debug, defined in lang.opt
  int f_trace_debug;
  
! // When doing WRITE statements, the IBM Language Reference and the ISO/IEC_2014
! // standard specify that when the ADVANCING clause is omitted, the default is
! // AFTER ADVANCING 1 LINE.
  //
  // MicroFocus and GnuCOBOL state that the default is BEFORE ADVANCING 1 LINE
  //
--- 143,151 ----
  // set using -f-trace-debug, defined in lang.opt
  int f_trace_debug;
  
! // When doing WRITE statements, the IBM Language Reference and the
! // ISO/IEC_2014 standard specify that when the ADVANCING clause is omitted, the
! // default isAFTER ADVANCING 1 LINE.
  //
  // MicroFocus and GnuCOBOL state that the default is BEFORE ADVANCING 1 LINE
  //
*************** trace1_init()
*** 201,207 ****
      trace_handle = gg_define_variable(INT, "trace_handle", vs_static);
      trace_indent = gg_define_variable(INT, "trace_indent", vs_static);
  
!     bTRACE1 = getenv("GCOBOL_TRACE") ? getenv("GCOBOL_TRACE") : gv_trace_switch;
  
      if( bTRACE1 && strcmp(bTRACE1, "0") != 0 )
        {
--- 202,208 ----
      trace_handle = gg_define_variable(INT, "trace_handle", vs_static);
      trace_indent = gg_define_variable(INT, "trace_indent", vs_static);
  
!     bTRACE1 = getenv("GCOBOL_TRACE") ? getenv("GCOBOL_TRACE") :gv_trace_switch;
  
      if( bTRACE1 && strcmp(bTRACE1, "0") != 0 )
        {
*************** build_main_that_calls_something(const ch
*** 267,277 ****
  
    gg_set_current_line_number(DEFAULT_LINE_NUMBER);
  
!   gg_define_function( INT,
!                       "main",
!                       INT, "argc",
!                       build_pointer_type(CHAR_P), "argv",
!                       NULL_TREE);
  
    // Pick up pointers to the input parameters:
    // First is the INT which is the number of argv[] entries
--- 268,289 ----
  
    gg_set_current_line_number(DEFAULT_LINE_NUMBER);
  
!   tree function_decl = gg_define_function( INT,
!                                            "main",
!                                            "main",
!                                            INT, "argc",
!                                            build_pointer_type(CHAR_P), "argv",
!                                            NULL_TREE);
! 
!   // Modify the default settings for main(), as empirically determined from
!   // examining C/C+_+ compilations.  (See the comment for gg_build_fn_decl()).
!     TREE_ADDRESSABLE(function_decl) = 0;
!     TREE_USED(function_decl) = 0;
!     TREE_NOTHROW(function_decl) = 0;
!     TREE_STATIC(function_decl) = 1;
!     DECL_EXTERNAL (function_decl) = 0;
!     TREE_PUBLIC (function_decl) = 1;
!     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 1;
  
    // Pick up pointers to the input parameters:
    // First is the INT which is the number of argv[] entries
*************** struct called_tree_t {
*** 701,723 ****
    };
  };
  
! static std::map<program_reference_t, std::list<called_tree_t> > call_targets;
  static std::map<tree, cbl_call_convention_t> called_targets;
  
! static void
! parser_call_target( tree func )
    {
!     cbl_call_convention_t convention = current_call_convention();
!     const char *name = IDENTIFIER_POINTER( DECL_NAME(func) );
!     program_reference_t key(current_program_index(), name);
  
!     // Each func is unique and inserted only once.
!     assert( called_targets.find(func) == called_targets.end() );
!     called_targets[func] = convention;
  
!     called_tree_t value(func, convention);
!     auto& p = call_targets[key];
!     p.push_back(value);
    }
  
  /*
--- 713,747 ----
    };
  };
  
! static std::map<program_reference_t, std::list<tree> > call_targets;
  static std::map<tree, cbl_call_convention_t> called_targets;
  
! static
! void
! set_call_convention(tree function_decl, cbl_call_convention_t convention)
    {
!   called_targets[function_decl] = convention;
!   }
  
! static
! void
! parser_call_target( const char *name, tree call_expr )
!   {
!   /*  This routine gets called when parser_call() has been invoked with a
!       literal target.  That target is a COBOL name like "prog_2".  However,
!       there is the case when "prog_2" is a forward reference to a contained
!       program nested inside "prog_1".  In that case, the actual definition
!       of "prog_2" will end up with a name like "prog_2.62", and eventually
!       the target of the call will have to be modified from "prog_2" to
!       "prog_2.62".
  
!       We save the call expression for this call, and then we update it later,
!       after we know whether or not it was a forward reference to a local
!       function. */
! 
!   program_reference_t key(current_program_index(), name);
!   auto& p = call_targets[key];
!   p.push_back(call_expr);
    }
  
  /*
*************** parser_call_target( tree func )
*** 729,738 ****
  cbl_call_convention_t
  parser_call_target_convention( tree func )
    {
!     auto p = called_targets.find(func);
!     if( p != called_targets.end() ) return p->second;
  
!     return cbl_call_cobol_e;
    }
  
  void
--- 753,766 ----
  cbl_call_convention_t
  parser_call_target_convention( tree func )
    {
!   auto p = called_targets.find(func);
!   if( p != called_targets.end() )
!     {
!     // This was found in our list of call targets
!     return p->second;
!     }
  
!   return cbl_call_cobol_e;
    }
  
  void
*************** parser_call_targets_dump()
*** 748,754 ****
                k.called);
        char ch = '[';
        for( auto func : v ) {
!         fprintf( stderr, "%c %s", ch, IDENTIFIER_POINTER(DECL_NAME(func.node)) );
          ch = ',';
        }
        fprintf(stderr, " ]\n");
--- 776,782 ----
                k.called);
        char ch = '[';
        for( auto func : v ) {
!         fprintf( stderr, "%c %s", ch, IDENTIFIER_POINTER(DECL_NAME(func)) );
          ch = ',';
        }
        fprintf(stderr, " ]\n");
*************** parser_call_target_update( size_t caller
*** 760,779 ****
                             const char plain_name[],
                             const char mangled_name[] )
    {
!     auto key = program_reference_t(caller, plain_name);
!     auto p = call_targets.find(key);
!     if( p == call_targets.end() ) return 0;
  
!     for( auto func : p->second )
!       {
!       func.convention = cbl_call_verbatim_e;
!       DECL_NAME(func.node) = get_identifier(mangled_name);
!       }
!     return p->second.size();
    }
  
  static tree
! function_handle_from_name(cbl_refer_t &name,
                            tree function_return_type)
    {
    Analyze();
--- 788,814 ----
                             const char plain_name[],
                             const char mangled_name[] )
    {
!   auto key = program_reference_t(caller, plain_name);
!   auto p = call_targets.find(key);
!   if( p == call_targets.end() ) return 0;
  
!   for( auto call_expr : p->second )
!     {
!     tree fndecl_type = build_varargs_function_type_array( COBOL_FUNCTION_RETURN_TYPE,
!                        0,     // No parameters yet
!                        NULL); // And, hence, no types
! 
!     // Fetch the FUNCTION_DECL for that FUNCTION_TYPE
!     tree function_decl = gg_build_fn_decl(mangled_name, fndecl_type);
!     tree function_address = gg_get_address_of(function_decl);
! 
!     TREE_OPERAND(call_expr, 1) = function_address;
!     }
!   return p->second.size();
    }
  
  static tree
! function_pointer_from_name(cbl_refer_t &name,
                            tree function_return_type)
    {
    Analyze();
*************** function_handle_from_name(cbl_refer_t &n
*** 782,851 ****
                          function_return_type,
                          0,
                          NULL);
!   tree function_pointer = build_pointer_type(function_type);
!   tree function_handle  = gg_define_variable(function_pointer, "..function_handle.1", vs_stack);
! 
    if( name.field->type == FldPointer )
      {
      // If the parameter is a pointer, just pick up the value and head for the
      // exit
      if( refer_is_clean(name) )
        {
!       gg_memcpy(gg_get_address_of(function_handle),
                  member(name.field->var_decl_node, "data"),
                  sizeof_pointer);
        }
      else
        {
!       gg_memcpy(gg_get_address_of(function_handle),
                  qualified_data_location(name),
                  sizeof_pointer);
        }
!     return function_handle;
      }
    else if( use_static_call() && is_literal(name.field) )
      {
!     // It's a literal, and we are using static calls. Generate the CALL, and
!     // pass the address expression to parser_call_target().  That will cause
!     // parser_call_target_update() to replace any nested CALL "foo" with the
!     // local "foo.60" name.
! 
!     // We create a reference to it, which is later resolved by the linker.
!     tree addr_expr = gg_get_function_address( function_return_type,
!                                               name.field->data.initial);
!     gg_assign(function_handle, addr_expr);
  
!     tree func = TREE_OPERAND(addr_expr, 0);
!     parser_call_target(func); // add function to list of call targets
      }
    else
      {
!     // This is not a literal or static
      if( name.field->type == FldLiteralA )
        {
!       gg_assign(function_handle,
                  gg_cast(build_pointer_type(function_type),
!                         gg_call_expr(VOID_P,
!                                     "__gg__function_handle_from_literal",
!                                     build_int_cst_type(INT, current_function->our_symbol_table_index),
!                                     gg_string_literal(name.field->data.initial),
!                                     NULL_TREE)));
        }
      else
        {
!       gg_assign(function_handle,
                  gg_cast(build_pointer_type(function_type),
                          gg_call_expr( VOID_P,
!                                       "__gg__function_handle_from_name",
!                                       build_int_cst_type(INT, current_function->our_symbol_table_index),
!                                       gg_get_address_of(name.field->var_decl_node),
!                                       refer_offset(name),
!                                       refer_size_source(  name),
!                                       NULL_TREE)));
        }
      }
  
!   return function_handle;
    }
  
  void
--- 817,887 ----
                          function_return_type,
                          0,
                          NULL);
!   tree function_pointer_type = build_pointer_type(function_type);
!   tree function_pointer       = gg_define_variable(function_pointer_type,
!                                                   "..function_pointer.1",
!                                                   vs_stack);
    if( name.field->type == FldPointer )
      {
      // If the parameter is a pointer, just pick up the value and head for the
      // exit
      if( refer_is_clean(name) )
        {
!       gg_memcpy(gg_get_address_of(function_pointer),
                  member(name.field->var_decl_node, "data"),
                  sizeof_pointer);
        }
      else
        {
!       gg_memcpy(gg_get_address_of(function_pointer),
                  qualified_data_location(name),
                  sizeof_pointer);
        }
!     return function_pointer;
      }
    else if( use_static_call() && is_literal(name.field) )
      {
!     tree fndecl_type = build_varargs_function_type_array( function_return_type,
!                        0,     // No parameters yet
!                        NULL); // And, hence, no types
  
!     // Fetch the FUNCTION_DECL for that FUNCTION_TYPE
!     tree function_decl = gg_build_fn_decl(name.field->data.initial,
!                                           fndecl_type);
!     // Take the address of the function decl:
!     tree address_of_function = gg_get_address_of(function_decl);
!     gg_assign(function_pointer, address_of_function);
      }
    else
      {
!     // We are not using static calls.
      if( name.field->type == FldLiteralA )
        {
!       gg_assign(function_pointer,
                  gg_cast(build_pointer_type(function_type),
!                         gg_call_expr( VOID_P,
!                                   "__gg__function_handle_from_literal",
!                                   build_int_cst_type(INT,
!                                     current_function->our_symbol_table_index),
!                                   gg_string_literal(name.field->data.initial),
!                                   NULL_TREE)));
        }
      else
        {
!       gg_assign(function_pointer,
                  gg_cast(build_pointer_type(function_type),
                          gg_call_expr( VOID_P,
!                                 "__gg__function_handle_from_name",
!                                 build_int_cst_type(INT,
!                                 current_function->our_symbol_table_index),
!                                 gg_get_address_of(name.field->var_decl_node),
!                                 refer_offset(name),
!                                 refer_size_source(  name),
!                                 NULL_TREE)));
        }
      }
  
!   return function_pointer;
    }
  
  void
*************** parser_initialize_programs(size_t nprogs
*** 879,889 ****
  
    for( size_t i=0; i<nprogs; i++ )
      {
!     tree function_handle = function_handle_from_name( progs[i],
!                                                     COBOL_FUNCTION_RETURN_TYPE);
      gg_call(VOID,
              "__gg__to_be_canceled",
!             gg_cast(SIZE_T, function_handle),
              NULL_TREE);
      }
    }
--- 915,925 ----
  
    for( size_t i=0; i<nprogs; i++ )
      {
!     tree function_pointer = function_pointer_from_name( progs[i],
!                                                         COBOL_FUNCTION_RETURN_TYPE);
      gg_call(VOID,
              "__gg__to_be_canceled",
!             gg_cast(SIZE_T, function_pointer),
              NULL_TREE);
      }
    }
*************** set_exception_environment( tree ecs, tre
*** 1077,1083 ****
    }
  
  void
! parser_statement_begin( const cbl_name_t statement_name, 
                          tree ecs,
                          tree dcls )
    {
--- 1113,1119 ----
    }
  
  void
! parser_statement_begin( const cbl_name_t statement_name,
                          tree ecs,
                          tree dcls )
    {
*************** parser_statement_begin( const cbl_name_t
*** 1116,1122 ****
    // operation, we need to store the location information and do the exception
    // overhead:
  
!   static const std::set<std::string> file_ops = 
      {
      "OPEN",
      "CLOSE",
--- 1152,1158 ----
    // operation, we need to store the location information and do the exception
    // overhead:
  
!   static const std::set<std::string> file_ops =
      {
      "OPEN",
      "CLOSE",
*************** parser_leave_file()
*** 3707,3713 ****
      {
      SHOW_PARSE_HEADER
      char ach[256];
!     sprintf(ach, "leaving level:%d %s", file_level, current_filename.back().c_str());
      SHOW_PARSE_TEXT(ach)
      SHOW_PARSE_END
      }
--- 3743,3752 ----
      {
      SHOW_PARSE_HEADER
      char ach[256];
!     sprintf(ach,
!             "leaving level:%d %s",
!             file_level,
!             current_filename.back().c_str());
      SHOW_PARSE_TEXT(ach)
      SHOW_PARSE_END
      }
*************** parser_leave_file()
*** 3717,3722 ****
--- 3756,3768 ----
      }
    file_level -= 1;
    current_filename.pop_back();
+ 
+   if( file_level == 0 )
+     {
+     // We are leaving the top-level file, which means this compilation is
+     // done, done, done.
+     gg_leaving_the_source_code_file();
+     }
    }
  
  void
*************** enter_program_common(const char *funcnam
*** 3731,3745 ****
    // have no parameters.  We'll chain the parameters on in parser_division(),
    // when we process PROCEDURE DIVISION USING...
  
!   gg_define_function_with_no_parameters( COBOL_FUNCTION_RETURN_TYPE,
!                                          funcname,
!                                          funcname_);
  
    current_function->first_time_through =
!     gg_define_variable(INT,
!                         "_first_time_through",
!                         vs_static,
!                         integer_one_node);
  
    gg_create_goto_pair(&current_function->skip_init_goto,
                        &current_function->skip_init_label);
--- 3777,3792 ----
    // have no parameters.  We'll chain the parameters on in parser_division(),
    // when we process PROCEDURE DIVISION USING...
  
!   gg_define_function(COBOL_FUNCTION_RETURN_TYPE,
!                      funcname,
!                      funcname_,
!                      NULL_TREE);
  
    current_function->first_time_through =
!                                   gg_define_variable(INT,
!                                                       "_first_time_through",
!                                                       vs_static,
!                                                       integer_one_node);
  
    gg_create_goto_pair(&current_function->skip_init_goto,
                        &current_function->skip_init_label);
*************** enter_program_common(const char *funcnam
*** 3764,3771 ****
    current_function->current_section = NULL;
    current_function->current_paragraph = NULL;
  
-   current_function->is_truly_nested = false;
- 
    // Text conversion must be initialized before the code generated by
    // parser_symbol_add runs.
  
--- 3811,3816 ----
*************** parser_enter_program( const char *funcna
*** 3825,3844 ****
    // The first thing we have to do is mangle this name.  This is safe even
    // though the end result will be mangled again, because the mangler doesn't
    // change a mangled name.
!   char *mangled_name = cobol_name_mangler(funcname_);
  
    size_t parent_index = current_program_index();
!   char funcname[128];
    if( parent_index )
      {
      // This is a nested function.  Tack on the parent_index to the end of it.
!     sprintf(funcname, "%s." HOST_SIZE_T_PRINT_DEC, mangled_name,
!             (fmt_size_t)parent_index);
      }
    else
      {
      // This is a top-level function; just use the straight mangled name
!     strcpy(funcname, mangled_name);
      }
    free(mangled_name);
  
--- 3870,3900 ----
    // The first thing we have to do is mangle this name.  This is safe even
    // though the end result will be mangled again, because the mangler doesn't
    // change a mangled name.
!    
!   char *mangled_name;
!  
!   if( current_call_convention() == cbl_call_cobol_e )
!     {
!     mangled_name = cobol_name_mangler(funcname_);
!     }
!   else
!     {
!     mangled_name = xstrdup(funcname_);
!     }
  
    size_t parent_index = current_program_index();
!   char *funcname;
    if( parent_index )
      {
      // This is a nested function.  Tack on the parent_index to the end of it.
!     funcname = xasprintf( "%s." HOST_SIZE_T_PRINT_DEC,
!                           mangled_name,
!                           (fmt_size_t)parent_index);
      }
    else
      {
      // This is a top-level function; just use the straight mangled name
!     funcname = xstrdup(mangled_name);
      }
    free(mangled_name);
  
*************** parser_enter_program( const char *funcna
*** 3904,3909 ****
--- 3960,3967 ----
      TRACE1_TEXT("\"")
      TRACE1_END
      }
+ 
+   free(funcname);
    }
  
  void
*************** tree_type_from_field_type(cbl_field_t *f
*** 5973,5979 ****
        case FldNumericDisplay:
        case FldNumericBinary:
        case FldPacked:
!         if( field->data.digits > 18 )
            {
            retval = UINT128;
            nbytes = 16;
--- 6031,6037 ----
        case FldNumericDisplay:
        case FldNumericBinary:
        case FldPacked:
!       if( field->data.digits > 18 )
            {
            retval = UINT128;
            nbytes = 16;
*************** tree_type_from_field_type(cbl_field_t *f
*** 6031,6044 ****
                  cbl_field_type_str(field->type));
          break;
        }
!     }
!   if( retval == SIZE_T && field->attr & signable_e )
!     {
!     retval = SSIZE_T;
!     }
!   if( retval == UINT128 && field->attr & signable_e )
!     {
!     retval = INT128;
      }
    return retval;
    }
--- 6089,6102 ----
                  cbl_field_type_str(field->type));
          break;
        }
!     if( retval == SIZE_T && field->attr & signable_e )
!       {
!       retval = SSIZE_T;
!       }
!     if( retval == UINT128 && field->attr & signable_e )
!       {
!       retval = INT128;
!       }
      }
    return retval;
    }
*************** restore_local_variables()
*** 6054,6065 ****
  
  static inline bool
  is_valuable( cbl_field_type_t type ) {
    switch ( type ) {
    case FldInvalid:
    case FldGroup:
    case FldAlphanumeric:
    case FldNumericEdited:
-   case FldAlphaEdited:
    case FldLiteralA:
    case FldClass:
    case FldConditional:
--- 6112,6124 ----
  
  static inline bool
  is_valuable( cbl_field_type_t type ) {
+   /*  The name of this routine is a play on words, in English.  It doesn't
+       mean "Is worth a lot".  It means "Can be converted to a value." */
    switch ( type ) {
    case FldInvalid:
    case FldGroup:
    case FldAlphanumeric:
    case FldNumericEdited:
    case FldLiteralA:
    case FldClass:
    case FldConditional:
*************** is_valuable( cbl_field_type_t type ) {
*** 6072,6077 ****
--- 6131,6137 ----
    // COBOL form to a little-endian binary representation so that they
    // can be conveyed BY CONTENT/BY VALUE in a CALL or user-defined
    // function activation.
+   case FldAlphaEdited:
    case FldNumericDisplay:
    case FldNumericBinary:
    case FldFloat:
*************** parser_exit_program(void)  // exits back
*** 6126,6132 ****
  
  static
  void
! pe_stuff(cbl_refer_t refer, ec_type_t ec)
    {
    // This is the moral equivalent of a C "return xyz;".
  
--- 6186,6192 ----
  
  static
  void
! program_end_stuff(cbl_refer_t refer, ec_type_t ec)
    {
    // This is the moral equivalent of a C "return xyz;".
  
*************** pe_stuff(cbl_refer_t refer, ec_type_t ec
*** 6149,6157 ****
  
      gg_assign(retval, gg_cast(return_type, integer_zero_node));
  
-     gg_modify_function_type(current_function->function_decl,
-                             return_type);
- 
      if( is_valuable( field_type ) )
        {
        // The field being returned is numeric.
--- 6209,6214 ----
*************** parser_exit( const cbl_refer_t& refer, e
*** 6254,6260 ****
      IF( current_function->called_by_main_counter, eq_op, integer_zero_node )
        {
        // This function wasn't called by main, so we treat it like a GOBACK
!       pe_stuff(refer, ec);
        }
      ELSE
        {
--- 6311,6317 ----
      IF( current_function->called_by_main_counter, eq_op, integer_zero_node )
        {
        // This function wasn't called by main, so we treat it like a GOBACK
!       program_end_stuff(refer, ec);
        }
      ELSE
        {
*************** parser_exit( const cbl_refer_t& refer, e
*** 6265,6271 ****
          // This was a recursive call into the function originally called by
          // main.  Because we are under the control of a calling program, we
          // treat this like a GOBACK
!         pe_stuff(refer, ec);
          }
        ELSE
          {
--- 6322,6328 ----
          // This was a recursive call into the function originally called by
          // main.  Because we are under the control of a calling program, we
          // treat this like a GOBACK
!         program_end_stuff(refer, ec);
          }
        ELSE
          {
*************** parser_exit( const cbl_refer_t& refer, e
*** 6290,6296 ****
        {
        }
        ENDIF
!     pe_stuff(refer, ec);
      }
    }
  
--- 6347,6353 ----
        {
        }
        ENDIF
!     program_end_stuff(refer, ec);
      }
    }
  
*************** parser_division(cbl_division_t division,
*** 6802,6807 ****
--- 6859,6868 ----
        {
        parser_local_add(returning);
        current_function->returning = returning;
+ 
+       size_t nbytes = 0;
+       tree returning_type = tree_type_from_field_type(returning, nbytes);
+       gg_modify_function_type(current_function->function_decl, returning_type);
        }
  
      // Stash the returning variables for use during parser_return()
*************** static
*** 12462,12472 ****
  void
  create_and_call(size_t narg,
                  cbl_ffi_arg_t args[],
!                 tree function_handle,
                  tree returned_value_type,
                  cbl_refer_t returned,
!                 cbl_label_t *not_except
!                 )
    {
    // We have a good function handle, so we are going to create a call
    tree *arguments = NULL;
--- 12523,12533 ----
  void
  create_and_call(size_t narg,
                  cbl_ffi_arg_t args[],
!                 tree function_pointer,
!                 const char *funcname,
                  tree returned_value_type,
                  cbl_refer_t returned,
!                 cbl_label_t *not_except)
    {
    // We have a good function handle, so we are going to create a call
    tree *arguments = NULL;
*************** create_and_call(size_t narg,
*** 12687,12714 ****
    gg_assign(var_decl_call_parameter_count,
              build_int_cst_type(INT, narg));
  
!   gg_assign(var_decl_call_parameter_signature,
!             gg_cast(CHAR_P, function_handle));
  
!   tree call_expr = gg_call_expr_list( returned_value_type,
!                                       function_handle,
                                        narg,
!                                       arguments );
    tree returned_value;
    if( returned.field )
      {
!     returned_value = gg_define_variable(returned_value_type);
  
!     // We are expecting a return value of type CHAR_P, SSIZE_T, SIZE_T,
!     // UINT128 or INT128
      push_program_state();
      gg_assign(returned_value, gg_cast(returned_value_type, call_expr));
      pop_program_state();
  
-     // Because the CALL had a RETURNING clause, RETURN-CODE doesn't return a
-     // value.  So, we make sure it is zero
- ////    gg_assign(var_decl_return_code, build_int_cst_type(SHORT, 0));
- 
      if( returned_value_type == CHAR_P )
        {
        tree returned_location = gg_define_uchar_star();
--- 12748,12814 ----
    gg_assign(var_decl_call_parameter_count,
              build_int_cst_type(INT, narg));
  
!   tree call_expr = NULL_TREE;
!   if( function_pointer )
!     {
!     gg_assign(var_decl_call_parameter_signature,
!               gg_cast(CHAR_P, function_pointer));
  
!     call_expr = gg_call_expr_list(returned_value_type,
!                                   function_pointer,
!                                   narg,
!                                   arguments );
!     }
!   else
!     {
!     tree fndecl_type = build_varargs_function_type_array( returned_value_type,
!                        0,     // No parameters yet
!                        NULL); // And, hence, no types
! 
!     // Fetch the FUNCTION_DECL for that FUNCTION_TYPE
!     tree function_decl = gg_build_fn_decl(funcname, fndecl_type);
!     set_call_convention(function_decl, current_call_convention());
!     
!     // Take the address of the function decl:
!     tree address_of_function = gg_get_address_of(function_decl);
! 
!     // Stash that address as the called program's signature:
!     tree address_as_char_p = gg_cast(CHAR_P, address_of_function);
!     tree assigment = gg_assign( var_decl_call_parameter_signature,
!                                 address_as_char_p);
!     // The source of the assigment is the second element of a MODIFY_EXPR
!     parser_call_target( funcname, assigment );
! 
!     // Create the call_expr from that address
!     call_expr = build_call_array_loc( location_from_lineno(),
!                                       returned_value_type,
!                                       address_of_function,
                                        narg,
!                                       arguments);
!     // Among other possibilities, this might be a forward reference to a
!     // contained function.  The name  here is "prog2", and ultimately will need
!     // to be replaced with a call to "prog2.62".  So, this call expr goes into
!     // a list of call expressions whose function_decl targets will be replaced.
!     parser_call_target( funcname, call_expr );
!     }
! 
    tree returned_value;
+ 
    if( returned.field )
      {
!     // Because the CALL had a RETURNING clause, RETURN-CODE doesn't return a
!     // value.  So, we make sure it is zero
!     //// gg_assign(var_decl_return_code, build_int_cst_type(SHORT, 0));
  
!     // We expect the return value to be a 64-bit or 128-bit integer.  How
!     // we treat that returned value depends on the target.
! 
!     // Pick up that value:
!     returned_value = gg_define_variable(returned_value_type);
      push_program_state();
      gg_assign(returned_value, gg_cast(returned_value_type, call_expr));
      pop_program_state();
  
      if( returned_value_type == CHAR_P )
        {
        tree returned_location = gg_define_uchar_star();
*************** parser_call(   cbl_refer_t name,
*** 12918,12956 ****
    // We are getting close to establishing the function_type.  To do that,
    // we want to establish the function's return type.
  
- //  gg_push_context();
    size_t nbytes;
    tree returned_value_type = tree_type_from_field_type(returned.field, nbytes);
  
!   tree function_handle = function_handle_from_name( name,
!                                                     returned_value_type);
!   if(    (use_static_call() && is_literal(name.field))
!       || (name.field && name.field->type == FldPointer) )
      {
!     // If these conditions are true, then we know we have a good
!     // function_handle, and we don't need to check
      create_and_call(narg,
                      args,
!                     function_handle,
                      returned_value_type,
                      returned,
!                     not_except
!                     );
      }
    else
      {
      // We might not have a good handle, so we have to check:
!     IF( function_handle,
          ne_op,
!         gg_cast(TREE_TYPE(function_handle), null_pointer_node) )
        {
!       create_and_call(narg,
!                       args,
!                       function_handle,
!                       returned_value_type,
!                       returned,
!                       not_except
!                       );
        }
      ELSE
        {
--- 13018,13066 ----
    // We are getting close to establishing the function_type.  To do that,
    // we want to establish the function's return type.
  
    size_t nbytes;
    tree returned_value_type = tree_type_from_field_type(returned.field, nbytes);
  
!   if( use_static_call() && is_literal(name.field) )
      {
!     // name is a literal
      create_and_call(narg,
                      args,
!                     NULL_TREE,
!                     name.field->data.initial,
                      returned_value_type,
                      returned,
!                     not_except);
!     }
!   else if( name.field && name.field->type == FldPointer )
!     {
!     tree function_pointer = function_pointer_from_name( name,
!                                                         returned_value_type);
!     // This is call-by-pointer; we know function_pointer is good:
!     create_and_call(narg,
!                     args,
!                     function_pointer,
!                     nullptr,
!                     returned_value_type,
!                     returned,
!                     not_except);
      }
    else
      {
+     tree function_pointer = function_pointer_from_name( name,
+                                                       returned_value_type);
      // We might not have a good handle, so we have to check:
!     IF( function_pointer,
          ne_op,
!         gg_cast(TREE_TYPE(function_pointer), null_pointer_node) )
        {
!     create_and_call(narg,
!                     args,
!                     function_pointer,
!                     nullptr,
!                     returned_value_type,
!                     returned,
!                     not_except);
        }
      ELSE
        {
*************** parser_call(   cbl_refer_t name,
*** 12998,13005 ****
      gg_append_statement( not_except->structs.call_exception->bottom.label );
      free( not_except->structs.call_exception );
      }
- //  gg_pop_context();
- 
    }
  
  // Set global variable to use alternative ENTRY point.
--- 13108,13113 ----
*************** parser_set_pointers( size_t ntgt, cbl_re
*** 13195,13204 ****
              || source.field->type == FldLiteralA))
        {
        // This is something like SET varp TO ENTRY "ref".
!       tree function_handle = function_handle_from_name(source,
                                                     COBOL_FUNCTION_RETURN_TYPE);
        gg_memcpy(qualified_data_location(tgts[i]),
!                 gg_get_address_of(function_handle),
                  sizeof_pointer);
        }
      else
--- 13303,13312 ----
              || source.field->type == FldLiteralA))
        {
        // This is something like SET varp TO ENTRY "ref".
!       tree function_pointer = function_pointer_from_name(source,
                                                     COBOL_FUNCTION_RETURN_TYPE);
        gg_memcpy(qualified_data_location(tgts[i]),
!                 gg_get_address_of(function_pointer),
                  sizeof_pointer);
        }
      else
*************** parser_program_hierarchy( const cbl_prog
*** 13453,13459 ****
          // We haven't seen this caller before
          callers.insert(caller);
  
!         char ach[2*sizeof(cbl_name_t)];
          tree names_table_type = build_array_type_nelts(CHAR_P, mol->second.size()+1);
          sprintf(ach, "..our_accessible_functions_" HOST_SIZE_T_PRINT_DEC,
                  (fmt_size_t)caller);
--- 13561,13567 ----
          // We haven't seen this caller before
          callers.insert(caller);
  
!         char ach[3*sizeof(cbl_name_t)];
          tree names_table_type = build_array_type_nelts(CHAR_P, mol->second.size()+1);
          sprintf(ach, "..our_accessible_functions_" HOST_SIZE_T_PRINT_DEC,
                  (fmt_size_t)caller);
*************** parser_program_hierarchy( const cbl_prog
*** 13480,13486 ****
                callee != mol->second.end();
                callee++ )
            {
!           sprintf(ach, "%s." HOST_SIZE_T_PRINT_DEC, (*callee)->name,
                    (fmt_size_t)(*callee)->parent_node->our_index);
  
            CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr_names),
--- 13588,13596 ----
                callee != mol->second.end();
                callee++ )
            {
!           sprintf(ach,
!                   "%s." HOST_SIZE_T_PRINT_DEC,
!                   (*callee)->name,
                    (fmt_size_t)(*callee)->parent_node->our_index);
  
            CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr_names),
*************** psa_FldLiteralA(struct cbl_field_t *fiel
*** 16238,16251 ****
    // We have the original nul-terminated text at data.initial.  We have a
    // copy of it in buffer[] in the internal codeset.
  
    // We will reuse a single static structure for each string
    static std::unordered_map<std::string, int> seen_before;
    std::string field_string(buffer);
    std::unordered_map<std::string, int>::const_iterator it =
                seen_before.find(field_string);
  
-   static const char name_base[] = "_literal_a_";
- 
    if( it != seen_before.end() )
      {
      // We've seen that string before.
--- 16348,16375 ----
    // We have the original nul-terminated text at data.initial.  We have a
    // copy of it in buffer[] in the internal codeset.
  
+   static const char name_base[] = "_literal_a_";
+ 
    // We will reuse a single static structure for each string
    static std::unordered_map<std::string, int> seen_before;
+ 
    std::string field_string(buffer);
+ 
+ #if 0
+   /*  This code is suppoed to re-use literals, and seems to work just fine in
+       x86_64-linux and on an Apple aarch64 M1 Macbook Pro.  But on an M1
+       mini, using -Os optimization, attempts were made in the generated
+       assembly language to define _literal_a_1 more than once.
+ 
+       I didn't know how to try to track this one down, so I decided simply to
+       punt by removing the code.
+ 
+       I am leaving the code here because of a conviction that it someday should
+       be tracked down. */
+ 
    std::unordered_map<std::string, int>::const_iterator it =
                seen_before.find(field_string);
  
    if( it != seen_before.end() )
      {
      // We've seen that string before.
*************** psa_FldLiteralA(struct cbl_field_t *fiel
*** 16258,16266 ****
                                                    vs_file_static);
      }
    else
      {
      // We have not seen that string before
!     static int nvar = 1;
      seen_before[field_string] = nvar;
  
      char ach[32];
--- 16382,16392 ----
                                                    vs_file_static);
      }
    else
+ #endif    
      {
      // We have not seen that string before
!     static int nvar = 0;
!     nvar += 1;
      seen_before[field_string] = nvar;
  
      char ach[32];
*************** psa_FldLiteralA(struct cbl_field_t *fiel
*** 16280,16286 ****
      TREE_USED(field->var_decl_node) = 1;
      TREE_STATIC(field->var_decl_node) = 1;
      DECL_PRESERVE_P (field->var_decl_node) = 1;
-     nvar += 1;
      }
  //  TRACE1
  //    {
--- 16406,16411 ----
*************** parser_symbol_add(struct cbl_field_t *ne
*** 16564,16570 ****
  
      if( !ancestor && (new_var->level > LEVEL01 && new_var->level <= LEVEL49 ) )
        {
!       cbl_internal_error("%s: %d %qs has NULL ancestor", __func__, 
                           new_var->level, new_var->name);
        }
  
--- 16689,16695 ----
  
      if( !ancestor && (new_var->level > LEVEL01 && new_var->level <= LEVEL49 ) )
        {
!       cbl_internal_error("%s: %d %qs has NULL ancestor", __func__,
                           new_var->level, new_var->name);
        }
  
diff -Nrcpad gcc-16-20250622/gcc/cobol/genapi.h gcc-16-20250629/gcc/cobol/genapi.h
*** gcc-16-20250622/gcc/cobol/genapi.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/genapi.h	Sun Jun 29 22:32:26 2025
***************
*** 7,13 ****
   *
   * * Redistributions of source code must retain the above copyright
   *   notice, this list of conditions and the following disclaimer.
!  * * Redistributions in binary form must reproduce the above
   *   copyright notice, this list of conditions and the following disclaimer
   *   in the documentation and/or other materials provided with the
   *   distribution.
--- 7,13 ----
   *
   * * Redistributions of source code must retain the above copyright
   *   notice, this list of conditions and the following disclaimer.
!  * * Redistributions in binary form must reproduce the above`
   *   copyright notice, this list of conditions and the following disclaimer
   *   in the documentation and/or other materials provided with the
   *   distribution.
diff -Nrcpad gcc-16-20250622/gcc/cobol/gengen.cc gcc-16-20250629/gcc/cobol/gengen.cc
*** gcc-16-20250622/gcc/cobol/gengen.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/gengen.cc	Sun Jun 29 22:32:26 2025
*************** tree bool_false_node;
*** 136,141 ****
--- 136,149 ----
  
  struct cbl_translation_unit_t gg_trans_unit;
  
+ // This set is used to prevent duplicated top-level program names from breaking
+ // the compiler when a source code module makes that mistake.
+ static std::unordered_set<std::string> names_we_have_seen;
+ 
+ // This vector is used to process the function_decls at the point we leave 
+ // the file.
+ static std::vector<tree> finalized_function_decls;
+ 
  void
  gg_build_translation_unit(const char *filename)
    {
*************** adjust_for_type(tree type)
*** 354,366 ****
    return retval;
    }
  
- static
  char *
! show_type(tree type)
    {
    if( !type )
      {
!     cbl_internal_error("The given type is not NULL, and that is just not fair");
      }
  
    if( DECL_P(type) )
--- 362,373 ----
    return retval;
    }
  
  char *
! gg_show_type(tree type)
    {
    if( !type )
      {
!     cbl_internal_error("The given type is NULL, and that is just not fair");
      }
  
    if( DECL_P(type) )
*************** show_type(tree type)
*** 372,382 ****
      cbl_internal_error("The given type is not a declaration or a TYPE");
      }
  
!   static char ach[1024];
    switch( TREE_CODE(type) )
      {
      case POINTER_TYPE:
!       sprintf(ach, "POINTER");
        break;
  
      case VOID_TYPE:
--- 379,392 ----
      cbl_internal_error("The given type is not a declaration or a TYPE");
      }
  
!   static char ach[1100];
!   static char ach2[1024];
!   static char ach3[1024];
    switch( TREE_CODE(type) )
      {
      case POINTER_TYPE:
!       strcpy(ach2, gg_show_type(TREE_TYPE(type)));
!       sprintf(ach, "POINTER to %s", ach2);
        break;
  
      case VOID_TYPE:
*************** show_type(tree type)
*** 405,415 ****
        break;
  
      case FUNCTION_TYPE:
!       sprintf(ach, "FUNCTION");
! //      sprintf(ach,
! //              "%3ld-bit %s INT",
! //              TREE_INT_CST_LOW(TYPE_SIZE(type)),
! //              (TYPE_UNSIGNED(type) ? "unsigned" : "  signed"));
        break;
  
      default:
--- 415,422 ----
        break;
  
      case FUNCTION_TYPE:
!       strcpy(ach3, gg_show_type(TREE_TYPE(type)));
!       sprintf(ach, "FUNCTION returning %s", ach3);
        break;
  
      default:
*************** show_type(tree type)
*** 419,425 ****
    return ach;
    }
  
! void
  gg_assign(tree dest, const tree source)
    {
    // This does the equivalent of a C/C++ "dest = source".  When X1 is set, it
--- 426,432 ----
    return ach;
    }
  
! tree
  gg_assign(tree dest, const tree source)
    {
    // This does the equivalent of a C/C++ "dest = source".  When X1 is set, it
*************** gg_assign(tree dest, const tree source)
*** 430,435 ****
--- 437,443 ----
    // This routine also provides for the possibility that the assignment is
    // for a source that is a function invocation, as in
    //    "dest = function_call()"
+   tree stmt = NULL_TREE;
  
    saw_pointer = false;
    tree dest_type = adjust_for_type(TREE_TYPE(dest));
*************** gg_assign(tree dest, const tree source)
*** 452,462 ****
  
    if( okay )
      {
!     tree stmt = build2_loc( location_from_lineno(),
!                             MODIFY_EXPR,
!                             TREE_TYPE(dest),
!                             dest,
!                             source);
      gg_append_statement(stmt);
      }
    else
--- 460,470 ----
  
    if( okay )
      {
!     stmt = build2_loc(location_from_lineno(),
!                       MODIFY_EXPR,
!                       TREE_TYPE(dest),
!                       dest,
!                       source);
      gg_append_statement(stmt);
      }
    else
*************** gg_assign(tree dest, const tree source)
*** 465,484 ****
      // the same.  This is a compilation-time error, since we want the caller to
      // have sorted the types out explicitly.  If we don't throw an error here,
      // the gimple reduction will do so.  Better to do it here, when we know
!     // where we are.
!     dbgmsg("Inefficient assignment");
!     if(DECL_P(dest) && DECL_NAME(dest))
!       {
!       dbgmsg("   Destination is %s", IDENTIFIER_POINTER(DECL_NAME(dest)));
!       }
!     dbgmsg("   dest type   is %s%s", show_type(dest_type), p2 ? "_P" : "");
!     if(DECL_P(source) && DECL_NAME(source))
        {
!       dbgmsg("   Source      is %s", IDENTIFIER_POINTER(DECL_NAME(source)));
        }
!     dbgmsg("   source type is %s%s", show_type(source_type), p2 ? "_P" : "");
!     gcc_unreachable();
      }
    }
  
  tree
--- 473,497 ----
      // the same.  This is a compilation-time error, since we want the caller to
      // have sorted the types out explicitly.  If we don't throw an error here,
      // the gimple reduction will do so.  Better to do it here, when we know
!     // where we are.S
!     static const int debugging = 1;
!     if( debugging )
        {
!       fprintf(stderr, "Inefficient assignment\n");
!       if(DECL_P(dest) && DECL_NAME(dest))
!         {
!         fprintf(stderr, "   Destination is %s\n", IDENTIFIER_POINTER(DECL_NAME(dest)));
!         }
!       fprintf(stderr, "   dest type   is %s%s\n", gg_show_type(dest_type), p2 ? "_P" : "");
!       if(DECL_P(source) && DECL_NAME(source))
!         {
!         fprintf(stderr, "   Source      is %s\n", IDENTIFIER_POINTER(DECL_NAME(source)));
!         }
!       fprintf(stderr, "   source type is %s%s\n", gg_show_type(source_type), p2 ? "_P" : "");
        }
!     cbl_internal_error("Attempting an assignment of differing types.");
      }
+   return stmt;
    }
  
  tree
*************** chain_parameter_to_function(tree functio
*** 2467,2589 ****
      }
    }
  
! void
! gg_modify_function_type(tree function_decl, tree return_type)
!   {
!   tree fndecl_type = build_varargs_function_type_array( return_type,
!                      0,     // No parameters yet
!                      NULL); // And, hence, no types
!   TREE_TYPE(function_decl)  = fndecl_type;
!   tree resdecl = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, return_type);
!   DECL_CONTEXT (resdecl) = function_decl;
!   DECL_RESULT (function_decl) = resdecl;
!   }
  
! tree
! gg_define_function_with_no_parameters(tree return_type,
!                                       const char *funcname,
!                                       const char *unmangled_name)
!   {
!   // This routine builds a function_decl, puts it on the stack, and
!   // gives it a context.
  
!   // At this time we don't know how many parameters this function expects, so
!   // we set things up and we'll tack on the parameters later.
  
!   // Create the FUNCTION_TYPE for that array:
!   // int nparams = 1;
!   // tree types[1] = {VOID_P};
!   // const char *names[1] = {"_p1"};
  
!   // tree fndecl_type = build_varargs_function_type_array( return_type,
!   // nparams,
!   // types);
  
-   tree fndecl_type = build_varargs_function_type_array( return_type,
-                      0,     // No parameters yet
-                      NULL); // And, hence, no types
  
!   // Create the FUNCTION_DECL for that FUNCTION_TYPE
!   tree function_decl = build_fn_decl (funcname, fndecl_type);
  
!   // Some of this stuff is magical, and is based on compiling C programs
!   // and just mimicking the results.
!   TREE_ADDRESSABLE(function_decl) = 1;
!   TREE_STATIC(function_decl) = 1;
!   DECL_EXTERNAL (function_decl) = 0;
!   DECL_PRESERVE_P (function_decl) = 0;
!   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 1;
!   DECL_ARTIFICIAL(function_decl) = 0;
!   TREE_NOTHROW(function_decl) = 0;
!   TREE_USED(function_decl) = 1;
  
!   // This code makes COBOL nested programs actual visible on the
!   // source code "trans_unit_decl" level, but with non-public "static"
!   // visibility.
!   if( gg_trans_unit.function_stack.size() == 0 )
      {
!     // gg_trans_unit.function_stack is empty, so our context is
!     // the compilation module, and we need to be public:
!     DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
!     TREE_PUBLIC(function_decl) = 1;
      }
    else
      {
!     // The stack has something in it, so we are building a nested function.
!     // Make the current function our context
!     DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
!     TREE_PUBLIC(function_decl) = 0;
! 
!     // This function is file static, but nobody calls it, so without
!     // intervention -O1+ optimizations will discard it.
!     DECL_PRESERVE_P (function_decl) = 1;
  
!     // Append this function to the list of functions and variables
!     // associated with the computation module.
!     gg_append_var_decl(function_decl);
!     }
  
!   // Establish the RESULT_DECL for the function:
!   tree resdecl = build_decl (location_from_lineno(), RESULT_DECL, NULL_TREE, return_type);
!   DECL_CONTEXT (resdecl) = function_decl;
!   DECL_RESULT (function_decl) = resdecl;
  
!   // The function_decl has a .function member, a pointer to struct_function.
!   // This is quietly, almost invisibly, extremely important.  You need to
!   // call this routine after DECL_RESULT has been established:
  
!   allocate_struct_function(function_decl, false);
  
!   struct gg_function_t new_function = {};
!   new_function.context_count = 0;
!   new_function.function_decl = function_decl;
!   new_function.our_name = IDENTIFIER_POINTER(DECL_NAME(function_decl));
!   new_function.our_unmangled_name = xstrdup(unmangled_name);
!   new_function.function_address = gg_get_function_address(VOID, new_function.our_name);
  
!   // Each program on the stack gets a unique identifier.  This is used, for
!   // example, to make sure that static variables have unique names.
!   static size_t program_id = 0;
!   new_function.program_id_number = program_id++;
  
!   // With everything established, put this function_decl on the stack
!   gg_trans_unit.function_stack.push_back(new_function);
  
!   // All we need is a context, and we are ready to go:
!   gg_push_context();
!   return function_decl;
!   }
  
- void
- gg_tack_on_function_parameters(tree function_decl, ...)
-   {
    int nparams = 0;
  
    tree types[ARG_LIMIT];
    const char *names[ARG_LIMIT];
  
    va_list params;
!   va_start(params, function_decl);
    for(;;)
      {
      tree var_type = va_arg(params, tree);
--- 2480,2600 ----
      }
    }
  
! /*  There are five ways that we use function_decls:
  
!     1, We define a main() entry point.
!     2. We call a function that turns out to be a static "t" function local to the source code module.
!     3. We define an global "T" function, and possibly call it later.
!     4. We call a function that we define later in the source code module.
!     5. We call a function that ends up being an extern that is not defined in the source code module.
  
!     Cases 3. and 4. turn out to require the same flags.  Here are the combinations of
!     flags that are required for each flavor of function_decl.  This was empirically
!     determind by compiling a C++ program with sample code for each type.
  
!                             | addressable | used | nothrow | static | external | public | no_instrument
! main                        |             |      |         |   X    |          |   X    |    X
! local                       |  X          |  X   |   X     |   X    |          |        |    X
! external defined inside     |  X          |  X   |   X     |   X    |          |   X    |    X
! external defined elsewhere  |  X          |  X   |         |        |   X      |   X    |
  
! */
  
  
! static std::unordered_map<std::string, tree> map_of_function_decls;
  
! static
! std::string function_decl_key(const char *funcname, tree fndecl_type)
!   {
!   std::string retval;
!   retval += funcname;
!   retval += gg_show_type(TREE_TYPE(fndecl_type));
!   return retval;
!   }
  
! tree
! gg_peek_fn_decl(const char *funcname, tree fndecl_type)
!   {
!   // When funcname is found in map_of_function_decls, this routine returns
!   // the type of the return value of that function decl.
! 
!   tree retval = NULL_TREE;
!   std::string key = function_decl_key(funcname, fndecl_type);
!   std::unordered_map<std::string, tree>::const_iterator it =
!           map_of_function_decls.find(key);
!   if( it != map_of_function_decls.end() )
      {
!     // This function_decl has already been defined.
!     retval = TREE_TYPE(TREE_TYPE(it->second));
!     }
!   return retval;
!   }
!   
! tree
! gg_build_fn_decl(const char *funcname, tree fndecl_type)
!   {
!   tree function_decl;
!   
!   std::string key = function_decl_key(funcname, fndecl_type);
!   std::unordered_map<std::string, tree>::const_iterator it =
!           map_of_function_decls.find(key);
!   if( it != map_of_function_decls.end() )
!     {
!     // This function_decl has already been defined.  Just return it; the caller
!     // is responsible for modifying it, if necessary.
!     function_decl = it->second;
      }
    else
      {
!     // When creating a never-seen function_decl, we default to the type used
!     // for calling a function defined elsewhere.  It's up to our caller to
!     // modify the flags, for example if this is part of creating a function.
  
!     function_decl = build_fn_decl(funcname, fndecl_type);
  
!     // These are the bits shown in the table in the comment up above
!     TREE_ADDRESSABLE(function_decl) = 1;
!     TREE_USED(function_decl) = 1;
!     TREE_NOTHROW(function_decl) = 0;
!     TREE_STATIC(function_decl) = 0;
!     DECL_EXTERNAL (function_decl) = 1;
!     TREE_PUBLIC (function_decl) = 1;
!     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 0;
  
!     DECL_PRESERVE_P (function_decl) = 0;
!     DECL_ARTIFICIAL(function_decl) = 0;
!     map_of_function_decls[key] = function_decl;
!     }
!   return function_decl;
!   }
  
! tree
! gg_define_function( tree return_type,
!                     const char *funcname,
!                     const char *unmangled_name,
!                     ...)
!   {
!   // This routine builds a function_decl, puts it on the stack, and
!   // gives it a context.
  
!   // At this time we don't know how many parameters this function expects, so
!   // we set things up and we'll tack on the parameters later.
  
!   /*  There is some bookkeeping we need to do to avoid crashing.
  
!       It's possible for the source code to have two top-level functions with
!       the same name.  This is a compile-time error, but the GCC processing gets
!       upset when it happens.  We'll prevent it from happening here:
  
!       */
  
    int nparams = 0;
  
    tree types[ARG_LIMIT];
    const char *names[ARG_LIMIT];
  
    va_list params;
!   va_start(params, unmangled_name);
    for(;;)
      {
      tree var_type = va_arg(params, tree);
*************** gg_tack_on_function_parameters(tree func
*** 2608,2690 ****
      nparams += 1;
      if(nparams > ARG_LIMIT)
        {
!       yywarn("%d parameters? Really? Are you insane?",ARG_LIMIT+1);
        gcc_unreachable();
        }
      }
    va_end(params);
  
!   // Chain the names onto the variables list:
!   for(int i=0; i<nparams; i++)
      {
!     chain_parameter_to_function(function_decl, types[i], names[i]);
      }
!   }
! 
! void
! gg_define_function(tree return_type, const char *funcname, ...)
!   {
!   // This routine builds a function_decl, puts it on the stack, and
!   // gives it a context.
! 
!   // After the funcname, we expect the formal parameters: pairs of types/names
!   // terminated by a NULL_TREE
! 
!   int nparams = 0;
! 
!   tree types[ARG_LIMIT];
!   const char *names[ARG_LIMIT];
! 
!   va_list params;
!   va_start(params,funcname);
!   for(;;)
      {
!     tree var_type = va_arg(params, tree);
!     if( !var_type )
!       {
!       break;
!       }
! 
!     if( TREE_CODE(var_type) >= NUM_TREE_CODES)
!       {
!       // Warning:  This test is not completely reliable, because a garbage
!       // byte could have a valid TREE_CODE.  But it does help.
!       yywarn("You forgot to put a %<NULL_TREE%> at the end of a "
!                   "%<gg_define_function()%> again");
!       gcc_unreachable();
!       }
! 
!     const char *name = va_arg(params, const char *);
! 
!     types[nparams] = var_type;
!     names[nparams] = name;
!     nparams += 1;
!     if(nparams > ARG_LIMIT)
!       {
!       yywarn("%d parameters? Really? Are you insane?", ARG_LIMIT+1);
!       gcc_unreachable();
!       }
      }
-   va_end(params);
  
-   // Create the FUNCTION_TYPE for that array:
    tree fndecl_type = build_varargs_function_type_array( return_type,
                       nparams,
                       types);
  
    // Create the FUNCTION_DECL for that FUNCTION_TYPE
!   tree function_decl = build_fn_decl (funcname, fndecl_type);
! 
!   // Some of this stuff is magical, and is based on compiling C programs
!   // and just mimicking the results.
!   TREE_ADDRESSABLE(function_decl) = 1;
!   TREE_STATIC(function_decl) = 1;
!   DECL_EXTERNAL (function_decl) = 0;
!   DECL_PRESERVE_P (function_decl) = 0;
!   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 1;
!   DECL_ARTIFICIAL(function_decl) = 0;
!   TREE_NOTHROW(function_decl) = 0;
!   TREE_USED(function_decl) = 1;
  
    // This code makes COBOL nested programs actual visible on the
    // source code "trans_unit_decl" level, but with non-public "static"
--- 2619,2651 ----
      nparams += 1;
      if(nparams > ARG_LIMIT)
        {
!       yywarn("%d parameters? Really? Are you insane?", ARG_LIMIT+1);
        gcc_unreachable();
        }
      }
    va_end(params);
  
!   std::unordered_set<std::string>::const_iterator it =
!           names_we_have_seen.find(funcname);
!   if( it != names_we_have_seen.end() )
      {
!     static int bum_counter = 1;
!     // We have seen this name before.  Replace it with something unique:
!     char ach[32];
!     sprintf(ach, "..no_dupes.%d", bum_counter++);
!     funcname = ach;
      }
!   else
      {
!     names_we_have_seen.insert(funcname);
      }
  
    tree fndecl_type = build_varargs_function_type_array( return_type,
                       nparams,
                       types);
  
    // Create the FUNCTION_DECL for that FUNCTION_TYPE
!   tree function_decl = gg_build_fn_decl (funcname, fndecl_type);
  
    // This code makes COBOL nested programs actual visible on the
    // source code "trans_unit_decl" level, but with non-public "static"
*************** gg_define_function(tree return_type, con
*** 2692,2713 ****
    if( gg_trans_unit.function_stack.size() == 0 )
      {
      // gg_trans_unit.function_stack is empty, so our context is
!     // the compilation module, and we need to be public:
      DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
-     TREE_PUBLIC(function_decl) = 1;
      }
    else
      {
!     // The stack has something in it, so we are building a nested function.
!     // Make the current function our context
!     DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
! 
!     // We need to make it public, because otherwise COBOL CALL "func"
!     // won't be able to find it, because dlopen/dlsym won't find it.
!     TREE_PUBLIC(function_decl) = 0;
  
!     // Append this function to the list of functions and variables
!     // associated with the computation module.
      gg_append_var_decl(function_decl);
      }
  
--- 2653,2692 ----
    if( gg_trans_unit.function_stack.size() == 0 )
      {
      // gg_trans_unit.function_stack is empty, so our context is
!     // the compilation module, and we need to be public because this is a
!     // top-level function with global scope:
! 
!     // These are the bits shown in the table for gg_build_fn_decl()
!     TREE_ADDRESSABLE(function_decl) = 1;
!     TREE_USED(function_decl) = 1;
!     TREE_NOTHROW(function_decl) = 1;
!     TREE_STATIC(function_decl) = 1;
!     DECL_EXTERNAL (function_decl) = 0;
!     TREE_PUBLIC (function_decl) = 1;
!     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 1;
      DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
      }
    else
      {
!     // The stack has something in it, so we are building a contained
!     // program-id.  Such function are implemented local static functions.
!     //
!     // It's not necessarily true that a static call to such a function will be
!     // part of the source code (the call can be through a variable), and so
!     // optimization routines can decide the function isn't used and can
!     // therefore be optimized away.  The preserve flag prevents that.
  
!     // These are the bits shown in the table for gg_build_fn_decl()
!     TREE_ADDRESSABLE(function_decl) = 1;
!     TREE_USED(function_decl) = 1;
!     TREE_NOTHROW(function_decl) = 1;
!     TREE_STATIC(function_decl) = 1;
!     DECL_EXTERNAL (function_decl) = 0;
!     TREE_PUBLIC (function_decl) = 0;
!     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(function_decl) = 1;
!     DECL_CONTEXT (function_decl) = gg_trans_unit.trans_unit_decl;
!     DECL_CONTEXT(function_decl) = gg_trans_unit.trans_unit_decl;
!     DECL_PRESERVE_P (function_decl) = 1;
      gg_append_var_decl(function_decl);
      }
  
*************** gg_define_function(tree return_type, con
*** 2731,2736 ****
--- 2710,2718 ----
    struct gg_function_t new_function = {};
    new_function.context_count = 0;
    new_function.function_decl = function_decl;
+   new_function.our_name = IDENTIFIER_POINTER(DECL_NAME(function_decl));
+   new_function.our_unmangled_name = xstrdup(unmangled_name);
+   new_function.function_address = gg_get_address_of(function_decl);
  
    // Each program on the stack gets a unique identifier.  This is used, for
    // example, to make sure that static variables have unique names.
*************** gg_define_function(tree return_type, con
*** 2742,2747 ****
--- 2724,2742 ----
  
    // All we need is a context, and we are ready to go:
    gg_push_context();
+   return function_decl;
+   }
+ 
+ void
+ gg_modify_function_type(tree function_decl, tree return_type)
+   {
+   tree fndecl_type = build_varargs_function_type_array( return_type,
+                      0,     // No parameters yet
+                      NULL); // And, hence, no types
+   TREE_TYPE(function_decl)  = fndecl_type;
+   tree resdecl = build_decl (UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, return_type);
+   DECL_CONTEXT (resdecl) = function_decl;
+   DECL_RESULT (function_decl) = resdecl;
    }
  
  tree
*************** gg_finalize_function()
*** 2860,2910 ****
    // Finish off the context
    gg_pop_context();
  
!   if( gg_trans_unit.function_stack.back().is_truly_nested )
!     {
!     // This code is for true nested functions.
! 
!     /////////  DANGER, WILL ROBINSON!
!     /////////  This is all well and good.  It does not, however, work.
!     /////////  I tried to implement it because I had a Brilliant Idea for
!     /////////  building COBOL paragraphs in a way that would easily allow
!     /////////  the GDB "NEXT" command to step over a PERFORM <paragraph>.
!     /////////  But, alas, I realized that it was just not going to work.
!     /////////
!     /////////  Pity.
!     /////////
!     /////////  But at that point, I was here, and I am leaving this uncooked
!     /////////  code in case I someday want to return to it.  If it becomes
!     /////////  your job, rather than mine, I encourage you to write a C
!     /////////  program that uses the GNU extensions that allow true nested
!     /////////  functions, and reverse engineer the "finish_function"
!     /////////  function, and get it working.
!     /////////
!     /////////  Good luck.  Bob Dubner, 2022-08-13
  
!     // Because this is a nested function, let's make sure that it actually
!     // has a function that it is nested within
!     gcc_assert(gg_trans_unit.function_stack.size() > 1 );
  
!     /* Genericize before inlining.  Delay genericizing nested functions
!        until their parent function is genericized.  Since finalizing
!        requires GENERIC, delay that as well.  */
  
!     // This is the comment in gcc/c/c-decl.c:
  
!     /* Register this function with cgraph just far enough to get it
!     added to our parent's nested function list.  Handy, since the
!     C front end does not have such a list.  */
  
!     static cgraph_node *node = cgraph_node::get_create (current_function->function_decl);
!     gcc_assert(node);
  
!     }
!   else
!     {
!     // This makes the function visible on the source code module level.
!     cgraph_node::finalize_function (current_function->function_decl, true);
!     }
  
    dump_function (TDI_original, current_function->function_decl);
  
--- 2855,2903 ----
    // Finish off the context
    gg_pop_context();
  
!   /*  Because COBOL functions can be misleadingly referenced before they
!     defined, and because our compiler is single pass, we need to defer
!     actually passing the function_decls to the middle end until we are
!     done with the entire compilation unit.
  
!     An actual example:
  
!       IDENTIFICATION DIVISION.
!       PROGRAM-ID. A.
!       DATA DIVISION.
!       WORKING-STORAGE SECTION.
!       01  CWD          PIC X(100).
!       01  LEN_OF_CWD   PIC 999 VALUE 100.
!       PROCEDURE DIVISION.
!           CALL    "getcwd" USING BY REFERENCE CWD BY VALUE LEN_OF_CWD
!           DISPLAY CWD
!           goback.
!       END PROGRAM A.
!       IDENTIFICATION DIVISION.
!       PROGRAM-ID. B.
!       DATA DIVISION.
!       WORKING-STORAGE SECTION.
!       01  CWD          PIC X(100).
!       01  RETURNED-CWD PIC X(100).
!       01  LEN_OF_CWD   PIC 999 VALUE 100.
!       PROCEDURE DIVISION.
!           CALL    "getcwd" USING BY REFERENCE CWD BY VALUE LEN_OF_CWD RETURNING RETURNED-CWD
!           DISPLAY RETURNED-CWD
!           goback.
!       END PROGRAM B.
  
!     When we encounter the first call to getcwd, we have no clue as to the
!     type of the return value, so we assume it is COBOL_FUNCTION_RETURN_TYPE
  
!     When we encounter the second call, we learn that it returns CHAR_P. But
!     an attempt to change the return type of the function_decl will result
!     in problems if the function_decl of A is processed by the middle end
!     before we get a chance to change the getcwd functiona_decl.
  
!     Hence the need for finalized_function_decls, which gets processed
!     at the end of the file.  */
  
!   finalized_function_decls.push_back(current_function->function_decl);
  
    dump_function (TDI_original, current_function->function_decl);
  
*************** gg_finalize_function()
*** 2917,2922 ****
--- 2910,2927 ----
    }
  
  void
+ gg_leaving_the_source_code_file()
+   {
+   for(  std::vector<tree>::const_iterator it=finalized_function_decls.begin();
+         it != finalized_function_decls.end();
+         it++ )
+     {
+     //This makes the function visible on the source code module level.
+     cgraph_node::finalize_function(*it, true);
+     }
+   }
+ 
+ void
  gg_push_context()
    {
    // Sit back, relax, prepare to be amazed.
*************** gg_call(tree return_type, const char *fu
*** 3148,3154 ****
    }
  
  tree
! gg_call_expr_list(tree return_type, tree function_name, int param_count, tree args[])
    {
    // Generalized caller. param_count is the count of params in the arg[]]
  
--- 3153,3159 ----
    }
  
  tree
! gg_call_expr_list(tree return_type, tree function_pointer, int param_count, tree args[])
    {
    // Generalized caller. param_count is the count of params in the arg[]]
  
*************** gg_call_expr_list(tree return_type, tree
*** 3165,3171 ****
  
    tree the_call = build_call_array_loc(location_from_lineno(),
                                         return_type,
!                                        function_name,
                                         param_count,
                                         args);
    // This routine returns the call_expr; the caller will have to deal with it
--- 3170,3176 ----
  
    tree the_call = build_call_array_loc(location_from_lineno(),
                                         return_type,
!                                        function_pointer,
                                         param_count,
                                         args);
    // This routine returns the call_expr; the caller will have to deal with it
*************** gg_trans_unit_var_decl(const char *var_n
*** 3407,3412 ****
--- 3412,3420 ----
    return NULL_TREE;
    }
  
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
+ 
  void
  gg_insert_into_assembler(const char ach[])
    {
*************** gg_insert_into_assemblerf(const char *fo
*** 3450,3452 ****
--- 3458,3462 ----
      gg_insert_into_assembler(ach);
      }
    }
+ 
+ #pragma GCC diagnostic pop
\ No newline at end of file
diff -Nrcpad gcc-16-20250622/gcc/cobol/gengen.h gcc-16-20250629/gcc/cobol/gengen.h
*** gcc-16-20250622/gcc/cobol/gengen.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/gengen.h	Sun Jun 29 22:32:26 2025
*************** struct gg_function_t
*** 206,216 ****
      // logical way: All programs are siblings, with the context being the source
      // code module.  The nested aspect is not reflected in the GENERIC tree.
  
-     // Truly nested functions are implemented within the generic tree; the
-     // nested function is completely inside the outer function.  This was
-     // implemented to support paragraphs as callable entities.
-     bool is_truly_nested;
- 
      // This variable, which appears on the stack, contains the exit_address
      // for the terminating proc of a PERFORM A or PERFORM A THROUGH B
      tree perform_exit_address;
--- 206,211 ----
*************** extern tree gg_trunc(tree integer_type,
*** 300,306 ****
  extern tree gg_cast(tree type, tree var);
  
  // Assignment, that is to say, A = B
! extern void gg_assign(tree dest, const tree source);
  
  // struct creation and field access
  // Create struct, and access a field in a struct
--- 295,301 ----
  extern tree gg_cast(tree type, tree var);
  
  // Assignment, that is to say, A = B
! extern tree gg_assign(tree dest, const tree source);
  
  // struct creation and field access
  // Create struct, and access a field in a struct
*************** extern tree gg_strncmp(tree char_star_A,
*** 456,468 ****
  extern void gg_return(tree operand = NULL_TREE);
  
  // These routines are the preample and postamble that bracket everything else
! extern void gg_define_function(tree return_type, const char *funcname, ...);
! extern tree gg_define_function_with_no_parameters(tree return_type,
!                                                   const char *funcname,
!                                                   const char *unmangled_name);
  extern void chain_parameter_to_function( tree function_decl,
                                          const tree param_type,
                                          const char *name);
  
  extern void gg_finalize_function();
  extern void gg_push_context();
--- 451,466 ----
  extern void gg_return(tree operand = NULL_TREE);
  
  // These routines are the preample and postamble that bracket everything else
! extern tree gg_build_fn_decl(const char *funcname, tree fndecl_type);
! extern tree gg_peek_fn_decl(const char *funcname);
! extern tree gg_define_function( tree return_type,
!                                 const char *funcname,
!                                 const char *unmangled_name,
!                                 ...);
  extern void chain_parameter_to_function( tree function_decl,
                                          const tree param_type,
                                          const char *name);
+ extern void gg_modify_function_type(tree function_decl, tree return_type);
  
  extern void gg_finalize_function();
  extern void gg_push_context();
*************** extern void gg_pop_context();
*** 471,477 ****
  // These are a generalized call constructor.  The first for when you just want
  // the function called, because you don't care about the return value.  The others
  // are for when you do need the return value.
! extern tree gg_call_expr_list(tree return_type,        tree function_name, int param_count, tree[]);
  
  // The following is a garden-variety call, with known return type and known
  // but in the case where the return value is unimportant.
--- 469,477 ----
  // These are a generalized call constructor.  The first for when you just want
  // the function called, because you don't care about the return value.  The others
  // are for when you do need the return value.
! extern tree gg_call_expr_list(tree return_type,
!                               tree function_pointer,
!                               int param_count, tree[]);
  
  // The following is a garden-variety call, with known return type and known
  // but in the case where the return value is unimportant.
*************** void gg_goto(tree pointer);
*** 505,513 ****
  void gg_record_statement_list_start();
  tree gg_record_statement_list_finish();
  
- // These routines are in support of PERFORM PARAGRAPH
- extern tree gg_get_function_decl(tree return_type, const char *funcname, ...);
- 
  // Used to call system exit()
  extern void gg_exit(tree exit_code);
  extern void gg_abort();
--- 505,510 ----
*************** extern tree gg_indirect(tree pointer, tr
*** 528,534 ****
  extern tree gg_string_literal(const char *string);
  
  #define CURRENT_LINE_NUMBER (cobol_location().first_line)
! location_t location_from_lineno();
  
  // When set to true, use UNKNOWN_LOCATION instead of CURRENT_LINE_NUMBER
  extern void gg_set_current_line_number(int line_number);
--- 525,531 ----
  extern tree gg_string_literal(const char *string);
  
  #define CURRENT_LINE_NUMBER (cobol_location().first_line)
! extern location_t location_from_lineno();
  
  // When set to true, use UNKNOWN_LOCATION instead of CURRENT_LINE_NUMBER
  extern void gg_set_current_line_number(int line_number);
*************** extern int  gg_get_current_line_number()
*** 536,547 ****
  
  extern tree gg_trans_unit_var_decl(const char *var_name);
  
! tree gg_open(tree char_star_A, tree int_B);
! tree gg_close(tree int_A);
! tree gg_get_indirect_reference(tree pointer, tree offset);
  
! void gg_insert_into_assembler(const char ach[]);
! void gg_insert_into_assemblerf(const char *format, ...) ATTRIBUTE_PRINTF_1;
  
! void gg_modify_function_type(tree function_decl, tree return_type);
  #endif
--- 533,545 ----
  
  extern tree gg_trans_unit_var_decl(const char *var_name);
  
! extern tree gg_open(tree char_star_A, tree int_B);
! extern tree gg_close(tree int_A);
! extern tree gg_get_indirect_reference(tree pointer, tree offset);
  
! extern void gg_insert_into_assembler(const char ach[]);
! extern void gg_insert_into_assemblerf(const char *format, ...) ATTRIBUTE_PRINTF_1;
  
! extern char *gg_show_type(tree type);
! extern void gg_leaving_the_source_code_file();
  #endif
diff -Nrcpad gcc-16-20250622/gcc/cobol/parse.y gcc-16-20250629/gcc/cobol/parse.y
*** gcc-16-20250622/gcc/cobol/parse.y	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/parse.y	Sun Jun 29 22:32:26 2025
*************** numstr2i( const char input[], radix_t ra
*** 12359,12365 ****
      return output;
    }
    if( erc == -1 ) {
!     yywarn("'%s' was accepted as %zu", input, integer);
    }
    return output;
  }
--- 12359,12365 ----
      return output;
    }
    if( erc == -1 ) {
!     yywarn("'%s' was accepted as %ld", input, integer);
    }
    return output;
  }
diff -Nrcpad gcc-16-20250622/gcc/cobol/parse_ante.h gcc-16-20250629/gcc/cobol/parse_ante.h
*** gcc-16-20250622/gcc/cobol/parse_ante.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cobol/parse_ante.h	Sun Jun 29 22:32:26 2025
*************** static class current_t {
*** 2151,2159 ****
--- 2151,2169 ----
       * subprograms, and whether or not they are COMMON. PROGRAM may be
       * the caller, or a subprogram could call COMMON sibling.
       */
+ 
+     static std::unordered_set<size_t> callers_we_have_seen;
      if( programs.size() == 1 ) {
        if( yydebug ) parser_call_targets_dump();
        for( size_t caller : symbol_program_programs() ) {
+         // We are running through the entire growing list of called programs
+         // at the point of each END PROGRAM.  This confuses the name changing
+         // routines, so we use a std::set to avoid doing callers more than
+         // once.
+         if( callers_we_have_seen.find(caller) != callers_we_have_seen.end() )
+           {
+           continue;
+           }
          const char *caller_name = cbl_label_of(symbol_at(caller))->name;
          for( auto callable : symbol_program_callables(caller) ) {
            auto called = cbl_label_of(symbol_at(callable));
*************** static class current_t {
*** 2161,2173 ****
              called->mangled_name? called->mangled_name : called->name;
  
            size_t n =
!             parser_call_target_update(caller, called->name, mangled_name);
            // Zero is not an error
            dbgmsg("updated " HOST_SIZE_T_PRINT_UNSIGNED
                   " calls from #%-3" GCC_PRISZ "u (%s) s/%s/%s/",
                   (fmt_size_t)n, (fmt_size_t)caller, caller_name,
                   called->name, mangled_name);
          }
        }
        if( yydebug ) parser_call_targets_dump();
      }
--- 2171,2186 ----
              called->mangled_name? called->mangled_name : called->name;
  
            size_t n =
!             parser_call_target_update(caller,
!                                       called->name,
!                                       mangled_name);
            // Zero is not an error
            dbgmsg("updated " HOST_SIZE_T_PRINT_UNSIGNED
                   " calls from #%-3" GCC_PRISZ "u (%s) s/%s/%s/",
                   (fmt_size_t)n, (fmt_size_t)caller, caller_name,
                   called->name, mangled_name);
          }
+       callers_we_have_seen.insert(caller);
        }
        if( yydebug ) parser_call_targets_dump();
      }
diff -Nrcpad gcc-16-20250622/gcc/common/config/aarch64/aarch64-common.cc gcc-16-20250629/gcc/common/config/aarch64/aarch64-common.cc
*** gcc-16-20250622/gcc/common/config/aarch64/aarch64-common.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/common/config/aarch64/aarch64-common.cc	Sun Jun 29 22:32:26 2025
*************** aarch64_handle_option (struct gcc_option
*** 142,147 ****
--- 142,151 ----
        opts->x_aarch64_flag_outline_atomics = val;
        return true;
  
+     case OPT_mmax_vectorization:
+       opts->x_flag_aarch64_max_vectorization = val;
+       return true;
+ 
      default:
        return true;
      }
diff -Nrcpad gcc-16-20250622/gcc/common/config/i386/i386-common.cc gcc-16-20250629/gcc/common/config/i386/i386-common.cc
*** gcc-16-20250622/gcc/common/config/i386/i386-common.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/common/config/i386/i386-common.cc	Sun Jun 29 22:32:26 2025
*************** const pta processor_alias_table[] =
*** 2310,2316 ****
      M_CPU_TYPE (INTEL_GRANDRIDGE), P_PROC_AVX2},
    {"clearwaterforest", PROCESSOR_CLEARWATERFOREST, CPU_HASWELL,
      PTA_CLEARWATERFOREST, M_CPU_TYPE (INTEL_CLEARWATERFOREST), P_PROC_AVX2},
!   {"intel", PROCESSOR_INTEL, CPU_SLM, PTA_NEHALEM,
      M_VENDOR (VENDOR_INTEL), P_NONE},
    {"geode", PROCESSOR_GEODE, CPU_GEODE,
      PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE, 0, P_NONE},
--- 2310,2316 ----
      M_CPU_TYPE (INTEL_GRANDRIDGE), P_PROC_AVX2},
    {"clearwaterforest", PROCESSOR_CLEARWATERFOREST, CPU_HASWELL,
      PTA_CLEARWATERFOREST, M_CPU_TYPE (INTEL_CLEARWATERFOREST), P_PROC_AVX2},
!   {"intel", PROCESSOR_INTEL, CPU_HASWELL, PTA_HASWELL,
      M_VENDOR (VENDOR_INTEL), P_NONE},
    {"geode", PROCESSOR_GEODE, CPU_GEODE,
      PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE, 0, P_NONE},
diff -Nrcpad gcc-16-20250622/gcc/common/config/riscv/riscv-common.cc gcc-16-20250629/gcc/common/config/riscv/riscv-common.cc
*** gcc-16-20250622/gcc/common/config/riscv/riscv-common.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/common/config/riscv/riscv-common.cc	Sun Jun 29 22:32:26 2025
*************** static const riscv_profiles riscv_profil
*** 295,300 ****
--- 295,309 ----
     "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
     "_zfa_zawrs_supm"},
  
+   /* RVA23S contains all mandatory base ISA for RVA23U64 and the privileged
+      extensions as mandatory extensions.  */
+   {"rva23s64", "rv64imafdcbv_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
+    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
+    "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
+    "_zfa_zawrs_svbare_svade_ssccptr_sstvecd_sstvala_sscounterenw_svpbmt"
+    "_svinval_svnapot_sstc_sscofpmf_ssnpm_ssu64xl_sha_supm"
+   },
+ 
    /* RVB23 contains all mandatory base ISA for RVA22U64 and the new extension
       'zihintntl,zicond,zimop,zcmop,zfa,zawrs' as mandatory
       extensions.  */
*************** static const riscv_profiles riscv_profil
*** 303,309 ****
     "_zicboz_zfhmin_zkt_zihintntl_zicond_zimop_zcmop_zcb"
     "_zfa_zawrs"},
  
!   /* Currently we do not define S/M mode Profiles in gcc part.  */
  
    /* Terminate the list.  */
    {NULL, NULL}
--- 312,325 ----
     "_zicboz_zfhmin_zkt_zihintntl_zicond_zimop_zcmop_zcb"
     "_zfa_zawrs"},
  
!   /* RVB23S contains all mandatory base ISA for RVB23U64 and the privileged
!      extensions as mandatory extensions.  */
!   {"rvb23s64", "rv64imafdcb_zicsr_zicntr_zihpm_ziccif_ziccrse_ziccamoa"
!    "_zicclsm_zic64b_za64rs_zihintpause_zba_zbb_zbs_zicbom_zicbop"
!    "_zicboz_zfhmin_zkt_zvfhmin_zvbb_zvkt_zihintntl_zicond_zimop_zcmop_zcb"
!    "_zfa_zawrs_svbare_svade_ssccptr_sstvecd_sstvala_sscounterenw_svpbmt"
!    "_svinval_svnapot_sstc_sscofpmf_ssu64xl_supm"
!   },
  
    /* Terminate the list.  */
    {NULL, NULL}
diff -Nrcpad gcc-16-20250622/gcc/common.opt gcc-16-20250629/gcc/common.opt
*** gcc-16-20250622/gcc/common.opt	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/common.opt	Sun Jun 29 22:32:26 2025
*************** Common Joined RejectNegative Var(auto_pr
*** 1187,1192 ****
--- 1187,1196 ----
  Use sample profile information for call graph node weights. The profile
  file is specified in the argument.
  
+ fauto-profile-inlining
+ Common Var(flag_auto_profile_inlining) Init(1) Optimization
+ Perform inlining using auto-profile.
+ 
  ; -fcheck-bounds causes gcc to generate array bounds checks.
  ; For C, C++ and ObjC: defaults off.
  ; For Java: defaults to on.
diff -Nrcpad gcc-16-20250622/gcc/config/aarch64/aarch64.cc gcc-16-20250629/gcc/config/aarch64/aarch64.cc
*** gcc-16-20250622/gcc/config/aarch64/aarch64.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/aarch64/aarch64.cc	Sun Jun 29 22:32:26 2025
*************** aarch64_override_options_internal (struc
*** 19036,19041 ****
--- 19036,19055 ----
    if (TARGET_SME && !TARGET_SVE2)
      sorry ("no support for %qs without %qs", "sme", "sve2");
  
+   /* Set scalar costing to a high value such that we always pick
+      vectorization.  Increase scalar costing by 10000%.  */
+   if (opts->x_flag_aarch64_max_vectorization)
+     SET_OPTION_IF_UNSET (opts, &global_options_set,
+ 			 param_vect_scalar_cost_multiplier, 10000);
+ 
+   /* Synchronize the -mautovec-preference and aarch64_autovec_preference using
+      whichever one is not default.  If both are set then prefer the param flag
+      over the parameters.  */
+   if (opts->x_autovec_preference != AARCH64_AUTOVEC_DEFAULT)
+     SET_OPTION_IF_UNSET (opts, &global_options_set,
+ 			 aarch64_autovec_preference,
+ 			 opts->x_autovec_preference);
+ 
    aarch64_override_options_after_change_1 (opts);
  }
  
*************** static const struct aarch64_attribute_in
*** 19786,19791 ****
--- 19800,19807 ----
       OPT_msign_return_address_ },
    { "outline-atomics", aarch64_attr_bool, true, NULL,
       OPT_moutline_atomics},
+   { "max-vectorization", aarch64_attr_bool, false, NULL,
+      OPT_mmax_vectorization},
    { NULL, aarch64_attr_custom, false, NULL, OPT____ }
  };
  
diff -Nrcpad gcc-16-20250622/gcc/config/aarch64/aarch64.opt gcc-16-20250629/gcc/config/aarch64/aarch64.opt
*** gcc-16-20250622/gcc/config/aarch64/aarch64.opt	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/aarch64/aarch64.opt	Sun Jun 29 22:32:26 2025
*************** msve-vector-bits=
*** 290,295 ****
--- 290,306 ----
  Target RejectNegative Joined Enum(sve_vector_bits) Var(aarch64_sve_vector_bits) Init(SVE_SCALABLE)
  -msve-vector-bits=<number>	Set the number of bits in an SVE vector register.
  
+ mautovec-preference=
+ Target RejectNegative Joined Var(autovec_preference) Enum(aarch64_autovec_preference) Init(AARCH64_AUTOVEC_DEFAULT)
+ -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.
+ 
+ mmax-vectorization
+ Target Var(flag_aarch64_max_vectorization) Save
+ Override the scalar cost model such that vectorization is always profitable.
+ 
  mverbose-cost-dump
  Target Undocumented Var(flag_aarch64_verbose_cost)
  Enables verbose cost model dumping in the debug dump files.
*************** The number of Newton iterations for calc
*** 356,363 ****
  
  -param=aarch64-autovec-preference=
  Target Joined Var(aarch64_autovec_preference) Enum(aarch64_autovec_preference) Init(AARCH64_AUTOVEC_DEFAULT) Param
! --param=aarch64-autovec-preference=[default|asimd-only|sve-only|prefer-asimd|prefer-sve]
! Force an ISA selection strategy for auto-vectorization.
  
  Enum
  Name(aarch64_autovec_preference) Type(enum aarch64_autovec_preference_enum) UnknownError(unknown autovec preference %qs)
--- 367,374 ----
  
  -param=aarch64-autovec-preference=
  Target Joined Var(aarch64_autovec_preference) Enum(aarch64_autovec_preference) Init(AARCH64_AUTOVEC_DEFAULT) Param
! An old alias for -mautovec-preference.  If both -mautovec-preference and
! --param=aarch64-autovec-preference are passed, the --param value will be used.
  
  Enum
  Name(aarch64_autovec_preference) Type(enum aarch64_autovec_preference_enum) UnknownError(unknown autovec preference %qs)
diff -Nrcpad gcc-16-20250622/gcc/config/arc/arc-modes.def gcc-16-20250629/gcc/config/arc/arc-modes.def
*** gcc-16-20250622/gcc/config/arc/arc-modes.def	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/arc/arc-modes.def	Sun Jun 29 22:32:26 2025
*************** along with GCC; see the file COPYING3.
*** 24,29 ****
--- 24,30 ----
  
  CC_MODE (CC_ZN);
  CC_MODE (CC_Z);
+ CC_MODE (CC_V);
  CC_MODE (CC_C);
  CC_MODE (CC_FP_GT);
  CC_MODE (CC_FP_GE);
diff -Nrcpad gcc-16-20250622/gcc/config/arc/arc-protos.h gcc-16-20250629/gcc/config/arc/arc-protos.h
*** gcc-16-20250622/gcc/config/arc/arc-protos.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/arc/arc-protos.h	Sun Jun 29 22:32:26 2025
*************** extern bool arc_check_mov_const (HOST_WI
*** 55,60 ****
--- 55,61 ----
  extern bool arc_split_mov_const (rtx *);
  extern bool arc_can_use_return_insn (void);
  extern bool arc_split_move_p (rtx *);
+ extern void arc_gen_unlikely_cbranch (enum rtx_code, machine_mode, rtx);
  #endif /* RTX_CODE */
  
  
diff -Nrcpad gcc-16-20250622/gcc/config/arc/arc.cc gcc-16-20250629/gcc/config/arc/arc.cc
*** gcc-16-20250622/gcc/config/arc/arc.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/arc/arc.cc	Sun Jun 29 22:32:26 2025
*************** get_arc_condition_code (rtx comparison)
*** 1436,1441 ****
--- 1436,1448 ----
  	case GEU : return ARC_CC_NC;
  	default : gcc_unreachable ();
  	}
+     case E_CC_Vmode:
+       switch (GET_CODE (comparison))
+ 	{
+ 	case EQ : return ARC_CC_NV;
+ 	case NE : return ARC_CC_V;
+ 	default : gcc_unreachable ();
+ 	}
      case E_CC_FP_GTmode:
        if (TARGET_ARGONAUT_SET && TARGET_SPFP)
  	switch (GET_CODE (comparison))
*************** arc_select_cc_mode (enum rtx_code op, rt
*** 1546,1551 ****
--- 1553,1565 ----
    machine_mode mode = GET_MODE (x);
    rtx x1;
  
+   /* Matches all instructions which can do .f and clobbers only Z flag.  */
+   if (GET_MODE_CLASS (mode) == MODE_INT
+       && y == const0_rtx
+       && GET_CODE (x) == MULT
+       && (op == EQ || op == NE))
+     return CC_Zmode;
+ 
    /* For an operation that sets the condition codes as a side-effect, the
       C and V flags is not set as for cmp, so we can only use comparisons where
       this doesn't matter.  (For LT and GE we can use "mi" and "pl"
*************** arc_libm_function_max_error (unsigned cf
*** 11543,11548 ****
--- 11557,11577 ----
    return default_libm_function_max_error (cfn, mode, boundary_p);
  }
  
+ void
+ arc_gen_unlikely_cbranch (enum rtx_code cmp, machine_mode cc_mode, rtx label)
+ {
+   rtx cc_reg, x;
+ 
+   cc_reg = gen_rtx_REG (cc_mode, CC_REG);
+   label = gen_rtx_LABEL_REF (VOIDmode, label);
+ 
+   x = gen_rtx_fmt_ee (cmp, VOIDmode, cc_reg, const0_rtx);
+   x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label, pc_rtx);
+ 
+   emit_unlikely_jump (gen_rtx_SET (pc_rtx, x));
+ }
+ 
+ 
  #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P
  #define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p
  
diff -Nrcpad gcc-16-20250622/gcc/config/arc/arc.md gcc-16-20250629/gcc/config/arc/arc.md
*** gcc-16-20250622/gcc/config/arc/arc.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/arc/arc.md	Sun Jun 29 22:32:26 2025
*************** archs4x, archs4xd"
*** 842,847 ****
--- 842,850 ----
  ; Optab prefix for sign/zero-extending operations
  (define_code_attr su_optab [(sign_extend "") (zero_extend "u")])
  
+ ;; Code iterator for sign/zero extension
+ (define_code_iterator ANY_EXTEND [sign_extend zero_extend])
+ 
  (define_insn "*<SEZ_prefix>xt<SQH_postfix>_cmp0_noout"
    [(set (match_operand 0 "cc_set_register" "")
  	(compare:CC_ZN (SEZ:SI (match_operand:SQH 1 "register_operand" "r"))
*************** archs4x, archs4xd"
*** 1068,1078 ****
     (set_attr "cond" "set_zn")
     (set_attr "length" "*,4,4,4,8")])
  
! ;; The next two patterns are for plos, ior, xor, and, and mult.
  (define_insn "*commutative_binary_cmp0_noout"
    [(set (match_operand 0 "cc_set_register" "")
  	(match_operator 4 "zn_compare_operator"
! 	  [(match_operator:SI 3 "commutative_operator"
  	     [(match_operand:SI 1 "register_operand" "%r,r")
  	      (match_operand:SI 2 "nonmemory_operand" "rL,Cal")])
  	   (const_int 0)]))]
--- 1071,1137 ----
     (set_attr "cond" "set_zn")
     (set_attr "length" "*,4,4,4,8")])
  
! (define_expand "<su_optab>mulvsi4"
!   [(ANY_EXTEND:DI (match_operand:SI 0 "register_operand"))
!    (ANY_EXTEND:DI (match_operand:SI 1 "register_operand"))
!    (ANY_EXTEND:DI (match_operand:SI 2 "register_operand"))
!    (label_ref (match_operand 3 "" ""))]
!   "TARGET_MPY"
!   {
!     emit_insn (gen_<su_optab>mulsi3_Vcmp (operands[0], operands[1],
! 					  operands[2]));
!     arc_gen_unlikely_cbranch (NE, CC_Vmode, operands[3]);
!     DONE;
!   })
! 
! (define_insn "<su_optab>mulsi3_Vcmp"
!   [(parallel
!     [(set
!       (reg:CC_V CC_REG)
!       (compare:CC_V
!        (mult:DI
! 	(ANY_EXTEND:DI (match_operand:SI 1 "register_operand"  "%0,r,r,r"))
! 	(ANY_EXTEND:DI (match_operand:SI 2 "nonmemory_operand"  "I,L,r,C32")))
!        (ANY_EXTEND:DI (mult:SI (match_dup 1) (match_dup 2)))))
!      (set (match_operand:SI 0 "register_operand"	       "=r,r,r,r")
! 	  (mult:SI (match_dup 1) (match_dup 2)))])]
!   "register_operand (operands[1], SImode)
!    || register_operand (operands[2], SImode)"
!   "mpy<su_optab>.f\\t%0,%1,%2"
!   [(set_attr "length" "4,4,4,8")
!    (set_attr "type"   "multi")])
! 
! (define_insn "*mulsi3_cmp0"
!   [(set (reg:CC_Z CC_REG)
! 	(compare:CC_Z
! 	 (mult:SI
! 	  (match_operand:SI 1 "register_operand"  "%r,0,r")
! 	  (match_operand:SI 2 "nonmemory_operand" "rL,I,i"))
! 	 (const_int 0)))
!    (set (match_operand:SI 0 "register_operand"    "=r,r,r")
! 	(mult:SI (match_dup 1) (match_dup 2)))]
!  "TARGET_MPY"
!  "mpy%?.f\\t%0,%1,%2"
!  [(set_attr "length" "4,4,8")
!   (set_attr "type" "multi")])
! 
! (define_insn "*mulsi3_cmp0_noout"
!   [(set (reg:CC_Z CC_REG)
! 	(compare:CC_Z
! 	 (mult:SI
! 	  (match_operand:SI 0 "register_operand"   "%r,r,r")
! 	  (match_operand:SI 1 "nonmemory_operand"  "rL,I,i"))
! 	 (const_int 0)))]
!  "TARGET_MPY"
!  "mpy%?.f\\t0,%0,%1"
!  [(set_attr "length" "4,4,8")
!   (set_attr "type" "multi")])
! 
! ;; The next two patterns are for plus, ior, xor, and.
  (define_insn "*commutative_binary_cmp0_noout"
    [(set (match_operand 0 "cc_set_register" "")
  	(match_operator 4 "zn_compare_operator"
! 	  [(match_operator:SI 3 "commutative_operator_sans_mult"
  	     [(match_operand:SI 1 "register_operand" "%r,r")
  	      (match_operand:SI 2 "nonmemory_operand" "rL,Cal")])
  	   (const_int 0)]))]
*************** archs4x, archs4xd"
*** 1085,1091 ****
  (define_insn "*commutative_binary_cmp0"
    [(set (match_operand 3 "cc_set_register" "")
  	(match_operator 5 "zn_compare_operator"
! 	  [(match_operator:SI 4 "commutative_operator"
  	     [(match_operand:SI 1 "register_operand"  "%0, 0,r,r")
  	      (match_operand:SI 2 "nonmemory_operand" "rL,rI,r,Cal")])
  	   (const_int 0)]))
--- 1144,1150 ----
  (define_insn "*commutative_binary_cmp0"
    [(set (match_operand 3 "cc_set_register" "")
  	(match_operator 5 "zn_compare_operator"
! 	  [(match_operator:SI 4 "commutative_operator_sans_mult"
  	     [(match_operand:SI 1 "register_operand"  "%0, 0,r,r")
  	      (match_operand:SI 2 "nonmemory_operand" "rL,rI,r,Cal")])
  	   (const_int 0)]))
*************** archs4x, archs4xd"
*** 2734,2739 ****
--- 2793,2848 ----
  }
    [(set_attr "length" "8")])
  
+ (define_insn "addsi3_v"
+  [(set (match_operand:SI       0 "register_operand"  "=r,r,r,  r")
+        (plus:SI (match_operand:SI 1 "register_operand"   "r,r,0,  r")
+ 		(match_operand:SI 2 "nonmemory_operand"  "r,L,I,C32")))
+   (set (reg:CC_V CC_REG)
+        (compare:CC_V (sign_extend:DI (plus:SI (match_dup 1)
+ 					      (match_dup 2)))
+ 		     (plus:DI (sign_extend:DI (match_dup 1))
+ 			      (sign_extend:DI (match_dup 2)))))]
+  ""
+  "add.f\\t%0,%1,%2"
+  [(set_attr "cond"   "set")
+   (set_attr "type"   "compare")
+   (set_attr "length" "4,4,4,8")])
+ 
+ (define_expand "addvsi4"
+   [(match_operand:SI 0 "register_operand")
+    (match_operand:SI 1 "register_operand")
+    (match_operand:SI 2 "nonmemory_operand")
+    (label_ref (match_operand 3 "" ""))]
+   ""
+   "emit_insn (gen_addsi3_v (operands[0], operands[1], operands[2]));
+    arc_gen_unlikely_cbranch (NE, CC_Vmode, operands[3]);
+    DONE;")
+ 
+ (define_insn "addsi3_c"
+  [(set (match_operand:SI       0 "register_operand"  "=r,r,r,  r")
+        (plus:SI (match_operand:SI 1 "register_operand"   "r,r,0,  r")
+ 		(match_operand:SI 2 "nonmemory_operand"  "r,L,I,C32")))
+   (set (reg:CC_C CC_REG)
+        (compare:CC_C (plus:SI (match_dup 1)
+ 			      (match_dup 2))
+ 		     (match_dup 1)))]
+  ""
+  "add.f\\t%0,%1,%2"
+  [(set_attr "cond"   "set")
+   (set_attr "type"   "compare")
+   (set_attr "length" "4,4,4,8")])
+ 
+ (define_expand "uaddvsi4"
+   [(match_operand:SI 0 "register_operand")
+    (match_operand:SI 1 "register_operand")
+    (match_operand:SI 2 "nonmemory_operand")
+    (label_ref (match_operand 3 "" ""))]
+   ""
+   "emit_insn (gen_addsi3_c (operands[0], operands[1], operands[2]));
+    arc_gen_unlikely_cbranch (LTU, CC_Cmode, operands[3]);
+    DONE;")
+ 
+ 
  (define_insn "add_f"
    [(set (reg:CC_C CC_REG)
  	(compare:CC_C
*************** archs4x, archs4xd"
*** 2914,2919 ****
--- 3023,3076 ----
    (set_attr "cpu_facility" "*,cd,*,*,*,*,*,*,*,*")
    ])
  
+ (define_insn "subsi3_v"
+   [(set (match_operand:SI	 0 "register_operand"  "=r,r,r,  r")
+ 	(minus:SI (match_operand:SI 1 "register_operand"   "r,r,0,  r")
+ 		  (match_operand:SI 2 "nonmemory_operand"  "r,L,I,C32")))
+    (set (reg:CC_V CC_REG)
+ 	(compare:CC_V (sign_extend:DI (minus:SI (match_dup 1)
+ 						(match_dup 2)))
+ 		      (minus:DI (sign_extend:DI (match_dup 1))
+ 				(sign_extend:DI (match_dup 2)))))]
+    ""
+    "sub.f\\t%0,%1,%2"
+    [(set_attr "cond"	"set")
+     (set_attr "type"	"compare")
+     (set_attr "length"	"4,4,4,8")])
+ 
+ (define_expand "subvsi4"
+  [(match_operand:SI 0 "register_operand")
+   (match_operand:SI 1 "register_operand")
+   (match_operand:SI 2 "nonmemory_operand")
+   (label_ref (match_operand 3 "" ""))]
+   ""
+   "emit_insn (gen_subsi3_v (operands[0], operands[1], operands[2]));
+    arc_gen_unlikely_cbranch (NE, CC_Vmode, operands[3]);
+    DONE;")
+ 
+ (define_insn "subsi3_c"
+   [(set (match_operand:SI	 0 "register_operand"	"=r,r,r,  r")
+ 	(minus:SI (match_operand:SI 1 "register_operand"	 "r,r,0,  r")
+ 		  (match_operand:SI 2 "nonmemory_operand"	 "r,L,I,C32")))
+    (set (reg:CC_C CC_REG)
+ 	(compare:CC_C (match_dup 1)
+ 		      (match_dup 2)))]
+    ""
+    "sub.f\\t%0,%1,%2"
+    [(set_attr "cond"	"set")
+     (set_attr "type"	"compare")
+     (set_attr "length"	"4,4,4,8")])
+ 
+ (define_expand "usubvsi4"
+   [(match_operand:SI 0 "register_operand")
+    (match_operand:SI 1 "register_operand")
+    (match_operand:SI 2 "nonmemory_operand")
+    (label_ref (match_operand 3 "" ""))]
+    ""
+    "emit_insn (gen_subsi3_c (operands[0], operands[1], operands[2]));
+     arc_gen_unlikely_cbranch (LTU, CC_Cmode, operands[3]);
+     DONE;")
+ 
  (define_expand "subdi3"
    [(set (match_operand:DI 0 "register_operand" "")
  	(minus:DI (match_operand:DI 1 "register_operand" "")
diff -Nrcpad gcc-16-20250622/gcc/config/arc/predicates.md gcc-16-20250629/gcc/config/arc/predicates.md
*** gcc-16-20250622/gcc/config/arc/predicates.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/arc/predicates.md	Sun Jun 29 22:32:26 2025
***************
*** 419,424 ****
--- 419,426 ----
        return code == EQ || code == NE;
      case E_CC_Cmode:
        return code == LTU || code == GEU;
+     case E_CC_Vmode:
+       return code == EQ || code == NE;
      case E_CC_FP_GTmode:
        return code == GT || code == UNLE;
      case E_CC_FP_GEmode:
***************
*** 451,457 ****
  })
  
  (define_predicate "equality_comparison_operator"
!   (match_code "eq, ne"))
  
  (define_predicate "ge_lt_comparison_operator"
    (match_code "ge, lt"))
--- 453,464 ----
  })
  
  (define_predicate "equality_comparison_operator"
!   (match_code "eq, ne")
!   {
!     machine_mode opmode = GET_MODE (XEXP (op, 0));
!     return opmode != CC_Vmode;
!   }
! )
  
  (define_predicate "ge_lt_comparison_operator"
    (match_code "ge, lt"))
diff -Nrcpad gcc-16-20250622/gcc/config/avr/avr.cc gcc-16-20250629/gcc/config/avr/avr.cc
*** gcc-16-20250622/gcc/config/avr/avr.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/avr/avr.cc	Sun Jun 29 22:32:26 2025
*************** avr_hard_regno_mode_ok (unsigned int reg
*** 14148,14154 ****
  	address registers is extreme stress test for reload.  */
  
    if (GET_MODE_SIZE (mode) >= 4
!       && regno >= REG_X
        // This problem only concerned the old reload.
        && ! avropt_lra_p)
      return false;
--- 14148,14154 ----
  	address registers is extreme stress test for reload.  */
  
    if (GET_MODE_SIZE (mode) >= 4
!       && regno + GET_MODE_SIZE (mode) >= REG_30
        // This problem only concerned the old reload.
        && ! avropt_lra_p)
      return false;
diff -Nrcpad gcc-16-20250622/gcc/config/avr/avr.opt gcc-16-20250629/gcc/config/avr/avr.opt
*** gcc-16-20250622/gcc/config/avr/avr.opt	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/avr/avr.opt	Sun Jun 29 22:32:26 2025
***************
*** 19,26 ****
  ; <http://www.gnu.org/licenses/>.
  
  mlra
! Target Var(avropt_lra_p) UInteger Init(0) Optimization Undocumented
! Usa LRA for reload instead of the old reload framework.  This option is experimental, and it may be removed in future versions of the compiler.
  
  mcall-prologues
  Target Mask(CALL_PROLOGUES) Optimization
--- 19,26 ----
  ; <http://www.gnu.org/licenses/>.
  
  mlra
! Target Var(avropt_lra_p) UInteger Init(1) Optimization Undocumented
! Usa LRA for reload instead of the old reload framework.  This option is experimental, on per default, and it may be removed in future versions of the compiler.
  
  mcall-prologues
  Target Mask(CALL_PROLOGUES) Optimization
diff -Nrcpad gcc-16-20250622/gcc/config/gcn/gcn-opts.h gcc-16-20250629/gcc/config/gcn/gcn-opts.h
*** gcc-16-20250622/gcc/config/gcn/gcn-opts.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/gcn/gcn-opts.h	Sun Jun 29 22:32:26 2025
*************** enum hsaco_attr_type
*** 84,91 ****
  #define TARGET_DPP8 TARGET_RDNA2_PLUS
  /* Device requires CDNA1-style manually inserted wait states for AVGPRs.  */
  #define TARGET_AVGPR_CDNA1_NOPS TARGET_CDNA1
! /* Whether to use the 'globally coherent' (glc) or the 'scope' (sc0, sc1) flag
!    for scalar memory operations. The string starts on purpose with a space.  */
  #define TARGET_GLC_NAME (TARGET_CDNA3 ? " sc0" : " glc")
  /* The metadata on different devices need different granularity.  */
  #define TARGET_VGPR_GRANULARITY \
--- 84,94 ----
  #define TARGET_DPP8 TARGET_RDNA2_PLUS
  /* Device requires CDNA1-style manually inserted wait states for AVGPRs.  */
  #define TARGET_AVGPR_CDNA1_NOPS TARGET_CDNA1
! /* Whether to use the 'globally coherent' (glc) or the 'scope' (sc0) flag
!    for non-scalar memory operations. The string starts on purpose with a space.
!    Note: for scalar memory operations (i.e. 's_...'), 'glc' is still used.
!    CDNA3 also uses 'nt' instead of 'slc' and 'sc1' instead of 'scc'; however,
!    there is no non-scalar user so far.  */
  #define TARGET_GLC_NAME (TARGET_CDNA3 ? " sc0" : " glc")
  /* The metadata on different devices need different granularity.  */
  #define TARGET_VGPR_GRANULARITY \
diff -Nrcpad gcc-16-20250622/gcc/config/gcn/gcn.cc gcc-16-20250629/gcc/config/gcn/gcn.cc
*** gcc-16-20250622/gcc/config/gcn/gcn.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/gcn/gcn.cc	Sun Jun 29 22:32:26 2025
*************** print_operand_address (FILE *file, rtx m
*** 7103,7108 ****
--- 7103,7110 ----
     O - print offset:n for data share operations.
     G - print "glc" (or for gfx94x: sc0) unconditionally [+ indep. of regnum]
     g - print "glc" (or for gfx94x: sc0), if appropriate for given MEM
+        NOTE: Do not use 'G' or 'g with scalar memory access ('s_...') as those
+        require "glc" also with gfx94x.
     L - print low-part of a multi-reg value
     H - print second part of a multi-reg value (high-part of 2-reg value)
     J - print third part of a multi-reg value
diff -Nrcpad gcc-16-20250622/gcc/config/gcn/gcn.md gcc-16-20250629/gcc/config/gcn/gcn.md
*** gcc-16-20250622/gcc/config/gcn/gcn.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/gcn/gcn.md	Sun Jun 29 22:32:26 2025
***************
*** 206,212 ****
  ;	 vdata: vgpr0-255
  ;	 srsrc: sgpr0-102
  ;	 soffset: sgpr0-102
! ;	 flags: offen, idxen, %G, lds, slc, tfe
  ;
  ; mtbuf - Typed memory buffer operation. Two words
  ;	 offset: 12-bit constant
--- 206,212 ----
  ;	 vdata: vgpr0-255
  ;	 srsrc: sgpr0-102
  ;	 soffset: sgpr0-102
! ;	 flags: offen, idxen, glc, lds, slc, tfe
  ;
  ; mtbuf - Typed memory buffer operation. Two words
  ;	 offset: 12-bit constant
***************
*** 216,225 ****
  ;	 vdata: vgpr0-255
  ;	 srsrc: sgpr0-102
  ;	 soffset: sgpr0-102
! ;	 flags: offen, idxen, %G, lds, slc, tfe
  ;
  ; flat - flat or global memory operations
! ;	 flags: %G, slc
  ;	 addr: vgpr0-255
  ;	 data: vgpr0-255
  ;	 vdst: vgpr0-255
--- 216,225 ----
  ;	 vdata: vgpr0-255
  ;	 srsrc: sgpr0-102
  ;	 soffset: sgpr0-102
! ;	 flags: offen, idxen, glc, lds, slc, tfe
  ;
  ; flat - flat or global memory operations
! ;	 flags: {CDNA3: sc0, nt, sc1 | otherwise: glc, slc, scc}
  ;	 addr: vgpr0-255
  ;	 data: vgpr0-255
  ;	 vdst: vgpr0-255
***************
*** 1987,1993 ****
     (use (match_operand 3 "const_int_operand"))]
    "0 /* Disabled.  */"
    "@
!    s_atomic_<bare_mnemonic><X>\t%0, %1, %2 %G2\;s_waitcnt\tlgkmcnt(0)
     flat_atomic_<bare_mnemonic><X>\t%0, %1, %2 %G2\;s_waitcnt\t0
     global_atomic_<bare_mnemonic><X>\t%0, %A1, %2%O1 %G2\;s_waitcnt\tvmcnt(0)"
    [(set_attr "type" "smem,flat,flat")
--- 1987,1993 ----
     (use (match_operand 3 "const_int_operand"))]
    "0 /* Disabled.  */"
    "@
!    s_atomic_<bare_mnemonic><X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)
     flat_atomic_<bare_mnemonic><X>\t%0, %1, %2 %G2\;s_waitcnt\t0
     global_atomic_<bare_mnemonic><X>\t%0, %A1, %2%O1 %G2\;s_waitcnt\tvmcnt(0)"
    [(set_attr "type" "smem,flat,flat")
***************
*** 2054,2060 ****
  	  UNSPECV_ATOMIC))]
    ""
    "@
!    s_atomic_cmpswap<X>\t%0, %1, %2 %G2\;s_waitcnt\tlgkmcnt(0)
     flat_atomic_cmpswap<X>\t%0, %1, %2 %G2\;s_waitcnt\t0
     global_atomic_cmpswap<X>\t%0, %A1, %2%O1 %G2\;s_waitcnt\tvmcnt(0)"
    [(set_attr "type" "smem,flat,flat")
--- 2054,2060 ----
  	  UNSPECV_ATOMIC))]
    ""
    "@
!    s_atomic_cmpswap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)
     flat_atomic_cmpswap<X>\t%0, %1, %2 %G2\;s_waitcnt\t0
     global_atomic_cmpswap<X>\t%0, %A1, %2%O1 %G2\;s_waitcnt\tvmcnt(0)"
    [(set_attr "type" "smem,flat,flat")
***************
*** 2096,2102 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_load%o0\t%0, %A1 %G1\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return (TARGET_RDNA2 /* Not GFX11.  */
  		    ? "flat_load%o0\t%0, %A1%O1 %G1 dlc\;s_waitcnt\t0"
--- 2096,2102 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_load%o0\t%0, %A1 glc\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return (TARGET_RDNA2 /* Not GFX11.  */
  		    ? "flat_load%o0\t%0, %A1%O1 %G1 dlc\;s_waitcnt\t0"
***************
*** 2113,2119 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_load%o0\t%0, %A1 %G1\;s_waitcnt\tlgkmcnt(0)\;"
  		   "s_dcache_wb_vol";
  	  case 1:
  	    return (TARGET_RDNA2
--- 2113,2119 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_load%o0\t%0, %A1 glc\;s_waitcnt\tlgkmcnt(0)\;"
  		   "s_dcache_wb_vol";
  	  case 1:
  	    return (TARGET_RDNA2
***************
*** 2147,2153 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_load%o0\t%0, %A1 %G1\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_RDNA2
--- 2147,2153 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_load%o0\t%0, %A1 glc\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_RDNA2
***************
*** 2196,2202 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_store%o1\t%1, %A0 %G1\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return "flat_store%o1\t%A0, %1%O0 %G1\;s_waitcnt\t0";
  	  case 2:
--- 2196,2202 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_store%o1\t%1, %A0 glc\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return "flat_store%o1\t%A0, %1%O0 %G1\;s_waitcnt\t0";
  	  case 2:
***************
*** 2208,2214 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 %G1";
  	  case 1:
  	    return (TARGET_GLn_CACHE
  		    ? "buffer_gl1_inv\;buffer_gl0_inv\;flat_store%o1\t%A0, %1%O0 %G1"
--- 2208,2214 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 glc";
  	  case 1:
  	    return (TARGET_GLn_CACHE
  		    ? "buffer_gl1_inv\;buffer_gl0_inv\;flat_store%o1\t%A0, %1%O0 %G1"
***************
*** 2233,2239 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 %G1\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
--- 2233,2239 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_store%o1\t%1, %A0 glc\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
***************
*** 2282,2288 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_atomic_swap<X>\t%0, %1, %2 %G1\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return "flat_atomic_swap<X>\t%0, %1, %2 %G1\;s_waitcnt\t0";
  	  case 2:
--- 2282,2288 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return "flat_atomic_swap<X>\t%0, %1, %2 %G1\;s_waitcnt\t0";
  	  case 2:
***************
*** 2296,2302 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_atomic_swap<X>\t%0, %1, %2 %G1\;s_waitcnt\tlgkmcnt(0)\;"
  		   "s_dcache_wb_vol\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
--- 2296,2302 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_atomic_swap<X>\t%0, %1, %2 glc\;s_waitcnt\tlgkmcnt(0)\;"
  		   "s_dcache_wb_vol\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
***************
*** 2327,2333 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 %G1\;"
  		   "s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return (TARGET_GLn_CACHE
--- 2327,2333 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 glc\;"
  		   "s_waitcnt\tlgkmcnt(0)";
  	  case 1:
  	    return (TARGET_GLn_CACHE
***************
*** 2362,2368 ****
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 %G1\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
--- 2362,2368 ----
  	switch (which_alternative)
  	  {
  	  case 0:
! 	    return "s_dcache_wb_vol\;s_atomic_swap<X>\t%0, %1, %2 glc\;"
  		   "s_waitcnt\tlgkmcnt(0)\;s_dcache_inv_vol";
  	  case 1:
  	    return (TARGET_GLn_CACHE
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386-expand.cc gcc-16-20250629/gcc/config/i386/i386-expand.cc
*** gcc-16-20250622/gcc/config/i386/i386-expand.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386-expand.cc	Sun Jun 29 22:32:26 2025
*************** ix86_expand_call (rtx retval, rtx fnaddr
*** 10138,10146 ****
  	  if (lookup_attribute ("interrupt",
  				TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
  	    error ("interrupt service routine cannot be called directly");
! 	  else if (lookup_attribute ("no_callee_saved_registers",
! 				     TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
  	    call_no_callee_saved_registers = true;
  	}
      }
    else
--- 10138,10148 ----
  	  if (lookup_attribute ("interrupt",
  				TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
  	    error ("interrupt service routine cannot be called directly");
! 	  else if (ix86_type_no_callee_saved_registers_p (TREE_TYPE (fndecl)))
  	    call_no_callee_saved_registers = true;
+ 	  if (fndecl == current_function_decl
+ 	      && decl_binds_to_current_def_p (fndecl))
+ 	    cfun->machine->recursive_function = true;
  	}
      }
    else
*************** ix86_expand_call (rtx retval, rtx fnaddr
*** 10150,10157 ****
  	  tree mem_expr = MEM_EXPR (fnaddr);
  	  if (mem_expr != nullptr
  	      && TREE_CODE (mem_expr) == MEM_REF
! 	      && lookup_attribute ("no_callee_saved_registers",
! 				   TYPE_ATTRIBUTES (TREE_TYPE (mem_expr))))
  	    call_no_callee_saved_registers = true;
  	}
  
--- 10152,10158 ----
  	  tree mem_expr = MEM_EXPR (fnaddr);
  	  if (mem_expr != nullptr
  	      && TREE_CODE (mem_expr) == MEM_REF
! 	      && ix86_type_no_callee_saved_registers_p (TREE_TYPE (mem_expr)))
  	    call_no_callee_saved_registers = true;
  	}
  
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386-features.cc gcc-16-20250629/gcc/config/i386/i386-features.cc
*** gcc-16-20250622/gcc/config/i386/i386-features.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386-features.cc	Sun Jun 29 22:32:26 2025
*************** ix86_rpad_gate ()
*** 3088,3097 ****
  /* Generate a vector set, DEST = SRC, at entry of the nearest dominator
     for basic block map BBS, which is in the fake loop that contains the
     whole function, so that there is only a single vector set in the
!    whole function.   */
  
  static void
! ix86_place_single_vector_set (rtx dest, rtx src, bitmap bbs)
  {
    basic_block bb = nearest_common_dominator_for_set (CDI_DOMINATORS, bbs);
    while (bb->loop_father->latch
--- 3088,3099 ----
  /* Generate a vector set, DEST = SRC, at entry of the nearest dominator
     for basic block map BBS, which is in the fake loop that contains the
     whole function, so that there is only a single vector set in the
!    whole function.  If not nullptr, INNER_SCALAR is the inner scalar of
!    SRC, as (reg:SI 99) in (vec_duplicate:V4SI (reg:SI 99)).  */
  
  static void
! ix86_place_single_vector_set (rtx dest, rtx src, bitmap bbs,
! 			      rtx inner_scalar = nullptr)
  {
    basic_block bb = nearest_common_dominator_for_set (CDI_DOMINATORS, bbs);
    while (bb->loop_father->latch
*************** ix86_place_single_vector_set (rtx dest,
*** 3112,3121 ****
        insn = NEXT_INSN (insn);
      }
  
    if (insn == BB_HEAD (bb))
!     emit_insn_before (set, insn);
    else
!     emit_insn_after (set, insn ? PREV_INSN (insn) : BB_END (bb));
  }
  
  /* At entry of the nearest common dominator for basic blocks with
--- 3114,3164 ----
        insn = NEXT_INSN (insn);
      }
  
+   rtx_insn *set_insn;
    if (insn == BB_HEAD (bb))
!     {
!       set_insn = emit_insn_before (set, insn);
!       if (dump_file)
! 	{
! 	  fprintf (dump_file, "\nPlace:\n\n");
! 	  print_rtl_single (dump_file, set_insn);
! 	  fprintf (dump_file, "\nbefore:\n\n");
! 	  print_rtl_single (dump_file, insn);
! 	  fprintf (dump_file, "\n");
! 	}
!     }
    else
!     {
!       rtx_insn *after = insn ? PREV_INSN (insn) : BB_END (bb);
!       set_insn = emit_insn_after (set, after);
!       if (dump_file)
! 	{
! 	  fprintf (dump_file, "\nPlace:\n\n");
! 	  print_rtl_single (dump_file, set_insn);
! 	  fprintf (dump_file, "\nafter:\n\n");
! 	  print_rtl_single (dump_file, after);
! 	  fprintf (dump_file, "\n");
! 	}
!     }
! 
!   if (inner_scalar)
!     {
!       /* Set the source in (vec_duplicate:V4SI (reg:SI 99)).  */
!       rtx reg = XEXP (src, 0);
!       if ((REG_P (inner_scalar) || MEM_P (inner_scalar))
! 	  && GET_MODE (reg) != GET_MODE (inner_scalar))
! 	inner_scalar = gen_rtx_SUBREG (GET_MODE (reg), inner_scalar, 0);
!       rtx set = gen_rtx_SET (reg, inner_scalar);
!       insn = emit_insn_before (set, set_insn);
!       if (dump_file)
! 	{
! 	  fprintf (dump_file, "\nAdd:\n\n");
! 	  print_rtl_single (dump_file, insn);
! 	  fprintf (dump_file, "\nbefore:\n\n");
! 	  print_rtl_single (dump_file, set_insn);
! 	  fprintf (dump_file, "\n");
! 	}
!     }
  }
  
  /* At entry of the nearest common dominator for basic blocks with
*************** make_pass_remove_partial_avx_dependency
*** 3346,3371 ****
    return new pass_remove_partial_avx_dependency (ctxt);
  }
  
! /* Return a machine mode suitable for vector SIZE.  */
  
  static machine_mode
! ix86_get_vector_load_mode (unsigned int size)
  {
!   machine_mode mode;
!   if (size == 64)
!     mode = V64QImode;
!   else if (size == 32)
!     mode = V32QImode;
!   else if (size == 16)
!     mode = V16QImode;
!   else if (size == 8)
!     mode = V8QImode;
!   else if (size == 4)
!     mode = V4QImode;
!   else if (size == 2)
!     mode = V2QImode;
!   else
!     gcc_unreachable ();
    return mode;
  }
  
--- 3389,3412 ----
    return new pass_remove_partial_avx_dependency (ctxt);
  }
  
! /* Return a machine mode suitable for vector SIZE with SMODE inner
!    mode.  */
  
  static machine_mode
! ix86_get_vector_cse_mode (unsigned int size, machine_mode smode)
  {
!   /* Use the inner scalar mode of vector broadcast source in:
! 
!      (set (reg:V8DF 394)
! 	  (vec_duplicate:V8DF (reg:V2DF 190 [ alpha ])))
! 
!      to compute the vector mode for broadcast from vector source.
!    */
!   if (VECTOR_MODE_P (smode))
!     smode = GET_MODE_INNER (smode);
!   scalar_mode s_mode = as_a <scalar_mode> (smode);
!   poly_uint64 nunits = size / GET_MODE_SIZE (smode);
!   machine_mode mode = mode_for_vector (s_mode, nunits).require ();
    return mode;
  }
  
*************** ix86_get_vector_load_mode (unsigned int
*** 3374,3380 ****
  
  static void
  replace_vector_const (machine_mode vector_mode, rtx vector_const,
! 		      auto_bitmap &vector_insns)
  {
    bitmap_iterator bi;
    unsigned int id;
--- 3415,3422 ----
  
  static void
  replace_vector_const (machine_mode vector_mode, rtx vector_const,
! 		      auto_bitmap &vector_insns,
! 		      machine_mode scalar_mode)
  {
    bitmap_iterator bi;
    unsigned int id;
*************** replace_vector_const (machine_mode vecto
*** 3386,3392 ****
        /* Get the single SET instruction.  */
        rtx set = single_set (insn);
        rtx src = SET_SRC (set);
!       machine_mode mode = GET_MODE (src);
  
        rtx replace;
        /* Replace the source operand with VECTOR_CONST.  */
--- 3428,3435 ----
        /* Get the single SET instruction.  */
        rtx set = single_set (insn);
        rtx src = SET_SRC (set);
!       rtx dest = SET_DEST (set);
!       machine_mode mode = GET_MODE (dest);
  
        rtx replace;
        /* Replace the source operand with VECTOR_CONST.  */
*************** replace_vector_const (machine_mode vecto
*** 3400,3406 ****
  	      /* If the mode size is smaller than its natural size,
  		 first insert an extra move with a QI vector SUBREG
  		 of the same size to avoid validate_subreg failure.  */
! 	      machine_mode vmode = ix86_get_vector_load_mode (size);
  	      rtx vreg;
  	      if (mode == vmode)
  		vreg = vector_const;
--- 3443,3450 ----
  	      /* If the mode size is smaller than its natural size,
  		 first insert an extra move with a QI vector SUBREG
  		 of the same size to avoid validate_subreg failure.  */
! 	      machine_mode vmode
! 		= ix86_get_vector_cse_mode (size, scalar_mode);
  	      rtx vreg;
  	      if (mode == vmode)
  		vreg = vector_const;
*************** replace_vector_const (machine_mode vecto
*** 3409,3415 ****
  		  vreg = gen_reg_rtx (vmode);
  		  rtx vsubreg = gen_rtx_SUBREG (vmode, vector_const, 0);
  		  rtx pat = gen_rtx_SET (vreg, vsubreg);
! 		  emit_insn_before (pat, insn);
  		}
  	      replace = gen_rtx_SUBREG (mode, vreg, 0);
  	    }
--- 3453,3467 ----
  		  vreg = gen_reg_rtx (vmode);
  		  rtx vsubreg = gen_rtx_SUBREG (vmode, vector_const, 0);
  		  rtx pat = gen_rtx_SET (vreg, vsubreg);
! 		  rtx_insn *vinsn = emit_insn_before (pat, insn);
! 		  if (dump_file)
! 		    {
! 		      fprintf (dump_file, "\nInsert an extra move:\n\n");
! 		      print_rtl_single (dump_file, vinsn);
! 		      fprintf (dump_file, "\nbefore:\n\n");
! 		      print_rtl_single (dump_file, insn);
! 		      fprintf (dump_file, "\n");
! 		    }
  		}
  	      replace = gen_rtx_SUBREG (mode, vreg, 0);
  	    }
*************** replace_vector_const (machine_mode vecto
*** 3417,3431 ****
--- 3469,3676 ----
  	    replace = gen_rtx_SUBREG (mode, vector_const, 0);
  	}
  
+       if (dump_file)
+ 	{
+ 	  fprintf (dump_file, "\nReplace:\n\n");
+ 	  print_rtl_single (dump_file, insn);
+ 	}
        SET_SRC (set) = replace;
        /* Drop possible dead definitions.  */
        PATTERN (insn) = set;
        INSN_CODE (insn) = -1;
        recog_memoized (insn);
+       if (dump_file)
+ 	{
+ 	  fprintf (dump_file, "\nwith:\n\n");
+ 	  print_rtl_single (dump_file, insn);
+ 	  fprintf (dump_file, "\n");
+ 	}
        df_insn_rescan (insn);
      }
  }
  
+ enum x86_cse_kind
+ {
+   X86_CSE_CONST0_VECTOR,
+   X86_CSE_CONSTM1_VECTOR,
+   X86_CSE_VEC_DUP
+ };
+ 
+ struct redundant_load
+ {
+   /* Bitmap of basic blocks with broadcast instructions.  */
+   auto_bitmap bbs;
+   /* Bitmap of broadcast instructions.  */
+   auto_bitmap insns;
+   /* The broadcast inner scalar.  */
+   rtx val;
+   /* The inner scalar mode.  */
+   machine_mode mode;
+   /* The instruction which sets the inner scalar.  Nullptr if the inner
+      scalar is applied to the whole function, instead of within the same
+      block.  */
+   rtx_insn *def_insn;
+   /* The widest broadcast source.  */
+   rtx broadcast_source;
+   /* The widest broadcast register.  */
+   rtx broadcast_reg;
+   /* The basic block of the broadcast instruction.  */
+   basic_block bb;
+   /* The number of broadcast instructions with the same inner scalar.  */
+   unsigned HOST_WIDE_INT count;
+   /* The threshold of broadcast instructions with the same inner
+      scalar.  */
+   unsigned int threshold;
+   /* The widest broadcast size in bytes.  */
+   unsigned int size;
+   /* Load kind.  */
+   x86_cse_kind kind;
+ };
+ 
+ /* Return the inner scalar if OP is a broadcast, else return nullptr.  */
+ 
+ static rtx
+ ix86_broadcast_inner (rtx op, machine_mode mode,
+ 		      machine_mode *scalar_mode_p,
+ 		      x86_cse_kind *kind_p, rtx_insn **insn_p)
+ {
+   if (op == const0_rtx || op == CONST0_RTX (mode))
+     {
+       *scalar_mode_p = QImode;
+       *kind_p = X86_CSE_CONST0_VECTOR;
+       *insn_p = nullptr;
+       return const0_rtx;
+     }
+   else if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
+ 	    && (op == constm1_rtx || op == CONSTM1_RTX (mode)))
+ 	    || (GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT
+ 		&& float_vector_all_ones_operand (op, mode)))
+     {
+       *scalar_mode_p = QImode;
+       *kind_p = X86_CSE_CONSTM1_VECTOR;
+       *insn_p = nullptr;
+       return constm1_rtx;
+     }
+ 
+   mode = GET_MODE (op);
+   int nunits = GET_MODE_NUNITS (mode);
+   if (nunits < 2)
+     return nullptr;
+ 
+   *kind_p = X86_CSE_VEC_DUP;
+ 
+   rtx reg;
+   if (GET_CODE (op) == VEC_DUPLICATE)
+     {
+       /* Only
+ 	  (vec_duplicate:V4SI (reg:SI 99))
+ 	  (vec_duplicate:V2DF (mem/u/c:DF (symbol_ref/u:DI ("*.LC1") [flags 0x2]) [0  S8 A64]))
+ 	 are supported.  Set OP to the broadcast source by default.  */
+       op = XEXP (op, 0);
+       reg = op;
+       if (SUBREG_P (op)
+ 	  && SUBREG_BYTE (op) == 0
+ 	  && !paradoxical_subreg_p (op))
+ 	reg = SUBREG_REG (op);
+       if (!REG_P (reg))
+ 	{
+ 	  if (MEM_P (op)
+ 	      && SYMBOL_REF_P (XEXP (op, 0))
+ 	      && CONSTANT_POOL_ADDRESS_P (XEXP (op, 0)))
+ 	    {
+ 	      /* Handle constant broadcast from memory.  */
+ 	      *scalar_mode_p = GET_MODE_INNER (mode);
+ 	      *insn_p = nullptr;
+ 	      return op;
+ 	    }
+ 	  return nullptr;
+ 	}
+     }
+   else if (CONST_VECTOR_P (op))
+     {
+       rtx first = XVECEXP (op, 0, 0);
+       for (int i = 1; i < nunits; ++i)
+ 	{
+ 	  rtx tmp = XVECEXP (op, 0, i);
+ 	  /* Vector duplicate value.  */
+ 	  if (!rtx_equal_p (tmp, first))
+ 	    return nullptr;
+ 	}
+       *scalar_mode_p = GET_MODE (first);
+       *insn_p = nullptr;
+       return first;
+     }
+   else
+     return nullptr;
+ 
+   mode = GET_MODE (op);
+ 
+   /* Only single def chain is supported.  */
+   df_ref ref = DF_REG_DEF_CHAIN (REGNO (reg));
+   if (!ref
+       || DF_REF_IS_ARTIFICIAL (ref)
+       || DF_REF_NEXT_REG (ref) != nullptr)
+     return nullptr;
+ 
+   rtx_insn *insn = DF_REF_INSN (ref);
+   rtx set = single_set (insn);
+   if (!set)
+     return nullptr;
+ 
+   rtx src = SET_SRC (set);
+ 
+   if (CONST_INT_P (src))
+     {
+       /* Handle sequences like
+ 
+ 	 (set (reg:SI 99)
+ 	       (const_int 34 [0x22]))
+ 	 (set (reg:V4SI 98)
+ 	       (vec_duplicate:V4SI (reg:SI 99)))
+ 
+ 	 Set *INSN_P to nullptr and return SET_SRC if SET_SRC is an
+ 	 integer constant.  */
+       op = src;
+       *insn_p = nullptr;
+     }
+   else
+     {
+       /* Handle sequences like
+ 
+ 	 (set (reg:QI 105 [ c ])
+ 	      (reg:QI 5 di [ c ]))
+ 	 (set (reg:V64QI 102 [ _1 ])
+ 	      (vec_duplicate:V64QI (reg:QI 105 [ c ])))
+ 
+ 	 (set (reg/v:SI 116 [ argc ])
+ 	      (mem/c:SI (reg:SI 135) [2 argc+0 S4 A32]))
+ 	 (set (reg:V4SI 119 [ _45 ])
+ 	      (vec_duplicate:V4SI (reg/v:SI 116 [ argc ])))
+ 
+ 	 (set (reg:SI 98 [ _1 ])
+ 	      (sign_extend:SI (reg:QI 106 [ c ])))
+ 	 (set (reg:V16SI 103 [ _2 ])
+ 	       (vec_duplicate:V16SI (reg:SI 98 [ _1 ])))
+ 
+ 	 (set (reg:SI 102 [ cost ])
+ 	      (mem/c:SI (symbol_ref:DI ("cost") [flags 0x40])))
+ 	 (set (reg:V4HI 103 [ _16 ])
+ 	      (vec_duplicate:V4HI (subreg:HI (reg:SI 102 [ cost ]) 0)))
+ 
+ 	 (set (subreg:SI (reg/v:HI 107 [ cr_val ]) 0)
+ 	      (ashift:SI (reg:SI 158)
+ 			 (subreg:QI (reg:SI 156 [ _2 ]) 0)))
+ 	 (set (reg:V16HI 183 [ _61 ])
+ 	      (vec_duplicate:V16HI (reg/v:HI 107 [ cr_val ])))
+ 
+ 	 Set *INSN_P to INSN and return the broadcast source otherwise.  */
+       *insn_p = insn;
+     }
+ 
+   *scalar_mode_p = mode;
+   return op;
+ }
+ 
  /* At entry of the nearest common dominator for basic blocks with vector
     CONST0_RTX and integer CONSTM1_RTX uses, generate a single widest
     vector set instruction for all CONST0_RTX and integer CONSTM1_RTX
*************** remove_redundant_vector_load (void)
*** 3440,3459 ****
  {
    timevar_push (TV_MACH_DEP);
  
!   auto_bitmap zero_bbs;
!   auto_bitmap m1_bbs;
!   auto_bitmap zero_insns;
!   auto_bitmap m1_insns;
! 
    basic_block bb;
    rtx_insn *insn;
!   unsigned HOST_WIDE_INT zero_count = 0;
!   unsigned HOST_WIDE_INT m1_count = 0;
!   unsigned int zero_size = 0;
!   unsigned int m1_size = 0;
  
    df_set_flags (DF_DEFER_INSN_RESCAN);
  
    FOR_EACH_BB_FN (bb, cfun)
      {
        FOR_BB_INSNS (bb, insn)
--- 3685,3700 ----
  {
    timevar_push (TV_MACH_DEP);
  
!   auto_vec<redundant_load *> loads;
!   redundant_load *load;
    basic_block bb;
    rtx_insn *insn;
!   unsigned int i;
  
    df_set_flags (DF_DEFER_INSN_RESCAN);
  
+   bool recursive_call_p = cfun->machine->recursive_function;
+ 
    FOR_EACH_BB_FN (bb, cfun)
      {
        FOR_BB_INSNS (bb, insn)
*************** remove_redundant_vector_load (void)
*** 3481,3562 ****
  	  if (!REG_P (dest) && !SUBREG_P (dest))
  	    continue;
  
! 	  if (src == CONST0_RTX (mode))
! 	    {
! 	      /* Record vector instruction with CONST0_RTX.  */
! 	      bitmap_set_bit (zero_insns, INSN_UID (insn));
  
! 	      /* Record the maximum vector size.  */
! 	      if (zero_size < GET_MODE_SIZE (mode))
! 		zero_size = GET_MODE_SIZE (mode);
  
! 	      /* Record the basic block with CONST0_RTX.  */
! 	      bitmap_set_bit (zero_bbs, bb->index);
! 	      zero_count++;
! 	    }
! 	  else if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT
! 		   && src == CONSTM1_RTX (mode))
! 	    {
! 	      /* Record vector instruction with CONSTM1_RTX.  */
! 	      bitmap_set_bit (m1_insns, INSN_UID (insn));
  
! 	      /* Record the maximum vector size.  */
! 	      if (m1_size < GET_MODE_SIZE (mode))
! 		m1_size = GET_MODE_SIZE (mode);
  
! 	      /* Record the basic block with CONSTM1_RTX.  */
! 	      bitmap_set_bit (m1_bbs, bb->index);
! 	      m1_count++;
! 	    }
! 	}
!     }
  
!   if (zero_count > 1 || m1_count > 1)
!     {
!       machine_mode zero_mode, m1_mode;
!       rtx vector_const0, vector_constm1;
  
!       if (zero_count > 1)
! 	{
! 	  zero_mode = ix86_get_vector_load_mode (zero_size);
! 	  vector_const0 = gen_reg_rtx (zero_mode);
! 	  replace_vector_const (zero_mode, vector_const0, zero_insns);
! 	}
!       else
! 	{
! 	  zero_mode = VOIDmode;
! 	  vector_const0 = nullptr;
! 	}
  
!       if (m1_count > 1)
! 	{
! 	  m1_mode = ix86_get_vector_load_mode (m1_size);
! 	  vector_constm1 = gen_reg_rtx (m1_mode);
! 	  replace_vector_const (m1_mode, vector_constm1, m1_insns);
! 	}
!       else
! 	{
! 	  m1_mode = VOIDmode;
! 	  vector_constm1 = nullptr;
  	}
  
        /* (Re-)discover loops so that bb->loop_father can be used in the
  	 analysis below.  */
        calculate_dominance_info (CDI_DOMINATORS);
        loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
  
!       if (vector_const0)
! 	ix86_place_single_vector_set (vector_const0,
! 				      CONST0_RTX (zero_mode),
! 				      zero_bbs);
  
!       if (vector_constm1)
! 	ix86_place_single_vector_set (vector_constm1,
! 				      CONSTM1_RTX (m1_mode),
! 				      m1_bbs);
  
        loop_optimizer_finalize ();
  
        df_process_deferred_rescans ();
      }
  
--- 3722,3903 ----
  	  if (!REG_P (dest) && !SUBREG_P (dest))
  	    continue;
  
! 	  rtx_insn *def_insn;
! 	  machine_mode scalar_mode;
! 	  x86_cse_kind kind;
! 	  rtx val = ix86_broadcast_inner (src, mode, &scalar_mode,
! 					  &kind, &def_insn);
! 	  if (!val)
! 	    continue;
  
! 	   /* Remove redundant register loads if there are more than 2
! 	      loads will be used.  */
! 	  unsigned int threshold = 2;
  
! 	  /* Check if there is a matching redundant vector load.   */
! 	  bool matched = false;
! 	  FOR_EACH_VEC_ELT (loads, i, load)
! 	    if (load->val
! 		&& load->kind == kind
! 		&& load->mode == scalar_mode
! 		&& (load->bb == bb
! 		    || kind < X86_CSE_VEC_DUP
! 		    /* Non all 0s/1s vector load must be in the same
! 		       basic block if it is in a recursive call.  */
! 		    || !recursive_call_p)
! 		&& rtx_equal_p (load->val, val))
! 	      {
! 		/* Record vector instruction.  */
! 		bitmap_set_bit (load->insns, INSN_UID (insn));
  
! 		/* Record the maximum vector size.  */
! 		if (load->size < GET_MODE_SIZE (mode))
! 		  load->size = GET_MODE_SIZE (mode);
  
! 		/* Record the basic block.  */
! 		bitmap_set_bit (load->bbs, bb->index);
! 		load->count++;
! 		matched = true;
! 		break;
! 	      }
  
! 	  if (matched)
! 	    continue;
  
! 	  /* We see this vector broadcast the first time.  */
! 	  load = new redundant_load;
  
! 	  load->val = copy_rtx (val);
! 	  load->mode = scalar_mode;
! 	  load->size = GET_MODE_SIZE (mode);
! 	  load->def_insn = def_insn;
! 	  load->count = 1;
! 	  load->threshold = threshold;
! 	  load->bb = BLOCK_FOR_INSN (insn);
! 	  load->kind = kind;
! 
! 	  bitmap_set_bit (load->insns, INSN_UID (insn));
! 	  bitmap_set_bit (load->bbs, bb->index);
! 
! 	  loads.safe_push (load);
  	}
+     }
+ 
+   bool replaced = false;
+   rtx reg, broadcast_source, broadcast_reg;
+   FOR_EACH_VEC_ELT (loads, i, load)
+     if (load->count >= load->threshold)
+       {
+ 	machine_mode mode = ix86_get_vector_cse_mode (load->size,
+ 						      load->mode);
+ 	broadcast_reg = gen_reg_rtx (mode);
+ 	if (load->def_insn)
+ 	  {
+ 	    /* Replace redundant vector loads with a single vector load
+ 	       in the same basic block.  */
+ 	    reg = load->val;
+ 	    if (load->mode != GET_MODE (reg))
+ 	      reg = gen_rtx_SUBREG (load->mode, reg, 0);
+ 	    broadcast_source = gen_rtx_VEC_DUPLICATE (mode, reg);
+ 	    replace_vector_const (mode, broadcast_reg, load->insns,
+ 				  load->mode);
+ 	  }
+ 	else
+ 	  {
+ 	    /* This is a constant integer/double vector.  If the
+ 	       inner scalar is 0 or -1, set vector to CONST0_RTX
+ 	       or CONSTM1_RTX directly.  */
+ 	    rtx reg;
+ 	    switch (load->kind)
+ 	      {
+ 	      case X86_CSE_CONST0_VECTOR:
+ 		broadcast_source = CONST0_RTX (mode);
+ 		break;
+ 	      case X86_CSE_CONSTM1_VECTOR:
+ 		broadcast_source = CONSTM1_RTX (mode);
+ 		break;
+ 	      default:
+ 		reg = gen_reg_rtx (load->mode);
+ 		broadcast_source = gen_rtx_VEC_DUPLICATE (mode, reg);
+ 		break;
+ 	      }
+ 	    replace_vector_const (mode, broadcast_reg, load->insns,
+ 				  load->mode);
+ 	  }
+ 	load->broadcast_source = broadcast_source;
+ 	load->broadcast_reg = broadcast_reg;
+ 	replaced = true;
+       }
+ 
+   if (replaced)
+     {
+       auto_vec<rtx_insn *> control_flow_insns;
  
        /* (Re-)discover loops so that bb->loop_father can be used in the
  	 analysis below.  */
        calculate_dominance_info (CDI_DOMINATORS);
        loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
  
!       FOR_EACH_VEC_ELT (loads, i, load)
! 	if (load->count >= load->threshold)
! 	  {
! 	    if (load->def_insn)
! 	      {
! 		/* Insert a broadcast after the original scalar
! 		   definition.  */
! 		rtx set = gen_rtx_SET (load->broadcast_reg,
! 				       load->broadcast_source);
! 		insn = emit_insn_after (set, load->def_insn);
  
! 		if (cfun->can_throw_non_call_exceptions)
! 		  {
! 		    /* Handle REG_EH_REGION note in DEF_INSN.  */
! 		    rtx note = find_reg_note (load->def_insn,
! 					      REG_EH_REGION, nullptr);
! 		    if (note)
! 		      {
! 			control_flow_insns.safe_push (load->def_insn);
! 			add_reg_note (insn, REG_EH_REGION,
! 				      XEXP (note, 0));
! 		      }
! 		  }
! 
! 		if (dump_file)
! 		  {
! 		    fprintf (dump_file, "\nAdd:\n\n");
! 		    print_rtl_single (dump_file, insn);
! 		    fprintf (dump_file, "\nafter:\n\n");
! 		    print_rtl_single (dump_file, load->def_insn);
! 		    fprintf (dump_file, "\n");
! 		  }
! 	      }
! 	    else
! 	      ix86_place_single_vector_set (load->broadcast_reg,
! 					    load->broadcast_source,
! 					    load->bbs,
! 					    (load->kind == X86_CSE_VEC_DUP
! 					     ? load->val
! 					     : nullptr));
! 	  }
  
        loop_optimizer_finalize ();
  
+       if (!control_flow_insns.is_empty ())
+ 	{
+ 	  free_dominance_info (CDI_DOMINATORS);
+ 
+ 	  FOR_EACH_VEC_ELT (control_flow_insns, i, insn)
+ 	    if (control_flow_insn_p (insn))
+ 	      {
+ 		/* Split the block after insn.  There will be a fallthru
+ 		   edge, which is OK so we keep it.  We have to create
+ 		   the exception edges ourselves.  */
+ 		bb = BLOCK_FOR_INSN (insn);
+ 		split_block (bb, insn);
+ 		rtl_make_eh_edge (NULL, bb, BB_END (bb));
+ 	      }
+ 	}
+ 
        df_process_deferred_rescans ();
      }
  
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386-options.cc gcc-16-20250629/gcc/config/i386/i386-options.cc
*** gcc-16-20250622/gcc/config/i386/i386-options.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386-options.cc	Sun Jun 29 22:32:26 2025
*************** static unsigned HOST_WIDE_INT initial_ix
*** 760,822 ****
  /* This table must be in sync with enum processor_type in i386.h.  */
  static const struct processor_costs *processor_cost_table[] =
  {
!   &generic_cost,
!   &i386_cost,
!   &i486_cost,
!   &pentium_cost,
!   &lakemont_cost,
!   &pentiumpro_cost,
!   &pentium4_cost,
!   &nocona_cost,
!   &core_cost,
!   &core_cost,
!   &core_cost,
!   &core_cost,
!   &atom_cost,
!   &slm_cost,
!   &slm_cost,
!   &slm_cost,
!   &tremont_cost,
!   &alderlake_cost,
!   &alderlake_cost,
!   &alderlake_cost,
!   &skylake_cost,
!   &skylake_cost,
!   &icelake_cost,
!   &icelake_cost,
!   &icelake_cost,
!   &skylake_cost,
!   &icelake_cost,
!   &skylake_cost,
!   &icelake_cost,
!   &alderlake_cost,
!   &icelake_cost,
!   &icelake_cost,
!   &icelake_cost,
!   &alderlake_cost,
!   &alderlake_cost,
!   &alderlake_cost,
!   &icelake_cost,
!   &intel_cost,
!   &lujiazui_cost,
!   &yongfeng_cost,
!   &shijidadao_cost,
!   &geode_cost,
!   &k6_cost,
!   &athlon_cost,
!   &k8_cost,
!   &amdfam10_cost,
!   &bdver_cost,
!   &bdver_cost,
!   &bdver_cost,
!   &bdver_cost,
!   &btver1_cost,
!   &btver2_cost,
!   &znver1_cost,
!   &znver2_cost,
!   &znver3_cost,
!   &znver4_cost,
!   &znver5_cost
  };
  
  /* Guarantee that the array is aligned with enum processor_type.  */
--- 760,822 ----
  /* This table must be in sync with enum processor_type in i386.h.  */
  static const struct processor_costs *processor_cost_table[] =
  {
!   &generic_cost,	/* PROCESSOR_GENERIC.		*/
!   &i386_cost,		/* PROCESSOR_I386.		*/
!   &i486_cost,		/* PROCESSOR_I486.		*/
!   &pentium_cost,	/* PROCESSOR_PENTIUM.		*/
!   &lakemont_cost,	/* PROCESSOR_LAKEMONT.		*/
!   &pentiumpro_cost,	/* PROCESSOR_PENTIUMPRO.	*/
!   &pentium4_cost,	/* PROCESSOR_PENTIUM4.		*/
!   &nocona_cost,		/* PROCESSOR_NOCONA.		*/
!   &core_cost,		/* PROCESSOR_CORE2.		*/
!   &core_cost,		/* PROCESSOR_NEHALEM.		*/
!   &core_cost,		/* PROCESSOR_SANDYBRIDGE.	*/
!   &core_cost,		/* PROCESSOR_HASWELL.		*/
!   &atom_cost,		/* PROCESSOR_BONNELL.		*/
!   &slm_cost,		/* PROCESSOR_SILVERMONT.	*/
!   &slm_cost,		/* PROCESSOR_GOLDMONT.		*/
!   &slm_cost,		/* PROCESSOR_GOLDMONT_PLUS.	*/
!   &tremont_cost,	/* PROCESSOR_TREMONT.		*/
!   &alderlake_cost,	/* PROCESSOR_SIERRAFOREST.	*/
!   &alderlake_cost,	/* PROCESSOR_GRANDRIDGE.	*/
!   &alderlake_cost,	/* PROCESSOR_CLEARWATERFOREST.	*/
!   &skylake_cost,	/* PROCESSOR_SKYLAKE.	*/
!   &skylake_cost,	/* PROCESSOR_SKYLAKE_AVX512.	*/
!   &icelake_cost,	/* PROCESSOR_CANNONLAKE.	*/
!   &icelake_cost,	/* PROCESSOR_ICELAKE_CLIENT.	*/
!   &icelake_cost,	/* PROCESSOR_ICELAKE_SERVER.	*/
!   &skylake_cost,	/* PROCESSOR_CASCADELAKE.	*/
!   &icelake_cost,	/* PROCESSOR_TIGERLAKE.		*/
!   &skylake_cost,	/* PROCESSOR_COOPERLAKE.	*/
!   &icelake_cost,	/* PROCESSOR_SAPPHIRERAPIDS.	*/
!   &alderlake_cost,	/* PROCESSOR_ALDERLAKE.		*/
!   &icelake_cost,	/* PROCESSOR_ROCKETLAKE.	*/
!   &icelake_cost,	/* PROCESSOR_GRANITERAPIDS.	*/
!   &icelake_cost,	/* PROCESSOR_GRANITERAPIDS_D.	*/
!   &alderlake_cost,	/* PROCESSOR_ARROWLAKE.		*/
!   &alderlake_cost,	/* PROCESSOR_ARROWLAKE_S.	*/
!   &alderlake_cost,	/* PROCESSOR_PANTHERLAKE.	*/
!   &icelake_cost,	/* PROCESSOR_DIAMONDRAPIDS.	*/
!   &alderlake_cost,	/* PROCESSOR_INTEL.		*/
!   &lujiazui_cost,	/* PROCESSOR_LUJIAZUI.		*/
!   &yongfeng_cost,	/* PROCESSOR_YONGFENG.		*/
!   &shijidadao_cost,	/* PROCESSOR_SHIJIDADAO.	*/
!   &geode_cost,		/* PROCESSOR_GEODE.		*/
!   &k6_cost,		/* PROCESSOR_K6.		*/
!   &athlon_cost,		/* PROCESSOR_ATHLON.		*/
!   &k8_cost,		/* PROCESSOR_K8.		*/
!   &amdfam10_cost,	/* PROCESSOR_AMDFAM10.		*/
!   &bdver_cost,		/* PROCESSOR_BDVER1.		*/
!   &bdver_cost,		/* PROCESSOR_BDVER2.		*/
!   &bdver_cost,		/* PROCESSOR_BDVER3.		*/
!   &bdver_cost,		/* PROCESSOR_BDVER4.		*/
!   &btver1_cost,		/* PROCESSOR_BTVER1.		*/
!   &btver2_cost,		/* PROCESSOR_BTVER2.		*/
!   &znver1_cost,		/* PROCESSOR_ZNVER1.		*/
!   &znver2_cost,		/* PROCESSOR_ZNVER2.		*/
!   &znver3_cost,		/* PROCESSOR_ZNVER3.		*/
!   &znver4_cost,		/* PROCESSOR_ZNVER4.		*/
!   &znver5_cost		/* PROCESSOR_ZNVER5.		*/
  };
  
  /* Guarantee that the array is aligned with enum processor_type.  */
*************** ix86_set_func_type (tree fndecl)
*** 3277,3283 ****
       interrupt function in this case.  */
    enum call_saved_registers_type no_callee_saved_registers
      = TYPE_DEFAULT_CALL_SAVED_REGISTERS;
!   if (lookup_attribute ("no_callee_saved_registers",
  			TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
      no_callee_saved_registers = TYPE_NO_CALLEE_SAVED_REGISTERS;
    else if (ix86_noreturn_no_callee_saved_registers
--- 3277,3286 ----
       interrupt function in this case.  */
    enum call_saved_registers_type no_callee_saved_registers
      = TYPE_DEFAULT_CALL_SAVED_REGISTERS;
!   if (lookup_attribute ("preserve_none",
! 			     TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
!     no_callee_saved_registers = TYPE_PRESERVE_NONE;
!   else if (lookup_attribute ("no_callee_saved_registers",
  			TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
      no_callee_saved_registers = TYPE_NO_CALLEE_SAVED_REGISTERS;
    else if (ix86_noreturn_no_callee_saved_registers
*************** ix86_set_func_type (tree fndecl)
*** 3301,3309 ****
  		      "interrupt and naked attributes are not compatible");
  
  	  if (no_callee_saved_registers)
! 	    error_at (DECL_SOURCE_LOCATION (fndecl),
! 		      "%qs and %qs attributes are not compatible",
! 		      "interrupt", "no_callee_saved_registers");
  
  	  int nargs = 0;
  	  for (tree arg = DECL_ARGUMENTS (fndecl);
--- 3304,3319 ----
  		      "interrupt and naked attributes are not compatible");
  
  	  if (no_callee_saved_registers)
! 	    {
! 	      const char *attr;
! 	      if (no_callee_saved_registers == TYPE_PRESERVE_NONE)
! 		attr = "preserve_none";
! 	      else
! 		attr = "no_callee_saved_registers";
! 	      error_at (DECL_SOURCE_LOCATION (fndecl),
! 			"%qs and %qs attributes are not compatible",
! 			"interrupt", attr);
! 	    }
  
  	  int nargs = 0;
  	  for (tree arg = DECL_ARGUMENTS (fndecl);
*************** ix86_set_func_type (tree fndecl)
*** 3325,3345 ****
        else
  	{
  	  cfun->machine->func_type = TYPE_NORMAL;
! 	  if (lookup_attribute ("no_caller_saved_registers",
! 				TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
  	    cfun->machine->call_saved_registers
  	      = TYPE_NO_CALLER_SAVED_REGISTERS;
- 	  if (no_callee_saved_registers)
- 	    {
- 	      if (cfun->machine->call_saved_registers
- 		  == TYPE_NO_CALLER_SAVED_REGISTERS)
- 		error_at (DECL_SOURCE_LOCATION (fndecl),
- 			  "%qs and %qs attributes are not compatible",
- 			  "no_caller_saved_registers",
- 			  "no_callee_saved_registers");
- 	      cfun->machine->call_saved_registers
- 		= no_callee_saved_registers;
- 	    }
  	}
      }
  }
--- 3335,3347 ----
        else
  	{
  	  cfun->machine->func_type = TYPE_NORMAL;
! 	  if (no_callee_saved_registers)
! 	    cfun->machine->call_saved_registers
! 	      = no_callee_saved_registers;
! 	  else if (lookup_attribute ("no_caller_saved_registers",
! 				     TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
  	    cfun->machine->call_saved_registers
  	      = TYPE_NO_CALLER_SAVED_REGISTERS;
  	}
      }
  }
*************** ix86_set_current_function (tree fndecl)
*** 3528,3538 ****
        || (cfun->machine->call_saved_registers
  	  == TYPE_NO_CALLER_SAVED_REGISTERS))
      {
!       /* Don't allow SSE, MMX nor x87 instructions since they
! 	 may change processor state.  */
        const char *isa;
        if (TARGET_SSE)
! 	isa = "SSE";
        else if (TARGET_MMX)
  	isa = "MMX/3Dnow";
        else if (TARGET_80387)
--- 3530,3550 ----
        || (cfun->machine->call_saved_registers
  	  == TYPE_NO_CALLER_SAVED_REGISTERS))
      {
!       /* Don't allow AVX, AVX512, MMX nor x87 instructions since they
! 	 may change processor state.  Don't allow SSE instructions in
! 	 exception/interrupt service routines.  */
        const char *isa;
        if (TARGET_SSE)
! 	{
! 	  if (TARGET_AVX512F)
! 	    isa = "AVX512";
! 	  else if (TARGET_AVX)
! 	    isa = "AVX";
! 	  else if (cfun->machine->func_type != TYPE_NORMAL)
! 	    isa = "SSE";
! 	  else
! 	    isa = NULL;
! 	}
        else if (TARGET_MMX)
  	isa = "MMX/3Dnow";
        else if (TARGET_80387)
*************** ix86_handle_fndecl_attribute (tree *node
*** 3957,3965 ****
  }
  
  static tree
! ix86_handle_call_saved_registers_attribute (tree *, tree, tree,
  					    int, bool *)
  {
    return NULL_TREE;
  }
  
--- 3969,4018 ----
  }
  
  static tree
! ix86_handle_call_saved_registers_attribute (tree *node, tree name, tree,
  					    int, bool *)
  {
+   const char *attr1 = nullptr;
+   const char *attr2 = nullptr;
+ 
+   if (is_attribute_p ("no_callee_saved_registers", name))
+     {
+       /* Disallow preserve_none and no_caller_saved_registers
+ 	 attributes.  */
+       attr1 = "no_callee_saved_registers";
+       if (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "preserve_none";
+       else if (lookup_attribute ("no_caller_saved_registers",
+ 				 TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "no_caller_saved_registers";
+     }
+   else if (is_attribute_p ("no_caller_saved_registers", name))
+     {
+       /* Disallow preserve_none and no_callee_saved_registers
+ 	 attributes.  */
+       attr1 = "no_caller_saved_registers";
+       if (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "preserve_none";
+       else if (lookup_attribute ("no_callee_saved_registers",
+ 				 TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "no_callee_saved_registers";
+     }
+   else if (is_attribute_p ("preserve_none", name))
+     {
+       /* Disallow no_callee_saved_registers and no_caller_saved_registers
+ 	 attributes.  */
+       attr1 = "preserve_none";
+       if (lookup_attribute ("no_callee_saved_registers",
+ 			    TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "no_caller_saved_registers";
+       else if (lookup_attribute ("no_callee_saved_registers",
+ 				 TYPE_ATTRIBUTES (*node)))
+ 	attr2 = "no_callee_saved_registers";
+     }
+ 
+   if (attr2)
+     error ("%qs and %qs attributes are not compatible", attr1, attr2);
+ 
    return NULL_TREE;
  }
  
*************** static const attribute_spec ix86_gnu_att
*** 4121,4126 ****
--- 4174,4181 ----
      ix86_handle_interrupt_attribute, NULL },
    { "no_caller_saved_registers", 0, 0, false, true, true, false,
      ix86_handle_call_saved_registers_attribute, NULL },
+   { "preserve_none", 0, 0, false, true, true, true,
+     ix86_handle_call_saved_registers_attribute, NULL },
    { "no_callee_saved_registers", 0, 0, false, true, true, true,
      ix86_handle_call_saved_registers_attribute, NULL },
    { "naked", 0, 0, true, false, false, false,
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386-protos.h gcc-16-20250629/gcc/config/i386/i386-protos.h
*** gcc-16-20250622/gcc/config/i386/i386-protos.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386-protos.h	Sun Jun 29 22:32:26 2025
*************** extern tree ix86_valid_target_attribute_
*** 282,287 ****
--- 282,288 ----
  					      struct gcc_options *,
  					      struct gcc_options *, bool);
  extern unsigned int ix86_get_callcvt (const_tree);
+ extern bool ix86_type_no_callee_saved_registers_p (const_tree);
  
  #endif
  
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386.cc gcc-16-20250629/gcc/config/i386/i386.cc
*** gcc-16-20250622/gcc/config/i386/i386.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386.cc	Sun Jun 29 22:32:26 2025
*************** static int const x86_64_ms_abi_int_param
*** 335,340 ****
--- 335,348 ----
    CX_REG, DX_REG, R8_REG, R9_REG
  };
  
+ /* Similar as Clang's preserve_none function parameter passing.
+    NB: Use DI_REG and SI_REG, see ix86_function_value_regno_p.  */
+ 
+ static int const x86_64_preserve_none_int_parameter_registers[6] =
+ {
+   R12_REG, R13_REG, R14_REG, R15_REG, DI_REG, SI_REG
+ };
+ 
  static int const x86_64_int_return_registers[4] =
  {
    AX_REG, DX_REG, DI_REG, SI_REG
*************** int ix86_arch_specified;
*** 460,466 ****
     red-zone.
  
     NB: Don't use red-zone for functions with no_caller_saved_registers
!    and 32 GPRs since 128-byte red-zone is too small for 31 GPRs.
  
     TODO: If we can reserve the first 2 WORDs, for PUSH and, another
     for CALL, in red-zone, we can allow local indirect jumps with
--- 468,475 ----
     red-zone.
  
     NB: Don't use red-zone for functions with no_caller_saved_registers
!    and 32 GPRs or 16 XMM registers since 128-byte red-zone is too small
!    for 31 GPRs or 15 GPRs + 16 XMM registers.
  
     TODO: If we can reserve the first 2 WORDs, for PUSH and, another
     for CALL, in red-zone, we can allow local indirect jumps with
*************** ix86_using_red_zone (void)
*** 471,477 ****
  {
    return (TARGET_RED_ZONE
  	  && !TARGET_64BIT_MS_ABI
! 	  && (!TARGET_APX_EGPR
  	      || (cfun->machine->call_saved_registers
  		  != TYPE_NO_CALLER_SAVED_REGISTERS))
  	  && (!cfun->machine->has_local_indirect_jump
--- 480,486 ----
  {
    return (TARGET_RED_ZONE
  	  && !TARGET_64BIT_MS_ABI
! 	  && ((!TARGET_APX_EGPR && !TARGET_SSE)
  	      || (cfun->machine->call_saved_registers
  		  != TYPE_NO_CALLER_SAVED_REGISTERS))
  	  && (!cfun->machine->has_local_indirect_jump
*************** x86_64_elf_unique_section (tree decl, in
*** 898,903 ****
--- 907,924 ----
    default_unique_section (decl, reloc);
  }
  
+ /* Return true if TYPE has no_callee_saved_registers or preserve_none
+    attribute.  */
+ 
+ bool
+ ix86_type_no_callee_saved_registers_p (const_tree type)
+ {
+   return (lookup_attribute ("no_callee_saved_registers",
+ 			    TYPE_ATTRIBUTES (type)) != NULL
+ 	  || lookup_attribute ("preserve_none",
+ 			       TYPE_ATTRIBUTES (type)) != NULL);
+ }
+ 
  #ifdef COMMON_ASM_OP
  
  #ifndef LARGECOMM_SECTION_ASM_OP
*************** ix86_function_ok_for_sibcall (tree decl,
*** 1019,1029 ****
  
    /* Sibling call isn't OK if callee has no callee-saved registers
       and the calling function has callee-saved registers.  */
!   if (cfun->machine->call_saved_registers != TYPE_NO_CALLEE_SAVED_REGISTERS
        && (cfun->machine->call_saved_registers
  	  != TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP)
!       && lookup_attribute ("no_callee_saved_registers",
! 			   TYPE_ATTRIBUTES (type)))
      return false;
  
    /* If outgoing reg parm stack space changes, we cannot do sibcall.  */
--- 1040,1051 ----
  
    /* Sibling call isn't OK if callee has no callee-saved registers
       and the calling function has callee-saved registers.  */
!   if ((cfun->machine->call_saved_registers
!        != TYPE_NO_CALLEE_SAVED_REGISTERS)
!       && cfun->machine->call_saved_registers != TYPE_PRESERVE_NONE
        && (cfun->machine->call_saved_registers
  	  != TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP)
!       && ix86_type_no_callee_saved_registers_p (type))
      return false;
  
    /* If outgoing reg parm stack space changes, we cannot do sibcall.  */
*************** ix86_comp_type_attributes (const_tree ty
*** 1188,1197 ****
        != ix86_function_regparm (type2, NULL))
      return 0;
  
!   if (lookup_attribute ("no_callee_saved_registers",
! 			TYPE_ATTRIBUTES (type1))
!       != lookup_attribute ("no_callee_saved_registers",
! 			   TYPE_ATTRIBUTES (type2)))
      return 0;
  
    return 1;
--- 1210,1225 ----
        != ix86_function_regparm (type2, NULL))
      return 0;
  
!   if (ix86_type_no_callee_saved_registers_p (type1)
!       != ix86_type_no_callee_saved_registers_p (type2))
!     return 0;
! 
!   /* preserve_none attribute uses a different calling convention is
!      only for 64-bit.  */
!   if (TARGET_64BIT
!       && (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (type1))
! 	  != lookup_attribute ("preserve_none",
! 			       TYPE_ATTRIBUTES (type2))))
      return 0;
  
    return 1;
*************** ix86_function_arg_regno_p (int regno)
*** 1553,1559 ****
    if (call_abi == SYSV_ABI && regno == AX_REG)
      return true;
  
!   if (call_abi == MS_ABI)
      parm_regs = x86_64_ms_abi_int_parameter_registers;
    else
      parm_regs = x86_64_int_parameter_registers;
--- 1581,1590 ----
    if (call_abi == SYSV_ABI && regno == AX_REG)
      return true;
  
!   if (cfun
!       && cfun->machine->call_saved_registers == TYPE_PRESERVE_NONE)
!     parm_regs = x86_64_preserve_none_int_parameter_registers;
!   else if (call_abi == MS_ABI)
      parm_regs = x86_64_ms_abi_int_parameter_registers;
    else
      parm_regs = x86_64_int_parameter_registers;
*************** init_cumulative_args (CUMULATIVE_ARGS *c
*** 1835,1840 ****
--- 1866,1872 ----
  
    memset (cum, 0, sizeof (*cum));
  
+   tree preserve_none_type;
    if (fndecl)
      {
        target = cgraph_node::get (fndecl);
*************** init_cumulative_args (CUMULATIVE_ARGS *c
*** 1843,1854 ****
  	  target = target->function_symbol ();
  	  local_info_node = cgraph_node::local_info_node (target->decl);
  	  cum->call_abi = ix86_function_abi (target->decl);
  	}
        else
! 	cum->call_abi = ix86_function_abi (fndecl);
      }
    else
!     cum->call_abi = ix86_function_type_abi (fntype);
  
    cum->caller = caller;
  
--- 1875,1898 ----
  	  target = target->function_symbol ();
  	  local_info_node = cgraph_node::local_info_node (target->decl);
  	  cum->call_abi = ix86_function_abi (target->decl);
+ 	  preserve_none_type = TREE_TYPE (target->decl);
  	}
        else
! 	{
! 	  cum->call_abi = ix86_function_abi (fndecl);
! 	  preserve_none_type = TREE_TYPE (fndecl);
! 	}
      }
    else
!     {
!       cum->call_abi = ix86_function_type_abi (fntype);
!       preserve_none_type = fntype;
!     }
!   cum->preserve_none_abi
!     = (preserve_none_type
!        && (lookup_attribute ("preserve_none",
! 			     TYPE_ATTRIBUTES (preserve_none_type))
! 	   != nullptr));
  
    cum->caller = caller;
  
*************** function_arg_64 (const CUMULATIVE_ARGS *
*** 3421,3429 ****
        break;
      }
  
    return construct_container (mode, orig_mode, type, 0, cum->nregs,
  			      cum->sse_nregs,
! 			      &x86_64_int_parameter_registers [cum->regno],
  			      cum->sse_regno);
  }
  
--- 3465,3479 ----
        break;
      }
  
+   const int *parm_regs;
+   if (cum->preserve_none_abi)
+     parm_regs = x86_64_preserve_none_int_parameter_registers;
+   else
+     parm_regs = x86_64_int_parameter_registers;
+ 
    return construct_container (mode, orig_mode, type, 0, cum->nregs,
  			      cum->sse_nregs,
! 			      &parm_regs[cum->regno],
  			      cum->sse_regno);
  }
  
*************** setup_incoming_varargs_64 (CUMULATIVE_AR
*** 4588,4593 ****
--- 4638,4649 ----
    if (max > X86_64_REGPARM_MAX)
      max = X86_64_REGPARM_MAX;
  
+   const int *parm_regs;
+   if (cum->preserve_none_abi)
+     parm_regs = x86_64_preserve_none_int_parameter_registers;
+   else
+     parm_regs = x86_64_int_parameter_registers;
+ 
    for (i = cum->regno; i < max; i++)
      {
        mem = gen_rtx_MEM (word_mode,
*************** setup_incoming_varargs_64 (CUMULATIVE_AR
*** 4595,4602 ****
        MEM_NOTRAP_P (mem) = 1;
        set_mem_alias_set (mem, set);
        emit_move_insn (mem,
! 		      gen_rtx_REG (word_mode,
! 				   x86_64_int_parameter_registers[i]));
      }
  
    if (ix86_varargs_fpr_size)
--- 4651,4657 ----
        MEM_NOTRAP_P (mem) = 1;
        set_mem_alias_set (mem, set);
        emit_move_insn (mem,
! 		      gen_rtx_REG (word_mode, parm_regs[i]));
      }
  
    if (ix86_varargs_fpr_size)
*************** ix86_get_ssemov (rtx *operands, unsigned
*** 5703,5709 ****
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW
  			 ? "vmovdqu16"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
--- 5758,5764 ----
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW && evex_reg_p
  			 ? "vmovdqu16"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
*************** ix86_get_ssemov (rtx *operands, unsigned
*** 5745,5751 ****
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW
  			 ? "vmovdqu8"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
--- 5800,5806 ----
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW && evex_reg_p
  			 ? "vmovdqu8"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
*************** ix86_get_ssemov (rtx *operands, unsigned
*** 5765,5771 ****
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW
  			 ? "vmovdqu16"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
--- 5820,5826 ----
  		      : "%vmovaps");
  	  else
  	    opcode = (misaligned_p
! 		      ? (TARGET_AVX512BW && evex_reg_p
  			 ? "vmovdqu16"
  			 : "%vmovdqu")
  		      : "%vmovdqa");
*************** ix86_save_reg (unsigned int regno, bool
*** 6718,6723 ****
--- 6773,6779 ----
  		  || !frame_pointer_needed));
  
      case TYPE_NO_CALLEE_SAVED_REGISTERS:
+     case TYPE_PRESERVE_NONE:
        return false;
  
      case TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP:
*************** ix86_nsaved_sseregs (void)
*** 6797,6803 ****
    int nregs = 0;
    int regno;
  
!   if (!TARGET_64BIT_MS_ABI)
      return 0;
    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
      if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true, true))
--- 6853,6861 ----
    int nregs = 0;
    int regno;
  
!   if (!TARGET_64BIT_MS_ABI
!       && (cfun->machine->call_saved_registers
! 	  != TYPE_NO_CALLER_SAVED_REGISTERS))
      return 0;
    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
      if (SSE_REGNO_P (regno) && ix86_save_reg (regno, true, true))
*************** ix86_compute_frame_layout (void)
*** 7005,7016 ****
    gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
    gcc_assert (preferred_alignment <= stack_alignment_needed);
  
!   /* The only ABI saving SSE regs should be 64-bit ms_abi.  */
!   gcc_assert (TARGET_64BIT || !frame->nsseregs);
    if (TARGET_64BIT && m->call_ms2sysv)
      {
        gcc_assert (stack_alignment_needed >= 16);
!       gcc_assert (!frame->nsseregs);
      }
  
    /* For SEH we have to limit the amount of code movement into the prologue.
--- 7063,7080 ----
    gcc_assert (preferred_alignment >= STACK_BOUNDARY / BITS_PER_UNIT);
    gcc_assert (preferred_alignment <= stack_alignment_needed);
  
!   /* The only ABI saving SSE regs should be 64-bit ms_abi or with
!      no_caller_saved_registers attribue.  */
!   gcc_assert (TARGET_64BIT
! 	      || (cfun->machine->call_saved_registers
! 		  == TYPE_NO_CALLER_SAVED_REGISTERS)
! 	      || !frame->nsseregs);
    if (TARGET_64BIT && m->call_ms2sysv)
      {
        gcc_assert (stack_alignment_needed >= 16);
!       gcc_assert ((cfun->machine->call_saved_registers
! 		   == TYPE_NO_CALLER_SAVED_REGISTERS)
! 		  || !frame->nsseregs);
      }
  
    /* For SEH we have to limit the amount of code movement into the prologue.
*************** ix86_expand_prologue (void)
*** 9443,9450 ****
      }
    else
      {
-       gcc_assert (!crtl->shrink_wrapped_separate);
- 
        rtx eax = gen_rtx_REG (Pmode, AX_REG);
        rtx r10 = NULL;
        const bool sp_is_cfa_reg = (m->fs.cfa_reg == stack_pointer_rtx);
--- 9507,9512 ----
*************** x86_this_parameter (tree function)
*** 23299,23305 ****
      {
        const int *parm_regs;
  
!       if (ix86_function_type_abi (type) == MS_ABI)
          parm_regs = x86_64_ms_abi_int_parameter_registers;
        else
          parm_regs = x86_64_int_parameter_registers;
--- 23361,23369 ----
      {
        const int *parm_regs;
  
!       if (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (type)))
! 	parm_regs = x86_64_preserve_none_int_parameter_registers;
!       else if (ix86_function_type_abi (type) == MS_ABI)
          parm_regs = x86_64_ms_abi_int_parameter_registers;
        else
          parm_regs = x86_64_int_parameter_registers;
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386.h gcc-16-20250629/gcc/config/i386/i386.h
*** gcc-16-20250622/gcc/config/i386/i386.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386.h	Sun Jun 29 22:32:26 2025
*************** typedef struct ix86_args {
*** 1696,1701 ****
--- 1696,1703 ----
    int stdarg;                   /* Set to 1 if function is stdarg.  */
    enum calling_abi call_abi;	/* Set to SYSV_ABI for sysv abi. Otherwise
   				   MS_ABI for ms abi.  */
+   bool preserve_none_abi;	/* Set to true if the preserve_none ABI is
+ 				   used.  */
    tree decl;			/* Callee decl.  */
  } CUMULATIVE_ARGS;
  
*************** constexpr wide_int_bitmask PTA_GOLDMONT_
*** 2446,2457 ****
    | PTA_SGX | PTA_PTWRITE;
  constexpr wide_int_bitmask PTA_TREMONT = PTA_GOLDMONT_PLUS | PTA_CLWB
    | PTA_GFNI | PTA_MOVDIRI | PTA_MOVDIR64B | PTA_CLDEMOTE | PTA_WAITPKG;
! constexpr wide_int_bitmask PTA_ALDERLAKE = PTA_TREMONT | PTA_ADX | PTA_AVX
    | PTA_AVX2 | PTA_BMI | PTA_BMI2 | PTA_F16C | PTA_FMA | PTA_LZCNT
    | PTA_PCONFIG | PTA_PKU | PTA_VAES | PTA_VPCLMULQDQ | PTA_SERIALIZE
    | PTA_HRESET | PTA_KL | PTA_WIDEKL | PTA_AVXVNNI;
! constexpr wide_int_bitmask PTA_SIERRAFOREST = PTA_ALDERLAKE | PTA_AVXIFMA
!   | PTA_AVXVNNIINT8 | PTA_AVXNECONVERT | PTA_CMPCCXADD | PTA_ENQCMD | PTA_UINTR;
  constexpr wide_int_bitmask PTA_GRANITERAPIDS = PTA_SAPPHIRERAPIDS | PTA_AMX_FP16
    | PTA_PREFETCHI | PTA_AVX10_1;
  constexpr wide_int_bitmask PTA_GRANITERAPIDS_D = PTA_GRANITERAPIDS
--- 2448,2461 ----
    | PTA_SGX | PTA_PTWRITE;
  constexpr wide_int_bitmask PTA_TREMONT = PTA_GOLDMONT_PLUS | PTA_CLWB
    | PTA_GFNI | PTA_MOVDIRI | PTA_MOVDIR64B | PTA_CLDEMOTE | PTA_WAITPKG;
! constexpr wide_int_bitmask PTA_ALDERLAKE = PTA_GOLDMONT_PLUS | PTA_CLWB
!   | PTA_GFNI | PTA_MOVDIRI | PTA_MOVDIR64B | PTA_WAITPKG | PTA_ADX | PTA_AVX
    | PTA_AVX2 | PTA_BMI | PTA_BMI2 | PTA_F16C | PTA_FMA | PTA_LZCNT
    | PTA_PCONFIG | PTA_PKU | PTA_VAES | PTA_VPCLMULQDQ | PTA_SERIALIZE
    | PTA_HRESET | PTA_KL | PTA_WIDEKL | PTA_AVXVNNI;
! constexpr wide_int_bitmask PTA_SIERRAFOREST = PTA_ALDERLAKE | PTA_CLDEMOTE
!   | PTA_AVXIFMA | PTA_AVXVNNIINT8 | PTA_AVXNECONVERT | PTA_CMPCCXADD
!   | PTA_ENQCMD | PTA_UINTR;
  constexpr wide_int_bitmask PTA_GRANITERAPIDS = PTA_SAPPHIRERAPIDS | PTA_AMX_FP16
    | PTA_PREFETCHI | PTA_AVX10_1;
  constexpr wide_int_bitmask PTA_GRANITERAPIDS_D = PTA_GRANITERAPIDS
*************** enum call_saved_registers_type
*** 2803,2808 ****
--- 2807,2815 ----
    /* The current function is a function specified with the "noreturn"
       attribute.  */
    TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP,
+   /* The current function is a function specified with the
+      "preserve_none" attribute.  */
+   TYPE_PRESERVE_NONE,
  };
  
  enum queued_insn_type
*************** struct GTY(()) machine_function {
*** 2879,2885 ****
    ENUM_BITFIELD(indirect_branch) function_return_type : 3;
  
    /* Call saved registers type.  */
!   ENUM_BITFIELD(call_saved_registers_type) call_saved_registers : 2;
  
    /* If true, there is register available for argument passing.  This
       is used only in ix86_function_ok_for_sibcall by 32-bit to determine
--- 2886,2892 ----
    ENUM_BITFIELD(indirect_branch) function_return_type : 3;
  
    /* Call saved registers type.  */
!   ENUM_BITFIELD(call_saved_registers_type) call_saved_registers : 3;
  
    /* If true, there is register available for argument passing.  This
       is used only in ix86_function_ok_for_sibcall by 32-bit to determine
*************** struct GTY(()) machine_function {
*** 2924,2929 ****
--- 2931,2939 ----
    /* True if inline asm with redzone clobber has been seen.  */
    BOOL_BITFIELD asm_redzone_clobber_seen : 1;
  
+   /* True if this is a recursive function.  */
+   BOOL_BITFIELD recursive_function : 1;
+ 
    /* The largest alignment, in bytes, of stack slot actually used.  */
    unsigned int max_used_stack_alignment;
  
diff -Nrcpad gcc-16-20250622/gcc/config/i386/i386.md gcc-16-20250629/gcc/config/i386/i386.md
*** gcc-16-20250622/gcc/config/i386/i386.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/i386.md	Sun Jun 29 22:32:26 2025
***************
*** 27449,27455 ****
  	(cond [(and (eq_attr "alternative" "0")
  		    (not (match_test "TARGET_OPT_AGU")))
  		 (const_string "alu")
! 	       (match_operand:<MODE> 2 "const0_operand")
  		 (const_string "imov")
  	      ]
  	      (const_string "lea")))
--- 27449,27455 ----
  	(cond [(and (eq_attr "alternative" "0")
  		    (not (match_test "TARGET_OPT_AGU")))
  		 (const_string "alu")
! 	       (match_operand 2 "const0_operand")
  		 (const_string "imov")
  	      ]
  	      (const_string "lea")))
***************
*** 27470,27476 ****
     (clobber (mem:BLK (scratch)))]
    ""
  {
!   if (operands[2] == CONST0_RTX (<MODE>mode))
      return "mov{<imodesuffix>}\t{%1, %0|%0, %1}";
    else
      {
--- 27470,27476 ----
     (clobber (mem:BLK (scratch)))]
    ""
  {
!   if (get_attr_type (insn) == TYPE_IMOV)
      return "mov{<imodesuffix>}\t{%1, %0|%0, %1}";
    else
      {
***************
*** 27478,27490 ****
        return "lea{<imodesuffix>}\t{%E2, %0|%0, %E2}";
      }
  }
!   [(set (attr "length_immediate")
  	(cond [(eq_attr "type" "imov")
  		 (const_string "0")
  	      ]
  	      (const_string "*")))
     (set_attr "mode" "<MODE>")])
  
  (define_insn "@pro_epilogue_adjust_stack_sub_<mode>"
    [(set (match_operand:P 0 "register_operand" "=r")
  	(minus:P (match_operand:P 1 "register_operand" "0")
--- 27478,27508 ----
        return "lea{<imodesuffix>}\t{%E2, %0|%0, %E2}";
      }
  }
!   [(set (attr "type")
! 	(cond [(match_operand 2 "const0_operand")
! 		 (const_string "imov")
! 	      ]
! 	      (const_string "lea")))
!    (set (attr "length_immediate")
  	(cond [(eq_attr "type" "imov")
  		 (const_string "0")
  	      ]
  	      (const_string "*")))
     (set_attr "mode" "<MODE>")])
  
+ (define_peephole2
+   [(parallel
+      [(set (match_operand:P 0 "register_operand")
+ 	   (plus:P (match_dup 0)
+ 		   (match_operand:P 1 "<nonmemory_operand>")))
+       (clobber (mem:BLK (scratch)))])]
+   "peep2_regno_dead_p (0, FLAGS_REG)"
+   [(parallel
+      [(set (match_dup 0)
+ 	   (plus:P (match_dup 0) (match_dup 1)))
+       (clobber (reg:CC FLAGS_REG))
+       (clobber (mem:BLK (scratch)))])])
+ 
  (define_insn "@pro_epilogue_adjust_stack_sub_<mode>"
    [(set (match_operand:P 0 "register_operand" "=r")
  	(minus:P (match_operand:P 1 "register_operand" "0")
***************
*** 29505,29510 ****
--- 29523,29545 ----
     (set_attr "prefix_extra" "1")
     (set_attr "mode" "DI")])
  
+ (define_expand "crc_rev<SWI124:mode>si4"
+   [(match_operand:SI 0 "register_operand")
+    (match_operand:SI 1 "register_operand")
+    (match_operand:SWI124 2 "nonimmediate_operand")
+    (match_operand:SI 3)]
+   "TARGET_CRC32"
+ {
+   /* crc32 uses iSCSI polynomial */
+   if (INTVAL (operands[3]) == 0x1EDC6F41)
+     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;
+ })
+ 
  (define_insn "rdpmc"
    [(set (match_operand:DI 0 "register_operand" "=A")
    	(unspec_volatile:DI [(match_operand:SI 1 "register_operand" "c")]
diff -Nrcpad gcc-16-20250622/gcc/config/i386/x86-tune-costs.h gcc-16-20250629/gcc/config/i386/x86-tune-costs.h
*** gcc-16-20250622/gcc/config/i386/x86-tune-costs.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/x86-tune-costs.h	Sun Jun 29 22:32:26 2025
*************** struct processor_costs tremont_cost = {
*** 3568,3694 ****
    COSTS_N_INSNS (2),			/* Branch mispredict scale.  */
  };
  
- static stringop_algs intel_memcpy[2] = {
-   {libcall, {{11, loop, false}, {-1, rep_prefix_4_byte, false}}},
-   {libcall, {{32, loop, false}, {64, rep_prefix_4_byte, false},
-              {8192, rep_prefix_8_byte, false}, {-1, libcall, false}}}};
- static stringop_algs intel_memset[2] = {
-   {libcall, {{8, loop, false}, {15, unrolled_loop, false},
-              {2048, rep_prefix_4_byte, false}, {-1, libcall, false}}},
-   {libcall, {{24, loop, false}, {32, unrolled_loop, false},
-              {8192, rep_prefix_8_byte, false}, {-1, libcall, false}}}};
- static const
- struct processor_costs intel_cost = {
-   {
-   /* Start of register allocator costs.  integer->integer move cost is 2. */
-   6,				     /* cost for loading QImode using movzbl */
-   {4, 4, 4},				/* cost of loading integer registers
- 					   in QImode, HImode and SImode.
- 					   Relative to reg-reg move (2).  */
-   {6, 6, 6},				/* cost of storing integer registers */
-   2,					/* cost of reg,reg fld/fst */
-   {6, 6, 8},				/* cost of loading fp registers
- 					   in SFmode, DFmode and XFmode */
-   {6, 6, 10},				/* cost of storing fp registers
- 					   in SFmode, DFmode and XFmode */
-   2,					/* cost of moving MMX register */
-   {6, 6},				/* cost of loading MMX registers
- 					   in SImode and DImode */
-   {6, 6},				/* cost of storing MMX registers
- 					   in SImode and DImode */
-   2, 2, 2,				/* cost of moving XMM,YMM,ZMM register */
-   {6, 6, 6, 6, 6},			/* cost of loading SSE registers
- 					   in 32,64,128,256 and 512-bit */
-   {6, 6, 6, 6, 6},			/* cost of storing SSE registers
- 					   in 32,64,128,256 and 512-bit */
-   4, 4,				/* SSE->integer and integer->SSE moves */
-   4, 4,				/* mask->integer and integer->mask moves */
-   {4, 4, 4},				/* cost of loading mask register
- 					   in QImode, HImode, SImode.  */
-   {6, 6, 6},				/* cost if storing mask register
- 					   in QImode, HImode, SImode.  */
-   2,					/* cost of moving mask register.  */
-   /* End of register allocator costs.  */
-   },
- 
-   COSTS_N_INSNS (1),			/* cost of an add instruction */
-   COSTS_N_INSNS (1) + 1,		/* cost of a lea instruction */
-   COSTS_N_INSNS (1),			/* variable shift costs */
-   COSTS_N_INSNS (1),			/* constant shift costs */
-   {COSTS_N_INSNS (3),			/* cost of starting multiply for QI */
-    COSTS_N_INSNS (3),			/*				 HI */
-    COSTS_N_INSNS (3),			/*				 SI */
-    COSTS_N_INSNS (4),			/*				 DI */
-    COSTS_N_INSNS (2)},			/*			      other */
-   0,					/* cost of multiply per each bit set */
-   {COSTS_N_INSNS (18),			/* cost of a divide/mod for QI */
-    COSTS_N_INSNS (26),			/*			    HI */
-    COSTS_N_INSNS (42),			/*			    SI */
-    COSTS_N_INSNS (74),			/*			    DI */
-    COSTS_N_INSNS (74)},			/*			    other */
-   COSTS_N_INSNS (1),			/* cost of movsx */
-   COSTS_N_INSNS (1),			/* cost of movzx */
-   8,					/* "large" insn */
-   17,					/* MOVE_RATIO */
-   6,					/* CLEAR_RATIO */
-   {4, 4, 4},				/* cost of loading integer registers
- 					   in QImode, HImode and SImode.
- 					   Relative to reg-reg move (2).  */
-   {6, 6, 6},				/* cost of storing integer registers */
-   {6, 6, 6, 6, 6},			/* cost of loading SSE register
- 					   in 32bit, 64bit, 128bit, 256bit and 512bit */
-   {6, 6, 6, 6, 6},			/* cost of storing SSE register
- 					   in 32bit, 64bit, 128bit, 256bit and 512bit */
-   {10, 10, 10, 10, 10},			/* cost of unaligned loads.  */
-   {10, 10, 10, 10, 10},			/* cost of unaligned loads.  */
-   2, 2, 2,				/* cost of moving XMM,YMM,ZMM register */
-   4,					/* cost of moving SSE register to integer.  */
-   4,					/* cost of moving integer register to SSE.  */
-   6, 6,					/* Gather load static, per_elt.  */
-   6, 6,					/* Gather store static, per_elt.  */
-   32,					/* size of l1 cache.  */
-   256,					/* size of l2 cache.  */
-   64,					/* size of prefetch block */
-   6,					/* number of parallel prefetches */
-   3,					/* Branch cost */
-   COSTS_N_INSNS (8),			/* cost of FADD and FSUB insns.  */
-   COSTS_N_INSNS (8),			/* cost of FMUL instruction.  */
-   COSTS_N_INSNS (20),			/* cost of FDIV instruction.  */
-   COSTS_N_INSNS (8),			/* cost of FABS instruction.  */
-   COSTS_N_INSNS (8),			/* cost of FCHS instruction.  */
-   COSTS_N_INSNS (40),			/* cost of FSQRT instruction.  */
- 
-   COSTS_N_INSNS (1),			/* cost of cheap SSE instruction.  */
-   COSTS_N_INSNS (8),			/* cost of ADDSS/SD SUBSS/SD insns.  */
-   COSTS_N_INSNS (8),			/* cost of MULSS instruction.  */
-   COSTS_N_INSNS (8),			/* cost of MULSD instruction.  */
-   COSTS_N_INSNS (6),			/* cost of FMA SS instruction.  */
-   COSTS_N_INSNS (6),			/* cost of FMA SD instruction.  */
-   COSTS_N_INSNS (20),			/* cost of DIVSS instruction.  */
-   COSTS_N_INSNS (20),			/* cost of DIVSD instruction.  */
-   COSTS_N_INSNS (40),			/* cost of SQRTSS instruction.  */
-   COSTS_N_INSNS (40),			/* cost of SQRTSD instruction.  */
-   COSTS_N_INSNS (8),			/* cost of CVTSS2SD etc.  */
-   COSTS_N_INSNS (16),			/* cost of 256bit VCVTPS2PD etc.  */
-   COSTS_N_INSNS (32),			/* cost of 512bit VCVTPS2PD etc.  */
-   COSTS_N_INSNS (8),			/* cost of CVTSI2SS instruction.  */
-   COSTS_N_INSNS (8),			/* cost of CVT(T)SS2SI instruction.  */
-   COSTS_N_INSNS (8),			/* cost of CVTPI2PS instruction.  */
-   COSTS_N_INSNS (8),			/* cost of CVT(T)PS2PI instruction.  */
-   1, 4, 1, 1,				/* reassoc int, fp, vec_int, vec_fp.  */
-   intel_memcpy,
-   intel_memset,
-   COSTS_N_INSNS (3),			/* cond_taken_branch_cost.  */
-   COSTS_N_INSNS (1),			/* cond_not_taken_branch_cost.  */
-   "16",					/* Loop alignment.  */
-   "16:8:8",				/* Jump alignment.  */
-   "0:0:8",				/* Label alignment.  */
-   "16",					/* Func alignment.  */
-   4,					/* Small unroll limit.  */
-   2,					/* Small unroll factor.  */
-   COSTS_N_INSNS (2),			/* Branch mispredict scale.  */
- };
- 
  /* lujiazui_cost should produce code tuned for ZHAOXIN lujiazui CPU.  */
  static stringop_algs lujiazui_memcpy[2] = {
    {libcall, {{32, loop, false}, {8192, rep_prefix_4_byte, false},
--- 3568,3573 ----
*************** struct processor_costs shijidadao_cost =
*** 4065,4083 ****
  
  
  
! /* Generic should produce code tuned for Core-i7 (and newer chips)
!    and btver1 (and newer chips).  */
  
  static stringop_algs generic_memcpy[2] = {
!   {libcall, {{32, loop, false}, {8192, rep_prefix_4_byte, false},
!              {-1, libcall, false}}},
!   {libcall, {{32, loop, false}, {8192, rep_prefix_8_byte, false},
!              {-1, libcall, false}}}};
  static stringop_algs generic_memset[2] = {
!   {libcall, {{32, loop, false}, {8192, rep_prefix_4_byte, false},
!              {-1, libcall, false}}},
!   {libcall, {{32, loop, false}, {8192, rep_prefix_8_byte, false},
!              {-1, libcall, false}}}};
  static const
  struct processor_costs generic_cost = {
    {
--- 3944,3979 ----
  
  
  
! /* Generic should produce code tuned for Haswell (and newer chips)
!    and znver1 (and newer chips):
!    1. Don't align memory.
!    2. For known sizes, prefer vector loop, unroll loop with 4 moves or
!       stores per iteration without aligning the loop, up to 256 bytes.
!    3. For unknown sizes, use memcpy/memset.
!    4. Since each loop iteration has 4 stores and 8 stores for zeroing
!       with unroll loop may be needed, change CLEAR_RATIO to 10 so that
!       zeroing up to 72 bytes are fully unrolled with 9 stores without
!       SSE.
!  */
  
  static stringop_algs generic_memcpy[2] = {
!   {libcall,
!    {{256, vector_loop, true},
!     {256, unrolled_loop, true},
!     {-1, libcall, true}}},
!   {libcall,
!    {{256, vector_loop, true},
!     {256, unrolled_loop, true},
!     {-1, libcall, true}}}};
  static stringop_algs generic_memset[2] = {
!   {libcall,
!    {{256, vector_loop, true},
!     {256, unrolled_loop, true},
!     {-1, libcall, true}}},
!   {libcall,
!    {{256, vector_loop, true},
!     {256, unrolled_loop, true},
!     {-1, libcall, true}}}};
  static const
  struct processor_costs generic_cost = {
    {
*************** struct processor_costs generic_cost = {
*** 4134,4140 ****
    COSTS_N_INSNS (1),			/* cost of movzx */
    8,					/* "large" insn */
    17,					/* MOVE_RATIO */
!   6,					/* CLEAR_RATIO */
    {6, 6, 6},				/* cost of loading integer registers
  					   in QImode, HImode and SImode.
  					   Relative to reg-reg move (2).  */
--- 4030,4036 ----
    COSTS_N_INSNS (1),			/* cost of movzx */
    8,					/* "large" insn */
    17,					/* MOVE_RATIO */
!   10,					/* CLEAR_RATIO */
    {6, 6, 6},				/* cost of loading integer registers
  					   in QImode, HImode and SImode.
  					   Relative to reg-reg move (2).  */
diff -Nrcpad gcc-16-20250622/gcc/config/i386/x86-tune-sched.cc gcc-16-20250629/gcc/config/i386/x86-tune-sched.cc
*** gcc-16-20250622/gcc/config/i386/x86-tune-sched.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/i386/x86-tune-sched.cc	Sun Jun 29 22:32:26 2025
*************** ix86_issue_rate (void)
*** 45,51 ****
      case PROCESSOR_LAKEMONT:
      case PROCESSOR_BONNELL:
      case PROCESSOR_SILVERMONT:
-     case PROCESSOR_INTEL:
      case PROCESSOR_K6:
      case PROCESSOR_BTVER2:
      case PROCESSOR_PENTIUM4:
--- 45,50 ----
*************** ix86_issue_rate (void)
*** 81,86 ****
--- 80,86 ----
      case PROCESSOR_YONGFENG:
      case PROCESSOR_SHIJIDADAO:
      case PROCESSOR_SIERRAFOREST:
+     case PROCESSOR_INTEL:
      case PROCESSOR_GENERIC:
      /* For znver5 decoder can handle 4 or 8 instructions per cycle,
         op cache 12 instruction/cycle, dispatch 8 instructions
*************** ix86_adjust_cost (rtx_insn *insn, int de
*** 497,502 ****
--- 497,503 ----
      case PROCESSOR_HASWELL:
      case PROCESSOR_TREMONT:
      case PROCESSOR_ALDERLAKE:
+     case PROCESSOR_INTEL:
      case PROCESSOR_GENERIC:
        /* Stack engine allows to execute push&pop instructions in parall.  */
        if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
*************** ix86_adjust_cost (rtx_insn *insn, int de
*** 519,525 ****
        break;
  
      case PROCESSOR_SILVERMONT:
-     case PROCESSOR_INTEL:
        if (!reload_completed)
  	return cost;
  
--- 520,525 ----
diff -Nrcpad gcc-16-20250622/gcc/config/pru/pru.md gcc-16-20250629/gcc/config/pru/pru.md
*** gcc-16-20250622/gcc/config/pru/pru.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/pru/pru.md	Sun Jun 29 22:32:26 2025
***************
*** 283,288 ****
--- 283,365 ----
    [(set_attr "type" "st,ld,alu,alu,alu,alu,alu,alu")
     (set_attr "length" "4,4,4,4,8,8,8,16")])
  
+ ; Break 64-bit register-to-register moves into 32-bit moves.
+ ; If only a subreg of the destination is used, this split would allow
+ ; for the other 32-bit subreg of the DI register to be eliminated.
+ (define_split
+   [(set (match_operand:DI 0 "register_operand")
+ 	(match_operand:DI 1 "register_operand"))]
+   "
+    /* TODO - LRA does not yet handle subregs efficiently.
+       So it is profitable to split only after register allocation is
+       complete.
+       Once https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651366.html
+       is merged, this condition should be removed to allow splitting
+       before LRA.  */
+    reload_completed
+    /* Sign-extended paradoxical registers require expansion
+       of the proper pattern.  We can do only zero extension here.  */
+    && (SUBREG_P (operands[1]) && paradoxical_subreg_p (operands[1])
+ 	? SUBREG_PROMOTED_VAR_P (operands[1])
+ 	  && SUBREG_PROMOTED_UNSIGNED_P (operands[1]) > 0
+ 	: true)"
+   [(set (match_dup 0) (match_dup 1))
+    (set (match_dup 2) (match_dup 3))]
+   "
+   rtx dst_lo = simplify_gen_subreg (SImode, operands[0], DImode, 0);
+   rtx dst_hi = simplify_gen_subreg (SImode, operands[0], DImode, 4);
+   rtx src_lo = simplify_gen_subreg (SImode, operands[1], DImode, 0);
+   rtx src_hi = simplify_gen_subreg (SImode, operands[1], DImode, 4);
+ 
+   if (SUBREG_P (operands[1]) && paradoxical_subreg_p (operands[1]))
+     {
+       gcc_assert (SUBREG_PROMOTED_VAR_P (operands[1]));
+       gcc_assert (SUBREG_PROMOTED_UNSIGNED_P (operands[1]) > 0);
+ 
+       operands[0] = dst_lo;
+       operands[1] = src_lo;
+       operands[2] = dst_hi;
+       operands[3] = const0_rtx;
+     }
+   else if (!reg_overlap_mentioned_p (dst_lo, src_hi))
+     {
+       operands[0] = dst_lo;
+       operands[1] = src_lo;
+       operands[2] = dst_hi;
+       operands[3] = src_hi;
+     }
+   else
+     {
+       operands[0] = dst_hi;
+       operands[1] = src_hi;
+       operands[2] = dst_lo;
+       operands[3] = src_lo;
+     }
+   "
+ )
+ 
+ ; Break loading of non-trivial 64-bit constant integers.  The split
+ ; will not generate better code sequence, but at least would allow
+ ; dropping a non-live 32-bit part of the destination, or better
+ ; constant propagation.
+ (define_split
+   [(set (match_operand:DI 0 "register_operand")
+ 	(match_operand:DI 1 "const_int_operand"))]
+   "reload_completed
+    && !satisfies_constraint_Z (operands[1])
+    && !satisfies_constraint_Um (operands[1])
+    && !satisfies_constraint_T (operands[1])"
+ 
+   [(set (match_dup 0) (match_dup 1))
+    (set (match_dup 2) (match_dup 3))]
+   "
+   operands[2] = simplify_gen_subreg (SImode, operands[0], DImode, 4);
+   operands[3] = simplify_gen_subreg (SImode, operands[1], DImode, 4);;
+   operands[0] = simplify_gen_subreg (SImode, operands[0], DImode, 0);
+   operands[1] = simplify_gen_subreg (SImode, operands[1], DImode, 0);
+   "
+ )
+ 
  ;
  ; load_multiple pattern(s).
  ;
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/autovec-opt.md gcc-16-20250629/gcc/config/riscv/autovec-opt.md
*** gcc-16-20250622/gcc/config/riscv/autovec-opt.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/autovec-opt.md	Sun Jun 29 22:32:26 2025
***************
*** 1721,1744 ****
  ;; - vfmsub.vf
  ;; - vfnmadd.vf
  ;; - vfnmsub.vf
  ;; =============================================================================
  
! ;; vfmadd.vf, vfmsub.vf
  (define_insn_and_split "*<optab>_vf_<mode>"
!   [(set (match_operand:V_VLSF 0 "register_operand"		"=vd")
      (plus_minus:V_VLSF
  	    (mult:V_VLSF
  	      (vec_duplicate:V_VLSF
! 		(match_operand:<VEL> 1 "register_operand"	"  f"))
! 	      (match_operand:V_VLSF 2 "register_operand"	"  0"))
! 	    (match_operand:V_VLSF 3 "register_operand"		" vr")))]
    "TARGET_VECTOR && can_create_pseudo_p ()"
    "#"
    "&& 1"
    [(const_int 0)]
    {
      rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
! 		 operands[2]};
      riscv_vector::emit_vlmax_insn (code_for_pred_mul_scalar (<CODE>, <MODE>mode),
  				   riscv_vector::TERNARY_OP_FRM_DYN, ops);
      DONE;
--- 1721,1746 ----
  ;; - vfmsub.vf
  ;; - vfnmadd.vf
  ;; - vfnmsub.vf
+ ;; - vfmacc.vf
+ ;; - vfmsac.vf
  ;; =============================================================================
  
! ;; vfmadd.vf, vfmsub.vf, vfmacc.vf, vfmsac.vf
  (define_insn_and_split "*<optab>_vf_<mode>"
!   [(set (match_operand:V_VLSF 0 "register_operand")
      (plus_minus:V_VLSF
  	    (mult:V_VLSF
  	      (vec_duplicate:V_VLSF
! 		(match_operand:<VEL> 1 "register_operand"))
! 	      (match_operand:V_VLSF 2 "register_operand"))
! 	    (match_operand:V_VLSF 3 "register_operand")))]
    "TARGET_VECTOR && can_create_pseudo_p ()"
    "#"
    "&& 1"
    [(const_int 0)]
    {
      rtx ops[] = {operands[0], operands[1], operands[2], operands[3],
! 		 RVV_VUNDEF(<MODE>mode)};
      riscv_vector::emit_vlmax_insn (code_for_pred_mul_scalar (<CODE>, <MODE>mode),
  				   riscv_vector::TERNARY_OP_FRM_DYN, ops);
      DONE;
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/predicates.md gcc-16-20250629/gcc/config/riscv/predicates.md
*** gcc-16-20250622/gcc/config/riscv/predicates.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/predicates.md	Sun Jun 29 22:32:26 2025
***************
*** 27,33 ****
    (ior (match_operand 0 "const_arith_operand")
         (match_operand 0 "register_operand")))
  
! ;; REG or REG+D where D fits in a simm12 and has the low 4 bits
  ;; off.  The REG+D form can be reloaded into a temporary if needed
  ;; after FP elimination if that exposes an invalid offset.
  (define_predicate "prefetch_operand"
--- 27,33 ----
    (ior (match_operand 0 "const_arith_operand")
         (match_operand 0 "register_operand")))
  
! ;; REG or REG+D where D fits in a simm12 and has the low 5 bits
  ;; off.  The REG+D form can be reloaded into a temporary if needed
  ;; after FP elimination if that exposes an invalid offset.
  (define_predicate "prefetch_operand"
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/riscv-v.cc gcc-16-20250629/gcc/config/riscv/riscv-v.cc
*** gcc-16-20250622/gcc/config/riscv/riscv-v.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/riscv-v.cc	Sun Jun 29 22:32:26 2025
*************** prepare_ternary_operands (rtx *ops)
*** 4723,4729 ****
  				   ops[4], ops[1], ops[6], ops[7], ops[9]));
        ops[5] = ops[4] = ops[0];
      }
!   else
      {
        /* Swap the multiplication ops if the fallback value is the
  	 second of the two.  */
--- 4723,4729 ----
  				   ops[4], ops[1], ops[6], ops[7], ops[9]));
        ops[5] = ops[4] = ops[0];
      }
!   else if (VECTOR_MODE_P (GET_MODE (ops[2])))
      {
        /* Swap the multiplication ops if the fallback value is the
  	 second of the two.  */
*************** prepare_ternary_operands (rtx *ops)
*** 4733,4740 ****
        /* TODO: ??? Maybe we could support splitting FMA (a, 4, b)
  	 into PLUS (ASHIFT (a, 2), b) according to uarchs.  */
      }
!   gcc_assert (rtx_equal_p (ops[5], RVV_VUNDEF (mode))
! 	      || rtx_equal_p (ops[5], ops[2]) || rtx_equal_p (ops[5], ops[4]));
  }
  
  /* Expand VEC_MASK_LEN_{LOAD_LANES,STORE_LANES}.  */
--- 4733,4742 ----
        /* TODO: ??? Maybe we could support splitting FMA (a, 4, b)
  	 into PLUS (ASHIFT (a, 2), b) according to uarchs.  */
      }
!   gcc_assert (
!     rtx_equal_p (ops[5], RVV_VUNDEF (mode)) || rtx_equal_p (ops[5], ops[2])
!     || (!VECTOR_MODE_P (GET_MODE (ops[2])) && rtx_equal_p (ops[5], ops[3]))
!     || rtx_equal_p (ops[5], ops[4]));
  }
  
  /* Expand VEC_MASK_LEN_{LOAD_LANES,STORE_LANES}.  */
*************** expand_vx_binary_vec_dup_vec (rtx op_0,
*** 5541,5546 ****
--- 5543,5549 ----
      case UMAX:
      case SMIN:
      case UMIN:
+     case US_PLUS:
        icode = code_for_pred_scalar (code, mode);
        break;
      case MINUS:
*************** expand_vx_binary_vec_vec_dup (rtx op_0,
*** 5579,5584 ****
--- 5582,5588 ----
      case UMAX:
      case SMIN:
      case UMIN:
+     case US_PLUS:
        icode = code_for_pred_scalar (code, mode);
        break;
      default:
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/riscv.cc gcc-16-20250629/gcc/config/riscv/riscv.cc
*** gcc-16-20250622/gcc/config/riscv/riscv.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/riscv.cc	Sun Jun 29 22:32:26 2025
*************** riscv_rtx_costs (rtx x, machine_mode mod
*** 3995,4000 ****
--- 3995,4001 ----
  		    case UDIV:
  		    case MOD:
  		    case UMOD:
+ 		    case US_PLUS:
  		      *total = get_vector_binary_rtx_cost (op, scalar2vr_cost);
  		      break;
  		    default:
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/riscv.md gcc-16-20250629/gcc/config/riscv/riscv.md
*** gcc-16-20250622/gcc/config/riscv/riscv.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/riscv.md	Sun Jun 29 22:32:26 2025
***************
*** 4860,4865 ****
--- 4860,4866 ----
    { operands[3] = GEN_INT (BITS_PER_WORD
  			   - exact_log2 (INTVAL (operands[3]) + 1)); })
  
+ ;; Standard extensions and pattern for optimization
  (include "bitmanip.md")
  (include "crypto.md")
  (include "sync.md")
***************
*** 4867,4885 ****
  (include "sync-ztso.md")
  (include "peephole.md")
  (include "pic.md")
- (include "generic.md")
- (include "sifive-7.md")
- (include "sifive-p400.md")
- (include "sifive-p600.md")
- (include "thead.md")
- (include "generic-vector-ooo.md")
- (include "generic-ooo.md")
  (include "vector.md")
  (include "vector-crypto.md")
  (include "vector-bfloat16.md")
  (include "zicond.md")
  (include "sfb.md")
  (include "zc.md")
  (include "corev.md")
  (include "xiangshan.md")
  (include "mips-p8700.md")
--- 4868,4888 ----
  (include "sync-ztso.md")
  (include "peephole.md")
  (include "pic.md")
  (include "vector.md")
  (include "vector-crypto.md")
  (include "vector-bfloat16.md")
  (include "zicond.md")
  (include "sfb.md")
  (include "zc.md")
+ ;; Vendor extensions
+ (include "thead.md")
  (include "corev.md")
+ ;; Pipeline models
+ (include "generic.md")
  (include "xiangshan.md")
  (include "mips-p8700.md")
+ (include "sifive-7.md")
+ (include "sifive-p400.md")
+ (include "sifive-p600.md")
+ (include "generic-vector-ooo.md")
+ (include "generic-ooo.md")
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/vector-iterators.md gcc-16-20250629/gcc/config/riscv/vector-iterators.md
*** gcc-16-20250622/gcc/config/riscv/vector-iterators.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/vector-iterators.md	Sun Jun 29 22:32:26 2025
***************
*** 4042,4052 ****
  ])
  
  (define_code_iterator any_int_binop_no_shift_v_vdup [
!   plus minus and ior xor mult div udiv mod umod smax umax smin umin
  ])
  
  (define_code_iterator any_int_binop_no_shift_vdup_v [
!   plus minus and ior xor mult smax umax smin umin
  ])
  
  (define_code_iterator any_int_unop [neg not])
--- 4042,4052 ----
  ])
  
  (define_code_iterator any_int_binop_no_shift_v_vdup [
!   plus minus and ior xor mult div udiv mod umod smax umax smin umin us_plus
  ])
  
  (define_code_iterator any_int_binop_no_shift_vdup_v [
!   plus minus and ior xor mult smax umax smin umin us_plus
  ])
  
  (define_code_iterator any_int_unop [neg not])
diff -Nrcpad gcc-16-20250622/gcc/config/riscv/vector.md gcc-16-20250629/gcc/config/riscv/vector.md
*** gcc-16-20250622/gcc/config/riscv/vector.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/riscv/vector.md	Sun Jun 29 22:32:26 2025
***************
*** 6599,6607 ****
  	        (match_operand:<VEL> 2 "register_operand"))
  	      (match_operand:V_VLSF 3 "register_operand"))
  	    (match_operand:V_VLSF 4 "register_operand"))
! 	  (match_operand:V_VLSF 5 "register_operand")))]
    "TARGET_VECTOR"
! {})
  
  (define_insn "*pred_<madd_msub><mode>_scalar"
    [(set (match_operand:V_VLSF 0 "register_operand"            "=vd, vr")
--- 6599,6640 ----
  	        (match_operand:<VEL> 2 "register_operand"))
  	      (match_operand:V_VLSF 3 "register_operand"))
  	    (match_operand:V_VLSF 4 "register_operand"))
! 	  (match_operand:V_VLSF 5 "vector_merge_operand")))]
    "TARGET_VECTOR"
! {
!   riscv_vector::prepare_ternary_operands (operands);
! })
! 
! (define_insn "*pred_mul_<optab><mode>_scalar_undef"
!   [(set (match_operand:V_VLSF 0 "register_operand"           "=vd,vd, vr, vr")
! 	(if_then_else:V_VLSF
! 	  (unspec:<VM>
! 	    [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
! 	     (match_operand 6 "vector_length_operand"    "rvl,rvl,rvl,rvl")
! 	     (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
! 	     (match_operand 8 "const_int_operand"        "  i,  i,  i,  i")
! 	     (match_operand 9 "const_int_operand"        "  i,  i,  i,  i")
! 	     (match_operand 10 "const_int_operand"       "  i,  i,  i,  i")
! 	     (reg:SI VL_REGNUM)
! 	     (reg:SI VTYPE_REGNUM)
! 	     (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
! 	  (plus_minus:V_VLSF
! 	    (mult:V_VLSF
! 	      (vec_duplicate:V_VLSF
! 	        (match_operand:<VEL> 3 "register_operand"    "  f,  f,  f,  f"))
! 	      (match_operand:V_VLSF 4 "register_operand"     "  0, vr,  0, vr"))
! 	    (match_operand:V_VLSF 5 "register_operand"       " vr,  0, vr,  0"))
! 	  (match_operand:V_VLSF 2 "vector_undef_operand")))]
!   "TARGET_VECTOR"
!   "@
!    vf<madd_msub>.vf\t%0,%3,%5%p1
!    vf<macc_msac>.vf\t%0,%3,%4%p1
!    vf<madd_msub>.vf\t%0,%3,%5%p1
!    vf<macc_msac>.vf\t%0,%3,%4%p1"
!   [(set_attr "type" "vfmuladd")
!    (set_attr "mode" "<MODE>")
!    (set (attr "frm_mode")
! 	(symbol_ref "riscv_vector::get_frm_mode (operands[10])"))])
  
  (define_insn "*pred_<madd_msub><mode>_scalar"
    [(set (match_operand:V_VLSF 0 "register_operand"            "=vd, vr")
diff -Nrcpad gcc-16-20250622/gcc/config/s390/vector.md gcc-16-20250629/gcc/config/s390/vector.md
*** gcc-16-20250622/gcc/config/s390/vector.md	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/config/s390/vector.md	Sun Jun 29 22:32:27 2025
***************
*** 75,81 ****
  			   V1DF V2DF
  			   (V1TF "TARGET_VXE") (TF "TARGET_VXE")])
  
! (define_mode_iterator VF [(V2SF "TARGET_VXE") (V4SF "TARGET_VXE") V2DF])
  
  ; All modes present in V_HW1 and VFT.
  (define_mode_iterator V_HW1_FT [V16QI V8HI V4SI V2DI V1TI V1DF
--- 75,81 ----
  			   V1DF V2DF
  			   (V1TF "TARGET_VXE") (TF "TARGET_VXE")])
  
! (define_mode_iterator VF [V2SF V4SF V2DF])
  
  ; All modes present in V_HW1 and VFT.
  (define_mode_iterator V_HW1_FT [V16QI V8HI V4SI V2DI V1TI V1DF
***************
*** 512,518 ****
  (define_mode_iterator VEC_SET_NONFLOAT
    [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V2SF V4SF])
  ; Iterator for single element float vectors
! (define_mode_iterator VEC_SET_SINGLEFLOAT [(V1SF "TARGET_VXE") V1DF (V1TF "TARGET_VXE")])
  
  ; FIXME: Support also vector mode operands for 1
  ; FIXME: A target memory operand seems to be useful otherwise we end
--- 512,518 ----
  (define_mode_iterator VEC_SET_NONFLOAT
    [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V2SF V4SF])
  ; Iterator for single element float vectors
! (define_mode_iterator VEC_SET_SINGLEFLOAT [V1SF V1DF (V1TF "TARGET_VXE")])
  
  ; FIXME: Support also vector mode operands for 1
  ; FIXME: A target memory operand seems to be useful otherwise we end
diff -Nrcpad gcc-16-20250622/gcc/cp/ChangeLog gcc-16-20250629/gcc/cp/ChangeLog
*** gcc-16-20250622/gcc/cp/ChangeLog	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/ChangeLog	Sun Jun 29 22:32:27 2025
***************
*** 1,3 ****
--- 1,147 ----
+ 2025-06-28  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	* module.cc (trees_out::walking_bit_field_unit): New flag.
+ 	(trees_out::trees_out): Initialize it.
+ 	(trees_out::core_vals): Set it.
+ 	(trees_out::get_merge_kind): Use it, move previous ad-hoc check
+ 	into assertion.
+ 
+ 2025-06-28  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/120644
+ 	* decl.cc (cp_finish_decl): Also propagate type to partial
+ 	templates.
+ 	* module.cc (trees_out::decl_value): Add assertion that the
+ 	TREE_TYPE of a streamed template decl matches its inner.
+ 	(trees_in::is_matching_decl): Clarify function return type
+ 	deduction should only occur for non-TEMPLATE_DECL.
+ 	* pt.cc (template_for_substitution): Handle partial specs.
+ 
+ 2025-06-27  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/120756
+ 	* pt.cc (resolve_nondeduced_context): Pass complain to mark_used.
+ 
+ 2025-06-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120777
+ 	* constexpr.cc: Implement C++26 P3533R2 - constexpr virtual
+ 	inheritance.
+ 	(is_valid_constexpr_fn): Don't reject constexpr cdtors in classes
+ 	with virtual bases for C++26, adjust error wording.
+ 	(cxx_bind_parameters_in_call): Add ORIG_FUN argument, add
+ 	values for __in_chrg and __vtt_parm arguments when needed.
+ 	(cxx_eval_dynamic_cast_fn): Adjust function comment, HINT -1
+ 	should be possible.  For C++26 if obj is cast from POINTER_PLUS_EXPR,
+ 	attempt to use cxx_fold_indirect_ref to simplify it and if successful,
+ 	build ADDR_EXPR of that.
+ 	(cxx_eval_call_expression): Add orig_fun variable, set it to
+ 	fun before looking through clones, pass it to
+ 	cxx_bind_parameters_in_call.
+ 	(reduced_constant_expression_p): Add SZ argument, pass DECL_SIZE
+ 	of FIELD_DECL e.index to recursive calls and don't return false
+ 	if SZ is non-NULL and there are unfilled fields with bit position
+ 	at or above SZ.
+ 	(cxx_fold_indirect_ref_1): Handle reading of vtables using
+ 	ptrdiff_t dynamic type instead of some pointer type.  Set el_sz
+ 	to DECL_SIZE_UNIT value rather than TYPE_SIZE_UNIT of
+ 	DECL_FIELD_IS_BASE fields in classes with virtual bases.
+ 	(cxx_fold_indirect_ref): In canonicalize_obj_off lambda look
+ 	through COMPONENT_REFs with DECL_FIELD_IS_BASE in classes with
+ 	virtual bases and adjust off correspondingly.  Remove assertion that
+ 	off is integer_zerop, pass tree_to_uhwi (off) instead of 0 to the
+ 	cxx_fold_indirect_ref_1 call.
+ 	* cp-tree.h (publicly_virtually_derived_p): Declare.
+ 	(reduced_constant_expression_p): Add another tree argument defaulted
+ 	to NULL_TREE.
+ 	* method.cc (synthesized_method_walk): Don't clear *constexpr_p
+ 	if there are virtual bases for C++26.
+ 	* class.cc (build_base_path): Compute fixed_type_p and
+ 	virtual_access before checks for build_simple_base_path instead of
+ 	after that and conditional cp_build_addr_expr.  Use build_simple_path
+ 	if !virtual_access even when v_binfo is non-NULL.
+ 	(layout_virtual_bases): For build_base_field calls use
+ 	access_public_node rather than access_private_node if
+ 	publicly_virtually_derived_p.
+ 	(build_vtbl_initializer): Revert 2018-09-18 and 2018-12-11 changes.
+ 	(publicly_virtually_derived_p): New function.
+ 
+ 2025-06-27  Jason Merrill  <jason@redhat.com>
+ 
+ 	* class.cc (fixed_type_or_null): Handle class-type CALL_EXPR.
+ 	* parser.cc (cp_parser_binary_expression): Fix decltype_p handling.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/98735
+ 	PR c++/118904
+ 	* cp-gimplify.cc (source_location_id): Remove.
+ 	(fold_builtin_source_location): Use generate_internal_label.
+ 	* module.cc (enum tree_tag): Add 'tt_internal_id' enumerator.
+ 	(trees_out::tree_value): Adjust assertion, write definitions
+ 	of uncontexted VAR_DECLs.
+ 	(trees_in::tree_value): Read variable definitions.
+ 	(trees_out::tree_node): Write internal labels, adjust assert.
+ 	(trees_in::tree_node): Read internal labels.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/120040
+ 	* constexpr.cc (cxx_eval_constant_expression): Handle TYPE_NAME
+ 	now being a TYPE_DECL rather than just an IDENTIFIER_NODE.
+ 	* init.cc (build_new_constexpr_heap_type): Build a TYPE_DECL for
+ 	the returned type; mark the type as artificial.
+ 	* module.cc (trees_out::type_node): Add some assertions.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/98735
+ 	PR c++/120040
+ 	* module.cc (trees_out::tree_value): Write TYPE_DECLs.
+ 	(trees_in::tree_value): Read TYPE_DECLs.
+ 	(trees_out::tree_node): Support uncontexted TYPE_DECLs, and
+ 	ensure that all parts of a by-value decl are marked for
+ 	streaming.
+ 	(trees_out::get_merge_kind): Treat members of uncontexted types
+ 	as always unique.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	* decl.cc (grokfndecl): Add explanation of how to attach to
+ 	global module.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* error.cc (cxx_initialize_diagnostics): Use
+ 	diagnostic_context::set_adjust_diagnostic_info_callback.
+ 
+ 2025-06-26  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* cp-trait.def: Implement C++26 P2830R10 - Constexpr Type Ordering.
+ 	(TYPE_ORDER): New.
+ 	* method.cc (type_order_value): Define.
+ 	* cp-tree.h (type_order_value): Declare.
+ 	* semantics.cc (trait_expr_value): Use gcc_unreachable also
+ 	for CPTK_TYPE_ORDER, adjust comment.
+ 	(finish_trait_expr): Handle CPTK_TYPE_ORDER.
+ 	* constraint.cc (diagnose_trait_expr): Likewise.
+ 
+ 2025-06-25  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* coroutines.h (class cp_coroutine_transform): Remove member
+ 	orig_fn_body.
+ 
+ 2025-06-24  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120773
+ 	* decl.cc (grokfndecl): Implement C++26 P3618R0 - Allow attaching
+ 	main to the global module.  Only pedwarn for current_lang_name
+ 	other than lang_name_cplusplus and adjust pedwarn wording.
+ 
+ 2025-06-23  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* parser.cc (OACC_WAIT_CLAUSE_MASK): Ass if clause.
+ 
  2025-06-18  Iain Sandoe  <iain@sandoe.co.uk>
  
  	PR c++/115908
diff -Nrcpad gcc-16-20250622/gcc/cp/class.cc gcc-16-20250629/gcc/cp/class.cc
*** gcc-16-20250622/gcc/cp/class.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/class.cc	Sun Jun 29 22:32:27 2025
*************** build_base_path (enum tree_code code,
*** 347,355 ****
  		 || processing_template_decl
  		 || in_template_context);
  
    /* For a non-pointer simple base reference, express it as a COMPONENT_REF
       without taking its address (and so causing lambda capture, 91933).  */
!   if (code == PLUS_EXPR && !v_binfo && !want_pointer && !has_empty && !uneval)
      return build_simple_base_path (expr, binfo);
  
    if (!want_pointer)
--- 347,364 ----
  		 || processing_template_decl
  		 || in_template_context);
  
+   fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
+ 
+   /* Do we need to look in the vtable for the real offset?  */
+   virtual_access = (v_binfo && fixed_type_p <= 0);
+ 
    /* For a non-pointer simple base reference, express it as a COMPONENT_REF
       without taking its address (and so causing lambda capture, 91933).  */
!   if (code == PLUS_EXPR
!       && !want_pointer
!       && !has_empty
!       && !uneval
!       && !virtual_access)
      return build_simple_base_path (expr, binfo);
  
    if (!want_pointer)
*************** build_base_path (enum tree_code code,
*** 362,368 ****
      expr = mark_rvalue_use (expr);
  
    offset = BINFO_OFFSET (binfo);
-   fixed_type_p = resolves_to_fixed_type_p (expr, &nonnull);
    target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
    /* TARGET_TYPE has been extracted from BINFO, and, is therefore always
       cv-unqualified.  Extract the cv-qualifiers from EXPR so that the
--- 371,376 ----
*************** build_base_path (enum tree_code code,
*** 371,379 ****
      (target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr))));
    ptr_target_type = build_pointer_type (target_type);
  
-   /* Do we need to look in the vtable for the real offset?  */
-   virtual_access = (v_binfo && fixed_type_p <= 0);
- 
    /* Don't bother with the calculations inside sizeof; they'll ICE if the
       source type is incomplete and the pointer value doesn't matter.  In a
       template (even in instantiate_non_dependent_expr), we don't have vtables
--- 379,384 ----
*************** layout_virtual_bases (record_layout_info
*** 6754,6762 ****
  	{
  	  /* This virtual base is not a primary base of any class in the
  	     hierarchy, so we have to add space for it.  */
! 	  next_field = build_base_field (rli, vbase,
! 					 access_private_node,
! 					 offsets, next_field);
  	}
      }
  }
--- 6759,6769 ----
  	{
  	  /* This virtual base is not a primary base of any class in the
  	     hierarchy, so we have to add space for it.  */
! 	  tree access = access_private_node;
! 	  if (publicly_virtually_derived_p (BINFO_TYPE (vbase), t))
! 	    access = access_public_node;
! 	  next_field = build_base_field (rli, vbase, access, offsets,
! 					 next_field);
  	}
      }
  }
*************** fixed_type_or_null (tree instance, int *
*** 8350,8355 ****
--- 8357,8371 ----
  	    *nonnull = 1;
  	  return TREE_TYPE (instance);
  	}
+       if (CLASS_TYPE_P (TREE_TYPE (instance)))
+ 	{
+ 	  /* We missed a build_cplus_new somewhere, likely due to tf_decltype
+ 	     mishandling.  */
+ 	  gcc_checking_assert (false);
+ 	  if (nonnull)
+ 	    *nonnull = 1;
+ 	  return TREE_TYPE (instance);
+ 	}
        return NULL_TREE;
  
      case SAVE_EXPR:
*************** build_vtbl_initializer (tree binfo,
*** 10620,10626 ****
  	  int i;
  	  if (init == size_zero_node)
  	    for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
! 	      CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), init);
  	  else
  	    for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
  	      {
--- 10636,10642 ----
  	  int i;
  	  if (init == size_zero_node)
  	    for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
! 	      CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, init);
  	  else
  	    for (i = 0; i < TARGET_VTABLE_USES_DESCRIPTORS; ++i)
  	      {
*************** build_vtbl_initializer (tree binfo,
*** 10628,10638 ****
  				     fn, build_int_cst (NULL_TREE, i));
  		TREE_CONSTANT (fdesc) = 1;
  
! 		CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), fdesc);
  	      }
  	}
        else
! 	CONSTRUCTOR_APPEND_ELT (*inits, size_int (jx++), init);
      }
  }
  
--- 10644,10654 ----
  				     fn, build_int_cst (NULL_TREE, i));
  		TREE_CONSTANT (fdesc) = 1;
  
! 		CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, fdesc);
  	      }
  	}
        else
! 	CONSTRUCTOR_APPEND_ELT (*inits, NULL_TREE, init);
      }
  }
  
*************** publicly_uniquely_derived_p (tree parent
*** 10970,10975 ****
--- 10986,11002 ----
  			   NULL, tf_none);
    return base && base != error_mark_node;
  }
+ 
+ /* TRUE iff TYPE is publicly & virtually derived from PARENT.  */
+ 
+ bool
+ publicly_virtually_derived_p (tree parent, tree type)
+ {
+   tree base = lookup_base (type, parent,
+ 			   ba_ignore_scope | ba_check | ba_require_virtual,
+ 			   NULL, tf_none);
+   return base && base != error_mark_node;
+ }
  
  /* CTX1 and CTX2 are declaration contexts.  Return the innermost common
     class between them, if any.  */
diff -Nrcpad gcc-16-20250622/gcc/cp/constexpr.cc gcc-16-20250629/gcc/cp/constexpr.cc
*** gcc-16-20250622/gcc/cp/constexpr.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/constexpr.cc	Sun Jun 29 22:32:27 2025
*************** is_valid_constexpr_fn (tree fun, bool co
*** 303,319 ****
  	    }
  	}
      }
!   else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)))
      {
        ret = false;
        if (complain)
  	{
  	  if (DECL_CONSTRUCTOR_P (fun))
  	    error ("%<constexpr%> constructor in %q#T that has "
! 		   "virtual base classes", DECL_CONTEXT (fun));
  	  else
  	    error ("%<constexpr%> destructor in %q#T that has "
! 		   "virtual base classes", DECL_CONTEXT (fun));
  	}
      }
  
--- 303,321 ----
  	    }
  	}
      }
!   else if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)) && cxx_dialect < cxx26)
      {
        ret = false;
        if (complain)
  	{
  	  if (DECL_CONSTRUCTOR_P (fun))
  	    error ("%<constexpr%> constructor in %q#T that has "
! 		   "virtual base classes only available with "
! 		   "%<-std=c++2c%> or %<-std=gnu++2c%>", DECL_CONTEXT (fun));
  	  else
  	    error ("%<constexpr%> destructor in %q#T that has "
! 		   "virtual base classes only available with "
! 		   "%<-std=c++2c%> or %<-std=gnu++2c%>", DECL_CONTEXT (fun));
  	}
      }
  
*************** addr_of_non_const_var (tree *tp, int *wa
*** 1879,1898 ****
  
  static tree
  cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t, tree fun,
! 			     bool *non_constant_p, bool *overflow_p,
! 			     bool *non_constant_args)
  {
!   const int nargs = call_expr_nargs (t);
    tree parms = DECL_ARGUMENTS (fun);
!   int i;
    /* We don't record ellipsis args below.  */
    int nparms = list_length (parms);
    int nbinds = nargs < nparms ? nargs : nparms;
    tree binds = make_tree_vec (nbinds);
  
    /* The call is not a constant expression if it involves the cdtor for a type
!      with virtual bases.  */
!   if (DECL_HAS_IN_CHARGE_PARM_P (fun) || DECL_HAS_VTT_PARM_P (fun))
      {
        if (!ctx->quiet)
  	{
--- 1881,1908 ----
  
  static tree
  cxx_bind_parameters_in_call (const constexpr_ctx *ctx, tree t, tree fun,
! 			     tree orig_fun, bool *non_constant_p,
! 			     bool *overflow_p, bool *non_constant_args)
  {
!   int nargs = call_expr_nargs (t);
    tree parms = DECL_ARGUMENTS (fun);
!   int i, j = 0;
!   if (DECL_HAS_IN_CHARGE_PARM_P (fun) && fun != orig_fun)
!     ++nargs;
!   if (DECL_HAS_VTT_PARM_P (fun)
!       && fun != orig_fun
!       && (DECL_COMPLETE_CONSTRUCTOR_P (orig_fun)
! 	  || DECL_COMPLETE_DESTRUCTOR_P (orig_fun)))
!     ++nargs;
    /* We don't record ellipsis args below.  */
    int nparms = list_length (parms);
    int nbinds = nargs < nparms ? nargs : nparms;
    tree binds = make_tree_vec (nbinds);
  
    /* The call is not a constant expression if it involves the cdtor for a type
!      with virtual bases before C++26.  */
!   if (cxx_dialect < cxx26
!       && (DECL_HAS_IN_CHARGE_PARM_P (fun) || DECL_HAS_VTT_PARM_P (fun)))
      {
        if (!ctx->quiet)
  	{
*************** cxx_bind_parameters_in_call (const const
*** 1910,1916 ****
        tree type = parms ? TREE_TYPE (parms) : void_type_node;
        if (parms && DECL_BY_REFERENCE (parms))
  	type = TREE_TYPE (type);
!       x = get_nth_callarg (t, i);
        /* For member function, the first argument is a pointer to the implied
           object.  For a constructor, it might still be a dummy object, in
  	 which case we get the real argument from ctx.  */
--- 1920,1949 ----
        tree type = parms ? TREE_TYPE (parms) : void_type_node;
        if (parms && DECL_BY_REFERENCE (parms))
  	type = TREE_TYPE (type);
!       if (i == 1
! 	  && j == 0
! 	  && DECL_HAS_IN_CHARGE_PARM_P (fun)
! 	  && orig_fun != fun)
! 	{
! 	  if (DECL_COMPLETE_CONSTRUCTOR_P (orig_fun)
! 	      || DECL_COMPLETE_DESTRUCTOR_P (orig_fun))
! 	    x = boolean_true_node;
! 	  else
! 	    x = boolean_false_node;
! 	  j = -1;
! 	}
!       else if (i == 2
! 	       && j == -1
! 	       && DECL_HAS_VTT_PARM_P (fun)
! 	       && orig_fun != fun
! 	       && (DECL_COMPLETE_CONSTRUCTOR_P (orig_fun)
! 		   || DECL_COMPLETE_DESTRUCTOR_P (orig_fun)))
! 	{
! 	  x = build_zero_cst (type);
! 	  j = -2;
! 	}
!       else
! 	x = get_nth_callarg (t, i + j);
        /* For member function, the first argument is a pointer to the implied
           object.  For a constructor, it might still be a dummy object, in
  	 which case we get the real argument from ctx.  */
*************** get_component_with_type (tree path, tree
*** 2529,2538 ****
  	dst_ptr + src2dst == src_ptr
     -1: unspecified relationship
     -2: src_type is not a public base of dst_type
!    -3: src_type is a multiple public non-virtual base of dst_type
! 
!   Since literal types can't have virtual bases, we only expect hint >=0,
!   -2, or -3.  */
  
  static tree
  cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree call,
--- 2562,2568 ----
  	dst_ptr + src2dst == src_ptr
     -1: unspecified relationship
     -2: src_type is not a public base of dst_type
!    -3: src_type is a multiple public non-virtual base of dst_type  */
  
  static tree
  cxx_eval_dynamic_cast_fn (const constexpr_ctx *ctx, tree call,
*************** cxx_eval_dynamic_cast_fn (const constexp
*** 2569,2574 ****
--- 2599,2620 ----
    if (*non_constant_p)
      return call;
  
+   /* For dynamic_cast from classes with virtual bases we can get something
+      like (virt_base *)(&d + 16) as OBJ.  Try to convert that into
+      d.D.1234 using cxx_fold_indirect_ref.  */
+   if (cxx_dialect >= cxx26 && CONVERT_EXPR_P (obj))
+     {
+       tree objo = obj;
+       STRIP_NOPS (objo);
+       if (TREE_CODE (objo) == POINTER_PLUS_EXPR)
+ 	{
+ 	  objo = cxx_fold_indirect_ref (ctx, loc, TREE_TYPE (TREE_TYPE (obj)),
+ 					obj);
+ 	  if (objo)
+ 	    obj = build_fold_addr_expr (objo);
+ 	}
+     }
+ 
    /* We expect OBJ to be in form of &d.D.2102 when HINT == 0,
       but when HINT is > 0, it can also be something like
       &d.D.2102 + 18446744073709551608, which includes the BINFO_OFFSET.  */
*************** cxx_eval_call_expression (const constexp
*** 2916,2921 ****
--- 2962,2968 ----
        *non_constant_p = true;
        return t;
      }
+   tree orig_fun = fun;
    if (DECL_CLONED_FUNCTION_P (fun) && !DECL_DELETING_DESTRUCTOR_P (fun))
      fun = DECL_CLONED_FUNCTION (fun);
  
*************** cxx_eval_call_expression (const constexp
*** 3110,3116 ****
    bool non_constant_args = false;
    constexpr_call new_call;
    new_call.bindings
!     = cxx_bind_parameters_in_call (ctx, t, fun, non_constant_p,
  				   overflow_p, &non_constant_args);
  
    /* We build up the bindings list before we know whether we already have this
--- 3157,3163 ----
    bool non_constant_args = false;
    constexpr_call new_call;
    new_call.bindings
!     = cxx_bind_parameters_in_call (ctx, t, fun, orig_fun, non_constant_p,
  				   overflow_p, &non_constant_args);
  
    /* We build up the bindings list before we know whether we already have this
*************** cxx_eval_call_expression (const constexp
*** 3514,3524 ****
  
  /* Return true if T is a valid constant initializer.  If a CONSTRUCTOR
     initializes all the members, the CONSTRUCTOR_NO_CLEARING flag will be
!    cleared.
     FIXME speed this up, it's taking 16% of compile time on sieve testcase.  */
  
  bool
! reduced_constant_expression_p (tree t)
  {
    if (t == NULL_TREE)
      return false;
--- 3561,3572 ----
  
  /* Return true if T is a valid constant initializer.  If a CONSTRUCTOR
     initializes all the members, the CONSTRUCTOR_NO_CLEARING flag will be
!    cleared.  If called recursively on a FIELD_DECL's CONSTRUCTOR, SZ
!    is DECL_SIZE of the FIELD_DECL, otherwise NULL.
     FIXME speed this up, it's taking 16% of compile time on sieve testcase.  */
  
  bool
! reduced_constant_expression_p (tree t, tree sz /* = NULL_TREE */)
  {
    if (t == NULL_TREE)
      return false;
*************** reduced_constant_expression_p (tree t)
*** 3586,3592 ****
  	{
  	  /* If VAL is null, we're in the middle of initializing this
  	     element.  */
! 	  if (!reduced_constant_expression_p (e.value))
  	    return false;
  	  /* We want to remove initializers for empty fields in a struct to
  	     avoid confusing output_constructor.  */
--- 3634,3645 ----
  	{
  	  /* If VAL is null, we're in the middle of initializing this
  	     element.  */
! 	  if (!reduced_constant_expression_p (e.value,
! 					      (e.index
! 					       && (TREE_CODE (e.index)
! 						   == FIELD_DECL))
! 					      ? DECL_SIZE (e.index)
! 					      : NULL_TREE))
  	    return false;
  	  /* We want to remove initializers for empty fields in a struct to
  	     avoid confusing output_constructor.  */
*************** reduced_constant_expression_p (tree t)
*** 3606,3612 ****
        /* There could be a non-empty field at the end.  */
        for (; field; field = next_subobject_field (DECL_CHAIN (field)))
  	if (!is_really_empty_class (TREE_TYPE (field), /*ignore_vptr*/false))
! 	  return false;
  ok:
        if (CONSTRUCTOR_NO_CLEARING (t))
  	/* All the fields are initialized.  */
--- 3659,3674 ----
        /* There could be a non-empty field at the end.  */
        for (; field; field = next_subobject_field (DECL_CHAIN (field)))
  	if (!is_really_empty_class (TREE_TYPE (field), /*ignore_vptr*/false))
! 	  {
! 	    /* Ignore FIELD_DECLs with bit positions beyond DECL_SIZE of
! 	       the parent FIELD_DECL (if any) for classes with virtual
! 	       bases.  */
! 	    if (cxx_dialect >= cxx26
! 		&& sz
! 		&& tree_int_cst_le (sz, bit_position (field)))
! 	      break;
! 	    return false;
! 	  }
  ok:
        if (CONSTRUCTOR_NO_CLEARING (t))
  	/* All the fields are initialized.  */
*************** cxx_fold_indirect_ref_1 (const constexpr
*** 5868,5873 ****
--- 5930,5949 ----
    unsigned HOST_WIDE_INT const_nunits;
    if (off == 0 && similar_type_p (optype, type))
      return op;
+   else if (cxx_dialect >= cxx26
+ 	   && VAR_P (op)
+ 	   && DECL_VTABLE_OR_VTT_P (op)
+ 	   && same_type_ignoring_top_level_qualifiers_p (type,
+ 							 ptrdiff_type_node)
+ 	   && POINTER_TYPE_P (strip_array_types (optype)))
+     {
+       /* We often read some virtual table elements using ptrdiff_t rather
+ 	 than pointer type.  */
+       if (tree ret = cxx_fold_indirect_ref_1 (ctx, loc,
+ 					      strip_array_types (optype),
+ 					      op, off, empty_base))
+ 	return fold_convert (type, ret);
+     }
    else if (TREE_CODE (optype) == COMPLEX_TYPE
  	   && similar_type_p (type, TREE_TYPE (optype)))
      {
*************** cxx_fold_indirect_ref_1 (const constexpr
*** 5961,5968 ****
  	    if (!tree_fits_uhwi_p (pos))
  	      continue;
  	    unsigned HOST_WIDE_INT upos = tree_to_uhwi (pos);
! 	    unsigned HOST_WIDE_INT el_sz
! 	      = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
  	    if (upos <= off && off < upos + el_sz)
  	      {
  		tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
--- 6037,6049 ----
  	    if (!tree_fits_uhwi_p (pos))
  	      continue;
  	    unsigned HOST_WIDE_INT upos = tree_to_uhwi (pos);
! 	    unsigned HOST_WIDE_INT el_sz;
! 	    if (DECL_FIELD_IS_BASE (field)
! 		&& CLASS_TYPE_P (optype)
! 		&& CLASSTYPE_VBASECLASSES (optype))
! 	      el_sz = tree_to_uhwi (DECL_SIZE_UNIT (field));
! 	    else
! 	      el_sz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (field)));
  	    if (upos <= off && off < upos + el_sz)
  	      {
  		tree cop = build3 (COMPONENT_REF, TREE_TYPE (field),
*************** cxx_fold_indirect_ref (const constexpr_c
*** 6013,6018 ****
--- 6094,6118 ----
       offset positive, so that cxx_fold_indirect_ref_1 can identify
       more folding opportunities.  */
    auto canonicalize_obj_off = [] (tree& obj, tree& off) {
+     if (cxx_dialect >= cxx26)
+       {
+ 	/* For C++26, we need to fold *(B *)(&x.D.1234 + 32) used
+ 	   to access virtual base members.  */
+ 	tree nobj = obj;
+ 	while (TREE_CODE (nobj) == COMPONENT_REF
+ 	       && DECL_FIELD_IS_BASE (TREE_OPERAND (nobj, 1)))
+ 	  nobj = TREE_OPERAND (nobj, 0);
+ 	if (nobj != obj
+ 	    && CLASS_TYPE_P (TREE_TYPE (nobj))
+ 	    && CLASSTYPE_VBASECLASSES (TREE_TYPE (nobj)))
+ 	  while (obj != nobj)
+ 	    {
+ 	      tree field = TREE_OPERAND (obj, 1);
+ 	      tree pos = byte_position (field);
+ 	      off = int_const_binop (PLUS_EXPR, off, pos);
+ 	      obj = TREE_OPERAND (obj, 0);
+ 	    }
+       }
      while (TREE_CODE (obj) == COMPONENT_REF
  	   /* We need to preserve union member accesses so that we can
  	      later properly diagnose accessing the wrong member.  */
*************** cxx_fold_indirect_ref (const constexpr_c
*** 6051,6058 ****
  	{
  	  tree off = integer_zero_node;
  	  canonicalize_obj_off (op, off);
! 	  gcc_assert (integer_zerop (off));
! 	  return cxx_fold_indirect_ref_1 (ctx, loc, type, op, 0, empty_base);
  	}
      }
    else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
--- 6151,6158 ----
  	{
  	  tree off = integer_zero_node;
  	  canonicalize_obj_off (op, off);
! 	  return cxx_fold_indirect_ref_1 (ctx, loc, type, op,
! 					  tree_to_uhwi (off), empty_base);
  	}
      }
    else if (TREE_CODE (sub) == POINTER_PLUS_EXPR
*************** cxx_eval_constant_expression (const cons
*** 8618,8624 ****
  	    tree cookie_size = NULL_TREE;
  	    tree arg_size = NULL_TREE;
  	    if (TREE_CODE (elt_type) == RECORD_TYPE
! 		&& TYPE_NAME (elt_type) == heap_identifier)
  	      {
  		tree fld1 = TYPE_FIELDS (elt_type);
  		tree fld2 = DECL_CHAIN (fld1);
--- 8718,8724 ----
  	    tree cookie_size = NULL_TREE;
  	    tree arg_size = NULL_TREE;
  	    if (TREE_CODE (elt_type) == RECORD_TYPE
! 		&& TYPE_IDENTIFIER (elt_type) == heap_identifier)
  	      {
  		tree fld1 = TYPE_FIELDS (elt_type);
  		tree fld2 = DECL_CHAIN (fld1);
diff -Nrcpad gcc-16-20250622/gcc/cp/constraint.cc gcc-16-20250629/gcc/cp/constraint.cc
*** gcc-16-20250622/gcc/cp/constraint.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/constraint.cc	Sun Jun 29 22:32:27 2025
*************** diagnose_trait_expr (tree expr, tree arg
*** 3266,3271 ****
--- 3266,3274 ----
      case CPTK_RANK:
        inform (loc, "  %qT cannot yield a rank", t1);
        break;
+     case CPTK_TYPE_ORDER:
+       inform (loc, "  %qT and %qT cannot be ordered", t1, t2);
+       break;
      case CPTK_REF_CONSTRUCTS_FROM_TEMPORARY:
        inform (loc, "  %qT is not a reference that binds to a temporary "
  	      "object of type %qT (direct-initialization)", t1, t2);
diff -Nrcpad gcc-16-20250622/gcc/cp/coroutines.h gcc-16-20250629/gcc/cp/coroutines.h
*** gcc-16-20250622/gcc/cp/coroutines.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/coroutines.h	Sun Jun 29 22:32:27 2025
*************** public:
*** 100,106 ****
  
  private:
    tree orig_fn_decl;		 /* The original function decl.  */
-   tree orig_fn_body = NULL_TREE; /* The original function body.  */
    location_t fn_start = UNKNOWN_LOCATION;
    location_t fn_end = UNKNOWN_LOCATION;
    tree resumer = error_mark_node;
--- 100,105 ----
diff -Nrcpad gcc-16-20250622/gcc/cp/cp-gimplify.cc gcc-16-20250629/gcc/cp/cp-gimplify.cc
*** gcc-16-20250622/gcc/cp/cp-gimplify.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/cp-gimplify.cc	Sun Jun 29 22:32:27 2025
*************** struct source_location_table_entry_hash
*** 3887,3893 ****
  
  static GTY(()) hash_table <source_location_table_entry_hash>
    *source_location_table;
- static GTY(()) unsigned int source_location_id;
  
  /* Fold the __builtin_source_location () call T.  */
  
--- 3887,3892 ----
*************** fold_builtin_source_location (const_tree
*** 3920,3928 ****
      var = entryp->var;
    else
      {
!       char tmp_name[32];
!       ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lsrc_loc", source_location_id++);
!       var = build_decl (loc, VAR_DECL, get_identifier (tmp_name),
  			source_location_impl);
        TREE_STATIC (var) = 1;
        TREE_PUBLIC (var) = 0;
--- 3919,3925 ----
      var = entryp->var;
    else
      {
!       var = build_decl (loc, VAR_DECL, generate_internal_label ("Lsrc_loc"),
  			source_location_impl);
        TREE_STATIC (var) = 1;
        TREE_PUBLIC (var) = 0;
diff -Nrcpad gcc-16-20250622/gcc/cp/cp-trait.def gcc-16-20250629/gcc/cp/cp-trait.def
*** gcc-16-20250622/gcc/cp/cp-trait.def	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/cp-trait.def	Sun Jun 29 22:32:27 2025
*************** DEFTRAIT_TYPE (REMOVE_CVREF, "__remove_c
*** 114,119 ****
--- 114,120 ----
  DEFTRAIT_TYPE (REMOVE_EXTENT, "__remove_extent", 1)
  DEFTRAIT_TYPE (REMOVE_POINTER, "__remove_pointer", 1)
  DEFTRAIT_TYPE (REMOVE_REFERENCE, "__remove_reference", 1)
+ DEFTRAIT_EXPR (TYPE_ORDER, "__builtin_type_order", 2)
  DEFTRAIT_TYPE (TYPE_PACK_ELEMENT, "__type_pack_element", -1)
  DEFTRAIT_TYPE (UNDERLYING_TYPE, "__underlying_type", 1)
  
diff -Nrcpad gcc-16-20250622/gcc/cp/cp-tree.h gcc-16-20250629/gcc/cp/cp-tree.h
*** gcc-16-20250622/gcc/cp/cp-tree.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/cp-tree.h	Sun Jun 29 22:32:27 2025
*************** extern void adjust_clone_args			(tree);
*** 7104,7109 ****
--- 7104,7110 ----
  extern void deduce_noexcept_on_destructor       (tree);
  extern bool uniquely_derived_from_p             (tree, tree);
  extern bool publicly_uniquely_derived_p         (tree, tree);
+ extern bool publicly_virtually_derived_p        (tree, tree);
  extern tree common_enclosing_class		(tree, tree);
  
  /* in cvt.cc */
*************** extern bool ctor_omit_inherited_parms		(
*** 7557,7562 ****
--- 7558,7565 ----
  extern tree locate_ctor				(tree);
  extern tree implicitly_declare_fn               (special_function_kind, tree,
  						 bool, tree, tree);
+ extern tree type_order_value			(tree, tree);
+ 
  /* In module.cc  */
  class module_state; /* Forward declare.  */
  inline bool modules_p () { return flag_modules != 0; }
*************** extern tree fold_non_dependent_init		(tr
*** 8912,8918 ****
  						 bool = false, tree = NULL_TREE);
  extern tree fold_simple				(tree);
  extern tree fold_to_constant			(tree);
! extern bool reduced_constant_expression_p       (tree);
  extern bool is_instantiation_of_constexpr       (tree);
  extern bool var_in_constexpr_fn                 (tree);
  extern bool var_in_maybe_constexpr_fn           (tree);
--- 8915,8921 ----
  						 bool = false, tree = NULL_TREE);
  extern tree fold_simple				(tree);
  extern tree fold_to_constant			(tree);
! extern bool reduced_constant_expression_p       (tree, tree = NULL_TREE);
  extern bool is_instantiation_of_constexpr       (tree);
  extern bool var_in_constexpr_fn                 (tree);
  extern bool var_in_maybe_constexpr_fn           (tree);
diff -Nrcpad gcc-16-20250622/gcc/cp/decl.cc gcc-16-20250629/gcc/cp/decl.cc
*** gcc-16-20250622/gcc/cp/decl.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/decl.cc	Sun Jun 29 22:32:27 2025
*************** cp_finish_decl (tree decl, tree init, bo
*** 8923,8932 ****
        cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
  
        /* Update the type of the corresponding TEMPLATE_DECL to match.  */
!       if (DECL_LANG_SPECIFIC (decl)
! 	  && DECL_TEMPLATE_INFO (decl)
! 	  && DECL_TEMPLATE_RESULT (DECL_TI_TEMPLATE (decl)) == decl)
! 	TREE_TYPE (DECL_TI_TEMPLATE (decl)) = type;
      }
  
    if (ensure_literal_type_for_constexpr_object (decl) == error_mark_node)
--- 8923,8934 ----
        cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
  
        /* Update the type of the corresponding TEMPLATE_DECL to match.  */
!       if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl))
! 	{
! 	  tree tmpl = template_for_substitution (decl);
! 	  if (DECL_TEMPLATE_RESULT (tmpl) == decl)
! 	    TREE_TYPE (tmpl) = type;
! 	}
      }
  
    if (ensure_literal_type_for_constexpr_object (decl) == error_mark_node)
*************** grokfndecl (tree ctype,
*** 11326,11336 ****
  		  "cannot declare %<::main%> to be %qs", "consteval");
        if (!publicp)
  	error_at (location, "cannot declare %<::main%> to be static");
!       if (current_lang_depth () != 0)
  	pedwarn (location, OPT_Wpedantic, "cannot declare %<::main%> with a"
! 		 " linkage specification");
        if (module_attach_p ())
! 	error_at (location, "cannot attach %<::main%> to a named module");
        inlinep = 0;
        publicp = 1;
      }
--- 11328,11343 ----
  		  "cannot declare %<::main%> to be %qs", "consteval");
        if (!publicp)
  	error_at (location, "cannot declare %<::main%> to be static");
!       if (current_lang_name != lang_name_cplusplus)
  	pedwarn (location, OPT_Wpedantic, "cannot declare %<::main%> with a"
! 		 " linkage specification other than %<extern \"C++\"%>");
        if (module_attach_p ())
! 	{
! 	  auto_diagnostic_group adg;
! 	  error_at (location, "cannot attach %<::main%> to a named module");
! 	  inform (location, "use %<extern \"C++\"%> to attach it to the "
! 		  "global module instead");
! 	}
        inlinep = 0;
        publicp = 1;
      }
diff -Nrcpad gcc-16-20250622/gcc/cp/error.cc gcc-16-20250629/gcc/cp/error.cc
*** gcc-16-20250622/gcc/cp/error.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/error.cc	Sun Jun 29 22:32:27 2025
*************** cxx_initialize_diagnostics (diagnostic_c
*** 308,314 ****
    diagnostic_text_starter (context) = cp_diagnostic_text_starter;
    /* diagnostic_finalizer is already c_diagnostic_text_finalizer.  */
    context->set_format_decoder (cp_printer);
!   context->m_adjust_diagnostic_info = cp_adjust_diagnostic_info;
  }
  
  /* Dump an '@module' name suffix for DECL, if it's attached to an import.  */
--- 308,314 ----
    diagnostic_text_starter (context) = cp_diagnostic_text_starter;
    /* diagnostic_finalizer is already c_diagnostic_text_finalizer.  */
    context->set_format_decoder (cp_printer);
!   context->set_adjust_diagnostic_info_callback (cp_adjust_diagnostic_info);
  }
  
  /* Dump an '@module' name suffix for DECL, if it's attached to an import.  */
diff -Nrcpad gcc-16-20250622/gcc/cp/init.cc gcc-16-20250629/gcc/cp/init.cc
*** gcc-16-20250622/gcc/cp/init.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/init.cc	Sun Jun 29 22:32:27 2025
*************** build_new_constexpr_heap_type (tree elt_
*** 3010,3016 ****
    tree atype1 = build_cplus_array_type (sizetype, itype1);
    tree atype2 = build_cplus_array_type (elt_type, itype2);
    tree rtype = cxx_make_type (RECORD_TYPE);
-   TYPE_NAME (rtype) = heap_identifier;
    tree fld1 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype1);
    tree fld2 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype2);
    DECL_FIELD_CONTEXT (fld1) = rtype;
--- 3010,3015 ----
*************** build_new_constexpr_heap_type (tree elt_
*** 3019,3025 ****
--- 3018,3033 ----
    DECL_ARTIFICIAL (fld2) = true;
    TYPE_FIELDS (rtype) = fld1;
    DECL_CHAIN (fld1) = fld2;
+   TYPE_ARTIFICIAL (rtype) = true;
    layout_type (rtype);
+ 
+   tree decl = build_decl (UNKNOWN_LOCATION, TYPE_DECL, heap_identifier, rtype);
+   TYPE_NAME (rtype) = decl;
+   TYPE_STUB_DECL (rtype) = decl;
+   DECL_CONTEXT (decl) = NULL_TREE;
+   DECL_ARTIFICIAL (decl) = true;
+   layout_decl (decl, 0);
+ 
    return rtype;
  }
  
diff -Nrcpad gcc-16-20250622/gcc/cp/method.cc gcc-16-20250629/gcc/cp/method.cc
*** gcc-16-20250622/gcc/cp/method.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/method.cc	Sun Jun 29 22:32:27 2025
*************** synthesized_method_walk (tree ctype, spe
*** 3024,3030 ****
      /* Vbase cdtors are not relevant.  */;
    else
      {
!       if (constexpr_p)
  	*constexpr_p = false;
  
        FOR_EACH_VEC_ELT (*vbases, i, base_binfo)
--- 3024,3030 ----
      /* Vbase cdtors are not relevant.  */;
    else
      {
!       if (constexpr_p && cxx_dialect < cxx26)
  	*constexpr_p = false;
  
        FOR_EACH_VEC_ELT (*vbases, i, base_binfo)
*************** num_artificial_parms_for (const_tree fn)
*** 3951,3955 ****
--- 3951,3976 ----
    return count;
  }
  
+ /* Return value of the __builtin_type_order trait.  */
+ 
+ tree
+ type_order_value (tree type1, tree type2)
+ {
+   tree rettype = lookup_comparison_category (cc_strong_ordering);
+   if (rettype == error_mark_node)
+     return rettype;
+   int ret;
+   if (type1 == type2)
+     ret = 0;
+   else
+     {
+       const char *name1 = ASTRDUP (mangle_type_string (type1));
+       const char *name2 = mangle_type_string (type2);
+       ret = strcmp (name1, name2);
+     }
+   return lookup_comparison_result (cc_strong_ordering, rettype,
+ 				   ret == 0 ? 0 : ret > 0 ? 1 : 2);
+ }
+ 
  
  #include "gt-cp-method.h"
diff -Nrcpad gcc-16-20250622/gcc/cp/module.cc gcc-16-20250629/gcc/cp/module.cc
*** gcc-16-20250622/gcc/cp/module.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/module.cc	Sun Jun 29 22:32:27 2025
*************** enum tree_tag {
*** 2811,2822 ****
    tt_decl,		/* By-value mergeable decl.  */
    tt_tpl_parm,		/* Template parm.  */
  
!   /* The ordering of the following 4 is relied upon in
       trees_out::tree_node.  */
    tt_id,  		/* Identifier node.  */
    tt_conv_id,		/* Conversion operator name.  */
    tt_anon_id,		/* Anonymous name.  */
    tt_lambda_id,		/* Lambda name.  */
  
    tt_typedef_type,	/* A (possibly implicit) typedefed type.  */
    tt_derived_type,	/* A type derived from another type.  */
--- 2811,2823 ----
    tt_decl,		/* By-value mergeable decl.  */
    tt_tpl_parm,		/* Template parm.  */
  
!   /* The ordering of the following 5 is relied upon in
       trees_out::tree_node.  */
    tt_id,  		/* Identifier node.  */
    tt_conv_id,		/* Conversion operator name.  */
    tt_anon_id,		/* Anonymous name.  */
    tt_lambda_id,		/* Lambda name.  */
+   tt_internal_id,       /* Internal name.  */
  
    tt_typedef_type,	/* A (possibly implicit) typedefed type.  */
    tt_derived_type,	/* A type derived from another type.  */
*************** private:
*** 3096,3101 ****
--- 3097,3105 ----
    unsigned section;
    bool writing_local_entities;	/* Whether we might walk into a TU-local
  				   entity we need to emit placeholders for.  */
+   bool walking_bit_field_unit;  /* Whether we're walking the underlying
+ 				   storage for a bit field.  There's no other
+ 				   great way to detect this.  */
  #if CHECKING_P
    int importedness;		/* Checker that imports not occurring
  				   inappropriately.  +ve imports ok,
*************** trees_out::trees_out (allocator *mem, mo
*** 3262,3268 ****
  		      unsigned section)
    :parent (mem), state (state), tree_map (500),
     dep_hash (&deps), ref_num (0), section (section),
!    writing_local_entities (false)
  {
  #if CHECKING_P
    importedness = 0;
--- 3266,3272 ----
  		      unsigned section)
    :parent (mem), state (state), tree_map (500),
     dep_hash (&deps), ref_num (0), section (section),
!    writing_local_entities (false), walking_bit_field_unit (false)
  {
  #if CHECKING_P
    importedness = 0;
*************** trees_out::core_vals (tree t)
*** 6511,6517 ****
      case FIELD_DECL:
        WT (t->field_decl.offset);
        WT (t->field_decl.bit_field_type);
!       WT (t->field_decl.qualifier); /* bitfield unit.  */
        WT (t->field_decl.bit_offset);
        WT (t->field_decl.fcontext);
        WT (t->decl_common.initial);
--- 6515,6524 ----
      case FIELD_DECL:
        WT (t->field_decl.offset);
        WT (t->field_decl.bit_field_type);
!       {
! 	auto ovr = make_temp_override (walking_bit_field_unit, true);
! 	WT (t->field_decl.qualifier); /* bitfield unit.  */
!       }
        WT (t->field_decl.bit_offset);
        WT (t->field_decl.fcontext);
        WT (t->decl_common.initial);
*************** trees_out::decl_value (tree decl, depset
*** 8212,8217 ****
--- 8219,8228 ----
        inner = DECL_TEMPLATE_RESULT (decl);
        inner_tag = insert (inner, WK_value);
  
+       /* On stream-in we assume that a template and its result will
+ 	 have the same type.  */
+       gcc_checking_assert (TREE_TYPE (decl) == TREE_TYPE (inner));
+ 
        if (streaming_p ())
  	{
  	  int code = TREE_CODE (inner);
*************** trees_out::type_node (tree type)
*** 9366,9371 ****
--- 9377,9383 ----
  
    tree root = (TYPE_NAME (type)
  	       ? TREE_TYPE (TYPE_NAME (type)) : TYPE_MAIN_VARIANT (type));
+   gcc_checking_assert (root);
  
    if (type != root)
      {
*************** trees_out::type_node (tree type)
*** 9444,9449 ****
--- 9456,9463 ----
  	|| TREE_CODE (type) == UNION_TYPE
  	|| TREE_CODE (type) == ENUMERAL_TYPE)
        {
+ 	gcc_checking_assert (DECL_P (name));
+ 
  	/* We can meet template parms that we didn't meet in the
  	   tpl_parms walk, because we're referring to a derived type
  	   that was previously constructed from equivalent template
*************** trees_out::tree_value (tree t)
*** 9658,9668 ****
  
    if (DECL_P (t))
      /* No template, type, var or function, except anonymous
!        non-context vars.  */
      gcc_checking_assert ((TREE_CODE (t) != TEMPLATE_DECL
! 			  && TREE_CODE (t) != TYPE_DECL
  			  && (TREE_CODE (t) != VAR_DECL
! 			      || (!DECL_NAME (t) && !DECL_CONTEXT (t)))
  			  && TREE_CODE (t) != FUNCTION_DECL));
  
    if (streaming_p ())
--- 9672,9685 ----
  
    if (DECL_P (t))
      /* No template, type, var or function, except anonymous
!        non-context vars and types.  */
      gcc_checking_assert ((TREE_CODE (t) != TEMPLATE_DECL
! 			  && (TREE_CODE (t) != TYPE_DECL
! 			      || (DECL_ARTIFICIAL (t) && !DECL_CONTEXT (t)))
  			  && (TREE_CODE (t) != VAR_DECL
! 			      || ((!DECL_NAME (t)
! 				   || IDENTIFIER_INTERNAL_P (DECL_NAME (t)))
! 				  && !DECL_CONTEXT (t)))
  			  && TREE_CODE (t) != FUNCTION_DECL));
  
    if (streaming_p ())
*************** trees_out::tree_value (tree t)
*** 9674,9680 ****
        tree_node_bools (t);
      }
  
!   if  (TREE_CODE (t) == TREE_BINFO)
      /* Binfos are decl-like and need merging information.  */
      binfo_mergeable (t);
  
--- 9691,9697 ----
        tree_node_bools (t);
      }
  
!   if (TREE_CODE (t) == TREE_BINFO)
      /* Binfos are decl-like and need merging information.  */
      binfo_mergeable (t);
  
*************** trees_out::tree_value (tree t)
*** 9683,9690 ****
--- 9700,9756 ----
      dump (dumper::TREE)
        && dump ("Writing tree:%d %C:%N", tag, TREE_CODE (t), t);
  
+   int type_tag = 0;
+   tree type = NULL_TREE;
+   if (TREE_CODE (t) == TYPE_DECL)
+     {
+       type = TREE_TYPE (t);
+ 
+       /* We only support a limited set of features for uncontexted types;
+ 	 these are typically types created in the language-independent
+ 	 parts of the frontend (such as ubsan).  */
+       gcc_checking_assert (RECORD_OR_UNION_TYPE_P (type)
+ 			   && TYPE_MAIN_VARIANT (type) == type
+ 			   && TYPE_NAME (type) == t
+ 			   && TYPE_STUB_DECL (type) == t
+ 			   && !TYPE_VFIELD (type)
+ 			   && !TYPE_BINFO (type)
+ 			   && !CLASS_TYPE_P (type));
+ 
+       if (streaming_p ())
+ 	{
+ 	  start (type);
+ 	  tree_node_bools (type);
+ 	}
+ 
+       type_tag = insert (type, WK_value);
+       if (streaming_p ())
+ 	dump (dumper::TREE)
+ 	  && dump ("Writing type: %d %C:%N", type_tag,
+ 		   TREE_CODE (type), type);
+     }
+ 
    tree_node_vals (t);
  
+   if (type)
+     {
+       tree_node_vals (type);
+       tree_node (TYPE_SIZE (type));
+       tree_node (TYPE_SIZE_UNIT (type));
+       chained_decls (TYPE_FIELDS (type));
+       if (streaming_p ())
+ 	dump (dumper::TREE)
+ 	  && dump ("Written type:%d %C:%N", type_tag, TREE_CODE (type), type);
+     }
+ 
+   /* For uncontexted VAR_DECLs we need to stream the definition so that
+      importers can recreate their value.  */
+   if (TREE_CODE (t) == VAR_DECL)
+     {
+       gcc_checking_assert (!DECL_NONTRIVIALLY_INITIALIZED_P (t));
+       tree_node (DECL_INITIAL (t));
+     }
+ 
    if (streaming_p ())
      dump (dumper::TREE) && dump ("Written tree:%d %C:%N", tag, TREE_CODE (t), t);
  }
*************** trees_in::tree_value ()
*** 9723,9736 ****
    dump (dumper::TREE)
      && dump ("Reading tree:%d %C", tag, TREE_CODE (t));
  
!   if (!tree_node_vals (t))
      {
        back_refs[~tag] = NULL_TREE;
        set_overrun ();
-       /* Bail.  */
        return NULL_TREE;
      }
  
    if (TREE_CODE (t) == LAMBDA_EXPR
        && CLASSTYPE_LAMBDA_EXPR (TREE_TYPE (t)))
      {
--- 9789,9843 ----
    dump (dumper::TREE)
      && dump ("Reading tree:%d %C", tag, TREE_CODE (t));
  
!   int type_tag = 0;
!   tree type = NULL_TREE;
!   if (TREE_CODE (t) == TYPE_DECL)
!     {
!       type = start ();
!       if (!type || !tree_node_bools (type))
! 	t = NULL_TREE;
! 
!       type_tag = insert (type);
!       if (t)
! 	dump (dumper::TREE)
! 	  && dump ("Reading type:%d %C", type_tag, TREE_CODE (type));
!     }
! 
!   if (!t)
      {
+ bail:
        back_refs[~tag] = NULL_TREE;
+       if (type_tag)
+ 	back_refs[~type_tag] = NULL_TREE;
        set_overrun ();
        return NULL_TREE;
      }
  
+   if (!tree_node_vals (t))
+     goto bail;
+ 
+   if (type)
+     {
+       if (!tree_node_vals (type))
+ 	goto bail;
+ 
+       TYPE_SIZE (type) = tree_node ();
+       TYPE_SIZE_UNIT (type) = tree_node ();
+       TYPE_FIELDS (type) = chained_decls ();
+       if (get_overrun ())
+ 	goto bail;
+ 
+       dump (dumper::TREE)
+ 	&& dump ("Read type:%d %C:%N", type_tag, TREE_CODE (type), type);
+     }
+ 
+   if (TREE_CODE (t) == VAR_DECL)
+     {
+       DECL_INITIAL (t) = tree_node ();
+       if (TREE_STATIC (t))
+ 	varpool_node::finalize_decl (t);
+     }
+ 
    if (TREE_CODE (t) == LAMBDA_EXPR
        && CLASSTYPE_LAMBDA_EXPR (TREE_TYPE (t)))
      {
*************** trees_out::tree_node (tree t)
*** 9873,9882 ****
  
    if (TREE_CODE (t) == IDENTIFIER_NODE)
      {
!       /* An identifier node -> tt_id, tt_conv_id, tt_anon_id, tt_lambda_id.  */
        int code = tt_id;
        if (IDENTIFIER_ANON_P (t))
  	code = IDENTIFIER_LAMBDA_P (t) ? tt_lambda_id : tt_anon_id;
        else if (IDENTIFIER_CONV_OP_P (t))
  	code = tt_conv_id;
  
--- 9980,9992 ----
  
    if (TREE_CODE (t) == IDENTIFIER_NODE)
      {
!       /* An identifier node -> tt_id, tt_conv_id, tt_anon_id, tt_lambda_id,
! 	 tt_internal_id.  */
        int code = tt_id;
        if (IDENTIFIER_ANON_P (t))
  	code = IDENTIFIER_LAMBDA_P (t) ? tt_lambda_id : tt_anon_id;
+       else if (IDENTIFIER_INTERNAL_P (t))
+ 	code = tt_internal_id;
        else if (IDENTIFIER_CONV_OP_P (t))
  	code = tt_conv_id;
  
*************** trees_out::tree_node (tree t)
*** 9891,9903 ****
  	}
        else if (code == tt_id && streaming_p ())
  	str (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
  
        int tag = insert (t);
        if (streaming_p ())
  	{
! 	  /* We know the ordering of the 4 id tags.  */
  	  static const char *const kinds[] =
! 	    {"", "conv_op ", "anon ", "lambda "};
  	  dump (dumper::TREE)
  	    && dump ("Written:%d %sidentifier:%N", tag,
  		     kinds[code - tt_id],
--- 10001,10015 ----
  	}
        else if (code == tt_id && streaming_p ())
  	str (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
+       else if (code == tt_internal_id && streaming_p ())
+ 	str (prefix_for_internal_label (t));
  
        int tag = insert (t);
        if (streaming_p ())
  	{
! 	  /* We know the ordering of the 5 id tags.  */
  	  static const char *const kinds[] =
! 	    {"", "conv_op ", "anon ", "lambda ", "internal "};
  	  dump (dumper::TREE)
  	    && dump ("Written:%d %sidentifier:%N", tag,
  		     kinds[code - tt_id],
*************** trees_out::tree_node (tree t)
*** 9974,9981 ****
  	      break;
  
  	    case VAR_DECL:
! 	      /* AGGR_INIT_EXPRs cons up anonymous uncontexted VAR_DECLs.  */
! 	      gcc_checking_assert (!DECL_NAME (t)
  				   && DECL_ARTIFICIAL (t));
  	      break;
  
--- 10086,10096 ----
  	      break;
  
  	    case VAR_DECL:
! 	      /* AGGR_INIT_EXPRs cons up anonymous uncontexted VAR_DECLs,
! 		 and internal vars are created by sanitizers and
! 		 __builtin_source_location.  */
! 	      gcc_checking_assert ((!DECL_NAME (t)
! 				    || IDENTIFIER_INTERNAL_P (DECL_NAME (t)))
  				   && DECL_ARTIFICIAL (t));
  	      break;
  
*************** trees_out::tree_node (tree t)
*** 9984,9990 ****
--- 10099,10116 ----
  		 PARM_DECLS.  It'd be nice if they had a
  		 distinguishing flag to double check.  */
  	      break;
+ 
+ 	    case TYPE_DECL:
+ 	      /* Some parts of the compiler need internal struct types;
+ 		 these types may not have an appropriate context to use.
+ 		 Walk the whole type (including its definition) by value.  */
+ 	      gcc_checking_assert (DECL_ARTIFICIAL (t)
+ 				   && TYPE_ARTIFICIAL (TREE_TYPE (t))
+ 				   && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t))
+ 				   && !CLASS_TYPE_P (TREE_TYPE (t)));
+ 	      break;
  	    }
+ 	  mark_declaration (t, has_definition (t));
  	  goto by_value;
  	}
      }
*************** trees_in::tree_node (bool is_use)
*** 10121,10126 ****
--- 10247,10263 ----
        }
        break;
  
+     case tt_internal_id:
+       /* An internal label.  */
+       {
+ 	const char *prefix = str ();
+ 	res = generate_internal_label (prefix);
+ 	int tag = insert (res);
+ 	dump (dumper::TREE)
+ 	  && dump ("Read internal identifier:%d %N", tag, res);
+       }
+       break;
+ 
      case tt_typedef_type:
        res = tree_node ();
        if (res)
*************** trees_out::get_merge_kind (tree decl, de
*** 11124,11129 ****
--- 11261,11271 ----
  	return MK_local_friend;
  
        gcc_checking_assert (TYPE_P (ctx));
+ 
+       /* Internal-only types will not need to dedup their members.  */
+       if (!DECL_CONTEXT (TYPE_NAME (ctx)))
+ 	return MK_unique;
+ 
        if (TREE_CODE (decl) == USING_DECL)
  	return MK_field;
  
*************** trees_out::get_merge_kind (tree decl, de
*** 11136,11150 ****
  	      return MK_named;
  	    }
  
! 	  if (!DECL_NAME (decl)
! 	      && !RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl))
! 	      && !DECL_BIT_FIELD_REPRESENTATIVE (decl))
  	    {
  	      /* The underlying storage unit for a bitfield.  We do not
  		 need to dedup it, because it's only reachable through
  		 the bitfields it represents.  And those are deduped.  */
  	      // FIXME: Is that assertion correct -- do we ever fish it
  	      // out and put it in an expr?
  	      gcc_checking_assert ((TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
  				    ? TREE_CODE (TREE_TYPE (TREE_TYPE (decl)))
  				    : TREE_CODE (TREE_TYPE (decl)))
--- 11278,11293 ----
  	      return MK_named;
  	    }
  
! 	  if (walking_bit_field_unit)
  	    {
  	      /* The underlying storage unit for a bitfield.  We do not
  		 need to dedup it, because it's only reachable through
  		 the bitfields it represents.  And those are deduped.  */
  	      // FIXME: Is that assertion correct -- do we ever fish it
  	      // out and put it in an expr?
+ 	      gcc_checking_assert (!DECL_NAME (decl)
+ 				   && !RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl))
+ 				   && !DECL_BIT_FIELD_REPRESENTATIVE (decl));
  	      gcc_checking_assert ((TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
  				    ? TREE_CODE (TREE_TYPE (TREE_TYPE (decl)))
  				    : TREE_CODE (TREE_TYPE (decl)))
*************** trees_in::is_matching_decl (tree existin
*** 12193,12199 ****
  	{
  	  dump (dumper::MERGE)
  	    && dump ("Propagating deduced return type to %N", existing);
! 	  FNDECL_USED_AUTO (e_inner) = true;
  	  DECL_SAVED_AUTO_RETURN_TYPE (existing) = TREE_TYPE (e_type);
  	  TREE_TYPE (existing) = change_return_type (TREE_TYPE (d_type), e_type);
  	}
--- 12336,12343 ----
  	{
  	  dump (dumper::MERGE)
  	    && dump ("Propagating deduced return type to %N", existing);
! 	  gcc_checking_assert (existing == e_inner);
! 	  FNDECL_USED_AUTO (existing) = true;
  	  DECL_SAVED_AUTO_RETURN_TYPE (existing) = TREE_TYPE (e_type);
  	  TREE_TYPE (existing) = change_return_type (TREE_TYPE (d_type), e_type);
  	}
diff -Nrcpad gcc-16-20250622/gcc/cp/parser.cc gcc-16-20250629/gcc/cp/parser.cc
*** gcc-16-20250622/gcc/cp/parser.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/parser.cc	Sun Jun 29 22:32:27 2025
*************** cp_parser_binary_expression (cp_parser*
*** 10835,10840 ****
--- 10835,10848 ----
  	    goto pop;
  	}
  
+       /* If we skipped build_cplus_new in build_cxx_call because of decltype_p,
+ 	 call it now that we know current.lhs is a subexpression.  */
+       if (decltype_p && !processing_template_decl
+ 	  && TREE_CODE (current.lhs) == CALL_EXPR
+ 	  && CLASS_TYPE_P (TREE_TYPE (current.lhs)))
+ 	current.lhs = build_cplus_new (TREE_TYPE (current.lhs), current.lhs,
+ 				       tf_warning_or_error);
+ 
       get_rhs:
        current.tree_type = binops_by_token[token->type].tree_type;
        current.loc = token->location;
*************** cp_parser_oacc_update (cp_parser *parser
*** 49704,49710 ****
  */
  
  #define OACC_WAIT_CLAUSE_MASK					\
! 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC))
  
  static tree
  cp_parser_oacc_wait (cp_parser *parser, cp_token *pragma_tok)
--- 49712,49719 ----
  */
  
  #define OACC_WAIT_CLAUSE_MASK					\
! 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)	\
! 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF))
  
  static tree
  cp_parser_oacc_wait (cp_parser *parser, cp_token *pragma_tok)
diff -Nrcpad gcc-16-20250622/gcc/cp/pt.cc gcc-16-20250629/gcc/cp/pt.cc
*** gcc-16-20250622/gcc/cp/pt.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/pt.cc	Sun Jun 29 22:32:27 2025
*************** resolve_nondeduced_context (tree orig_ex
*** 24604,24610 ****
  	}
        if (good == 1)
  	{
! 	  mark_used (goodfn);
  	  expr = goodfn;
  	  if (baselink)
  	    expr = build_baselink (BASELINK_BINFO (baselink),
--- 24604,24611 ----
  	}
        if (good == 1)
  	{
! 	  if (!mark_used (goodfn, complain) && !(complain & tf_error))
! 	    return error_mark_node;
  	  expr = goodfn;
  	  if (baselink)
  	    expr = build_baselink (BASELINK_BINFO (baselink),
*************** tree
*** 27536,27541 ****
--- 27537,27546 ----
  template_for_substitution (tree decl)
  {
    tree tmpl = DECL_TI_TEMPLATE (decl);
+   if (VAR_P (decl))
+     if (tree partial = most_specialized_partial_spec (decl, tf_none))
+       if (partial != error_mark_node)
+ 	tmpl = TI_TEMPLATE (partial);
  
    /* Set TMPL to the template whose DECL_TEMPLATE_RESULT is the pattern
       for the instantiation.  This is not always the most general
diff -Nrcpad gcc-16-20250622/gcc/cp/semantics.cc gcc-16-20250629/gcc/cp/semantics.cc
*** gcc-16-20250622/gcc/cp/semantics.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/cp/semantics.cc	Sun Jun 29 22:32:27 2025
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13593,13600 ****
      case CPTK_IS_DEDUCIBLE:
        return type_targs_deducible_from (type1, type2);
  
!     /* __array_rank is handled in finish_trait_expr. */
      case CPTK_RANK:
        gcc_unreachable ();
  
  #define DEFTRAIT_TYPE(CODE, NAME, ARITY) \
--- 13593,13602 ----
      case CPTK_IS_DEDUCIBLE:
        return type_targs_deducible_from (type1, type2);
  
!     /* __array_rank and __builtin_type_order are handled in
!        finish_trait_expr.  */
      case CPTK_RANK:
+     case CPTK_TYPE_ORDER:
        gcc_unreachable ();
  
  #define DEFTRAIT_TYPE(CODE, NAME, ARITY) \
*************** finish_trait_expr (location_t loc, cp_tr
*** 13724,13729 ****
--- 13726,13737 ----
        tree trait_expr = make_node (TRAIT_EXPR);
        if (kind == CPTK_RANK)
  	TREE_TYPE (trait_expr) = size_type_node;
+       else if (kind == CPTK_TYPE_ORDER)
+ 	{
+ 	  tree val = type_order_value (type1, type1);
+ 	  if (val != error_mark_node)
+ 	    TREE_TYPE (trait_expr) = TREE_TYPE (val);
+ 	}
        else
  	TREE_TYPE (trait_expr) = boolean_type_node;
        TRAIT_EXPR_TYPE1 (trait_expr) = type1;
*************** finish_trait_expr (location_t loc, cp_tr
*** 13831,13836 ****
--- 13839,13845 ----
      case CPTK_IS_UNION:
      case CPTK_IS_VOLATILE:
      case CPTK_RANK:
+     case CPTK_TYPE_ORDER:
        break;
  
      case CPTK_IS_LAYOUT_COMPATIBLE:
*************** finish_trait_expr (location_t loc, cp_tr
*** 13870,13875 ****
--- 13879,13886 ----
  	++rank;
        val = build_int_cst (size_type_node, rank);
      }
+   else if (kind == CPTK_TYPE_ORDER)
+     val = type_order_value (type1, type2);
    else
      val = (trait_expr_value (kind, type1, type2)
  	   ? boolean_true_node : boolean_false_node);
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-format-html.cc gcc-16-20250629/gcc/diagnostic-format-html.cc
*** gcc-16-20250622/gcc/diagnostic-format-html.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-format-html.cc	Sun Jun 29 22:32:27 2025
*************** along with GCC; see the file COPYING3.
*** 41,46 ****
--- 41,48 ----
  #include "intl.h"
  #include "xml.h"
  #include "xml-printer.h"
+ #include "diagnostic-state.h"
+ #include "graphviz.h"
  #include "json.h"
  #include "selftest-xml.h"
  
*************** along with GCC; see the file COPYING3.
*** 48,54 ****
  
  html_generation_options::html_generation_options ()
  : m_css (true),
!   m_javascript (true)
  {
  }
  
--- 50,59 ----
  
  html_generation_options::html_generation_options ()
  : m_css (true),
!   m_javascript (true),
!   m_show_state_diagrams (false),
!   m_show_state_diagram_xml (false),
!   m_show_state_diagram_dot_src (false)
  {
  }
  
*************** public:
*** 141,146 ****
--- 146,154 ----
      m_ui_focus_ids.append_string (focus_id.c_str ());
    }
  
+   std::unique_ptr<xml::node>
+   maybe_make_state_diagram (const diagnostic_event &event);
+ 
  private:
    void
    add_stylesheet (std::string url);
*************** const char * const HTML_SCRIPT
*** 310,323 ****
--- 318,344 ----
       "      const element_id = focus_ids[focus_idx];\n"
       "      return document.getElementById(element_id);\n"
       "  }\n"
+      "  function get_any_state_diagram (focus_idx)\n"
+      "  {\n"
+      "      const element_id = focus_ids[focus_idx];\n"
+      "      return document.getElementById(element_id + \"-state-diagram\");\n"
+      "  }\n"
       "  function unhighlight_current_focus_idx ()\n"
       "  {\n"
       "      get_focus_span (current_focus_idx).classList.remove ('selected');\n"
+      "      state_diagram = get_any_state_diagram (current_focus_idx);\n"
+      "      if (state_diagram) {\n"
+      "          state_diagram.style.visibility = \"hidden\";\n"
+      "      }\n"
       "  }\n"
       "  function highlight_current_focus_idx ()\n"
       "  {\n"
       "      const el = get_focus_span (current_focus_idx);\n"
       "      el.classList.add ('selected');\n"
+      "      state_diagram = get_any_state_diagram (current_focus_idx);\n"
+      "      if (state_diagram) {\n"
+      "          state_diagram.style.visibility = \"visible\";\n"
+      "      }\n"
       "      // Center the element on the screen\n"
       "      const top_y = el.getBoundingClientRect ().top + window.pageYOffset;\n"
       "      const middle = top_y - (window.innerHeight / 2);\n"
*************** html_builder::html_builder (diagnostic_c
*** 405,410 ****
--- 426,432 ----
        {
  	xml::auto_print_element title (xp, "title", true);
  	m_title_element = xp.get_insertion_point ();
+ 	m_title_element->add_text (" ");
        }
  
        if (m_html_gen_opts.m_css)
*************** html_builder::pop_nesting_level ()
*** 563,568 ****
--- 585,643 ----
    m_cur_nesting_levels.pop_back ();
  }
  
+ static void
+ print_pre_source (xml::printer &xp, const char *text)
+ {
+   xp.push_tag_with_class ("pre", "source", true);
+   xp.add_text (text);
+   xp.pop_tag ("pre");
+ }
+ 
+ std::unique_ptr<xml::node>
+ html_builder::maybe_make_state_diagram (const diagnostic_event &event)
+ {
+   if (!m_html_gen_opts.m_show_state_diagrams)
+     return nullptr;
+ 
+   /* Get XML state document; if we're going to print it later, also request
+      the debug version.  */
+   auto xml_state
+     = event.maybe_make_xml_state (m_html_gen_opts.m_show_state_diagram_xml);
+   if (!xml_state)
+     return nullptr;
+ 
+   // Convert it to .dot AST
+   auto graph = make_dot_graph_from_xml_state (*xml_state);
+   gcc_assert (graph);
+ 
+   auto wrapper = std::make_unique<xml::element> ("div", false);
+   xml::printer xp (*wrapper);
+ 
+   if (m_html_gen_opts.m_show_state_diagram_xml)
+     {
+       // For debugging, show the XML src inline:
+       pretty_printer pp;
+       xml_state->write_as_xml (&pp, 0, true);
+       print_pre_source (xp, pp_formatted_text (&pp));
+     }
+ 
+   if (m_html_gen_opts.m_show_state_diagram_dot_src)
+     {
+       // For debugging, show the dot src inline:
+       pretty_printer pp;
+       dot::writer w (pp);
+       graph->print (w);
+       print_pre_source (xp, pp_formatted_text (&pp));
+     }
+ 
+   // Turn the .dot into SVG and splice into place
+   auto svg = dot::make_svg_from_graph (*graph);
+   if (svg)
+     xp.append (std::move (svg));
+ 
+   return wrapper;
+ }
+ 
  /* Custom subclass of html_label_writer.
     Wrap labels within a <span> element, supplying them with event IDs.
     Add the IDs to the list of focus IDs.  */
*************** class html_path_label_writer : public ht
*** 572,605 ****
  public:
    html_path_label_writer (xml::printer &xp,
  			  html_builder &builder,
  			  const std::string &event_id_prefix)
    : m_xp (xp),
      m_html_builder (builder),
      m_event_id_prefix (event_id_prefix),
!     m_next_event_idx (0)
    {
    }
  
    void begin_label () final override
    {
      m_xp.push_tag_with_class ("span", "event", true);
!     pretty_printer pp;
!     pp_printf (&pp, "%s%i",
! 	       m_event_id_prefix.c_str (), m_next_event_idx++);
!     m_xp.set_attr ("id", pp_formatted_text (&pp));
!     m_html_builder.add_focus_id (pp_formatted_text (&pp));
    }
  
    void end_label () final override
    {
      m_xp.pop_tag ("span"); // from begin_label
    }
  
  private:
    xml::printer &m_xp;
    html_builder &m_html_builder;
    const std::string &m_event_id_prefix;
    int m_next_event_idx;
  };
  
  /* See https://pf3.patternfly.org/v3/pattern-library/widgets/#alerts */
--- 647,705 ----
  public:
    html_path_label_writer (xml::printer &xp,
  			  html_builder &builder,
+ 			  const diagnostic_path &path,
  			  const std::string &event_id_prefix)
    : m_xp (xp),
      m_html_builder (builder),
+     m_path (path),
      m_event_id_prefix (event_id_prefix),
!     m_next_event_idx (0),
!     m_curr_event_id ()
    {
    }
  
    void begin_label () final override
    {
+     m_curr_event_id = m_next_event_idx++;
      m_xp.push_tag_with_class ("span", "event", true);
!     m_xp.set_attr ("id", get_element_id ());
!     m_html_builder.add_focus_id (get_element_id ());
    }
  
    void end_label () final override
    {
+     const diagnostic_event &event
+       = m_path.get_event (m_curr_event_id.zero_based ());
+     if (auto state_doc = m_html_builder.maybe_make_state_diagram (event))
+     {
+       m_xp.push_tag_with_class ("div", "state-diagram", false);
+       m_xp.set_attr ("id", get_element_id () + "-state-diagram");
+       m_xp.set_attr ("style",
+ 		     ("position: absolute;"
+ 		      " z-index: 1;"
+ 		      " visibility: hidden;"));
+       m_xp.append (std::move (state_doc));
+       m_xp.pop_tag ("div");
+     }
+ 
      m_xp.pop_tag ("span"); // from begin_label
    }
  
  private:
+   std::string
+   get_element_id () const
+   {
+     gcc_assert (m_curr_event_id.known_p ());
+     return (m_event_id_prefix
+ 	    + std::to_string (m_curr_event_id.zero_based ()));
+   }
+ 
    xml::printer &m_xp;
    html_builder &m_html_builder;
+   const diagnostic_path &m_path;
    const std::string &m_event_id_prefix;
    int m_next_event_idx;
+   diagnostic_event_id_t m_curr_event_id;
  };
  
  /* See https://pf3.patternfly.org/v3/pattern-library/widgets/#alerts */
*************** public:
*** 799,804 ****
--- 899,914 ----
  	case pp_token::kind::end_url:
  	  m_xp.pop_tag ("a");
  	  break;
+ 
+ 	case pp_token::kind::event_id:
+ 	  {
+ 	    pp_token_event_id *sub = as_a <pp_token_event_id *> (iter);
+ 	    gcc_assert (sub->m_event_id.known_p ());
+ 	    m_xp.add_text ("(");
+ 	    m_xp.add_text (std::to_string (sub->m_event_id.one_based ()));
+ 	    m_xp.add_text (")");
+ 	  }
+ 	  break;
  	}
    }
  
*************** html_builder::make_element_for_diagnosti
*** 1003,1010 ****
        xp.pop_tag ("label");
  
        std::string event_id_prefix (diag_id + "-event-");
!       html_path_label_writer event_label_writer (xp, *this,
  						 event_id_prefix);
        diagnostic_source_print_policy dspp (m_context);
        print_path_as_html (xp, *path, m_context, &event_label_writer,
  			  dspp);
--- 1113,1121 ----
        xp.pop_tag ("label");
  
        std::string event_id_prefix (diag_id + "-event-");
!       html_path_label_writer event_label_writer (xp, *this, *path,
  						 event_id_prefix);
+ 
        diagnostic_source_print_policy dspp (m_context);
        print_path_as_html (xp, *path, m_context, &event_label_writer,
  			  dspp);
*************** public:
*** 1201,1207 ****
    {
      m_builder.emit_diagram (diagram);
    }
!   void after_diagnostic (const diagnostic_info &)
    {
      /* No-op, but perhaps could show paths here.  */
    }
--- 1312,1318 ----
    {
      m_builder.emit_diagram (diagram);
    }
!   void after_diagnostic (const diagnostic_info &) final override
    {
      /* No-op, but perhaps could show paths here.  */
    }
*************** test_token_printer ()
*** 1375,1380 ****
--- 1486,1500 ----
         "&apos;"
         "</div>\n");
    }
+ 
+   {
+     token_printer_test t;
+     diagnostic_event_id_t event_id (0);
+     pp_printf (&t.m_pp, "foo %@ bar", &event_id);
+     ASSERT_XML_PRINT_EQ
+       (t.m_top_element,
+        "<div>foo (1) bar</div>\n");
+   }
  }
  
  /* A subclass of html_output_format for writing selftests.
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-format-html.h gcc-16-20250629/gcc/diagnostic-format-html.h
*** gcc-16-20250622/gcc/diagnostic-format-html.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-format-html.h	Sun Jun 29 22:32:27 2025
*************** struct html_generation_options
*** 30,35 ****
--- 30,46 ----
  
    bool m_css;
    bool m_javascript;
+ 
+   // Debugging options:
+ 
+   // If true, attempt to show state diagrams at events
+   bool m_show_state_diagrams;
+ 
+   // If true, show the XML form of the state with such diagrams
+   bool m_show_state_diagram_xml;
+ 
+   // If true, show the .dot source used for the diagram
+   bool m_show_state_diagram_dot_src;
  };
  
  extern diagnostic_output_file
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-format-sarif.cc gcc-16-20250629/gcc/diagnostic-format-sarif.cc
*** gcc-16-20250622/gcc/diagnostic-format-sarif.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-format-sarif.cc	Sun Jun 29 22:32:27 2025
*************** along with GCC; see the file COPYING3.
*** 50,55 ****
--- 50,56 ----
  #include "pretty-print-urlifier.h"
  #include "demangle.h"
  #include "backtrace.h"
+ #include "xml.h"
  
  /* A json::array where the values are "unique" as per
     SARIF v2.1.0 section 3.7.3 ("Array properties with unique values").  */
*************** populate_thread_flow_location_object (sa
*** 2959,2964 ****
--- 2960,2979 ----
       via a property bag.  */
    ev.maybe_add_sarif_properties (*this, tfl_obj);
  
+   if (get_opts ().m_xml_state)
+     if (auto xml_state = ev.maybe_make_xml_state (true))
+       {
+ 	sarif_property_bag &props = tfl_obj.get_or_create_properties ();
+ 
+ 	pretty_printer pp;
+ 	xml_state->write_as_xml (&pp, 0, true);
+ 
+ #define PROPERTY_PREFIX "gcc/diagnostic_event/"
+ 	props.set_string (PROPERTY_PREFIX "xml_state",
+ 			  pp_formatted_text (&pp));
+ #undef PROPERTY_PREFIX
+       }
+ 
    /* "location" property (SARIF v2.1.0 section 3.38.3).  */
    tfl_obj.set<sarif_location>
      ("location",
*************** make_sarif_sink (diagnostic_context &con
*** 4101,4107 ****
  // struct sarif_generation_options
  
  sarif_generation_options::sarif_generation_options ()
! : m_version (sarif_version::v2_1_0)
  {
  }
  
--- 4116,4123 ----
  // struct sarif_generation_options
  
  sarif_generation_options::sarif_generation_options ()
! : m_version (sarif_version::v2_1_0),
!   m_xml_state (false)
  {
  }
  
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-format-sarif.h gcc-16-20250629/gcc/diagnostic-format-sarif.h
*** gcc-16-20250622/gcc/diagnostic-format-sarif.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-format-sarif.h	Sun Jun 29 22:32:27 2025
*************** struct sarif_generation_options
*** 101,106 ****
--- 101,107 ----
    sarif_generation_options ();
  
    enum sarif_version m_version;
+   bool m_xml_state;
  };
  
  extern std::unique_ptr<diagnostic_output_format>
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-output-spec.cc gcc-16-20250629/gcc/diagnostic-output-spec.cc
*** gcc-16-20250622/gcc/diagnostic-output-spec.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/diagnostic-output-spec.cc	Sun Jun 29 22:32:27 2025
***************
*** 0 ****
--- 1,849 ----
+ /* Support for the DSL of -fdiagnostics-add-output= and
+    -fdiagnostics-set-output=.
+    Copyright (C) 2024-2025 Free Software Foundation, Inc.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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 file implements the domain-specific language for the options
+    -fdiagnostics-add-output= and -fdiagnostics-set-output=, and for
+    the "diagnostic_manager_add_sink_from_spec" entrypoint to
+    libgdiagnostics.  */
+ 
+ #include "config.h"
+ #define INCLUDE_ARRAY
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
+ #include "system.h"
+ #include "coretypes.h"
+ #include "version.h"
+ #include "intl.h"
+ #include "diagnostic.h"
+ #include "diagnostic-color.h"
+ #include "diagnostic-format.h"
+ #include "diagnostic-format-html.h"
+ #include "diagnostic-format-text.h"
+ #include "diagnostic-format-sarif.h"
+ #include "selftest.h"
+ #include "selftest-diagnostic.h"
+ #include "pretty-print-markup.h"
+ #include "diagnostic-output-spec.h"
+ 
+ /* A namespace for handling the DSL of the arguments of
+    -fdiagnostics-add-output= and -fdiagnostics-set-output=.  */
+ 
+ namespace diagnostics_output_spec {
+ 
+ /* Decls.  */
+ 
+ struct scheme_name_and_params
+ {
+   std::string m_scheme_name;
+   std::vector<std::pair<std::string, std::string>> m_kvs;
+ };
+ 
+ /* Class for parsing the arguments of -fdiagnostics-add-output= and
+    -fdiagnostics-set-output=, and making diagnostic_output_format
+    instances (or issuing errors).  */
+ 
+ class output_factory
+ {
+ public:
+   class scheme_handler
+   {
+   public:
+     scheme_handler (std::string scheme_name)
+     : m_scheme_name (std::move (scheme_name))
+     {}
+     virtual ~scheme_handler () {}
+ 
+     const std::string &get_scheme_name () const { return m_scheme_name; }
+ 
+     virtual std::unique_ptr<diagnostic_output_format>
+     make_sink (const context &ctxt,
+ 	       diagnostic_context &dc,
+ 	       const char *unparsed_arg,
+ 	       const scheme_name_and_params &parsed_arg) const = 0;
+ 
+   protected:
+     bool
+     parse_bool_value (const context &ctxt,
+ 		      const char *unparsed_arg,
+ 		      const std::string &key,
+ 		      const std::string &value,
+ 		      bool &out) const
+     {
+       if (value == "yes")
+ 	{
+ 	  out = true;
+ 	  return true;
+ 	}
+       else if (value == "no")
+ 	{
+ 	  out = false;
+ 	  return true;
+ 	}
+       else
+ 	{
+ 	  ctxt.report_error
+ 	    ("%<%s%s%>:"
+ 	     " unexpected value %qs for key %qs; expected %qs or %qs",
+ 	     ctxt.get_option_name (), unparsed_arg,
+ 	     value.c_str (),
+ 	     key.c_str (),
+ 	     "yes", "no");
+ 
+ 	  return false;
+ 	}
+     }
+     template <typename EnumType, size_t NumValues>
+     bool
+     parse_enum_value (const context &ctxt,
+ 		      const char *unparsed_arg,
+ 		      const std::string &key,
+ 		      const std::string &value,
+ 		      const std::array<std::pair<const char *, EnumType>, NumValues> &value_names,
+ 		      EnumType &out) const
+     {
+       for (auto &iter : value_names)
+ 	if (value == iter.first)
+ 	  {
+ 	    out = iter.second;
+ 	    return true;
+ 	  }
+ 
+       auto_vec<const char *> known_values;
+       for (auto iter : value_names)
+ 	known_values.safe_push (iter.first);
+       pp_markup::comma_separated_quoted_strings e (known_values);
+       ctxt.report_error
+ 	("%<%s%s%>:"
+ 	 " unexpected value %qs for key %qs; known values: %e",
+ 	 ctxt.get_option_name (), unparsed_arg,
+ 	 value.c_str (),
+ 	 key.c_str (),
+ 	 &e);
+       return false;
+     }
+ 
+   private:
+     const std::string m_scheme_name;
+   };
+ 
+   output_factory ();
+ 
+   std::unique_ptr<diagnostic_output_format>
+   make_sink (const context &ctxt,
+ 	     diagnostic_context &dc,
+ 	     const char *unparsed_arg,
+ 	     const scheme_name_and_params &parsed_arg);
+ 
+   const scheme_handler *get_scheme_handler (const std::string &scheme_name);
+ 
+ private:
+   std::vector<std::unique_ptr<scheme_handler>> m_scheme_handlers;
+ };
+ 
+ class text_scheme_handler : public output_factory::scheme_handler
+ {
+ public:
+   text_scheme_handler () : scheme_handler ("text") {}
+ 
+   std::unique_ptr<diagnostic_output_format>
+   make_sink (const context &ctxt,
+ 	     diagnostic_context &dc,
+ 	     const char *unparsed_arg,
+ 	     const scheme_name_and_params &parsed_arg) const final override;
+ };
+ 
+ class sarif_scheme_handler : public output_factory::scheme_handler
+ {
+ public:
+   sarif_scheme_handler () : scheme_handler ("sarif") {}
+ 
+   std::unique_ptr<diagnostic_output_format>
+   make_sink (const context &ctxt,
+ 	     diagnostic_context &dc,
+ 	     const char *unparsed_arg,
+ 	     const scheme_name_and_params &parsed_arg) const final override;
+ 
+ private:
+   static sarif_generation_options
+   make_sarif_gen_opts (enum sarif_version version,
+ 		       bool xml_state);
+ 
+   static std::unique_ptr<sarif_serialization_format>
+   make_sarif_serialization_object (enum sarif_serialization_kind);
+ };
+ 
+ class html_scheme_handler : public output_factory::scheme_handler
+ {
+ public:
+   html_scheme_handler () : scheme_handler ("experimental-html") {}
+ 
+   std::unique_ptr<diagnostic_output_format>
+   make_sink (const context &ctxt,
+ 	     diagnostic_context &dc,
+ 	     const char *unparsed_arg,
+ 	     const scheme_name_and_params &parsed_arg) const final override;
+ };
+ 
+ /* struct context.  */
+ 
+ void
+ context::report_error (const char *gmsgid, ...) const
+ {
+   va_list ap;
+   va_start (ap, gmsgid);
+   report_error_va (gmsgid, &ap);
+   va_end (ap);
+ }
+ 
+ void
+ context::report_unknown_key (const char *unparsed_arg,
+ 			     const std::string &key,
+ 			     const std::string &scheme_name,
+ 			     auto_vec<const char *> &known_keys) const
+ {
+   pp_markup::comma_separated_quoted_strings e (known_keys);
+   report_error
+     ("%<%s%s%>:"
+      " unknown key %qs for format %qs; known keys: %e",
+      get_option_name (), unparsed_arg,
+      key.c_str (), scheme_name.c_str (), &e);
+ }
+ 
+ void
+ context::report_missing_key (const char *unparsed_arg,
+ 			     const std::string &key,
+ 			     const std::string &scheme_name,
+ 			     const char *metavar) const
+ {
+   report_error
+     ("%<%s%s%>:"
+      " missing required key %qs for format %qs;"
+      " try %<%s%s:%s=%s%>",
+      get_option_name (), unparsed_arg,
+      key.c_str (), scheme_name.c_str (),
+      get_option_name (), scheme_name.c_str (), key.c_str (), metavar);
+ }
+ 
+ diagnostic_output_file
+ context::open_output_file (label_text &&filename) const
+ {
+   FILE *outf = fopen (filename.get (), "w");
+   if (!outf)
+     {
+       report_error ("unable to open %qs: %m", filename.get ());
+       return diagnostic_output_file (nullptr, false, std::move (filename));
+     }
+   return diagnostic_output_file (outf, true, std::move (filename));
+ }
+ 
+ static std::unique_ptr<scheme_name_and_params>
+ parse (const context &ctxt, const char *unparsed_arg)
+ {
+   scheme_name_and_params result;
+   if (const char *const colon = strchr (unparsed_arg, ':'))
+     {
+       result.m_scheme_name = std::string (unparsed_arg, colon - unparsed_arg);
+       /* Expect zero of more of KEY=VALUE,KEY=VALUE, etc  .*/
+       const char *iter = colon + 1;
+       const char *last_separator = ":";
+       while (iter)
+ 	{
+ 	  /* Look for a non-empty key string followed by '='.  */
+ 	  const char *eq = strchr (iter, '=');
+ 	  if (eq == nullptr || eq == iter)
+ 	    {
+ 	      /* Missing '='.  */
+ 	      ctxt.report_error
+ 		("%<%s%s%>:"
+ 		 " expected KEY=VALUE-style parameter for format %qs"
+ 		 " after %qs;"
+ 		 " got %qs",
+ 		 ctxt.get_option_name (), unparsed_arg,
+ 		 result.m_scheme_name.c_str (),
+ 		 last_separator,
+ 		 iter);
+ 	      return nullptr;
+ 	    }
+ 	  std::string key = std::string (iter, eq - iter);
+ 	  std::string value;
+ 	  const char *comma = strchr (iter, ',');
+ 	  if (comma)
+ 	    {
+ 	      value = std::string (eq + 1, comma - (eq + 1));
+ 	      iter = comma + 1;
+ 	      last_separator = ",";
+ 	    }
+ 	  else
+ 	    {
+ 	      value = std::string (eq + 1);
+ 	      iter = nullptr;
+ 	    }
+ 	  result.m_kvs.push_back ({std::move (key), std::move (value)});
+ 	}
+     }
+   else
+     result.m_scheme_name = unparsed_arg;
+   return std::make_unique<scheme_name_and_params> (std::move (result));
+ }
+ 
+ std::unique_ptr<diagnostic_output_format>
+ context::parse_and_make_sink (const char *unparsed_arg,
+ 			      diagnostic_context &dc)
+ {
+   auto parsed_arg = diagnostics_output_spec::parse (*this, unparsed_arg);
+   if (!parsed_arg)
+     return nullptr;
+ 
+   diagnostics_output_spec::output_factory factory;
+   return factory.make_sink (*this, dc, unparsed_arg, *parsed_arg);
+ }
+ 
+ /* class output_factory::scheme_handler.  */
+ 
+ /* class output_factory.  */
+ 
+ output_factory::output_factory ()
+ {
+   m_scheme_handlers.push_back (std::make_unique<text_scheme_handler> ());
+   m_scheme_handlers.push_back (std::make_unique<sarif_scheme_handler> ());
+   m_scheme_handlers.push_back (std::make_unique<html_scheme_handler> ());
+ }
+ 
+ const output_factory::scheme_handler *
+ output_factory::get_scheme_handler (const std::string &scheme_name)
+ {
+   for (auto &iter : m_scheme_handlers)
+     if (iter->get_scheme_name () == scheme_name)
+       return iter.get ();
+   return nullptr;
+ }
+ 
+ std::unique_ptr<diagnostic_output_format>
+ output_factory::make_sink (const context &ctxt,
+ 			   diagnostic_context &dc,
+ 			   const char *unparsed_arg,
+ 			   const scheme_name_and_params &parsed_arg)
+ {
+   auto scheme_handler = get_scheme_handler (parsed_arg.m_scheme_name);
+   if (!scheme_handler)
+     {
+       auto_vec<const char *> strings;
+       for (auto &iter : m_scheme_handlers)
+ 	strings.safe_push (iter->get_scheme_name ().c_str ());
+       pp_markup::comma_separated_quoted_strings e (strings);
+       ctxt.report_error ("%<%s%s%>:"
+ 			 " unrecognized format %qs; known formats: %e",
+ 			 ctxt.get_option_name (), unparsed_arg,
+ 			 parsed_arg.m_scheme_name.c_str (), &e);
+       return nullptr;
+     }
+ 
+   return scheme_handler->make_sink (ctxt, dc, unparsed_arg, parsed_arg);
+ }
+ 
+ /* class text_scheme_handler : public output_factory::scheme_handler.  */
+ 
+ std::unique_ptr<diagnostic_output_format>
+ text_scheme_handler::make_sink (const context &ctxt,
+ 				diagnostic_context &dc,
+ 				const char *unparsed_arg,
+ 				const scheme_name_and_params &parsed_arg) const
+ {
+   bool show_color = pp_show_color (dc.get_reference_printer ());
+   bool show_nesting = false;
+   bool show_locations_in_nesting = true;
+   bool show_levels = false;
+   for (auto& iter : parsed_arg.m_kvs)
+     {
+       const std::string &key = iter.first;
+       const std::string &value = iter.second;
+       if (key == "color")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_color))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "experimental-nesting")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 show_nesting))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "experimental-nesting-show-locations")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 show_locations_in_nesting))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "experimental-nesting-show-levels")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_levels))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+ 
+       /* Key not found.  */
+       auto_vec<const char *> known_keys;
+       known_keys.safe_push ("color");
+       known_keys.safe_push ("experimental-nesting");
+       known_keys.safe_push ("experimental-nesting-show-locations");
+       known_keys.safe_push ("experimental-nesting-show-levels");
+       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
+ 			       known_keys);
+       return nullptr;
+     }
+ 
+   auto sink = std::make_unique<diagnostic_text_output_format> (dc);
+   sink->set_show_nesting (show_nesting);
+   sink->set_show_locations_in_nesting (show_locations_in_nesting);
+   sink->set_show_nesting_levels (show_levels);
+   return sink;
+ }
+ 
+ /* class sarif_scheme_handler : public output_factory::scheme_handler.  */
+ 
+ std::unique_ptr<diagnostic_output_format>
+ sarif_scheme_handler::make_sink (const context &ctxt,
+ 				 diagnostic_context &dc,
+ 				 const char *unparsed_arg,
+ 				 const scheme_name_and_params &parsed_arg) const
+ {
+   label_text filename;
+   enum sarif_serialization_kind serialization_kind
+     = sarif_serialization_kind::json;
+   enum sarif_version version = sarif_version::v2_1_0;
+   bool xml_state = false;
+   for (auto& iter : parsed_arg.m_kvs)
+     {
+       const std::string &key = iter.first;
+       const std::string &value = iter.second;
+       if (key == "file")
+ 	{
+ 	  filename = label_text::take (xstrdup (value.c_str ()));
+ 	  continue;
+ 	}
+       if (key == "serialization")
+ 	{
+ 	  static const std::array<std::pair<const char *, enum sarif_serialization_kind>,
+ 				  (size_t)sarif_serialization_kind::num_values> value_names
+ 	    {{{"json", sarif_serialization_kind::json}}};
+ 
+ 	  if (!parse_enum_value<enum sarif_serialization_kind>
+ 		 (ctxt, unparsed_arg,
+ 		  key, value,
+ 		  value_names,
+ 		  serialization_kind))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "version")
+ 	{
+ 	  static const std::array<std::pair<const char *, enum sarif_version>,
+ 				  (size_t)sarif_version::num_versions> value_names
+ 	    {{{"2.1", sarif_version::v2_1_0},
+ 	      {"2.2-prerelease", sarif_version::v2_2_prerelease_2024_08_08}}};
+ 
+ 	    if (!parse_enum_value<enum sarif_version> (ctxt, unparsed_arg,
+ 						       key, value,
+ 						       value_names,
+ 						       version))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "xml-state")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 xml_state))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+ 
+       /* Key not found.  */
+       auto_vec<const char *> known_keys;
+       known_keys.safe_push ("file");
+       known_keys.safe_push ("serialization");
+       known_keys.safe_push ("version");
+       known_keys.safe_push ("xml-state");
+       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
+ 			       known_keys);
+       return nullptr;
+     }
+ 
+   diagnostic_output_file output_file;
+   if (filename.get ())
+     output_file = ctxt.open_output_file (std::move (filename));
+   else
+     // Default filename
+     {
+       const char *basename = ctxt.get_base_filename ();
+       if (!basename)
+ 	{
+ 	  ctxt.report_missing_key (unparsed_arg,
+ 				   "file",
+ 				   get_scheme_name (),
+ 				   "FILENAME");
+ 	  return nullptr;
+ 	}
+       output_file
+ 	= diagnostic_output_format_open_sarif_file
+ 	    (dc,
+ 	     ctxt.get_affected_location_mgr (),
+ 	     basename,
+ 	     serialization_kind);
+     }
+   if (!output_file)
+     return nullptr;
+ 
+   auto sarif_gen_opts = make_sarif_gen_opts (version, xml_state);
+ 
+   auto serialization_obj = make_sarif_serialization_object (serialization_kind);
+ 
+   auto sink = make_sarif_sink (dc,
+ 			       *ctxt.get_affected_location_mgr (),
+ 			       std::move (serialization_obj),
+ 			       sarif_gen_opts,
+ 			       std::move (output_file));
+   return sink;
+ }
+ 
+ sarif_generation_options
+ sarif_scheme_handler::make_sarif_gen_opts (enum sarif_version version,
+ 					   bool xml_state)
+ {
+   sarif_generation_options sarif_gen_opts;
+   sarif_gen_opts.m_version = version;
+   sarif_gen_opts.m_xml_state = xml_state;
+   return sarif_gen_opts;
+ }
+ 
+ std::unique_ptr<sarif_serialization_format>
+ sarif_scheme_handler::
+ make_sarif_serialization_object (enum sarif_serialization_kind kind)
+ {
+   switch (kind)
+     {
+     default:
+       gcc_unreachable ();
+     case sarif_serialization_kind::json:
+       return std::make_unique<sarif_serialization_format_json> (true);
+       break;
+     }
+ }
+ 
+ /* class html_scheme_handler : public output_factory::scheme_handler.  */
+ 
+ std::unique_ptr<diagnostic_output_format>
+ html_scheme_handler::make_sink (const context &ctxt,
+ 				diagnostic_context &dc,
+ 				const char *unparsed_arg,
+ 				const scheme_name_and_params &parsed_arg) const
+ {
+   bool css = true;
+   label_text filename;
+   bool javascript = true;
+   bool show_state_diagrams = false;
+   bool show_state_diagram_xml = false;
+   bool show_state_diagram_dot_src = false;
+   for (auto& iter : parsed_arg.m_kvs)
+     {
+       const std::string &key = iter.first;
+       const std::string &value = iter.second;
+       if (key == "css")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 css))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "file")
+ 	{
+ 	  filename = label_text::take (xstrdup (value.c_str ()));
+ 	  continue;
+ 	}
+       if (key == "javascript")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 javascript))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "show-state-diagrams")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 show_state_diagrams))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "show-state-diagram-dot-src")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 show_state_diagram_dot_src))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+       if (key == "show-state-diagram-xml")
+ 	{
+ 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
+ 				 show_state_diagram_xml))
+ 	    return nullptr;
+ 	  continue;
+ 	}
+ 
+       /* Key not found.  */
+       auto_vec<const char *> known_keys;
+       known_keys.safe_push ("css");
+       known_keys.safe_push ("file");
+       known_keys.safe_push ("javascript");
+       known_keys.safe_push ("show-state-diagrams");
+       known_keys.safe_push ("show-state-diagram-dot-src");
+       known_keys.safe_push ("show-state-diagram-xml");
+       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
+ 			       known_keys);
+       return nullptr;
+     }
+ 
+   diagnostic_output_file output_file;
+   if (filename.get ())
+     output_file = ctxt.open_output_file (std::move (filename));
+   else
+     // Default filename
+     {
+       const char *basename = ctxt.get_base_filename ();
+       if (!basename)
+ 	{
+ 	  ctxt.report_missing_key (unparsed_arg,
+ 				   "file",
+ 				   get_scheme_name (),
+ 				   "FILENAME");
+ 	  return nullptr;
+ 	}
+       output_file
+ 	= diagnostic_output_format_open_html_file
+ 	    (dc,
+ 	     ctxt.get_affected_location_mgr (),
+ 	     basename);
+     }
+   if (!output_file)
+     return nullptr;
+ 
+   html_generation_options html_gen_opts;
+   html_gen_opts.m_css = css;
+   html_gen_opts.m_javascript = javascript;
+   html_gen_opts.m_show_state_diagrams = show_state_diagrams;
+   html_gen_opts.m_show_state_diagram_xml = show_state_diagram_xml;
+   html_gen_opts.m_show_state_diagram_dot_src = show_state_diagram_dot_src;
+ 
+   auto sink = make_html_sink (dc,
+ 			      *ctxt.get_affected_location_mgr (),
+ 			      html_gen_opts,
+ 			      std::move (output_file));
+   return sink;
+ }
+ 
+ } // namespace diagnostics_output_spec
+ 
+ #if CHECKING_P
+ 
+ namespace selftest {
+ 
+ /* RAII class to temporarily override "progname" to the
+    string "PROGNAME".  */
+ 
+ class auto_fix_progname
+ {
+ public:
+   auto_fix_progname ()
+   {
+     m_old_progname = progname;
+     progname = "PROGNAME";
+   }
+ 
+   ~auto_fix_progname ()
+   {
+     progname = m_old_progname;
+   }
+ 
+ private:
+   const char *m_old_progname;
+ };
+ 
+ struct parser_test
+ {
+   class test_spec_context : public diagnostics_output_spec::gcc_spec_context
+   {
+   public:
+     test_spec_context (diagnostic_context &dc,
+ 		       line_maps *location_mgr,
+ 		       location_t loc,
+ 		       const char *option_name)
+     : gcc_spec_context (dc,
+ 			location_mgr,
+ 			location_mgr,
+ 			loc,
+ 			option_name)
+     {
+     }
+ 
+     const char *
+     get_base_filename () const final override
+     {
+       return "BASE_FILENAME";
+     }
+   };
+ 
+   parser_test ()
+   : m_dc (),
+     m_ctxt (m_dc, line_table, UNKNOWN_LOCATION, "-fOPTION="),
+     m_fmt (m_dc.get_output_format (0))
+   {
+     pp_buffer (m_fmt.get_printer ())->m_flush_p = false;
+   }
+ 
+   std::unique_ptr<diagnostics_output_spec::scheme_name_and_params>
+   parse (const char *unparsed_arg)
+   {
+     return diagnostics_output_spec::parse (m_ctxt, unparsed_arg);
+   }
+ 
+   bool execution_failed_p () const
+   {
+     return m_dc.execution_failed_p ();
+   }
+ 
+   const char *
+   get_diagnostic_text () const
+   {
+     return pp_formatted_text (m_fmt.get_printer ());
+   }
+ 
+ private:
+   test_diagnostic_context m_dc;
+   test_spec_context m_ctxt;
+   diagnostic_output_format &m_fmt;
+ };
+ 
+ /* Selftests.  */
+ 
+ static void
+ test_output_arg_parsing ()
+ {
+   auto_fix_quotes fix_quotes;
+   auto_fix_progname fix_progname;
+ 
+   /* Minimal correct example.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo");
+     ASSERT_EQ (result->m_scheme_name, "foo");
+     ASSERT_EQ (result->m_kvs.size (), 0);
+     ASSERT_FALSE (pt.execution_failed_p ());
+   }
+ 
+   /* Stray trailing colon with no key/value pairs.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:");
+     ASSERT_EQ (result, nullptr);
+     ASSERT_TRUE (pt.execution_failed_p ());
+     ASSERT_STREQ (pt.get_diagnostic_text (),
+ 		  "PROGNAME: error: `-fOPTION=foo:':"
+ 		  " expected KEY=VALUE-style parameter for format `foo'"
+ 		  " after `:';"
+ 		  " got `'\n");
+   }
+ 
+   /* No key before '='.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:=");
+     ASSERT_EQ (result, nullptr);
+     ASSERT_TRUE (pt.execution_failed_p ());
+     ASSERT_STREQ (pt.get_diagnostic_text (),
+ 		  "PROGNAME: error: `-fOPTION=foo:=':"
+ 		  " expected KEY=VALUE-style parameter for format `foo'"
+ 		  " after `:';"
+ 		  " got `='\n");
+   }
+ 
+   /* No value for key.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:key,");
+     ASSERT_EQ (result, nullptr);
+     ASSERT_TRUE (pt.execution_failed_p ());
+     ASSERT_STREQ (pt.get_diagnostic_text (),
+ 		  "PROGNAME: error: `-fOPTION=foo:key,':"
+ 		  " expected KEY=VALUE-style parameter for format `foo'"
+ 		  " after `:';"
+ 		  " got `key,'\n");
+   }
+ 
+   /* Correct example, with one key/value pair.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:key=value");
+     ASSERT_EQ (result->m_scheme_name, "foo");
+     ASSERT_EQ (result->m_kvs.size (), 1);
+     ASSERT_EQ (result->m_kvs[0].first, "key");
+     ASSERT_EQ (result->m_kvs[0].second, "value");
+     ASSERT_FALSE (pt.execution_failed_p ());
+   }
+ 
+   /* Stray trailing comma.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:key=value,");
+     ASSERT_EQ (result, nullptr);
+     ASSERT_TRUE (pt.execution_failed_p ());
+     ASSERT_STREQ (pt.get_diagnostic_text (),
+ 		  "PROGNAME: error: `-fOPTION=foo:key=value,':"
+ 		  " expected KEY=VALUE-style parameter for format `foo'"
+ 		  " after `,';"
+ 		  " got `'\n");
+   }
+ 
+   /* Correct example, with two key/value pairs.  */
+   {
+     parser_test pt;
+     auto result = pt.parse ("foo:color=red,shape=circle");
+     ASSERT_EQ (result->m_scheme_name, "foo");
+     ASSERT_EQ (result->m_kvs.size (), 2);
+     ASSERT_EQ (result->m_kvs[0].first, "color");
+     ASSERT_EQ (result->m_kvs[0].second, "red");
+     ASSERT_EQ (result->m_kvs[1].first, "shape");
+     ASSERT_EQ (result->m_kvs[1].second, "circle");
+     ASSERT_FALSE (pt.execution_failed_p ());
+   }
+ }
+ 
+ /* Run all of the selftests within this file.  */
+ 
+ void
+ diagnostic_output_spec_cc_tests ()
+ {
+   test_output_arg_parsing ();
+ }
+ 
+ } // namespace selftest
+ 
+ 
+ #endif /* #if CHECKING_P */
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-output-spec.h gcc-16-20250629/gcc/diagnostic-output-spec.h
*** gcc-16-20250622/gcc/diagnostic-output-spec.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/diagnostic-output-spec.h	Sun Jun 29 22:32:27 2025
***************
*** 0 ****
--- 1,116 ----
+ /* Support for the DSL of -fdiagnostics-add-output= and
+    -fdiagnostics-set-output=.
+    Copyright (C) 2024-2025 Free Software Foundation, Inc.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #ifndef GCC_DIAGNOSTIC_OUTPUT_SPEC_H
+ #define GCC_DIAGNOSTIC_OUTPUT_SPEC_H
+ 
+ #include "diagnostic-format.h"
+ #include "diagnostic-output-file.h"
+ 
+ namespace diagnostics_output_spec {
+ 
+ /* An abstract base class for handling the DSL of -fdiagnostics-add-output=
+    and -fdiagnostics-set-output=.  */
+ 
+ class context
+ {
+  public:
+   std::unique_ptr<diagnostic_output_format>
+   parse_and_make_sink (const char *,
+ 		       diagnostic_context &dc);
+ 
+   void
+   report_error (const char *gmsgid, ...) const
+     ATTRIBUTE_GCC_DIAG(2,3);
+ 
+   void
+   report_unknown_key (const char *unparsed_arg,
+ 		      const std::string &key,
+ 		      const std::string &scheme_name,
+ 		      auto_vec<const char *> &known_keys) const;
+ 
+   void
+   report_missing_key (const char *unparsed_arg,
+ 		      const std::string &key,
+ 		      const std::string &scheme_name,
+ 		      const char *metavar) const;
+ 
+   diagnostic_output_file
+   open_output_file (label_text &&filename) const;
+ 
+   const char *
+   get_option_name () const { return m_option_name; }
+ 
+   line_maps *
+   get_affected_location_mgr () const { return m_affected_location_mgr; }
+ 
+   virtual ~context () {}
+ 
+   virtual void
+   report_error_va (const char *gmsgid, va_list *ap) const = 0;
+ 
+   virtual const char *
+   get_base_filename () const = 0;
+ 
+ protected:
+   context (const char *option_name,
+ 	   line_maps *affected_location_mgr)
+   : m_option_name (option_name),
+     m_affected_location_mgr (affected_location_mgr)
+   {
+   }
+ 
+   const char *m_option_name;
+   line_maps *m_affected_location_mgr;
+ };
+ 
+ /* A subclass that implements reporting errors via a diagnostic_context.  */
+ 
+ struct gcc_spec_context : public diagnostics_output_spec::context
+ {
+ public:
+   gcc_spec_context (diagnostic_context &dc,
+ 		    line_maps *affected_location_mgr,
+ 		    line_maps *control_location_mgr,
+ 		    location_t loc,
+ 		    const char *option_name)
+   : context (option_name, affected_location_mgr),
+     m_dc (dc),
+     m_control_location_mgr (control_location_mgr),
+     m_loc (loc)
+   {}
+ 
+   void report_error_va (const char *gmsgid, va_list *ap) const final override
+     ATTRIBUTE_GCC_DIAG(2, 0)
+   {
+     m_dc.begin_group ();
+     rich_location richloc (m_control_location_mgr, m_loc);
+     m_dc.diagnostic_impl (&richloc, nullptr, -1, gmsgid, ap, DK_ERROR);
+     m_dc.end_group ();
+   }
+ 
+   diagnostic_context &m_dc;
+   line_maps *m_control_location_mgr;
+   location_t m_loc;
+ };
+ 
+ } // namespace diagnostics_output_spec
+ 
+ #endif
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-path-output.cc gcc-16-20250629/gcc/diagnostic-path-output.cc
*** gcc-16-20250622/gcc/diagnostic-path-output.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-path-output.cc	Sun Jun 29 22:32:27 2025
*************** class path_label : public range_label
*** 135,141 ****
      return result;
    }
  
!   const label_effects *get_effects (unsigned /*range_idx*/) const
    {
      return &m_effects;
    }
--- 135,141 ----
      return result;
    }
  
!   const label_effects *get_effects (unsigned /*range_idx*/) const final override
    {
      return &m_effects;
    }
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-path.cc gcc-16-20250629/gcc/diagnostic-path.cc
*** gcc-16-20250622/gcc/diagnostic-path.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-path.cc	Sun Jun 29 22:32:27 2025
*************** along with GCC; see the file COPYING3.
*** 20,31 ****
--- 20,33 ----
  
  #include "config.h"
  #define INCLUDE_ALGORITHM
+ #define INCLUDE_MAP
  #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
  #include "diagnostic.h"
  #include "diagnostic-path.h"
+ #include "xml.h"
  
  /* Disable warnings about missing quoting in GCC diagnostics for the print
     calls below.  */
*************** diagnostic_event::get_desc (pretty_print
*** 154,159 ****
--- 156,170 ----
    return label_text::take (xstrdup (pp_formatted_text (pp.get ())));
  }
  
+ // Base implementation of diagnostic_event::maybe_make_xml_state
+ 
+ std::unique_ptr<xml::document>
+ diagnostic_event::maybe_make_xml_state (bool) const
+ {
+   // Don't attempt to make a state document:
+   return nullptr;
+ }
+ 
  /* class diagnostic_path.  */
  
  /* Subroutine of diagnostic_path::interprocedural_p.
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-path.h gcc-16-20250629/gcc/diagnostic-path.h
*** gcc-16-20250622/gcc/diagnostic-path.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic-path.h	Sun Jun 29 22:32:27 2025
*************** along with GCC; see the file COPYING3.
*** 25,30 ****
--- 25,32 ----
  #include "diagnostic-event-id.h"
  #include "logical-location.h"
  
+ namespace xml { class document; }
+ 
  class sarif_builder;
  class sarif_object;
  
*************** class diagnostic_event
*** 170,175 ****
--- 172,182 ----
    {
    }
  
+   /* Hook for capturing state at this event, potentially for visualizing
+      in HTML output.  */
+   virtual std::unique_ptr<xml::document>
+   maybe_make_xml_state (bool debug) const;
+ 
    label_text get_desc (pretty_printer &ref_pp) const;
  };
  
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-state-to-dot.cc gcc-16-20250629/gcc/diagnostic-state-to-dot.cc
*** gcc-16-20250622/gcc/diagnostic-state-to-dot.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/diagnostic-state-to-dot.cc	Sun Jun 29 22:32:27 2025
***************
*** 0 ****
--- 1,537 ----
+ /* Creating GraphViz .dot files from XML state documents.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #define INCLUDE_ALGORITHM
+ #define INCLUDE_MAP
+ #define INCLUDE_SET
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+ 
+ #include "xml.h"
+ #include "xml-printer.h"
+ #include "graphviz.h"
+ 
+ static int
+ get_depth (const xml::element &e)
+ {
+   int deepest_child = 0;
+   for (auto &iter : e.m_children)
+     if (xml::element *child_element = iter->dyn_cast_element ())
+       deepest_child = std::max (deepest_child,
+ 				get_depth (*child_element));
+   return deepest_child + 1;
+ }
+ 
+ enum class dynalloc_state
+ {
+   unknown,
+   nonnull,
+   unchecked,
+   freed
+ };
+ 
+ static const char *
+ get_color_for_dynalloc_state (enum dynalloc_state dynalloc_st)
+ {
+   switch (dynalloc_st)
+     {
+     default:
+       gcc_unreachable ();
+       break;
+     case dynalloc_state::unknown:
+     case dynalloc_state::nonnull:
+       return nullptr;
+ 
+     case dynalloc_state::unchecked:
+       return "#ec7a08"; // pf-orange-400
+ 
+     case dynalloc_state::freed:
+       return "#cc0000"; // pf-red-100
+     }
+ }
+ 
+ static void
+ set_color_for_dynalloc_state (dot::attr_list &attrs,
+ 			      enum dynalloc_state dynalloc_state)
+ {
+   if (const char *color = get_color_for_dynalloc_state (dynalloc_state))
+     attrs.add (dot::id ("color"), dot::id (color));
+ }
+ 
+ static enum dynalloc_state
+ get_dynalloc_state (const xml::element &input_element)
+ {
+   const char *dyn_alloc_state = input_element.get_attr ("dynamic-alloc-state");
+   if (!dyn_alloc_state)
+     return dynalloc_state::unknown;
+ 
+   if (dyn_alloc_state == std::string ("unchecked"))
+     return dynalloc_state::unchecked;
+ 
+   if (dyn_alloc_state == std::string ("nonnull"))
+     return dynalloc_state::nonnull;
+ 
+   if (dyn_alloc_state == std::string ("freed"))
+     return dynalloc_state::freed;
+ 
+   return dynalloc_state::unknown;
+ }
+ 
+ class state_diagram : public dot::graph
+ {
+ public:
+   state_diagram (const xml::document &input_state_doc)
+   : m_next_id (0),
+     m_show_tags (false)
+   {
+     // "node [shape=plaintext]\n"
+     {
+       auto attr_stmt
+ 	= std::make_unique<dot::attr_stmt> (dot::attr_stmt::kind::node);
+       attr_stmt->m_attrs.add (dot::id ("shape"), dot::id ("plaintext"));
+       add_stmt (std::move (attr_stmt));
+     }
+ 
+     /* Recurse down the XML state diagram, creating subgraphs
+        and then eventually creating nodes, and recursively
+        creating XML tables, adding ports for the endpoints of edges,
+        and recording edges we'll want to create (into m_pending_edges).  */
+     xml::element *input_elmt_state_diagram
+       = input_state_doc.find_child_element ("state-diagram");
+     gcc_assert (input_elmt_state_diagram);
+     xml::element *input_elmt_mem_regions
+       = input_elmt_state_diagram->find_child_element ("memory-regions");
+     if (!input_elmt_mem_regions)
+       return;
+     auto root_cluster
+       = std::make_unique<dot::subgraph> (dot::id ("cluster_memory_regions"));
+     for (auto &iter : input_elmt_mem_regions->m_children)
+       on_input_xml_node (*root_cluster, *iter);
+     add_stmt (std::move (root_cluster));
+ 
+     /* We should now have ports for edge endpoints for all region ids.
+        Use them now to create edges.  */
+     for (auto &pe : m_pending_edges)
+       {
+ 	auto search = m_region_id_to_dst_node_id.find (pe.m_dst_region_id);
+ 	if (search != m_region_id_to_dst_node_id.end ())
+ 	  {
+ 	    auto &dst_node_id = search->second;
+ 	    auto e = std::make_unique<dot::edge_stmt> (pe.m_src_node_id,
+ 						       dst_node_id);
+ 
+ 	    auto dynalloc_state = m_region_id_to_dynalloc_state.find (pe.m_dst_region_id);
+ 	    if (dynalloc_state != m_region_id_to_dynalloc_state.end ())
+ 	      set_color_for_dynalloc_state (e->m_attrs,
+ 					    dynalloc_state->second);
+ 
+ 	    add_stmt (std::move (e));
+ 	  }
+       }
+   }
+ 
+ private:
+   struct pending_edge
+   {
+     dot::node_id m_src_node_id;
+     std::string m_dst_region_id;
+   };
+ 
+   dot::id
+   get_id_for_region (const char *region_id)
+   {
+     gcc_assert (region_id);
+     return std::string ("cluster_region_") + region_id;
+   }
+ 
+   dot::id
+   make_id (bool cluster = false)
+   {
+     if (cluster)
+       return std::string ("cluster_") + std::to_string (m_next_id++);
+     else
+       return std::string ("id_") + std::to_string (m_next_id++);
+   }
+ 
+   bool
+   starts_node_p (const xml::element &e)
+   {
+     if (e.m_kind == "stack"
+ 	|| e.m_kind == "heap-buffer"
+ 	|| e.m_kind == "variable") // e.g. within globals
+       return true;
+     return false;
+   }
+ 
+   void
+   on_input_xml_node (dot::subgraph &parent_subgraph,
+ 		     xml::node &input_node)
+   {
+     xml::element *input_element = input_node.dyn_cast_element ();
+     if (!input_element)
+       return;
+ 
+     dot::id sg_id = make_id (true);
+ 
+     if (starts_node_p (*input_element))
+       {
+ 	// Create node with table
+ 	xml::element table ("table", false);
+ 	xml::printer xp (table);
+ 	xp.set_attr ("border", "0");
+ 	xp.set_attr ("cellborder", "1");
+ 	xp.set_attr ("cellspacing", "0");
+ 
+ 	const int max_depth = get_depth (*input_element);
+ 	const int num_columns = max_depth + 2;
+ 
+ 	dot::id id_of_node = make_id ();
+ 	on_xml_node (id_of_node, xp, *input_element,
+ 		     max_depth, 0, num_columns);
+ 
+ 	auto node = std::make_unique<dot::node_stmt> (std::move (id_of_node));
+ 	node->m_attrs.add (dot::id ("shape"),
+ 			   dot::id ("plaintext"));
+ 
+ 	// xml must be done by now
+ 
+ 	node->m_attrs.add (dot::id ("label"),
+ 			   dot::id (table));
+ 
+ 	parent_subgraph.m_stmt_list.add_stmt (std::move (node));
+       }
+     else
+       {
+ 	auto child_subgraph = std::make_unique<dot::subgraph> (std::move (sg_id));
+ 
+ 	if (const char *label = input_element->get_attr ("label"))
+ 	  child_subgraph->add_attr (dot::id ("label"), dot::id (label));
+ 
+ 	// recurse:
+ 	for (auto &iter : input_element->m_children)
+ 	  on_input_xml_node (*child_subgraph, *iter);
+ 	parent_subgraph.m_stmt_list.add_stmt (std::move (child_subgraph));
+       }
+   }
+ 
+   enum class style { h1, h2 };
+ 
+   void
+   add_title_tr (const dot::id &id_of_node,
+ 		xml::printer &xp,
+ 		int num_columns,
+ 		const xml::element &input_element,
+ 		std::string heading,
+ 		enum style styl,
+ 		enum dynalloc_state dynalloc_state)
+   {
+     xp.push_tag ("tr", true);
+     xp.push_tag ("td", false);
+     xp.set_attr ("colspan", std::to_string (num_columns));
+     xp.set_attr ("cellpadding", "5");
+ 
+     const char *bgcolor;
+     const char *color;
+     if (const char *c = get_color_for_dynalloc_state (dynalloc_state))
+       {
+ 	bgcolor = c;
+ 	color = "white";
+       }
+     else
+       switch (styl)
+ 	{
+ 	default:
+ 	  gcc_unreachable ();
+ 	case style::h1:
+ 	  // from diagnostic-format-html.cc: HTML_STYLE .linenum
+ 	  bgcolor = "#0088ce";
+ 	  color = "white";
+ 	  break;
+ 	case style::h2:
+ 	  // from diagnostic-format-html.cc: HTML_STYLE .events-hdr
+ 	  bgcolor = "#393f44"; // pf-black-800
+ 	  color = "white";
+ 	  break;
+ 	}
+ 
+     xp.set_attr ("bgcolor", bgcolor);
+     xp.push_tag ("font", false);
+     xp.set_attr ("color", color);
+     if (heading == "")
+       heading = " ";
+     xp.add_text (std::move (heading));
+     xp.pop_tag ("font");
+ 
+     maybe_add_dst_port (id_of_node, xp, input_element);
+ 
+     xp.pop_tag ("td");
+     xp.pop_tag ("tr");
+   }
+ 
+   /* Recursively add <TR> to XP for INPUT_NODE and its descendents.  */
+   void
+   on_xml_node (const dot::id &id_of_node,
+ 	       xml::printer &xp,
+ 	       xml::node &input_node,
+ 	       int max_depth,
+ 	       int depth,
+ 	       int num_columns)
+   {
+     bool recurse = true;
+ 
+     xml::element *input_element = input_node.dyn_cast_element ();
+     if (!input_element)
+       return;
+ 
+     if (input_element->m_kind == "concrete-bindings")
+       return;
+     if (input_element->m_kind == "padding")
+       return;
+ 
+     if (input_element->m_kind == "stack")
+       {
+ 	add_title_tr (id_of_node, xp, num_columns, *input_element, "Stack",
+ 		      style::h1, dynalloc_state::unknown);
+       }
+     else if (input_element->m_kind == "stack-frame")
+       {
+ 	if (const char *function = input_element->get_attr ("function"))
+ 	  add_title_tr (id_of_node, xp, num_columns, *input_element,
+ 			std::string ("Frame: ") + function,
+ 			style::h2, dynalloc_state::unknown);
+       }
+     else if (input_element->m_kind == "heap-buffer")
+       {
+ 	const char *extents = input_element->get_attr ("dynamic-extents");
+ 	enum dynalloc_state dynalloc_st = get_dynalloc_state (*input_element);
+ 	if (auto region_id = input_element->get_attr ("region_id"))
+ 	    m_region_id_to_dynalloc_state[region_id] = dynalloc_st;
+ 	const char *type = input_element->get_attr ("type");
+ 	pretty_printer pp;
+ 	switch (dynalloc_st)
+ 	  {
+ 	  default:
+ 	    gcc_unreachable ();
+ 
+ 	  case dynalloc_state::unknown:
+ 	  case dynalloc_state::nonnull:
+ 	    if (type)
+ 	      {
+ 		if (extents)
+ 		  pp_printf (&pp, "%s (%s byte allocation)",
+ 			     type, extents);
+ 		else
+ 		  pp_printf (&pp, "%s", type);
+ 	      }
+ 	    else
+ 	      {
+ 		if (extents)
+ 		  pp_printf (&pp, "%s byte allocation",
+ 			     extents);
+ 	      }
+ 	    break;
+ 
+ 	  case dynalloc_state::unchecked:
+ 	    if (type)
+ 	      {
+ 		if (extents)
+ 		  pp_printf (&pp, "%s (unchecked %s byte allocation)",
+ 			     type, extents);
+ 	      }
+ 	    else
+ 	      {
+ 		if (extents)
+ 		  pp_printf (&pp, "Unchecked %s byte allocation",
+ 			     extents);
+ 	      }
+ 	    break;
+ 
+ 	  case dynalloc_state::freed:
+ 	    // TODO: show deallocator
+ 	    // TODO: show deallocation event
+ 	    pp_printf (&pp, "Freed buffer");
+ 	    break;
+ 	  }
+ 	add_title_tr (id_of_node, xp, num_columns, *input_element,
+ 		      pp_formatted_text (&pp),
+ 		      style::h2,
+ 		      dynalloc_st);
+       }
+     else
+       {
+ 	xp.push_tag ("tr", true);
+ 	if (depth > 0)
+ 	  {
+ 	    /* Indent, by create a <td> spanning "depth" columns.  */
+ 	    xp.push_tag ("td", false);
+ 	    xp.set_attr ("colspan", std::to_string (depth));
+ 	    xp.add_text (" "); // graphviz doesn't like <td/>
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	if (m_show_tags)
+ 	  {
+ 	    // Debug: show XML tag
+ 	    xp.push_tag ("td", false);
+ 	    xp.add_text ("<");
+ 	    xp.add_text (input_element->m_kind);
+ 	    xp.add_text (">");
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	if (input_element->m_kind == "variable")
+ 	  {
+ 	    const char *name = input_element->get_attr ("name");
+ 	    gcc_assert (name);
+ 	    xp.push_tag ("td", false);
+ 	    maybe_add_dst_port (id_of_node, xp, *input_element);
+ 	    push_src_text (xp);
+ 	    xp.add_text (name);
+ 	    pop_src_text (xp);
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	else if (input_element->m_kind == "element")
+ 	  {
+ 	    const char *index = input_element->get_attr ("index");
+ 	    gcc_assert (index);
+ 	    xp.push_tag ("td", false);
+ 	    maybe_add_dst_port (id_of_node, xp, *input_element);
+ 	    push_src_text (xp);
+ 	    xp.add_text ("[");
+ 	    xp.add_text (index);
+ 	    xp.add_text ("]");
+ 	    pop_src_text (xp);
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	else if (input_element->m_kind == "field")
+ 	  {
+ 	    const char *name = input_element->get_attr ("name");
+ 	    gcc_assert (name);
+ 	    xp.push_tag ("td", false);
+ 	    maybe_add_dst_port (id_of_node, xp, *input_element);
+ 	    push_src_text (xp);
+ 	    xp.add_text (".");
+ 	    xp.add_text (name);
+ 	    pop_src_text (xp);
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	if (const char *type = input_element->get_attr ("type"))
+ 	  {
+ 	    xp.push_tag ("td", false);
+ 	    if (max_depth > depth)
+ 	      xp.set_attr ("colspan", std::to_string (max_depth - depth));
+ 	    xp.set_attr ("align", "right");
+ 	    push_src_text (xp);
+ 	    xp.add_text (type);
+ 	    pop_src_text (xp);
+ 	    xp.pop_tag ("td");
+ 	  }
+ 	if (auto value = input_element->find_child_element ("value-of-region"))
+ 	  {
+ 	    xp.push_tag ("td", false);
+ 	    for (auto &iter : value->m_children)
+ 	      if (auto child_element = iter->dyn_cast_element ())
+ 		print_value (id_of_node, xp, *child_element);
+ 	    xp.pop_tag ("td");
+ 	    recurse = false;
+ 	  }
+ 	xp.pop_tag ("tr");
+       }
+ 
+     if (recurse)
+       for (auto &iter : input_element->m_children)
+ 	on_xml_node (id_of_node, xp, *iter, max_depth, depth + 1, num_columns);
+   }
+ 
+   void
+   push_src_text (xml::printer &xp)
+   {
+     xp.push_tag ("font");
+     xp.set_attr ("color", "blue");
+   }
+ 
+   void
+   pop_src_text (xml::printer &xp)
+   {
+     xp.pop_tag ("font");
+   }
+ 
+   void
+   print_value (const dot::id &id_of_node,
+ 	       xml::printer &xp,
+ 	       xml::element &input_element)
+   {
+     if (input_element.m_kind == "pointer-to-region")
+       if (const char *dst_region_id = input_element.get_attr ("region_id"))
+ 	{
+ 	  dot::id src_port_id = make_id ();
+ 	  xp.set_attr ("port", src_port_id.m_str);
+ 	  m_pending_edges.push_back
+ 	    ({dot::node_id (id_of_node,
+ 			    dot::port (src_port_id,
+ 				       dot::compass_pt::e)),
+ 	       dst_region_id});
+       }
+ 
+     if (input_element.m_kind == "uninitialized")
+       {
+ 	xp.add_text ("(uninitialized)");
+ 	return;
+       }
+ 
+     if (auto dump_text = input_element.get_attr ("dump-text"))
+       xp.add_text (dump_text);
+   }
+ 
+   /* If INPUT_ELEMENT has a "region_id", add a port to XP for possible
+      incoming edges to use.  */
+ 
+   void
+   maybe_add_dst_port (const dot::id &id_of_node,
+ 		      xml::printer &xp,
+ 		      const xml::element &input_element)
+   {
+     if (const char *region_id = input_element.get_attr ("region_id"))
+       {
+ 	dot::id dst_id = make_id ();
+ 	dot::node_id node_id (id_of_node,
+ 			      dot::port (dst_id/*,
+ 						 dot::compass_pt::w*/));
+ 	xp.set_attr ("port", dst_id.m_str);
+ 	m_region_id_to_dst_node_id.emplace (std::string (region_id),
+ 					    std::move (node_id));
+       }
+   }
+ 
+ 
+ private:
+   int m_next_id;
+   std::vector<pending_edge> m_pending_edges;
+   std::map<std::string, dot::node_id> m_region_id_to_dst_node_id;
+   std::map<std::string, enum dynalloc_state> m_region_id_to_dynalloc_state;
+   bool m_show_tags;
+ };
+ 
+ std::unique_ptr<dot::graph>
+ make_dot_graph_from_xml_state (const xml::document &xml_state)
+ {
+   return std::make_unique<state_diagram> (xml_state);
+ }
diff -Nrcpad gcc-16-20250622/gcc/diagnostic-state.h gcc-16-20250629/gcc/diagnostic-state.h
*** gcc-16-20250622/gcc/diagnostic-state.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/diagnostic-state.h	Sun Jun 29 22:32:27 2025
***************
*** 0 ****
--- 1,37 ----
+ /* Capturing changing state in diagnostic paths.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #ifndef GCC_DIAGNOSTIC_STATE_H
+ #define GCC_DIAGNOSTIC_STATE_H
+ 
+ /* We want to be able to express changing program states in diagnostic paths,
+    so that we can emit this in HTML and SARIF output, and to keep this
+    separate from implementation details of -fanalyzer.
+ 
+    For now, we use xml::document as the type in the diagnostic subsystem
+    for (optionally) tracking the state at a diagnostic_event.  */
+ 
+ namespace xml { class document; }
+ namespace dot { class graph; }
+ 
+ extern std::unique_ptr<dot::graph>
+ make_dot_graph_from_xml_state (const xml::document &xml_state);
+ 
+ #endif /* GCC_DIAGNOSTIC_STATE_H */
diff -Nrcpad gcc-16-20250622/gcc/diagnostic.cc gcc-16-20250629/gcc/diagnostic.cc
*** gcc-16-20250622/gcc/diagnostic.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic.cc	Sun Jun 29 22:32:27 2025
*************** diagnostic_context::supports_fnotice_on_
*** 525,530 ****
--- 525,537 ----
  }
  
  void
+ diagnostic_context::set_main_input_filename (const char *filename)
+ {
+   for (auto sink : m_output_sinks)
+     sink->set_main_input_filename (filename);
+ }
+ 
+ void
  diagnostic_context::
  set_client_data_hooks (std::unique_ptr<diagnostic_client_data_hooks> hooks)
  {
diff -Nrcpad gcc-16-20250622/gcc/diagnostic.h gcc-16-20250629/gcc/diagnostic.h
*** gcc-16-20250622/gcc/diagnostic.h	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/diagnostic.h	Sun Jun 29 22:32:27 2025
*************** public:
*** 840,845 ****
--- 840,877 ----
      return m_option_classifier.m_classification_history;
    }
  
+   void set_main_input_filename (const char *filename);
+ 
+   void
+   set_permissive_option (diagnostic_option_id opt_permissive)
+   {
+     m_opt_permissive = opt_permissive;
+   }
+ 
+   void
+   set_fatal_errors (bool fatal_errors)
+   {
+     m_fatal_errors = fatal_errors;
+   }
+ 
+   void
+   set_internal_error_callback (void (*cb) (diagnostic_context *,
+ 					   const char *,
+ 					   va_list *))
+   {
+     m_internal_error = cb;
+   }
+ 
+   void
+   set_adjust_diagnostic_info_callback (void (*cb) (diagnostic_context *,
+ 						   diagnostic_info *))
+   {
+     m_adjust_diagnostic_info = cb;
+   }
+ 
+   void
+   inhibit_notes () { m_inhibit_notes_p = true; }
+ 
  private:
    void error_recursion () ATTRIBUTE_NORETURN;
  
*************** public:
*** 909,914 ****
--- 941,947 ----
    /* True if permerrors are warnings.  */
    bool m_permissive;
  
+ private:
    /* The option to associate with turning permerrors into warnings,
       if any.  */
    diagnostic_option_id m_opt_permissive;
*************** public:
*** 916,921 ****
--- 949,955 ----
    /* True if errors are fatal.  */
    bool m_fatal_errors;
  
+ public:
    /* True if all warnings should be disabled.  */
    bool m_inhibit_warnings;
  
*************** private:
*** 947,953 ****
      diagnostic_text_finalizer_fn m_end_diagnostic;
    } m_text_callbacks;
  
- public:
    /* Client hook to report an internal error.  */
    void (*m_internal_error) (diagnostic_context *, const char *, va_list *);
  
--- 981,986 ----
*************** public:
*** 955,961 ****
       about to issue, such as its kind.  */
    void (*m_adjust_diagnostic_info)(diagnostic_context *, diagnostic_info *);
  
- private:
    /* Owned by the context; this would be a std::unique_ptr if
       diagnostic_context had a proper ctor.  */
    diagnostic_option_manager *m_option_mgr;
--- 988,993 ----
*************** public:
*** 982,990 ****
  private:
    int m_lock;
  
- public:
    bool m_inhibit_notes_p;
  
    diagnostic_source_printing_options m_source_printing;
  
  private:
--- 1014,1022 ----
  private:
    int m_lock;
  
    bool m_inhibit_notes_p;
  
+ public:
    diagnostic_source_printing_options m_source_printing;
  
  private:
*************** private:
*** 1081,1093 ****
    diagnostic_buffer *m_diagnostic_buffer;
  };
  
- inline void
- diagnostic_inhibit_notes (diagnostic_context * context)
- {
-   context->m_inhibit_notes_p = true;
- }
- 
- 
  /* Client supplied function to announce a diagnostic
     (for text-based diagnostic output).  */
  inline diagnostic_text_starter_fn &
--- 1113,1118 ----
diff -Nrcpad gcc-16-20250622/gcc/digraph.cc gcc-16-20250629/gcc/digraph.cc
*** gcc-16-20250622/gcc/digraph.cc	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/digraph.cc	Sun Jun 29 22:32:27 2025
*************** You should have received a copy of the G
*** 18,23 ****
--- 18,25 ----
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
diff -Nrcpad gcc-16-20250622/gcc/doc/analyzer.texi gcc-16-20250629/gcc/doc/analyzer.texi
*** gcc-16-20250622/gcc/doc/analyzer.texi	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/doc/analyzer.texi	Sun Jun 29 22:32:27 2025
*************** python-xdot)
*** 619,624 ****
--- 619,643 ----
  @item @code{-fdump-analyzer-exploded-nodes-2}
  which dumps a @file{SRC.eg.txt} file containing the full @code{exploded_graph}.
  
+ @item @code{-fdiagnostics-add-output=experimental-html:show-state-diagrams=yes}
+ which writes out the diagnostics in HTML form, and generates SVG state
+ diagrams visualizing the state of memory at each event (inspired by the
+ "ddd" debugger).  These can be seen by pressing 'j' and 'k' to single-step
+ forward and backward through events.  Note that these SVG diagrams are
+ created from an intermediate XML representation generated from
+ @code{program_state} objects.  The XML representation can be easier to
+ read - for example, rather than storing the contents of memory via byte
+ offsets, it uses fields for structs and element indexes for arrays,
+ recursively.  However it is a different representation, and thus bugs could
+ be hidden by this transformation.  Generating the SVG diagrams requires
+ an invocation of "dot" per event, so it noticeably slows down diagnostic
+ emission, hence the opt-in command-line flag.  The XML and ``dot''
+ representations can be seen by @code{__analyzer_dump_xml} and
+ @code{__analyzer_dump_dot} below (writing them to stderr), or by adding
+ @code{show-state-diagrams-xml=yes} and
+ @code{show-state-diagrams-dot-src=yes} to the html sink, which shows
+ them within the generated HTML next to the generated SVG.
+ 
  @end itemize
  
  Assuming that you have the
*************** extern void __analyzer_dump_capacity (co
*** 688,693 ****
--- 707,721 ----
  will emit a warning describing the capacity of the base region of
  the region pointed to by the 1st argument.
  
+ @item __analyzer_dump_dot
+ @smallexample
+ __analyzer_dump_dot ();
+ @end smallexample
+ 
+ will dump GraphViz .dot source to stderr reaches the call in its
+ traversal of the source.  This .dot source implements a diagram
+ describing the analyzer’s state.
+ 
  @item __analyzer_dump_escaped
  @smallexample
  extern void __analyzer_dump_escaped (void);
*************** will emit a warning describing the state
*** 764,769 ****
--- 792,805 ----
  a name matching the 1st argument (which must be a string literal).
  This is for use when debugging, and may be of use in DejaGnu tests.
  
+ @item __analyzer_dump_xml
+ @smallexample
+ __analyzer_dump_xml ();
+ @end smallexample
+ 
+ will dump the copious information about the analyzer's state each time it
+ reaches the call in its traversal of the source.
+ 
  @item __analyzer_eval
  @smallexample
  __analyzer_eval (expr);
diff -Nrcpad gcc-16-20250622/gcc/doc/extend.texi gcc-16-20250629/gcc/doc/extend.texi
*** gcc-16-20250622/gcc/doc/extend.texi	Sun Jun 22 22:32:19 2025
--- gcc-16-20250629/gcc/doc/extend.texi	Sun Jun 29 22:32:27 2025
*************** Enable or disable calls to out-of-line h
*** 3884,3889 ****
--- 3884,3899 ----
  This corresponds to the behavior of the command-line options
  @option{-moutline-atomics} and @option{-mno-outline-atomics}.
  
+ @cindex @code{max-vectorization} function attribute, AArch64
+ @item max-vectorization
+ @itemx no-max-vectorization
+ @code{max-vectorization} tells GCC's vectorizer to treat all vector
+ loops as being more profitable than the original scalar loops when
+ optimizing the current function.  @code{no-max-vectorization} disables
+ this behavior.
+ This corresponds to the behavior of the command-line options
+ @option{-mmax-vectorization} and @option{-mno-max-vectorization}.
+ 
  @cindex @code{indirect_return} function attribute, AArch64
  @item indirect_return
  The @code{indirect_return} attribute can be applied to a function type
*************** registers. For example, this attribute c
*** 6119,6124 ****
--- 6129,6141 ----
  called from the interrupt handler assembly stub which will preserve
  all registers and return from interrupt.
  
+ @cindex @code{preserve_none} function attribute, x86
+ @item preserve_none
+ This attribute is similar to @code{no_callee_saved_registers}, except
+ on x86-64, r12, r13, r14, r15, rdi and rsi registers are used for
+ integer parameter passing and this calling convention is subject to
+ change.
+ 
  @cindex @code{no_caller_saved_registers} function attribute, x86
  @item no_caller_saved_registers
  Use this attribute to indicate that the specified function has no
*************** caller-saved registers. That is, all reg
*** 6126,6134 ****
  example, this attribute can be used for a function called from an
  interrupt handler. The compiler generates proper function entry and
  exit sequences to save and restore any modified registers, except for
! the EFLAGS register.  Since GCC doesn't preserve SSE, MMX nor x87
! states, the GCC option @option{-mgeneral-regs-only} should be used to
! compile functions with @code{no_caller_saved_registers} attribute.
  
  @cindex @code{interrupt} function attribute, x86
  @item interrupt
--- 6143,6152 ----
  example, this attribute can be used for a function called from an
  interrupt handler. The compiler generates proper function entry and
  exit sequences to save and restore any modified registers, except for
! the EFLAGS register.  Since GCC doesn't preserve YMM nor ZMM registers,
! @code{no_caller_saved_registers} attribute can't be used on functions
! with AVX enabled.  Note that MMX and x87 registers aren't preserved by
! @code{no_caller_saved_registers} attribute.
  
  @cindex @code{interrupt} function attribute, x86
  @item interrupt
*************** NoError:
*** 9177,9183 ****
  @item unused
  This feature is intended for program-generated code that may contain 
  unused labels, but which is compiled with @option{-Wall}.  It is
! not normally appropriate to use in it human-written code, though it
  could be useful in cases where the code that jumps to the label is
  contained within an @code{#ifdef} conditional.
  
--- 9195,9201 ----
  @item unused
  This feature is intended for program-generated code that may contain 
  unused labels, but which is compiled with @option{-Wall}.  It is
! not normally appropriate to use it in human-written code, though it
  could be useful in cases where the code that jumps to the label is
  contained within an @code{#ifdef} conditional.
  
*************** loop or a @code{#pragma GCC ivdep}, and
*** 10382,10387 ****
--- 10400,10410 ----
  @var{n} is an integer constant expression specifying the unrolling factor.
  The values of @math{0} and @math{1} block any unrolling of the loop.
  
+ If the loop was vectorized the unroll factor specified will be used to seed the
+ vectorizer unroll factor.  Whether the loop is unrolled or not will be
+ determined by target costing.  The resulting vectorized loop may still be
+ unrolled more in later passes depending on the target costing.
+ 
  @end table
  
  @node Thread-Local
diff -Nrcpad gcc-16-20250622/gcc/doc/invoke.texi gcc-16-20250629/gcc/doc/invoke.texi
*** gcc-16-20250622/gcc/doc/invoke.texi	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/doc/invoke.texi	Sun Jun 29 22:32:27 2025
*************** Objective-C and Objective-C++ Dialects}.
*** 573,579 ****
  -fmin-function-alignment=[@var{n}]
  -fno-allocation-dce -fallow-store-data-races
  -fassociative-math  -fauto-profile  -fauto-profile[=@var{path}]
! -fauto-inc-dec  -fbranch-probabilities
  -fcaller-saves
  -fcombine-stack-adjustments  -fconserve-stack
  -ffold-mem-offsets
--- 573,579 ----
  -fmin-function-alignment=[@var{n}]
  -fno-allocation-dce -fallow-store-data-races
  -fassociative-math  -fauto-profile  -fauto-profile[=@var{path}]
! -fauto-profile-inlining -fauto-inc-dec  -fbranch-probabilities
  -fcaller-saves
  -fcombine-stack-adjustments  -fconserve-stack
  -ffold-mem-offsets
*************** in this release.
*** 6131,6136 ****
--- 6131,6148 ----
  
  @end table
  
+ There is also this key intended for use by GCC developers, rather than
+ end-users, and subject to change or removal without notice:
+ 
+ @table @gcctabopt
+ 
+ @item xml-state=@r{[}yes@r{|}no@r{]}
+ This is a debugging feature and defaults to @code{no}.
+ If @code{xml-state=yes}, then attempt to capture detailed state information
+ from @option{-fanalyzer} in the generated SARIF.
+ 
+ @end table
+ 
  @item experimental-html
  Emit diagnostics to a file in HTML format.  This scheme is experimental,
  and may go away in future GCC releases.  The keys and details of the output
*************** for viewing results.  Defaults to yes.
*** 6154,6159 ****
--- 6166,6200 ----
  
  @end table
  
+ There are also these keys intended for use by GCC developers, rather than
+ end-users, and subject to change or removal without notice:
+ 
+ @table @gcctabopt
+ 
+ @item show-state-diagrams=@r{[}yes@r{|}no@r{]}
+ This is a debugging feature and defaults to @code{no}.
+ If @code{show-state-diagrams=yes}, then attempt to use @command{dot} to
+ generate SVG diagrams in the generated HTML, visualizing the state at each
+ event in a diagnostic path.
+ These are visible by pressing ``j'' and ``k'' to single-step forward and
+ backward through events.  Enabling this option will slow down
+ HTML generation.
+ 
+ @item show-state-diagrams-dot-src=@r{[}yes@r{|}no@r{]}
+ This is a debugging feature and defaults to @code{no}.
+ If @code{show-state-diagrams-dot-src=yes}
+ then if @code{show-state-diagrams=yes},
+ the generated state diagrams will also show the .dot source input to
+ GraphViz used for the diagram.
+ 
+ @item show-state-diagrams-xml=@r{[}yes@r{|}no@r{]}
+ This is a debugging feature and defaults to @code{no}.
+ If @code{show-state-diagrams-xml=yes}
+ then if @code{show-state-diagrams=yes}, the generated state diagrams will
+ also show an XML representation of the state.
+ 
+ @end table
+ 
  @end table
  
  For example,
*************** E.g.
*** 15461,15466 ****
--- 15502,15513 ----
  create_gcov --binary=your_program.unstripped --profile=perf.data \
      --gcov=profile.afdo
  @end smallexample
+ 
+ @opindex fauto-profile-inlining
+ @item -fauto-profile-inlining
+ When auto-profile is available inline all relevant functions which was
+ inlined in the tran run before reading the profile feedback.  This improves
+ context sensitivity of the profile.  Enabled by default.
  @end table
  
  The following options control compiler behavior regarding floating-point
*************** predicate chain.
*** 17420,17425 ****
--- 17467,17475 ----
  @item uninit-max-num-chains
  Maximum number of predicates ored in the normalized predicate chain.
  
+ @item uninit-max-prune-work
+ Maximum amount of work done to prune paths where the variable is always initialized.
+ 
  @item sched-autopref-queue-depth
  Hardware autoprefetcher scheduler model control flag.
  Number of lookahead cycles the model looks into; at '
*************** The precision of division is proportiona
*** 17583,17602 ****
  approximation is enabled.  The default value is 2.
  
  @item aarch64-autovec-preference
! Force an ISA selection strategy for auto-vectorization.
! @table @samp
! @item default
! Use the default heuristics.
! @item asimd-only
! Use only Advanced SIMD for auto-vectorization.
! @item sve-only
! Use only SVE for auto-vectorization.
! @item prefer-asimd
! Use both Advanced SIMD and SVE.  Prefer Advanced SIMD when the costs are
! deemed equal.
! @item prefer-sve
! Use both Advanced SIMD and SVE.  Prefer SVE when the costs are deemed equal.
! @end table
  
  @item aarch64-ldp-policy
  Fine-grained policy for load pairs.
--- 17633,17641 ----
  approximation is enabled.  The default value is 2.
  
  @item aarch64-autovec-preference
! An old alias for @option{-mautovec-preference}.  If both
! @option{-mautovec-preference} and @option{--param=aarch64-autovec-preference}
! are passed, the @option{--param} value will be used.
  
  @item aarch64-ldp-policy
  Fine-grained policy for load pairs.
*************** used directly.  The same applies when us
*** 22030,22035 ****
--- 22069,22104 ----
  selected cpu supports the @samp{lse} feature.
  This option is on by default.
  
+ @item -mmax-vectorization
+ @itemx -mno-max-vectorization
+ Enable or disable an override to vectorizer cost model making vectorization
+ always appear profitable.  This option can be combined with
+ @option{-mautovec-preference} allowing precise control over which ISA will be
+ used for auto-vectorization.  Unlike @option{-fno-vect-cost-model} or
+ @option{-fvect-cost-model=unlimited} this option does not turn off cost
+ comparison between different vector modes.
+ 
+ @item -mautovec-preference=@var{name}
+ Force an ISA selection strategy for auto-vectorization.  The possible
+ values of @var{name} are:
+ @table @samp
+ @item default
+ Use the default heuristics.
+ @item asimd-only
+ Use only Advanced SIMD for auto-vectorization.
+ @item sve-only
+ Use only SVE for auto-vectorization.
+ @item prefer-asimd
+ Use both Advanced SIMD and SVE.  Prefer Advanced SIMD when the costs are
+ deemed equal.
+ @item prefer-sve
+ Use both Advanced SIMD and SVE.  Prefer SVE when the costs are deemed equal.
+ @end table
+ 
+ For best performance it is highly recommended to use @option{-mcpu} or
+ @option{-mtune} instead.  This parameter should only be used for code
+ exploration.
+ 
  @opindex march
  @item -march=@var{name}
  Specify the name of the target architecture and, optionally, one or
*************** VPCLMULQDQ, AVX512BITALG, RDPID and AVX5
*** 34777,34813 ****
  Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont CPU with 64-bit extensions,
  MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW,
  PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX,
! GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI,
! BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL,
! WIDEKL and AVX-VNNI instruction set support.
  
  @item arrowlake
  Intel Arrow Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
  SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC,
  XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
! MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT,
! PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI,
! UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT and CMPCCXADD instruction set
! support.
  
  @item arrowlake-s
  @itemx lunarlake
  Intel Arrow Lake S/Lunar Lake CPU with 64-bit extensions, MOVBE, MMX, SSE,
  SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND,
  XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB,
! MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA,
! LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI,
! UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512,
! SM3 and SM4 instruction set support.
  
  @item pantherlake
  Intel Panther Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
  SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC,
  XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
! MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT,
! PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI,
! UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512,
! SM3, SM4 and PREFETCHI instruction set support.
  
  @item sapphirerapids
  @itemx emeraldrapids
--- 34846,34881 ----
  Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont CPU with 64-bit extensions,
  MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW,
  PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX,
! GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C,
! FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL and
! AVX-VNNI instruction set support.
  
  @item arrowlake
  Intel Arrow Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
  SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC,
  XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
! MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU,
! VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA,
! AVXVNNIINT8, AVXNECONVERT and CMPCCXADD instruction set support.
  
  @item arrowlake-s
  @itemx lunarlake
  Intel Arrow Lake S/Lunar Lake CPU with 64-bit extensions, MOVBE, MMX, SSE,
  SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND,
  XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB,
! MOVDIRI, MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT,
! PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR,
! AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3 and
! SM4 instruction set support.
  
  @item pantherlake
  Intel Panther Lake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
  SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC,
  XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
! MOVDIR64B, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU,
! VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA,
! AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4 and
! PREFETCHI instruction set support.
  
  @item sapphirerapids
  @itemx emeraldrapids
*************** Produce code optimized for the most curr
*** 35159,35166 ****
  Haswell and Silvermont for this version of GCC.  If you know the CPU
  on which your code will run, then you should use the corresponding
  @option{-mtune} or @option{-march} option instead of @option{-mtune=intel}.
! But, if you want your application performs better on both Haswell and
! Silvermont, then you should use this option.
  
  As new Intel processors are deployed in the marketplace, the behavior of
  this option will change.  Therefore, if you upgrade to a newer version of
--- 35227,35234 ----
  Haswell and Silvermont for this version of GCC.  If you know the CPU
  on which your code will run, then you should use the corresponding
  @option{-mtune} or @option{-march} option instead of @option{-mtune=intel}.
! But, if you want your application performs better on both Diamond Rapids
! and Clearwater Forest, then you should use this option.
  
  As new Intel processors are deployed in the marketplace, the behavior of
  this option will change.  Therefore, if you upgrade to a newer version of
diff -Nrcpad gcc-16-20250622/gcc/doc/libgdiagnostics/topics/compatibility.rst gcc-16-20250629/gcc/doc/libgdiagnostics/topics/compatibility.rst
*** gcc-16-20250622/gcc/doc/libgdiagnostics/topics/compatibility.rst	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/doc/libgdiagnostics/topics/compatibility.rst	Sun Jun 29 22:32:27 2025
*************** acccessing values within a :type:`diagno
*** 177,179 ****
--- 177,188 ----
    * :func:`diagnostic_logical_location_get_fully_qualified_name`
  
    * :func:`diagnostic_logical_location_get_decorated_name`
+ 
+ ``LIBGDIAGNOSTICS_ABI_2``
+ -------------------------
+ ``LIBGDIAGNOSTICS_ABI_2`` covers the addition of these functions for
+ supporting command-line options and SARIF playback:
+ 
+   * :func:`diagnostic_manager_add_sink_from_spec`
+ 
+   * :func:`diagnostic_manager_set_analysis_target`
diff -Nrcpad gcc-16-20250622/gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst gcc-16-20250629/gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst
*** gcc-16-20250622/gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/doc/libgdiagnostics/topics/diagnostic-manager.rst	Sun Jun 29 22:32:27 2025
*************** Responsibilities include:
*** 56,58 ****
--- 56,100 ----
     This will flush output to all of the output sinks, and clean up.
  
     The parameter must be non-NULL.
+ 
+ .. function:: int diagnostic_manager_add_sink_from_spec (diagnostic_manager *affected_mgr, \
+ 				       const char *option_name, \
+ 				       const char *spec, \
+ 				       diagnostic_manager *control_mgr)
+ 
+    This function can be used to support option processing similar to GCC's
+    :option:`-fdiagnostics-add-output=`.  This allows command-line tools to
+    support the same domain-specific language for specifying output sink
+    as GCC does.
+ 
+    The function will attempt to parse :param:`spec` as if it were
+    an argument to GCC's :option:`-fdiagnostics-add-output=OUTPUT-SPEC`.
+    If successful, it will add an output sink to :param:`affected_mgr` and return zero.
+    Otherwise, it will emit an error diagnostic to :param:`control_mgr` and
+    return non-zero.
+ 
+    :param:`affected_mgr` and :param:`control_mgr` can be the same manager,
+    or be different managers.
+ 
+    This function was added in :ref:`LIBGDIAGNOSTICS_ABI_2`; you can
+    test for its presence using
+ 
+    .. code-block:: c
+ 
+       #ifdef LIBDIAGNOSTICS_HAVE_diagnostic_manager_add_sink_from_spec
+ 
+ 
+ .. function:: void diagnostic_manager_set_analysis_target (diagnostic_manager *mgr, \
+ 	                                                   const diagnostic_file *file)
+ 
+    This function sets the "main input file" of :param:`mgr` to be
+    :param:`file`.
+    This affects the :code:`<title>` of generated HTML and
+    the :code:`role` of the artifact in SARIF output (SARIF v2.1.0 section 3.24.6).
+ 
+    This function was added in :ref:`LIBGDIAGNOSTICS_ABI_2`; you can
+    test for its presence using
+ 
+    .. code-block:: c
+ 
+       #ifdef LIBDIAGNOSTICS_HAVE_diagnostic_manager_set_analysis_target
diff -Nrcpad gcc-16-20250622/gcc/ext-dce.cc gcc-16-20250629/gcc/ext-dce.cc
*** gcc-16-20250622/gcc/ext-dce.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/ext-dce.cc	Sun Jun 29 22:32:28 2025
*************** ext_dce_try_optimize_insn (rtx_insn *ins
*** 446,452 ****
        /* INSN may have a REG_EQUAL note indicating that the value was
  	 sign or zero extended.  That note is no longer valid since we've
  	 just removed the extension.  Just wipe the notes.  */
!       remove_reg_equal_equiv_notes (insn, true);
      }
    else
      {
--- 446,452 ----
        /* INSN may have a REG_EQUAL note indicating that the value was
  	 sign or zero extended.  That note is no longer valid since we've
  	 just removed the extension.  Just wipe the notes.  */
!       remove_reg_equal_equiv_notes (insn, false);
      }
    else
      {
diff -Nrcpad gcc-16-20250622/gcc/fortran/ChangeLog gcc-16-20250629/gcc/fortran/ChangeLog
*** gcc-16-20250622/gcc/fortran/ChangeLog	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/ChangeLog	Sun Jun 29 22:32:28 2025
***************
*** 1,3 ****
--- 1,69 ----
+ 2025-06-27  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/120784
+ 	* interface.cc (gfc_match_end_interface): Detect empty local_name.
+ 
+ 2025-06-26  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* match.cc (gfc_match_nullify): Initialize p to NULL;
+ 
+ 2025-06-26  Andre Vehreschild  <vehre@gcc.gnu.org>
+ 
+ 	* trans.cc (gfc_allocate_using_malloc): Prevent possible memory
+ 	leak when allocation was already done.
+ 
+ 2025-06-26  Andre Vehreschild  <vehre@gcc.gnu.org>
+ 
+ 	* resolve.cc (resolve_fl_derived0): Do not create the token
+ 	component when not in coarray lib mode.
+ 	* trans-types.cc: Do not access the token when not in coarray
+ 	lib mode.
+ 
+ 2025-06-26  Andre Vehreschild  <vehre@gcc.gnu.org>
+ 
+ 	PR fortran/120711
+ 	* trans-array.cc (gfc_trans_array_ctor_element): Store the value
+ 	of the offset for reuse.
+ 
+ 2025-06-24  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* trans-stmt.cc (gfc_trans_call_acc_attach_detach): New.
+ 	(gfc_trans_call): Call it.
+ 
+ 2025-06-24  Harald Anlauf  <anlauf@gmx.de>
+ 	    Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 	    Mikael Morin  <mikael@gcc.gnu.org>
+ 
+ 	PR fortran/120743
+ 	* trans-expr.cc (gfc_conv_substring): Substring indices are of
+ 	type gfc_charlen_type_node.  Convert to size_type_node for
+ 	pointer arithmetic only after offset adjustments have been made.
+ 
+ 2025-06-24  Mikael Morin  <morin-mikael@orange.fr>
+ 
+ 	* misc.cc (gfc_var_name_for_select_type_temp): New function.
+ 	* gfortran.h (gfc_var_name_for_select_type_temp): Declare it.
+ 	* resolve.cc (resolve_select_type): Pick a discriminating name
+ 	from the SELECT TYPE variable reference and use it in the name
+ 	of the temporary variable that is generated.  Truncate name to
+ 	the buffer size.
+ 	* match.cc (select_type_set_tmp): Likewise.  Pass the
+ 	discriminating name...
+ 	(select_intrinsic_set_tmp): ... to this function.  Use the
+ 	discriminating name likewise.  Augment the buffer size to match
+ 	that of select_type_set_tmp and resolve_select_type.
+ 
+ 2025-06-23  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* openmp.cc (OACC_WAIT_CLAUSES): Add if clause.
+ 	* trans-openmp.cc (gfc_trans_oacc_wait_directive): Handle it.
+ 
+ 2025-06-23  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/120784
+ 	* interface.cc (gfc_match_end_interface): If a use-associated
+ 	symbol is renamed, use the local_name for checking.
+ 
  2025-06-19  Mikael Morin  <mikael@gcc.gnu.org>
  
  	PR fortran/120713
diff -Nrcpad gcc-16-20250622/gcc/fortran/gfortran.h gcc-16-20250629/gcc/fortran/gfortran.h
*** gcc-16-20250622/gcc/fortran/gfortran.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/gfortran.h	Sun Jun 29 22:32:28 2025
*************** void gfc_done_2 (void);
*** 3507,3512 ****
--- 3507,3514 ----
  
  int get_c_kind (const char *, CInteropKind_t *);
  
+ const char * gfc_var_name_for_select_type_temp (gfc_expr *);
+ 
  const char *gfc_closest_fuzzy_match (const char *, char **);
  inline void
  vec_push (char **&optr, size_t &osz, const char *elt)
diff -Nrcpad gcc-16-20250622/gcc/fortran/interface.cc gcc-16-20250629/gcc/fortran/interface.cc
*** gcc-16-20250622/gcc/fortran/interface.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/interface.cc	Sun Jun 29 22:32:28 2025
*************** gfc_match_end_interface (void)
*** 452,462 ****
  
      case INTERFACE_DTIO:
      case INTERFACE_GENERIC:
        if (type != current_interface.type
! 	  || strcmp (current_interface.sym->name, name) != 0)
  	{
! 	  gfc_error ("Expecting %<END INTERFACE %s%> at %C",
! 		     current_interface.sym->name);
  	  m = MATCH_ERROR;
  	}
  
--- 452,471 ----
  
      case INTERFACE_DTIO:
      case INTERFACE_GENERIC:
+       /* If a use-associated symbol is renamed, check the local_name.   */
+       const char *local_name = current_interface.sym->name;
+ 
+       if (current_interface.sym->attr.use_assoc
+ 	  && current_interface.sym->attr.use_rename
+ 	  && current_interface.sym->ns->use_stmts->rename
+ 	  && (current_interface.sym->ns->use_stmts->rename->local_name[0]
+ 	      != '\0'))
+ 	local_name = current_interface.sym->ns->use_stmts->rename->local_name;
+ 
        if (type != current_interface.type
! 	  || strcmp (local_name, name) != 0)
  	{
! 	  gfc_error ("Expecting %<END INTERFACE %s%> at %C", local_name);
  	  m = MATCH_ERROR;
  	}
  
diff -Nrcpad gcc-16-20250622/gcc/fortran/match.cc gcc-16-20250629/gcc/fortran/match.cc
*** gcc-16-20250622/gcc/fortran/match.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/match.cc	Sun Jun 29 22:32:28 2025
*************** match
*** 5293,5299 ****
  gfc_match_nullify (void)
  {
    gfc_code *tail;
!   gfc_expr *e, *p;
    match m;
  
    tail = NULL;
--- 5293,5299 ----
  gfc_match_nullify (void)
  {
    gfc_code *tail;
!   gfc_expr *e, *p = NULL;
    match m;
  
    tail = NULL;
*************** select_type_push (gfc_symbol *sel)
*** 7171,7179 ****
  /* Set the temporary for the current intrinsic SELECT TYPE selector.  */
  
  static gfc_symtree *
! select_intrinsic_set_tmp (gfc_typespec *ts)
  {
!   char name[GFC_MAX_SYMBOL_LEN];
    gfc_symtree *tmp;
    HOST_WIDE_INT charlen = 0;
    gfc_symbol *selector = select_type_stack->selector;
--- 7171,7181 ----
  /* Set the temporary for the current intrinsic SELECT TYPE selector.  */
  
  static gfc_symtree *
! select_intrinsic_set_tmp (gfc_typespec *ts, const char *var_name)
  {
!   /* Keep size in sync with the buffer size in resolve_select_type as it
!      determines the final name through truncation.  */
!   char name[GFC_MAX_SYMBOL_LEN + 12 + 1];
    gfc_symtree *tmp;
    HOST_WIDE_INT charlen = 0;
    gfc_symbol *selector = select_type_stack->selector;
*************** select_intrinsic_set_tmp (gfc_typespec *
*** 7192,7203 ****
      charlen = gfc_mpz_get_hwi (ts->u.cl->length->value.integer);
  
    if (ts->type != BT_CHARACTER)
!     sprintf (name, "__tmp_%s_%d", gfc_basic_typename (ts->type),
! 	     ts->kind);
    else
      snprintf (name, sizeof (name),
! 	      "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
! 	      gfc_basic_typename (ts->type), charlen, ts->kind);
  
    gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
    sym = tmp->n.sym;
--- 7194,7205 ----
      charlen = gfc_mpz_get_hwi (ts->u.cl->length->value.integer);
  
    if (ts->type != BT_CHARACTER)
!     snprintf (name, sizeof (name), "__tmp_%s_%d_%s",
! 	      gfc_basic_typename (ts->type), ts->kind, var_name);
    else
      snprintf (name, sizeof (name),
! 	      "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d_%s",
! 	      gfc_basic_typename (ts->type), charlen, ts->kind, var_name);
  
    gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
    sym = tmp->n.sym;
*************** select_type_set_tmp (gfc_typespec *ts)
*** 7239,7245 ****
        return;
      }
  
!   tmp = select_intrinsic_set_tmp (ts);
  
    if (tmp == NULL)
      {
--- 7241,7249 ----
        return;
      }
  
!   gfc_expr *select_type_expr = gfc_state_stack->construct->expr1;
!   const char *var_name = gfc_var_name_for_select_type_temp (select_type_expr);
!   tmp = select_intrinsic_set_tmp (ts, var_name);
  
    if (tmp == NULL)
      {
*************** select_type_set_tmp (gfc_typespec *ts)
*** 7247,7255 ****
  	return;
  
        if (ts->type == BT_CLASS)
! 	sprintf (name, "__tmp_class_%s", ts->u.derived->name);
        else
! 	sprintf (name, "__tmp_type_%s", ts->u.derived->name);
  
        gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
        sym = tmp->n.sym;
--- 7251,7261 ----
  	return;
  
        if (ts->type == BT_CLASS)
! 	snprintf (name, sizeof (name), "__tmp_class_%s_%s", ts->u.derived->name,
! 		  var_name);
        else
! 	snprintf (name, sizeof (name), "__tmp_type_%s_%s", ts->u.derived->name,
! 		  var_name);
  
        gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
        sym = tmp->n.sym;
diff -Nrcpad gcc-16-20250622/gcc/fortran/misc.cc gcc-16-20250629/gcc/fortran/misc.cc
*** gcc-16-20250622/gcc/fortran/misc.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/misc.cc	Sun Jun 29 22:32:28 2025
*************** gfc_mpz_set_hwi (mpz_t rop, const HOST_W
*** 472,474 ****
--- 472,495 ----
    const wide_int w = wi::shwi (op, HOST_BITS_PER_WIDE_INT);
    wi::to_mpz (w, rop, SIGNED);
  }
+ 
+ 
+ /* Extract a name suitable for use in the name of the select type temporary
+    variable.  We pick the last component name in the data reference if there
+    is one, otherwise the user variable name, and return the empty string by
+    default.  */
+ 
+ const char *
+ gfc_var_name_for_select_type_temp (gfc_expr *e)
+ {
+   const char *name = "";
+   if (e->symtree)
+     name = e->symtree->name;
+   for (gfc_ref *r = e->ref; r; r = r->next)
+     if (r->type == REF_COMPONENT
+ 	&& !(strcmp (r->u.c.component->name, "_data") == 0
+ 	     || strcmp (r->u.c.component->name, "_vptr") == 0))
+       name = r->u.c.component->name;
+ 
+   return name;
+ }
diff -Nrcpad gcc-16-20250622/gcc/fortran/openmp.cc gcc-16-20250629/gcc/fortran/openmp.cc
*** gcc-16-20250622/gcc/fortran/openmp.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/openmp.cc	Sun Jun 29 22:32:28 2025
*************** error:
*** 4474,4480 ****
     | OMP_CLAUSE_COPYOUT | OMP_CLAUSE_DELETE | OMP_CLAUSE_FINALIZE	      \
     | OMP_CLAUSE_DETACH)
  #define OACC_WAIT_CLAUSES \
!   omp_mask (OMP_CLAUSE_ASYNC)
  #define OACC_ROUTINE_CLAUSES \
    (omp_mask (OMP_CLAUSE_GANG) | OMP_CLAUSE_WORKER | OMP_CLAUSE_VECTOR	      \
     | OMP_CLAUSE_SEQ							      \
--- 4474,4480 ----
     | OMP_CLAUSE_COPYOUT | OMP_CLAUSE_DELETE | OMP_CLAUSE_FINALIZE	      \
     | OMP_CLAUSE_DETACH)
  #define OACC_WAIT_CLAUSES \
!   omp_mask (OMP_CLAUSE_ASYNC) | OMP_CLAUSE_IF
  #define OACC_ROUTINE_CLAUSES \
    (omp_mask (OMP_CLAUSE_GANG) | OMP_CLAUSE_WORKER | OMP_CLAUSE_VECTOR	      \
     | OMP_CLAUSE_SEQ							      \
diff -Nrcpad gcc-16-20250622/gcc/fortran/resolve.cc gcc-16-20250629/gcc/fortran/resolve.cc
*** gcc-16-20250622/gcc/fortran/resolve.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/resolve.cc	Sun Jun 29 22:32:28 2025
*************** resolve_select_type (gfc_code *code, gfc
*** 10819,10824 ****
--- 10819,10826 ----
  	ref = gfc_copy_ref (ref);
      }
  
+   gfc_expr *orig_expr1 = code->expr1;
+ 
    /* Add EXEC_SELECT to switch on type.  */
    new_st = gfc_get_code (code->op);
    new_st->expr1 = code->expr1;
*************** resolve_select_type (gfc_code *code, gfc
*** 10846,10852 ****
    for (body = code->block; body; body = body->block)
      {
        gfc_symbol *vtab;
-       gfc_expr *e;
        c = body->ext.block.case_list;
  
        /* Generate an index integer expression for address of the
--- 10848,10853 ----
*************** resolve_select_type (gfc_code *code, gfc
*** 10854,10859 ****
--- 10855,10861 ----
  	 is stored in c->high and is used to resolve intrinsic cases.  */
        if (c->ts.type != BT_UNKNOWN)
  	{
+ 	  gfc_expr *e;
  	  if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
  	    {
  	      vtab = gfc_find_derived_vtab (c->ts.u.derived);
*************** resolve_select_type (gfc_code *code, gfc
*** 10886,10896 ****
  	 when this case is actually true, so build a new ASSOCIATE
  	 that does precisely this here (instead of using the
  	 'global' one).  */
! 
        if (c->ts.type == BT_CLASS)
! 	sprintf (name, "__tmp_class_%s", c->ts.u.derived->name);
        else if (c->ts.type == BT_DERIVED)
! 	sprintf (name, "__tmp_type_%s", c->ts.u.derived->name);
        else if (c->ts.type == BT_CHARACTER)
  	{
  	  HOST_WIDE_INT charlen = 0;
--- 10888,10900 ----
  	 when this case is actually true, so build a new ASSOCIATE
  	 that does precisely this here (instead of using the
  	 'global' one).  */
!       const char * var_name = gfc_var_name_for_select_type_temp (orig_expr1);
        if (c->ts.type == BT_CLASS)
! 	snprintf (name, sizeof (name), "__tmp_class_%s_%s",
! 		  c->ts.u.derived->name, var_name);
        else if (c->ts.type == BT_DERIVED)
! 	snprintf (name, sizeof (name), "__tmp_type_%s_%s",
! 		  c->ts.u.derived->name, var_name);
        else if (c->ts.type == BT_CHARACTER)
  	{
  	  HOST_WIDE_INT charlen = 0;
*************** resolve_select_type (gfc_code *code, gfc
*** 10898,10909 ****
  	      && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
  	    charlen = gfc_mpz_get_hwi (c->ts.u.cl->length->value.integer);
  	  snprintf (name, sizeof (name),
! 		    "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d",
! 		    gfc_basic_typename (c->ts.type), charlen, c->ts.kind);
  	}
        else
! 	sprintf (name, "__tmp_%s_%d", gfc_basic_typename (c->ts.type),
! 	         c->ts.kind);
  
        st = gfc_find_symtree (ns->sym_root, name);
        gcc_assert (st->n.sym->assoc);
--- 10902,10914 ----
  	      && c->ts.u.cl->length->expr_type == EXPR_CONSTANT)
  	    charlen = gfc_mpz_get_hwi (c->ts.u.cl->length->value.integer);
  	  snprintf (name, sizeof (name),
! 		    "__tmp_%s_" HOST_WIDE_INT_PRINT_DEC "_%d_%s",
! 		    gfc_basic_typename (c->ts.type), charlen, c->ts.kind,
! 		    var_name);
  	}
        else
! 	snprintf (name, sizeof (name), "__tmp_%s_%d_%s",
! 		  gfc_basic_typename (c->ts.type), c->ts.kind, var_name);
  
        st = gfc_find_symtree (ns->sym_root, name);
        gcc_assert (st->n.sym->assoc);
*************** resolve_fl_derived0 (gfc_symbol *sym)
*** 16836,16843 ****
      return false;
  
    /* Now add the caf token field, where needed.  */
!   if (flag_coarray != GFC_FCOARRAY_NONE
!       && !sym->attr.is_class && !sym->attr.vtype)
      {
        for (c = sym->components; c; c = c->next)
  	if (!c->attr.dimension && !c->attr.codimension
--- 16841,16848 ----
      return false;
  
    /* Now add the caf token field, where needed.  */
!   if (flag_coarray == GFC_FCOARRAY_LIB && !sym->attr.is_class
!       && !sym->attr.vtype)
      {
        for (c = sym->components; c; c = c->next)
  	if (!c->attr.dimension && !c->attr.codimension
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans-array.cc gcc-16-20250629/gcc/fortran/trans-array.cc
*** gcc-16-20250622/gcc/fortran/trans-array.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans-array.cc	Sun Jun 29 22:32:28 2025
*************** static void
*** 1991,2004 ****
  gfc_trans_array_ctor_element (stmtblock_t * pblock, tree desc,
  			      tree offset, gfc_se * se, gfc_expr * expr)
  {
!   tree tmp;
  
    gfc_conv_expr (se, expr);
  
    /* Store the value.  */
    tmp = build_fold_indirect_ref_loc (input_location,
  				 gfc_conv_descriptor_data_get (desc));
!   tmp = gfc_build_array_ref (tmp, offset, NULL);
  
    if (expr->expr_type == EXPR_FUNCTION && expr->ts.type == BT_DERIVED
        && expr->ts.u.derived->attr.alloc_comp)
--- 1991,2007 ----
  gfc_trans_array_ctor_element (stmtblock_t * pblock, tree desc,
  			      tree offset, gfc_se * se, gfc_expr * expr)
  {
!   tree tmp, offset_eval;
  
    gfc_conv_expr (se, expr);
  
    /* Store the value.  */
    tmp = build_fold_indirect_ref_loc (input_location,
  				 gfc_conv_descriptor_data_get (desc));
!   /* The offset may change, so get its value now and use that to free memory.
!    */
!   offset_eval = gfc_evaluate_now (offset, &se->pre);
!   tmp = gfc_build_array_ref (tmp, offset_eval, NULL);
  
    if (expr->expr_type == EXPR_FUNCTION && expr->ts.type == BT_DERIVED
        && expr->ts.u.derived->attr.alloc_comp)
*************** finish:
*** 3150,3157 ****
       the reference.  */
    if ((expr->ts.type == BT_DERIVED || expr->ts.type == BT_CLASS)
         && finalblock.head != NULL_TREE)
!     gfc_add_block_to_block (&loop->post, &finalblock);
! 
  }
  
  
--- 3153,3159 ----
       the reference.  */
    if ((expr->ts.type == BT_DERIVED || expr->ts.type == BT_CLASS)
         && finalblock.head != NULL_TREE)
!     gfc_prepend_expr_to_block (&loop->post, finalblock.head);
  }
  
  
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans-expr.cc gcc-16-20250629/gcc/fortran/trans-expr.cc
*** gcc-16-20250622/gcc/fortran/trans-expr.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans-expr.cc	Sun Jun 29 22:32:28 2025
*************** gfc_conv_substring (gfc_se * se, gfc_ref
*** 2800,2807 ****
        else if (POINTER_TYPE_P (TREE_TYPE (tmp)))
  	{
  	  tree diff;
! 	  diff = fold_build2 (MINUS_EXPR, size_type_node, start.expr,
! 			      build_one_cst (size_type_node));
  	  se->expr
  	    = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (tmp), tmp, diff);
  	}
--- 2800,2808 ----
        else if (POINTER_TYPE_P (TREE_TYPE (tmp)))
  	{
  	  tree diff;
! 	  diff = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, start.expr,
! 			      build_one_cst (gfc_charlen_type_node));
! 	  diff = fold_convert (size_type_node, diff);
  	  se->expr
  	    = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (tmp), tmp, diff);
  	}
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans-openmp.cc gcc-16-20250629/gcc/fortran/trans-openmp.cc
*** gcc-16-20250622/gcc/fortran/trans-openmp.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans-openmp.cc	Sun Jun 29 22:32:28 2025
*************** gfc_trans_oacc_wait_directive (gfc_code
*** 6048,6053 ****
--- 6048,6057 ----
      args->quick_push (gfc_convert_expr_to_tree (&block, el->expr));
  
    stmt = build_call_expr_loc_vec (loc, stmt, args);
+   if (clauses->if_expr)
+     stmt = build3_loc (input_location, COND_EXPR, void_type_node,
+ 		       gfc_convert_expr_to_tree (&block, clauses->if_expr),
+ 		       stmt, NULL_TREE);
    gfc_add_expr_to_block (&block, stmt);
  
    vec_free (args);
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans-stmt.cc gcc-16-20250629/gcc/fortran/trans-stmt.cc
*** gcc-16-20250622/gcc/fortran/trans-stmt.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans-stmt.cc	Sun Jun 29 22:32:28 2025
*************** get_intrinsic_for_code (gfc_code *code)
*** 377,382 ****
--- 377,433 ----
  }
  
  
+ /* Handle the OpenACC routines acc_attach{,_async} and
+    acc_detach{,_finalize}{,_async} explicitly.  This is required as the
+    the corresponding device pointee is attached to the corresponding device
+    pointer, but if a temporary array descriptor is created for the call,
+    that one is used as pointer instead of the original pointer.  */
+ 
+ tree
+ gfc_trans_call_acc_attach_detach (gfc_code *code)
+ {
+   stmtblock_t block;
+   gfc_se ptr_addr_se, async_se;
+   tree fn;
+ 
+   fn = code->resolved_sym->backend_decl;
+   if (fn == NULL)
+     {
+       fn = gfc_get_symbol_decl (code->resolved_sym);
+       code->resolved_sym->backend_decl = fn;
+     }
+ 
+   gfc_start_block (&block);
+ 
+   gfc_init_se (&ptr_addr_se, NULL);
+   ptr_addr_se.descriptor_only = 1;
+   ptr_addr_se.want_pointer = 1;
+   gfc_conv_expr (&ptr_addr_se, code->ext.actual->expr);
+   gfc_add_block_to_block (&block, &ptr_addr_se.pre);
+   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (ptr_addr_se.expr)))
+     ptr_addr_se.expr = gfc_conv_descriptor_data_get (ptr_addr_se.expr);
+   ptr_addr_se.expr = build_fold_addr_expr (ptr_addr_se.expr);
+ 
+   bool async = code->ext.actual->next != NULL;
+   if (async)
+     {
+       gfc_init_se (&async_se, NULL);
+       gfc_conv_expr (&async_se, code->ext.actual->next->expr);
+       fn = build_call_expr_loc (gfc_get_location (&code->loc), fn, 2,
+ 				ptr_addr_se.expr, async_se.expr);
+     }
+   else
+     fn = build_call_expr_loc (gfc_get_location (&code->loc),
+ 			      fn, 1, ptr_addr_se.expr);
+   gfc_add_expr_to_block (&block, fn);
+   gfc_add_block_to_block (&block, &ptr_addr_se.post);
+   if (async)
+     gfc_add_block_to_block (&block, &async_se.post);
+ 
+   return gfc_finish_block (&block);
+ }
+ 
+ 
  /* Translate the CALL statement.  Builds a call to an F95 subroutine.  */
  
  tree
*************** gfc_trans_call (gfc_code * code, bool de
*** 392,404 ****
    tree tmp;
    bool is_intrinsic_mvbits;
  
    /* A CALL starts a new block because the actual arguments may have to
       be evaluated first.  */
    gfc_init_se (&se, NULL);
    gfc_start_block (&se.pre);
  
-   gcc_assert (code->resolved_sym);
- 
    ss = gfc_ss_terminator;
    if (code->resolved_sym->attr.elemental)
      ss = gfc_walk_elemental_function_args (ss, code->ext.actual,
--- 443,474 ----
    tree tmp;
    bool is_intrinsic_mvbits;
  
+   gcc_assert (code->resolved_sym);
+ 
+   /* Unfortunately, acc_attach* and acc_detach* need some special treatment for
+      attaching the the pointee to a pointer as GCC might introduce a temporary
+      array descriptor, whose data component is then used as to be attached to
+      pointer.  */
+   if (flag_openacc
+       && code->resolved_sym->attr.subroutine
+       && code->resolved_sym->formal
+       && code->resolved_sym->formal->sym->ts.type == BT_ASSUMED
+       && code->resolved_sym->formal->sym->attr.dimension
+       && code->resolved_sym->formal->sym->as->type == AS_ASSUMED_RANK
+       && startswith (code->resolved_sym->name, "acc_")
+       && (!strcmp (code->resolved_sym->name + 4, "attach")
+ 	  || !strcmp (code->resolved_sym->name + 4, "attach_async")
+ 	  || !strcmp (code->resolved_sym->name + 4, "detach")
+ 	  || !strcmp (code->resolved_sym->name + 4, "detach_async")
+ 	  || !strcmp (code->resolved_sym->name + 4, "detach_finalize")
+ 	  || !strcmp (code->resolved_sym->name + 4, "detach_finalize_async")))
+     return gfc_trans_call_acc_attach_detach (code);
+ 
    /* A CALL starts a new block because the actual arguments may have to
       be evaluated first.  */
    gfc_init_se (&se, NULL);
    gfc_start_block (&se.pre);
  
    ss = gfc_ss_terminator;
    if (code->resolved_sym->attr.elemental)
      ss = gfc_walk_elemental_function_args (ss, code->ext.actual,
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans-types.cc gcc-16-20250629/gcc/fortran/trans-types.cc
*** gcc-16-20250622/gcc/fortran/trans-types.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans-types.cc	Sun Jun 29 22:32:28 2025
*************** copy_derived_types:
*** 3187,3193 ****
      for (c = derived->components; c; c = c->next)
        {
  	/* Do not add a caf_token field for class container components.  */
! 	if ((codimen || coarray_flag) && !c->attr.dimension
  	    && !c->attr.codimension && (c->attr.allocatable || c->attr.pointer)
  	    && !derived->attr.is_class)
  	  {
--- 3187,3193 ----
      for (c = derived->components; c; c = c->next)
        {
  	/* Do not add a caf_token field for class container components.  */
! 	if (codimen && coarray_flag && !c->attr.dimension
  	    && !c->attr.codimension && (c->attr.allocatable || c->attr.pointer)
  	    && !derived->attr.is_class)
  	  {
diff -Nrcpad gcc-16-20250622/gcc/fortran/trans.cc gcc-16-20250629/gcc/fortran/trans.cc
*** gcc-16-20250622/gcc/fortran/trans.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/fortran/trans.cc	Sun Jun 29 22:32:28 2025
*************** gfc_allocate_using_malloc (stmtblock_t *
*** 822,827 ****
--- 822,828 ----
    tree tmp, error_cond;
    stmtblock_t on_error;
    tree status_type = status ? TREE_TYPE (status) : NULL_TREE;
+   bool cond_is_true = cond == boolean_true_node;
  
    /* If successful and stat= is given, set status to 0.  */
    if (status != NULL_TREE)
*************** gfc_allocate_using_malloc (stmtblock_t *
*** 834,844 ****
    tmp = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
  			 size, build_int_cst (size_type_node, 1));
  
!   tmp = build_call_expr_loc (input_location,
! 			     builtin_decl_explicit (BUILT_IN_MALLOC), 1, tmp);
!   if (cond == boolean_true_node)
      tmp = alt_alloc;
!   else if (cond)
      tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), cond,
  		      alt_alloc, tmp);
  
--- 835,847 ----
    tmp = fold_build2_loc (input_location, MAX_EXPR, size_type_node,
  			 size, build_int_cst (size_type_node, 1));
  
!   if (!cond_is_true)
!     tmp = build_call_expr_loc (input_location,
! 			       builtin_decl_explicit (BUILT_IN_MALLOC), 1, tmp);
!   else
      tmp = alt_alloc;
! 
!   if (!cond_is_true && cond)
      tmp = build3_loc (input_location, COND_EXPR, TREE_TYPE (tmp), cond,
  		      alt_alloc, tmp);
  
diff -Nrcpad gcc-16-20250622/gcc/function.cc gcc-16-20250629/gcc/function.cc
*** gcc-16-20250622/gcc/function.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/function.cc	Sun Jun 29 22:32:28 2025
*************** instantiate_virtual_regs_in_insn (rtx_in
*** 1722,1740 ****
  	  new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
  	  if (new_rtx == NULL)
  	    continue;
  	  if (maybe_ne (offset, 0))
! 	    {
! 	      start_sequence ();
! 	      new_rtx = expand_simple_binop
! 		(GET_MODE (new_rtx), PLUS, new_rtx,
! 		 gen_int_mode (offset, GET_MODE (new_rtx)),
! 		 NULL_RTX, 1, OPTAB_LIB_WIDEN);
! 	      seq = end_sequence ();
! 	      emit_insn_before (seq, insn);
! 	    }
! 	  x = simplify_gen_subreg (recog_data.operand_mode[i], new_rtx,
! 				   GET_MODE (new_rtx), SUBREG_BYTE (x));
  	  gcc_assert (x);
  	  break;
  
  	default:
--- 1722,1738 ----
  	  new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
  	  if (new_rtx == NULL)
  	    continue;
+ 	  start_sequence ();
  	  if (maybe_ne (offset, 0))
! 	    new_rtx = expand_simple_binop
! 	      (GET_MODE (new_rtx), PLUS, new_rtx,
! 	       gen_int_mode (offset, GET_MODE (new_rtx)),
! 	       NULL_RTX, 1, OPTAB_LIB_WIDEN);
! 	  x = force_subreg (recog_data.operand_mode[i], new_rtx,
! 			    GET_MODE (new_rtx), SUBREG_BYTE (x));
  	  gcc_assert (x);
+ 	  seq = end_sequence ();
+ 	  emit_insn_before (seq, insn);
  	  break;
  
  	default:
diff -Nrcpad gcc-16-20250622/gcc/genoutput.cc gcc-16-20250629/gcc/genoutput.cc
*** gcc-16-20250622/gcc/genoutput.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/genoutput.cc	Sun Jun 29 22:32:28 2025
*************** scan_operands (class data *d, rtx part,
*** 478,484 ****
        d->operand[opno].n_alternatives
  	= n_occurrences (',', d->operand[opno].constraint) + 1;
        d->operand[opno].address_p = 0;
!       d->operand[opno].eliminable = 0;
        return;
  
      case MATCH_OPERATOR:
--- 478,484 ----
        d->operand[opno].n_alternatives
  	= n_occurrences (',', d->operand[opno].constraint) + 1;
        d->operand[opno].address_p = 0;
!       d->operand[opno].eliminable = 1;
        return;
  
      case MATCH_OPERATOR:
diff -Nrcpad gcc-16-20250622/gcc/gimple-fold.cc gcc-16-20250629/gcc/gimple-fold.cc
*** gcc-16-20250622/gcc/gimple-fold.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/gimple-fold.cc	Sun Jun 29 22:32:28 2025
*************** fold_const_aggregate_ref_1 (tree t, tree
*** 10117,10135 ****
        base = get_ref_base_and_extent (t, &offset, &size, &max_size, &reverse);
        ctor = get_base_constructor (base, &offset, valueize);
  
        /* Empty constructor.  Always fold to 0.  */
        if (ctor == error_mark_node)
  	return build_zero_cst (TREE_TYPE (t));
!       /* We do not know precise address.  */
        if (!known_size_p (max_size) || maybe_ne (max_size, size))
  	return NULL_TREE;
-       /* We cannot determine ctor.  */
-       if (!ctor)
- 	return NULL_TREE;
- 
        /* Out of bound array access.  Value is undefined, but don't fold.  */
        if (maybe_lt (offset, 0))
  	return NULL_TREE;
  
        tem = fold_ctor_reference (TREE_TYPE (t), ctor, offset, size, base);
        if (tem)
--- 10117,10137 ----
        base = get_ref_base_and_extent (t, &offset, &size, &max_size, &reverse);
        ctor = get_base_constructor (base, &offset, valueize);
  
+       /* We cannot determine ctor.  */
+       if (!ctor)
+ 	return NULL_TREE;
        /* Empty constructor.  Always fold to 0.  */
        if (ctor == error_mark_node)
  	return build_zero_cst (TREE_TYPE (t));
!       /* We do not know precise access.  */
        if (!known_size_p (max_size) || maybe_ne (max_size, size))
  	return NULL_TREE;
        /* Out of bound array access.  Value is undefined, but don't fold.  */
        if (maybe_lt (offset, 0))
  	return NULL_TREE;
+       /* Access with reverse storage order.  */
+       if (reverse)
+ 	return NULL_TREE;
  
        tem = fold_ctor_reference (TREE_TYPE (t), ctor, offset, size, base);
        if (tem)
*************** fold_const_aggregate_ref_1 (tree t, tree
*** 10149,10155 ****
  	      && offset.is_constant (&coffset)
  	      && (coffset % BITS_PER_UNIT != 0
  		  || csize % BITS_PER_UNIT != 0)
- 	      && !reverse
  	      && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN)
  	    {
  	      poly_int64 bitoffset;
--- 10151,10156 ----
*************** gimple_get_virt_method_for_vtable (HOST_
*** 10276,10288 ****
    access_index = offset / BITS_PER_UNIT / elt_size;
    gcc_checking_assert (offset % (elt_size * BITS_PER_UNIT) == 0);
  
!   /* The C++ FE can now produce indexed fields, and we check if the indexes
!      match.  */
    if (access_index < CONSTRUCTOR_NELTS (init))
      {
        fn = CONSTRUCTOR_ELT (init, access_index)->value;
!       tree idx = CONSTRUCTOR_ELT (init, access_index)->index;
!       gcc_checking_assert (!idx || tree_to_uhwi (idx) == access_index);
        STRIP_NOPS (fn);
      }
    else
--- 10277,10288 ----
    access_index = offset / BITS_PER_UNIT / elt_size;
    gcc_checking_assert (offset % (elt_size * BITS_PER_UNIT) == 0);
  
!   /* This code makes an assumption that there are no
!      indexed fileds produced by C++ FE, so we can directly index the array.  */
    if (access_index < CONSTRUCTOR_NELTS (init))
      {
        fn = CONSTRUCTOR_ELT (init, access_index)->value;
!       gcc_checking_assert (!CONSTRUCTOR_ELT (init, access_index)->index);
        STRIP_NOPS (fn);
      }
    else
diff -Nrcpad gcc-16-20250622/gcc/gimple-predicate-analysis.cc gcc-16-20250629/gcc/gimple-predicate-analysis.cc
*** gcc-16-20250622/gcc/gimple-predicate-analysis.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/gimple-predicate-analysis.cc	Sun Jun 29 22:32:28 2025
*************** bool
*** 385,391 ****
  uninit_analysis::prune_phi_opnds (gphi *phi, unsigned opnds, gphi *flag_def,
  				  tree boundary_cst, tree_code cmp_code,
  				  hash_set<gphi *> *visited_phis,
! 				  bitmap *visited_flag_phis)
  {
    /* The Boolean predicate guarding the PHI definition.  Initialized
       lazily from PHI in the first call to is_use_guarded() and cached
--- 385,392 ----
  uninit_analysis::prune_phi_opnds (gphi *phi, unsigned opnds, gphi *flag_def,
  				  tree boundary_cst, tree_code cmp_code,
  				  hash_set<gphi *> *visited_phis,
! 				  bitmap *visited_flag_phis,
! 				  unsigned &max_attempts)
  {
    /* The Boolean predicate guarding the PHI definition.  Initialized
       lazily from PHI in the first call to is_use_guarded() and cached
*************** uninit_analysis::prune_phi_opnds (gphi *
*** 398,403 ****
--- 399,408 ----
        if (!MASK_TEST_BIT (opnds, i))
  	continue;
  
+       if (max_attempts == 0)
+ 	return false;
+       --max_attempts;
+ 
        tree flag_arg = gimple_phi_arg_def (flag_def, i);
        if (!is_gimple_constant (flag_arg))
  	{
*************** uninit_analysis::prune_phi_opnds (gphi *
*** 432,438 ****
  	  unsigned opnds_arg_phi = m_eval.phi_arg_set (phi_arg_def);
  	  if (!prune_phi_opnds (phi_arg_def, opnds_arg_phi, flag_arg_def,
  				boundary_cst, cmp_code, visited_phis,
! 				visited_flag_phis))
  	    return false;
  
  	  bitmap_clear_bit (*visited_flag_phis, SSA_NAME_VERSION (phi_result));
--- 437,443 ----
  	  unsigned opnds_arg_phi = m_eval.phi_arg_set (phi_arg_def);
  	  if (!prune_phi_opnds (phi_arg_def, opnds_arg_phi, flag_arg_def,
  				boundary_cst, cmp_code, visited_phis,
! 				visited_flag_phis, max_attempts))
  	    return false;
  
  	  bitmap_clear_bit (*visited_flag_phis, SSA_NAME_VERSION (phi_result));
*************** uninit_analysis::overlap (gphi *phi, uns
*** 634,642 ****
  	 value that is in conflict with the use guard/predicate.  */
        bitmap visited_flag_phis = NULL;
        gphi *phi_def = as_a<gphi *> (flag_def);
        bool all_pruned = prune_phi_opnds (phi, opnds, phi_def, boundary_cst,
  					 cmp_code, visited,
! 					 &visited_flag_phis);
        if (visited_flag_phis)
  	BITMAP_FREE (visited_flag_phis);
        if (all_pruned)
--- 639,648 ----
  	 value that is in conflict with the use guard/predicate.  */
        bitmap visited_flag_phis = NULL;
        gphi *phi_def = as_a<gphi *> (flag_def);
+       unsigned max_attempts = param_uninit_max_prune_work;
        bool all_pruned = prune_phi_opnds (phi, opnds, phi_def, boundary_cst,
  					 cmp_code, visited,
! 					 &visited_flag_phis, max_attempts);
        if (visited_flag_phis)
  	BITMAP_FREE (visited_flag_phis);
        if (all_pruned)
diff -Nrcpad gcc-16-20250622/gcc/gimple-predicate-analysis.h gcc-16-20250629/gcc/gimple-predicate-analysis.h
*** gcc-16-20250622/gcc/gimple-predicate-analysis.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/gimple-predicate-analysis.h	Sun Jun 29 22:32:28 2025
*************** private:
*** 152,158 ****
    bool is_use_guarded (gimple *, basic_block, gphi *, unsigned,
  		       hash_set<gphi *> *);
    bool prune_phi_opnds (gphi *, unsigned, gphi *, tree, tree_code,
! 			hash_set<gphi *> *, bitmap *);
    bool overlap (gphi *, unsigned, hash_set<gphi *> *, const predicate &);
  
    void collect_phi_def_edges (gphi *, basic_block, vec<edge> *,
--- 152,158 ----
    bool is_use_guarded (gimple *, basic_block, gphi *, unsigned,
  		       hash_set<gphi *> *);
    bool prune_phi_opnds (gphi *, unsigned, gphi *, tree, tree_code,
! 			hash_set<gphi *> *, bitmap *, unsigned &);
    bool overlap (gphi *, unsigned, hash_set<gphi *> *, const predicate &);
  
    void collect_phi_def_edges (gphi *, basic_block, vec<edge> *,
diff -Nrcpad gcc-16-20250622/gcc/gimple-range-op.cc gcc-16-20250629/gcc/gimple-range-op.cc
*** gcc-16-20250622/gcc/gimple-range-op.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/gimple-range-op.cc	Sun Jun 29 22:32:28 2025
*************** gimple_range_op_handler::maybe_builtin_c
*** 1416,1422 ****
        m_operator = &op_cfn_signbit;
        break;
  
!     CASE_FLT_FN (BUILT_IN_ISINF):
        m_op1 = gimple_call_arg (call, 0);
        m_operator = &op_cfn_isinf;
        break;
--- 1416,1422 ----
        m_operator = &op_cfn_signbit;
        break;
  
!     CASE_FLT_FN (CFN_BUILT_IN_ISINF):
        m_op1 = gimple_call_arg (call, 0);
        m_operator = &op_cfn_isinf;
        break;
diff -Nrcpad gcc-16-20250622/gcc/gimple-ssa-sccopy.cc gcc-16-20250629/gcc/gimple-ssa-sccopy.cc
*** gcc-16-20250622/gcc/gimple-ssa-sccopy.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/gimple-ssa-sccopy.cc	Sun Jun 29 22:32:28 2025
*************** public:
*** 699,706 ****
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *) { return true; }
!   virtual unsigned int execute (function *);
    opt_pass * clone () final override { return new pass_sccopy (m_ctxt); }
  }; // class pass_sccopy
  
--- 699,706 ----
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *) final override { return true; }
!   virtual unsigned int execute (function *) final override;
    opt_pass * clone () final override { return new pass_sccopy (m_ctxt); }
  }; // class pass_sccopy
  
diff -Nrcpad gcc-16-20250622/gcc/graphviz.cc gcc-16-20250629/gcc/graphviz.cc
*** gcc-16-20250622/gcc/graphviz.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/graphviz.cc	Sun Jun 29 22:32:28 2025
*************** You should have received a copy of the G
*** 18,36 ****
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
  #include "graphviz.h"
  
! /* graphviz_out's ctor, wrapping PP.  */
! 
! graphviz_out::graphviz_out (pretty_printer *pp)
  : m_pp (pp),
    m_indent (0)
  {
  }
  
  /* Formatted print of FMT.  */
  
  void
--- 18,56 ----
  along with GCC; see the file COPYING3.  If not see
  <http://www.gnu.org/licenses/>.  */
  
+ #define INCLUDE_MAP
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
  #include "config.h"
  #include "system.h"
  #include "coretypes.h"
  #include "graphviz.h"
+ #include "xml.h"
+ #include "xml-printer.h"
+ #include "pex.h"
+ #include "selftest.h"
  
! dot::writer::writer (pretty_printer &pp)
  : m_pp (pp),
    m_indent (0)
  {
  }
  
+ /* Print the current indent to the underlying pp.  */
+ 
+ void
+ dot::writer::write_indent ()
+ {
+   for (int i = 0; i < m_indent * 4; ++i)
+     pp_space (get_pp ());
+ }
+ 
+ graphviz_out::graphviz_out (pretty_printer *pp)
+ : writer (*pp)
+ {
+   gcc_assert (pp);
+ }
+ 
  /* Formatted print of FMT.  */
  
  void
*************** graphviz_out::print (const char *fmt, ..
*** 40,47 ****
  
    va_start (ap, fmt);
    text_info text (fmt, &ap, errno);
!   pp_format (m_pp, &text);
!   pp_output_formatted_text (m_pp);
    va_end (ap);
  }
  
--- 60,67 ----
  
    va_start (ap, fmt);
    text_info text (fmt, &ap, errno);
!   pp_format (get_pp (), &text);
!   pp_output_formatted_text (get_pp ());
    va_end (ap);
  }
  
*************** graphviz_out::println (const char *fmt,
*** 57,76 ****
  
    va_start (ap, fmt);
    text_info text (fmt, &ap, errno);
!   pp_format (m_pp, &text);
!   pp_output_formatted_text (m_pp);
    va_end (ap);
  
!   pp_newline (m_pp);
! }
! 
! /* Print the current indent to the underlying pp.  */
! 
! void
! graphviz_out::write_indent ()
! {
!   for (int i = 0; i < m_indent * 2; ++i)
!     pp_space (m_pp);
  }
  
  /* Write the start of an HTML-like row via <TR>, writing to the stream
--- 77,87 ----
  
    va_start (ap, fmt);
    text_info text (fmt, &ap, errno);
!   pp_format (get_pp (), &text);
!   pp_output_formatted_text (get_pp ());
    va_end (ap);
  
!   pp_newline (get_pp ());
  }
  
  /* Write the start of an HTML-like row via <TR>, writing to the stream
*************** graphviz_out::write_indent ()
*** 79,86 ****
  void
  graphviz_out::begin_tr ()
  {
!   pp_string (m_pp, "<TR>");
!   pp_write_text_to_stream (m_pp);
  }
  
  /* Write the end of an HTML-like row via </TR>, writing to the stream
--- 90,97 ----
  void
  graphviz_out::begin_tr ()
  {
!   pp_string (get_pp (), "<TR>");
!   pp_write_text_to_stream (get_pp ());
  }
  
  /* Write the end of an HTML-like row via </TR>, writing to the stream
*************** graphviz_out::begin_tr ()
*** 89,96 ****
  void
  graphviz_out::end_tr ()
  {
!   pp_string (m_pp, "</TR>");
!   pp_write_text_to_stream (m_pp);
  }
  
  /* Write the start of an HTML-like <TD>, writing to the stream
--- 100,107 ----
  void
  graphviz_out::end_tr ()
  {
!   pp_string (get_pp (), "</TR>");
!   pp_write_text_to_stream (get_pp ());
  }
  
  /* Write the start of an HTML-like <TD>, writing to the stream
*************** graphviz_out::end_tr ()
*** 99,106 ****
  void
  graphviz_out::begin_td ()
  {
!   pp_string (m_pp, "<TD ALIGN=\"LEFT\">");
!   pp_write_text_to_stream (m_pp);
  }
  
  /* Write the end of an HTML-like </TD>, writing to the stream
--- 110,117 ----
  void
  graphviz_out::begin_td ()
  {
!   pp_string (get_pp (), "<TD ALIGN=\"LEFT\">");
!   pp_write_text_to_stream (get_pp ());
  }
  
  /* Write the end of an HTML-like </TD>, writing to the stream
*************** graphviz_out::begin_td ()
*** 109,116 ****
  void
  graphviz_out::end_td ()
  {
!   pp_string (m_pp, "</TD>");
!   pp_write_text_to_stream (m_pp);
  }
  
  /* Write the start of an HTML-like row via <TR><TD>, writing to the stream
--- 120,127 ----
  void
  graphviz_out::end_td ()
  {
!   pp_string (get_pp (), "</TD>");
!   pp_write_text_to_stream (get_pp ());
  }
  
  /* Write the start of an HTML-like row via <TR><TD>, writing to the stream
*************** graphviz_out::end_td ()
*** 119,126 ****
  void
  graphviz_out::begin_trtd ()
  {
!   pp_string (m_pp, "<TR><TD ALIGN=\"LEFT\">");
!   pp_write_text_to_stream (m_pp);
  }
  
  /* Write the end of an HTML-like row via </TD></TR>, writing to the stream
--- 130,137 ----
  void
  graphviz_out::begin_trtd ()
  {
!   pp_string (get_pp (), "<TR><TD ALIGN=\"LEFT\">");
!   pp_write_text_to_stream (get_pp ());
  }
  
  /* Write the end of an HTML-like row via </TD></TR>, writing to the stream
*************** graphviz_out::begin_trtd ()
*** 129,134 ****
  void
  graphviz_out::end_tdtr ()
  {
!   pp_string (m_pp, "</TD></TR>");
!   pp_write_text_to_stream (m_pp);
  }
--- 140,767 ----
  void
  graphviz_out::end_tdtr ()
  {
!   pp_string (get_pp (), "</TD></TR>");
!   pp_write_text_to_stream (get_pp ());
! }
! 
! namespace dot {
! 
! // Definitions
! 
! // struct ast_node
! 
! void
! ast_node::dump () const
! {
!   pretty_printer pp;
!   pp.set_output_stream (stderr);
!   writer w (pp);
!   print (w);
!   pp_newline (&pp);
!   pp_flush (&pp);
! }
! 
! // struct id
! 
! id::id (std::string str)
! : m_str (std::move (str)),
!   m_kind (is_identifier_p (m_str.c_str ())
! 	  ? kind::identifier
! 	  : kind::quoted)
! {
! }
! 
! id::id (const xml::node &n)
! : m_kind (kind::html)
! {
!   pretty_printer pp;
!   n.write_as_xml (&pp, 0, true);
!   m_str = pp_formatted_text (&pp);
! }
! 
! void
! id::print (writer &w) const
! {
!   switch (m_kind)
!     {
!     default:
!       gcc_unreachable ();
! 
!     case kind::identifier:
!       w.write_string (m_str.c_str ());
!       break;
! 
!     case kind::quoted:
!       w.write_character ('"');
!       for (auto ch : m_str)
! 	if (ch == '"')
! 	  w.write_string ("\\\"");
! 	else
! 	  w.write_character (ch);
!       w.write_character ('"');
!       break;
! 
!     case kind::html:
!       w.write_character ('<');
!       w.write_string (m_str.c_str ());
!       w.write_character ('>');
!       break;
! 
!     }
! }
! 
! bool
! id::is_identifier_p (const char *str)
! {
!   const char initial_ch = *str;
!   if (initial_ch != '_' && !ISALPHA (initial_ch))
!     return false;
!   for (const char *iter = str + 1; *iter; ++iter)
!     {
!       const char iter_ch = *iter;
!       if (iter_ch != '_' && !ISALNUM (iter_ch))
! 	return false;
!     }
!   return true;
! }
! 
! // struct kv_pair
! 
! void
! kv_pair::print (writer &w) const
! {
!   m_key.print (w);
!   w.write_character ('=');
!   m_value.print (w);
! }
! 
! // struct attr_list
! 
! void
! attr_list::print (writer &w) const
! {
!   if (m_kvs.empty ())
!     return;
!   w.write_string (" [");
!   for (auto iter = m_kvs.begin (); iter != m_kvs.end (); ++iter)
!     {
!       if (iter != m_kvs.begin ())
! 	w.write_string ("; ");
!       iter->print (w);
!     }
!   w.write_string ("]");
! }
! 
! // struct stmt_list
! 
! void
! stmt_list::print (writer &w) const
! {
!   for (auto &stmt : m_stmts)
!     {
!       w.write_indent ();
!       stmt->print (w);
!       w.write_string (";");
!       w.write_newline ();
!     }
! }
! 
! void
! stmt_list::add_edge (node_id src_id, node_id dst_id)
! {
!   m_stmts.push_back
!     (std::make_unique<dot::edge_stmt>
!      (std::move (src_id), std::move (dst_id)));
! }
! 
! void
! stmt_list::add_attr (id key, id value)
! {
!   add_stmt
!     (std::make_unique <kv_stmt> (kv_pair (std::move (key),
! 					  std::move (value))));
  }
+ 
+ // struct graph
+ 
+ void
+ graph::print (writer &w) const
+ {
+   w.write_indent ();
+   w.write_string ("digraph ");
+   if (m_id)
+     {
+       m_id->print (w);
+       w.write_character (' ');
+     }
+   w.write_string ("{");
+   w.write_newline ();
+ 
+   w.indent ();
+   m_stmt_list.print (w);
+   w.outdent ();
+ 
+   w.write_indent ();
+   w.write_string ("}");
+   w.write_newline ();
+ }
+ 
+ // struct stmt_with_attr_list : public stmt
+ 
+ void
+ stmt_with_attr_list::set_label (dot::id value)
+ {
+   m_attrs.add (dot::id ("label"), std::move (value));
+ }
+ 
+ // struct node_stmt : public stmt_with_attr_list
+ 
+ void
+ node_stmt::print (writer &w) const
+ {
+   m_id.print (w);
+   m_attrs.print (w);
+ }
+ 
+ // struct attr_stmt : public stmt_with_attr_list
+ 
+ void
+ attr_stmt::print (writer &w) const
+ {
+   switch (m_kind)
+     {
+     default:
+       gcc_unreachable ();
+     case kind::graph:
+       w.write_string ("graph");
+       break;
+     case kind::node:
+       w.write_string ("node");
+       break;
+     case kind::edge:
+       w.write_string ("edge");
+       break;
+     }
+   m_attrs.print (w);
+ }
+ 
+ // struct kv_stmt : public stmt
+ 
+ void
+ kv_stmt::print (writer &w) const
+ {
+   m_kv.print (w);
+ }
+ 
+ // struct node_id
+ 
+ void
+ node_id::print (writer &w) const
+ {
+   m_id.print (w);
+   if (m_port)
+     m_port->print (w);
+ }
+ 
+ // struct port
+ 
+ void
+ port::print (writer &w) const
+ {
+   if (m_id)
+     {
+       w.write_character (':');
+       m_id->print (w);
+     }
+   if (m_compass_pt)
+     {
+       w.write_character (':');
+       switch (*m_compass_pt)
+ 	{
+ 	default:
+ 	  gcc_unreachable ();
+ 	case compass_pt::n:
+ 	  w.write_string ("n");
+ 	  break;
+ 	case compass_pt::ne:
+ 	  w.write_string ("ne");
+ 	  break;
+ 	case compass_pt::e:
+ 	  w.write_string ("e");
+ 	  break;
+ 	case compass_pt::se:
+ 	  w.write_string ("se");
+ 	  break;
+ 	case compass_pt::s:
+ 	  w.write_string ("s");
+ 	  break;
+ 	case compass_pt::sw:
+ 	  w.write_string ("sw");
+ 	  break;
+ 	case compass_pt::w:
+ 	  w.write_string ("w");
+ 	  break;
+ 	case compass_pt::nw:
+ 	  w.write_string ("nw");
+ 	  break;
+ 	case compass_pt::c:
+ 	  w.write_string ("c");
+ 	  break;
+ 	}
+     }
+ }
+ 
+ // struct edge_stmt : public stmt_with_attr_list
+ 
+ void
+ edge_stmt::print (writer &w) const
+ {
+   for (auto iter = m_node_ids.begin (); iter != m_node_ids.end (); ++iter)
+     {
+       if (iter != m_node_ids.begin ())
+ 	w.write_string (" -> ");
+       iter->print (w);
+     }
+   m_attrs.print (w);
+ }
+ 
+ // struct subgraph : public stmt
+ 
+ void
+ subgraph::print (writer &w) const
+ {
+   w.write_newline ();
+   w.write_indent ();
+   w.write_string ("subgraph ");
+   m_id.print (w);
+   w.write_string (" {");
+   w.write_newline ();
+ 
+   w.indent ();
+   m_stmt_list.print (w);
+   w.outdent ();
+   w.write_newline ();
+ 
+   w.write_indent ();
+   w.write_string ("}"); // newline and semicolon added by stmt_list
+ }
+ 
+ /* Convert G to graphviz source, attempt to invoke "dot -Tsvg" on it
+    as a subprocess, and get the SVG source from stdout, or nullptr
+    if there was a problem.  */
+ 
+ static std::unique_ptr<std::string>
+ make_svg_document_buffer_from_graph (const graph &g)
+ {
+   /* Ideally there would be a way of doing this without
+      invoking dot as a subprocess.  */
+ 
+   std::vector<std::string> args;
+   args.push_back ("dot");
+   args.push_back ("-Tsvg");
+ 
+   pex p (0, "dot", nullptr);
+ 
+   {
+     auto pipe_stdin = p.input_file (true, nullptr);
+     gcc_assert (pipe_stdin.m_file);
+     pretty_printer pp;
+     pp.set_output_stream (pipe_stdin.m_file);
+     writer w (pp);
+     g.print (w);
+     pp_flush (&pp);
+   }
+ 
+   int err = 0;
+   const char * errmsg
+     = p.run (PEX_SEARCH,
+ 	     "dot", args, nullptr, nullptr, &err);
+   auto pipe_stdout = p.read_output ();
+   auto content = pipe_stdout.read_all ();
+ 
+   if (errmsg)
+     return nullptr;
+   if (err)
+     return nullptr;
+ 
+   std::string result;
+   result.reserve (content->size () + 1);
+   for (auto &iter : *content)
+     result.push_back (iter);
+   return std::make_unique<std::string> (std::move (result));
+ }
+ 
+ /* Convert G to graphviz source, attempt to invoke "dot -Tsvg" on it
+    as a subprocess, and get the SVG source from stdout, and extract
+    the "svg" subtree as an xml::raw node.
+ 
+    Note that this
+    (a) invokes "dot" as a subprocess
+    (b) assumes that we trust the output from "dot".
+ 
+    Return nullptr if there was a problem.  */
+ 
+ std::unique_ptr<xml::node>
+ make_svg_from_graph (const graph &g)
+ {
+   auto svg_src = make_svg_document_buffer_from_graph (g);
+   if (!svg_src)
+     return nullptr;
+ 
+   /* Skip past the XML header to the parts we care about.  */
+   auto pos = svg_src->find ("<!-- Generated by graphviz");
+   if (pos == svg_src->npos)
+     return nullptr;
+ 
+   auto substring = std::string (*svg_src, pos);
+   return std::make_unique<xml::raw> (std::move (substring));
+ }
+ 
+ } // namespace dot
+ 
+ #if CHECKING_P
+ 
+ namespace selftest {
+ 
+ static void
+ test_ids ()
+ {
+   ASSERT_TRUE (dot::id::is_identifier_p ("foo"));
+   ASSERT_FALSE (dot::id::is_identifier_p ("hello world"));
+   ASSERT_TRUE (dot::id::is_identifier_p ("foo42"));
+   ASSERT_FALSE (dot::id::is_identifier_p ("42"));
+   ASSERT_TRUE (dot::id::is_identifier_p ("_"));
+ }
+ 
+ static void
+ test_trivial_graph ()
+ {
+   dot::graph g;
+   // node "a"
+   {
+     g.add_stmt (std::make_unique<dot::node_stmt> (dot::id ("a")));
+   }
+   // node "b"
+   {
+     auto n = std::make_unique<dot::node_stmt> (dot::id ("b"));
+     n->m_attrs.add (dot::id ("label"), dot::id ("This is node b"));
+     n->m_attrs.add (dot::id ("color"), dot::id ("green"));
+     g.add_stmt (std::move (n));
+   }
+   // an edge between them
+   {
+     auto e = std::make_unique<dot::edge_stmt> (dot::id ("a"),
+ 					       dot::id ("b"));
+     e->m_attrs.add (dot::id ("label"), dot::id ("I'm an edge"));
+     g.add_stmt (std::move (e));
+   }
+   pretty_printer pp;
+   dot::writer w (pp);
+   g.print (w);
+   ASSERT_STREQ
+     (pp_formatted_text (&pp),
+      ("digraph {\n"
+       "    a;\n"
+       "    b [label=\"This is node b\"; color=green];\n"
+       "    a -> b [label=\"I'm an edge\"];\n"
+       "}\n"));
+ }
+ 
+ /* Recreating the HTML record example from
+    https://graphviz.org/doc/info/shapes.html#html  */
+ 
+ static void
+ test_layout_example ()
+ {
+   dot::graph g (dot::id ("structs"));
+ 
+   // "node [shape=plaintext]\n"
+   {
+     auto attr_stmt
+       = std::make_unique<dot::attr_stmt> (dot::attr_stmt::kind::node);
+     attr_stmt->m_attrs.add (dot::id ("shape"), dot::id ("plaintext"));
+     g.add_stmt (std::move (attr_stmt));
+   }
+ 
+   // struct1
+   {
+     auto n = std::make_unique<dot::node_stmt> (dot::id ("struct1"));
+ 
+     xml::element table ("TABLE", false);
+     xml::printer xp (table);
+     xp.set_attr ("BORDER", "0");
+     xp.set_attr ("CELLBORDER", "1");
+     xp.set_attr ("CELLSPACING", "0");
+ 
+     xp.push_tag ("TR", true);
+ 
+     xp.push_tag ("TD", false);
+     xp.add_text ("left");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", false);
+     xp.set_attr ("PORT", "f1");
+     xp.add_text ("mid dle");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", false);
+     xp.set_attr ("PORT", "f2");
+     xp.add_text ("right");
+     xp.pop_tag ("TD");
+ 
+     n->set_label (table);
+     g.add_stmt (std::move (n));
+   }
+ 
+   // struct2
+   {
+     auto n = std::make_unique<dot::node_stmt> (dot::id ("struct2"));
+     xml::element table ("TABLE", false);
+     xml::printer xp (table);
+     xp.set_attr ("BORDER", "0");
+     xp.set_attr ("CELLBORDER", "1");
+     xp.set_attr ("CELLSPACING", "0");
+ 
+     xp.push_tag ("TR", true);
+ 
+     xp.push_tag ("TD", false);
+     xp.set_attr ("PORT", "f0");
+     xp.add_text ("one");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", false);
+     xp.add_text ("two");
+     xp.pop_tag ("TD");
+ 
+     n->set_label (table);
+     g.add_stmt (std::move (n));
+   }
+ 
+   // struct3
+   {
+     auto n = std::make_unique<dot::node_stmt> (dot::id ("struct3"));
+     xml::element table ("TABLE", false);
+     xml::printer xp (table);
+     xp.set_attr ("BORDER", "0");
+     xp.set_attr ("CELLBORDER", "1");
+     xp.set_attr ("CELLSPACING", "0");
+     xp.set_attr ("CELLPADDING", "4");
+ 
+     xp.push_tag ("TR", false);
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("ROWSPAN", "3");
+     xp.add_text ("hello");
+     xp.append (std::make_unique<xml::element> ("BR", false));
+     xp.add_text ("world");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("COLSPAN", "3");
+     xp.add_text ("b");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("ROWSPAN", "3");
+     xp.add_text ("g");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("ROWSPAN", "3");
+     xp.add_text ("h");
+     xp.pop_tag ("TD");
+ 
+     xp.pop_tag ("TR");
+ 
+     xp.push_tag ("TR", false);
+ 
+     xp.push_tag ("TD", true);
+     xp.add_text ("c");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("PORT", "here");
+     xp.add_text ("d");
+     xp.pop_tag ("TD");
+ 
+     xp.push_tag ("TD", true);
+     xp.add_text ("e");
+     xp.pop_tag ("TD");
+ 
+     xp.pop_tag ("TR");
+ 
+     xp.push_tag ("TR", false);
+ 
+     xp.push_tag ("TD", true);
+     xp.set_attr ("COLSPAN", "3");
+     xp.add_text ("f");
+     xp.pop_tag ("TD");
+ 
+     n->set_label (table);
+     g.add_stmt (std::move (n));
+   }
+ 
+   g.m_stmt_list.add_edge
+     (dot::node_id (dot::id ("struct1"),
+ 		   dot::port (dot::id ("f1"))),
+      dot::node_id (dot::id ("struct2"),
+ 		   dot::port (dot::id ("f0"))));
+   g.m_stmt_list.add_edge
+     (dot::node_id (dot::id ("struct1"),
+ 		   dot::port (dot::id ("f2"))),
+      dot::node_id (dot::id ("struct3"),
+ 		   dot::port (dot::id ("here"))));
+ 
+   pretty_printer pp;
+   dot::writer w (pp);
+   g.print (w);
+ 
+   /* There are some whitespace differences with the example in the
+      GraphViz docs.  */
+   ASSERT_STREQ
+     (pp_formatted_text (&pp),
+      ("digraph structs {\n"
+       "    node [shape=plaintext];\n" // added semicolon
+       "    struct1 [label=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\n"
+       "  <TR><TD>left</TD><TD PORT=\"f1\">mid dle</TD><TD PORT=\"f2\">right</TD></TR>\n"
+       "</TABLE>\n"
+       ">];\n"
+       "    struct2 [label=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\n"
+       "  <TR><TD PORT=\"f0\">one</TD><TD>two</TD></TR>\n"
+       "</TABLE>\n"
+       ">];\n"
+       "    struct3 [label=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"4\">\n"
+       "  <TR>\n"
+       "    <TD ROWSPAN=\"3\">hello<BR/>world</TD>\n"
+       "    <TD COLSPAN=\"3\">b</TD>\n"
+       "    <TD ROWSPAN=\"3\">g</TD>\n"
+       "    <TD ROWSPAN=\"3\">h</TD>\n"
+       "  </TR>\n"
+       "  <TR>\n"
+       "    <TD>c</TD>\n"
+       "    <TD PORT=\"here\">d</TD>\n"
+       "    <TD>e</TD>\n"
+       "  </TR>\n"
+       "  <TR>\n"
+       "    <TD COLSPAN=\"3\">f</TD>\n"
+       "  </TR>\n"
+       "</TABLE>\n"
+       ">];\n"
+       "    struct1:f1 -> struct2:f0;\n"
+       "    struct1:f2 -> struct3:here;\n"
+       "}\n"));
+ }
+ 
+ /* Run all of the selftests within this file.  */
+ 
+ void
+ graphviz_cc_tests ()
+ {
+   test_ids ();
+   test_trivial_graph ();
+   test_layout_example ();
+ }
+ 
+ } // namespace selftest
+ 
+ #endif /* CHECKING_P */
diff -Nrcpad gcc-16-20250622/gcc/graphviz.h gcc-16-20250629/gcc/graphviz.h
*** gcc-16-20250622/gcc/graphviz.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/graphviz.h	Sun Jun 29 22:32:28 2025
*************** along with GCC; see the file COPYING3.
*** 23,32 ****
  
  #include "pretty-print.h" /* for ATTRIBUTE_GCC_PPDIAG.  */
  
  /* A class for writing .dot output to a pretty_printer with
     indentation to show nesting.  */
  
! class graphviz_out {
   public:
    graphviz_out (pretty_printer *pp);
  
--- 23,378 ----
  
  #include "pretty-print.h" /* for ATTRIBUTE_GCC_PPDIAG.  */
  
+ namespace xml { class node; }
+ 
+ namespace dot {
+ 
  /* A class for writing .dot output to a pretty_printer with
     indentation to show nesting.  */
  
! class writer {
! public:
!   writer (pretty_printer &pp);
! 
!   void indent () { m_indent++; }
!   void outdent () { m_indent--; }
! 
!   void write_indent ();
! 
!   void write_character (char ch)
!   {
!     pp_character (&m_pp, ch);
!   }
!   void write_string (const char *str)
!   {
!     pp_string (&m_pp, str);
!   }
!   void write_newline ()
!   {
!     pp_newline (&m_pp);
!   }
! 
!   pretty_printer *get_pp () const { return &m_pp; }
! 
!  private:
!   pretty_printer &m_pp;
!   int m_indent;
! };
! 
! // An AST for the dot language
! // See https://graphviz.org/doc/info/lang.html
! 
! // Forward decls
! 
! struct id;
! struct node_id;
! struct port;
! struct kv_pair;
! struct graph;
! struct attr_list;
! struct stmt_list;
! struct stmt;
!   struct node_stmt;
!   struct attr_stmt;
!   struct kv_stmt;
!   struct edge_stmt;
!   struct subgraph;
! 
! // Decls
! 
! struct ast_node
! {
!   virtual ~ast_node () {}
!   virtual void print (writer &w) const = 0;
! 
!   void dump () const;
! };
! 
! struct id : public ast_node
! {
!   enum class kind
!   {
!     identifier,
!     quoted,
!     html
!   };
! 
!   id (std::string str);
! 
!   /* For HTML labels: see https://graphviz.org/doc/info/shapes.html#html  */
!   id (const xml::node &n);
! 
!   void print (writer &w) const final override;
! 
!   static bool is_identifier_p (const char *);
! 
!   std::string m_str;
!   enum kind m_kind;
! };
! 
! /* ID '=' ID */
! 
! struct kv_pair : ast_node
! {
!   kv_pair (id key, id value)
!   : m_key (std::move (key)),
!     m_value (std::move (value))
!   {
!   }
! 
!   void print (writer &w) const final override;
! 
!   id m_key;
!   id m_value;
! };
! 
! /* attr_list: '[' [ a_list ] ']' [ attr_list ] */
! 
! struct attr_list : public ast_node
! {
!   void print (writer &w) const;
!   void add (id key, id value)
!   {
!     m_kvs.push_back ({std::move (key), std::move (value)});
!   }
! 
!   std::vector<kv_pair> m_kvs;
! };
! 
! /* stmt_list : [ stmt [ ';' ] stmt_list ] */
! 
! struct stmt_list : public ast_node
! {
!   void print (writer &w) const final override;
!   void add_stmt (std::unique_ptr<stmt> s)
!   {
!     m_stmts.push_back (std::move (s));
!   }
!   void add_edge (node_id src_id, node_id dst_id);
!   void add_attr (id key, id value);
! 
!   std::vector<std::unique_ptr<stmt>> m_stmts;
! };
! 
! /* graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'  */
! 
! struct graph : public ast_node
! {
!   graph ()
!   : m_id (nullptr)
!   {
!   }
! 
!   graph (id id_)
!   : m_id (std::make_unique<id> (std::move (id_)))
!   {
!   }
! 
!   void print (writer &w) const final override;
! 
!   void add_stmt (std::unique_ptr<stmt> s)
!   {
!     m_stmt_list.add_stmt (std::move (s));
!   }
! 
!   std::unique_ptr<id> m_id; // optional
!   stmt_list m_stmt_list;
! };
! 
! /* Abstract base class.
!      stmt : node_stmt
! 	  | edge_stmt
! 	  | attr_stmt
! 	  | ID '=' ID ("kv_stmt")
! 	  | subgraph  */
! 
! struct stmt
! {
!   virtual ~stmt () {}
!   virtual void print (writer &w) const = 0;
! };
! 
! struct stmt_with_attr_list : public stmt
! {
!   void set_attr (id key, id value)
!   {
!     m_attrs.add (std::move (key), std::move (value));
!   }
!   void set_label (dot::id label);
! 
!   attr_list m_attrs;
! };
! 
! struct node_stmt : public stmt_with_attr_list
! {
!   node_stmt (id id_)
!   : m_id (id_)
!   {
!   }
! 
!   void print (writer &w) const final override;
! 
!   id m_id;
! };
! 
! struct attr_stmt : public stmt_with_attr_list
! {
!   enum class kind { graph, node, edge };
! 
!   attr_stmt (enum kind kind_)
!   : m_kind (kind_)
!   {
!   }
! 
!   void print (writer &w) const final override;
! 
!   enum kind m_kind;
! };
! 
! /* "ID '=' ID" as a stmt.  */
! 
! struct kv_stmt : public stmt
! {
!   kv_stmt (kv_pair kv)
!   : m_kv (std::move (kv))
!   {}
! 
!   void print (writer &w) const final override;
! 
!   kv_pair m_kv;
! };
! 
! /* node_id : ID [ port ] */
! 
! enum class compass_pt
! {
!  n, ne, e, se, s, sw, w, nw, c
!  /* "_" clashes with intl macro */
! };
! 
! /* port : ':' ID [ ':' compass_pt ]
!         | ':' compass_pt
! */
! 
! struct port : public ast_node
! {
!   port (id id_)
!   : m_id (std::make_unique<id> (std::move (id_))),
!     m_compass_pt (nullptr)
!   {
!   }
! 
!   port (enum compass_pt compass_pt_)
!   : m_id (nullptr),
!     m_compass_pt (std::make_unique<compass_pt> (compass_pt_))
!   {
!   }
! 
!   port (id id_,
! 	enum compass_pt compass_pt_)
!   : m_id (std::make_unique<id> (std::move (id_))),
!     m_compass_pt (std::make_unique<compass_pt> (compass_pt_))
!   {
!   }
! 
!   port (const port &other)
!   : m_id (nullptr),
!     m_compass_pt (nullptr)
!   {
!     if (other.m_id)
!       m_id = std::make_unique<id> (*other.m_id);
!     if (other.m_compass_pt)
!       m_compass_pt = std::make_unique<enum compass_pt> (*other.m_compass_pt);
!   }
! 
!   void print (writer &w) const final override;
! 
!   std::unique_ptr<id> m_id; // would be std::optional
!   std::unique_ptr<enum compass_pt> m_compass_pt; // would be std::optional
! };
! 
! struct node_id : public ast_node
! {
!   node_id (id id_)
!   : m_id (id_),
!     m_port (nullptr)
!   {
!   }
!   node_id (id id_, port port_)
!   : m_id (id_),
!     m_port (std::make_unique<port> (std::move (port_)))
!   {
!   }
!   node_id (const node_id &other)
!   : m_id (other.m_id),
!     m_port (nullptr)
!   {
!     if (other.m_port)
!       m_port = std::make_unique<port> (*other.m_port);
!   }
! 
!   void print (writer &w) const final override;
! 
!   id m_id;
!   std::unique_ptr<port> m_port; // would be std::optional
! };
! 
! /* The full grammar for edge_stmt is:
!      edge_stmt  : (node_id | subgraph) edgeRHS [ attr_list ]
!      edgeRHS    : edgeop (node_id | subgraph) [ edgeRHS ]
!    This class support the subsets where all are "node_id", rather than
!    "subgraph", and doesn't yet support "port" giving effectively:
!       node_id (edgeop node_id)+ [ attr_list]
!  */
! 
! struct edge_stmt : public stmt_with_attr_list
! {
!   edge_stmt (node_id src_id, node_id dst_id)
!   {
!     m_node_ids.push_back (std::move (src_id));
!     m_node_ids.push_back (std::move (dst_id));
!   }
! 
!   void print (writer &w) const final override;
! 
!   std::vector<node_id> m_node_ids; // should have 2 or more elements
! };
! 
! /* [ subgraph [ ID ] ] '{' stmt_list '}' */
! 
! struct subgraph : public stmt
! {
!   subgraph (id id_)
!   : m_id (id_)
!   {
!   }
! 
!   void print (writer &w) const final override;
! 
!   void add_stmt (std::unique_ptr<stmt> s)
!   {
!     m_stmt_list.add_stmt (std::move (s));
!   }
!   void add_attr (id key, id value)
!   {
!     m_stmt_list.add_stmt
!       (std::make_unique <kv_stmt> (kv_pair (std::move (key),
! 					    std::move (value))));
!   }
! 
!   id m_id;
!   stmt_list m_stmt_list;
! };
! 
! extern std::unique_ptr<xml::node>
! make_svg_from_graph (const graph &g);
! 
! } // namespace dot
! 
! /* A class for writing .dot output to a pretty_printer with
!    indentation to show nesting.  */
! 
! class graphviz_out : public dot::writer {
   public:
    graphviz_out (pretty_printer *pp);
  
*************** class graphviz_out {
*** 35,45 ****
    void println (const char *fmt, ...)
      ATTRIBUTE_GCC_PPDIAG(2,3);
  
-   void indent () { m_indent++; }
-   void outdent () { m_indent--; }
- 
-   void write_indent ();
- 
    void begin_tr ();
    void end_tr ();
  
--- 381,386 ----
*************** class graphviz_out {
*** 48,59 ****
  
    void begin_trtd ();
    void end_tdtr ();
- 
-   pretty_printer *get_pp () const { return m_pp; }
- 
-  private:
-   pretty_printer *m_pp;
-   int m_indent;
  };
  
  #endif /* GCC_GRAPHVIZ_H */
--- 389,394 ----
diff -Nrcpad gcc-16-20250622/gcc/ipa-inline.cc gcc-16-20250629/gcc/ipa-inline.cc
*** gcc-16-20250622/gcc/ipa-inline.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/ipa-inline.cc	Sun Jun 29 22:32:28 2025
*************** early_inline_small_functions (struct cgr
*** 3120,3126 ****
  static bool
  inline_functions_by_afdo (struct cgraph_node *node, bool *speculative_calls)
  {
!   if (!flag_auto_profile)
      return false;
    struct cgraph_edge *e;
    bool inlined = false;
--- 3120,3126 ----
  static bool
  inline_functions_by_afdo (struct cgraph_node *node, bool *speculative_calls)
  {
!   if (!flag_auto_profile || !flag_auto_profile_inlining)
      return false;
    struct cgraph_edge *e;
    bool inlined = false;
*************** early_inliner (function *fun)
*** 3320,3325 ****
--- 3320,3344 ----
  	fprintf (dump_file, "Iterations: %i\n", iterations);
      }
  
+   /* do AFDO inlining in case it was not done as part of early inlining.  */
+   if (optimize
+       && !flag_no_inline
+       && !flag_early_inlining
+       && flag_auto_profile_inlining)
+     {
+       bool speculative_calls = false;
+       inlined |= inline_functions_by_afdo (node, &speculative_calls);
+       if (speculative_calls)
+ 	{
+ 	  cgraph_edge *next;
+ 	  for (cgraph_edge *e = node->callees; e; e = next)
+ 	    {
+ 	      next = e->next_callee;
+ 	      cgraph_edge::redirect_call_stmt_to_callee (e);
+ 	    }
+ 	}
+     }
+ 
    if (inlined)
      {
        timevar_push (TV_INTEGRATION);
diff -Nrcpad gcc-16-20250622/gcc/libgdiagnostics++.h gcc-16-20250629/gcc/libgdiagnostics++.h
*** gcc-16-20250622/gcc/libgdiagnostics++.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/libgdiagnostics++.h	Sun Jun 29 22:32:28 2025
*************** public:
*** 329,334 ****
--- 329,345 ----
  				       version);
    }
  
+   bool
+   add_sink_from_spec (const char *option_name,
+ 		      const char *spec,
+ 		      manager control_mgr)
+   {
+     return diagnostic_manager_add_sink_from_spec (m_inner,
+ 						  option_name,
+ 						  spec,
+ 						  control_mgr.m_inner);
+   }
+ 
    void
    write_patch (FILE *dst_stream)
    {
*************** public:
*** 381,386 ****
--- 392,399 ----
    diagnostic
    begin_diagnostic (enum diagnostic_level level);
  
+   void
+   set_analysis_target (file f);
  
    diagnostic_manager *m_inner;
    bool m_owned;
*************** manager::begin_diagnostic (enum diagnost
*** 683,688 ****
--- 696,707 ----
    return diagnostic (diagnostic_begin (m_inner, level));
  }
  
+ inline void
+ manager::set_analysis_target (file f)
+ {
+   diagnostic_manager_set_analysis_target (m_inner, f.m_inner);
+ }
+ 
  } // namespace libgdiagnostics
  
  #endif // #ifndef LIBGDIAGNOSTICSPP_H
diff -Nrcpad gcc-16-20250622/gcc/libgdiagnostics.cc gcc-16-20250629/gcc/libgdiagnostics.cc
*** gcc-16-20250622/gcc/libgdiagnostics.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/libgdiagnostics.cc	Sun Jun 29 22:32:28 2025
*************** along with GCC; see the file COPYING3.
*** 31,36 ****
--- 31,37 ----
  #include "diagnostic-client-data-hooks.h"
  #include "diagnostic-format-sarif.h"
  #include "diagnostic-format-text.h"
+ #include "diagnostic-output-spec.h"
  #include "logical-location.h"
  #include "edit-context.h"
  #include "libgdiagnostics.h"
*************** diagnostic_logical_location_get_decorate
*** 1983,1985 ****
--- 1984,2050 ----
  
    return loc->m_decorated_name.get_str ();
  }
+ 
+ namespace {
+ 
+ struct spec_context : public diagnostics_output_spec::context
+ {
+ public:
+   spec_context (const char *option_name,
+ 		diagnostic_manager &affected_mgr,
+ 		diagnostic_manager &control_mgr)
+   : context (option_name, affected_mgr.get_line_table ()),
+     m_control_mgr (control_mgr)
+   {}
+ 
+   void report_error_va (const char *gmsgid, va_list *ap) const final override
+   {
+     diagnostic *diag
+       = diagnostic_begin (&m_control_mgr, DIAGNOSTIC_LEVEL_ERROR);
+     diagnostic_finish_va (diag, gmsgid, ap);
+   }
+ 
+   const char *
+   get_base_filename () const final override
+   {
+     return nullptr;
+   }
+ 
+ private:
+   diagnostic_manager &m_control_mgr;
+ };
+ 
+ } // anon namespace
+ 
+ /* Public entrypoint.  */
+ 
+ int
+ diagnostic_manager_add_sink_from_spec (diagnostic_manager *affected_mgr,
+ 				       const char *option_name,
+ 				       const char *spec,
+ 				       diagnostic_manager *control_mgr)
+ {
+   FAIL_IF_NULL (affected_mgr);
+   FAIL_IF_NULL (option_name);
+   FAIL_IF_NULL (spec);
+   FAIL_IF_NULL (control_mgr);
+ 
+   spec_context ctxt (option_name, *affected_mgr, *control_mgr);
+   auto inner_sink = ctxt.parse_and_make_sink (spec, affected_mgr->get_dc ());
+   if (!inner_sink)
+     return -1;
+   affected_mgr->get_dc ().add_sink (std::move (inner_sink));
+   return 0;
+ }
+ 
+ /* Public entrypoint.  */
+ 
+ void
+ diagnostic_manager_set_analysis_target (diagnostic_manager *mgr,
+ 					const diagnostic_file *file)
+ {
+   FAIL_IF_NULL (mgr);
+   FAIL_IF_NULL (file);
+ 
+   mgr->get_dc ().set_main_input_filename (file->get_name ());
+ }
diff -Nrcpad gcc-16-20250622/gcc/libgdiagnostics.h gcc-16-20250629/gcc/libgdiagnostics.h
*** gcc-16-20250622/gcc/libgdiagnostics.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/libgdiagnostics.h	Sun Jun 29 22:32:28 2025
*************** extern diagnostic_file *
*** 734,739 ****
--- 734,770 ----
  diagnostic_physical_location_get_file (const diagnostic_physical_location *physical_loc)
    LIBGDIAGNOSTICS_PARAM_CAN_BE_NULL(0);
  
+ /* Attempt to parse SPEC as if an argument to GCC's
+    -fdiagnostics-add-output=OUTPUT-SPEC.
+    If successful, add an output sink to AFFECTED_MGR and return zero.
+    Otherwise, emit a diagnostic to CONTROL_MGR and return non-zero.
+    Added in LIBGDIAGNOSTICS_ABI_2.  */
+ #define LIBDIAGNOSTICS_HAVE_diagnostic_manager_add_sink_from_spec
+ 
+ extern int
+ diagnostic_manager_add_sink_from_spec (diagnostic_manager *affected_mgr,
+ 				       const char *option_name,
+ 				       const char *spec,
+ 				       diagnostic_manager *control_mgr)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (1)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (2)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (3)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (4);
+ 
+ 
+ /* Set the main input file of MGR to be FILE.
+    This affects the <title> of generated HTML and
+    the "role" of the artifact in SARIF output (SARIF v2.1.0
+    section 3.24.6).
+    Added in LIBGDIAGNOSTICS_ABI_2.  */
+ #define LIBDIAGNOSTICS_HAVE_diagnostic_manager_set_analysis_target
+ 
+ extern void
+ diagnostic_manager_set_analysis_target (diagnostic_manager *mgr,
+ 					const diagnostic_file *file)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (1)
+   LIBGDIAGNOSTICS_PARAM_MUST_BE_NON_NULL (2);
+ 
  /* DEFERRED:
     - thread-safety
     - plural forms
diff -Nrcpad gcc-16-20250622/gcc/libgdiagnostics.map gcc-16-20250629/gcc/libgdiagnostics.map
*** gcc-16-20250622/gcc/libgdiagnostics.map	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/libgdiagnostics.map	Sun Jun 29 22:32:28 2025
*************** LIBGDIAGNOSTICS_ABI_1 {
*** 83,85 ****
--- 83,92 ----
      diagnostic_logical_location_get_fully_qualified_name;
      diagnostic_logical_location_get_decorated_name;
  } LIBGDIAGNOSTICS_ABI_0;
+ 
+ # Add hooks needed for HTML output from sarif-replay
+ LIBGDIAGNOSTICS_ABI_2 {
+   global:
+     diagnostic_manager_add_sink_from_spec;
+     diagnostic_manager_set_analysis_target;
+ } LIBGDIAGNOSTICS_ABI_1;
diff -Nrcpad gcc-16-20250622/gcc/libsarifreplay.cc gcc-16-20250629/gcc/libsarifreplay.cc
*** gcc-16-20250622/gcc/libsarifreplay.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/libsarifreplay.cc	Sun Jun 29 22:32:28 2025
*************** sarif_replayer::handle_artifact_obj (con
*** 966,971 ****
--- 966,982 ----
    auto file = m_output_mgr.new_file (artifact_loc_uri->get_string (),
  				     sarif_source_language);
  
+   // 3.24.6 "roles" property
+   const property_spec_ref prop_roles
+     ("artifact", "roles", "3.24.6");
+   if (auto roles_obj
+       = get_optional_property<json::array> (artifact_obj,
+ 					    prop_roles))
+     for (auto iter : *roles_obj)
+       if (auto str = require_string (*iter, prop_roles))
+ 	if (!strcmp (str->get_string (), "analysisTarget"))
+ 	  m_output_mgr.set_analysis_target (file);
+ 
    // Set contents, if available
    const property_spec_ref prop_contents
      ("artifact", "contents", "3.24.8");
diff -Nrcpad gcc-16-20250622/gcc/lra-eliminations.cc gcc-16-20250629/gcc/lra-eliminations.cc
*** gcc-16-20250622/gcc/lra-eliminations.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lra-eliminations.cc	Sun Jun 29 22:32:28 2025
*************** move_plus_up (rtx x)
*** 309,316 ****
    return x;
  }
  
! /* Flag that we already did frame pointer to stack pointer elimination.  */
! static bool elimination_fp2sp_occured_p = false;
  
  /* Scan X and replace any eliminable registers (such as fp) with a
     replacement (such as sp) if SUBST_P, plus an offset.  The offset is
--- 309,326 ----
    return x;
  }
  
! /* Flag that we already applied nonzero stack pointer elimination
!    offset; such sp updates cannot currently be undone.  */
! static bool elimination_2sp_occurred_p = false;
! 
! /* Take note of any nonzero sp-OFFSET used in eliminations to sp.  */
! static inline poly_int64
! note_spoff (poly_int64 offset)
! {
!   if (maybe_ne (offset, 0))
!     elimination_2sp_occurred_p = true;
!   return offset;
! }
  
  /* Scan X and replace any eliminable registers (such as fp) with a
     replacement (such as sp) if SUBST_P, plus an offset.  The offset is
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 369,381 ****
  	{
  	  rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
- 	  if (ep->to_rtx == stack_pointer_rtx && ep->from == FRAME_POINTER_REGNUM)
- 	    elimination_fp2sp_occured_p = true;
- 
  	  if (maybe_ne (update_sp_offset, 0))
  	    {
  	      if (ep->to_rtx == stack_pointer_rtx)
! 		return plus_constant (Pmode, to, update_sp_offset);
  	      return to;
  	    }
  	  else if (update_p)
--- 379,388 ----
  	{
  	  rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
  	  if (maybe_ne (update_sp_offset, 0))
  	    {
  	      if (ep->to_rtx == stack_pointer_rtx)
! 		return plus_constant (Pmode, to, note_spoff (update_sp_offset));
  	      return to;
  	    }
  	  else if (update_p)
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 385,391 ****
  				  ep->offset
  				  - (insn != NULL_RTX
  				     && ep->to_rtx == stack_pointer_rtx
! 				     ? lra_get_insn_recog_data (insn)->sp_offset
  				     : 0));
  	  else
  	    return to;
--- 392,399 ----
  				  ep->offset
  				  - (insn != NULL_RTX
  				     && ep->to_rtx == stack_pointer_rtx
! 				     ? note_spoff (lra_get_insn_recog_data
! 						   (insn)->sp_offset)
  				     : 0));
  	  else
  	    return to;
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 402,420 ****
  	      poly_int64 offset, curr_offset;
  	      rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
- 	      if (ep->to_rtx == stack_pointer_rtx && ep->from == FRAME_POINTER_REGNUM)
- 		elimination_fp2sp_occured_p = true;
- 
  	      if (! update_p && ! full_p)
  		return simplify_gen_binary (PLUS, Pmode, to, XEXP (x, 1));
  
  	      if (maybe_ne (update_sp_offset, 0))
! 		offset = ep->to_rtx == stack_pointer_rtx ? update_sp_offset : 0;
  	      else
  		offset = (update_p
  			  ? ep->offset - ep->previous_offset : ep->offset);
  	      if (full_p && insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
! 		offset -= lra_get_insn_recog_data (insn)->sp_offset;
  	      if (poly_int_rtx_p (XEXP (x, 1), &curr_offset)
  		  && known_eq (curr_offset, -offset))
  		return to;
--- 410,427 ----
  	      poly_int64 offset, curr_offset;
  	      rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
  	      if (! update_p && ! full_p)
  		return simplify_gen_binary (PLUS, Pmode, to, XEXP (x, 1));
  
  	      if (maybe_ne (update_sp_offset, 0))
! 		offset = (ep->to_rtx == stack_pointer_rtx
! 			  ? note_spoff (update_sp_offset)
! 			  : 0);
  	      else
  		offset = (update_p
  			  ? ep->offset - ep->previous_offset : ep->offset);
  	      if (full_p && insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
! 		offset -= note_spoff (lra_get_insn_recog_data (insn)->sp_offset);
  	      if (poly_int_rtx_p (XEXP (x, 1), &curr_offset)
  		  && known_eq (curr_offset, -offset))
  		return to;
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 465,479 ****
  	{
  	  rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
- 	  if (ep->to_rtx == stack_pointer_rtx && ep->from == FRAME_POINTER_REGNUM)
- 	    elimination_fp2sp_occured_p = true;
- 
  	  if (maybe_ne (update_sp_offset, 0))
  	    {
  	      if (ep->to_rtx == stack_pointer_rtx)
  		return plus_constant (Pmode,
  				      gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
! 				      update_sp_offset * INTVAL (XEXP (x, 1)));
  	      return gen_rtx_MULT (Pmode, to, XEXP (x, 1));
  	    }
  	  else if (update_p)
--- 472,484 ----
  	{
  	  rtx to = subst_p ? ep->to_rtx : ep->from_rtx;
  
  	  if (maybe_ne (update_sp_offset, 0))
  	    {
  	      if (ep->to_rtx == stack_pointer_rtx)
  		return plus_constant (Pmode,
  				      gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
! 				      note_spoff (update_sp_offset)
! 				      * INTVAL (XEXP (x, 1)));
  	      return gen_rtx_MULT (Pmode, to, XEXP (x, 1));
  	    }
  	  else if (update_p)
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 486,492 ****
  	      poly_int64 offset = ep->offset;
  
  	      if (insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
! 		offset -= lra_get_insn_recog_data (insn)->sp_offset;
  	      return
  		plus_constant (Pmode,
  			       gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
--- 491,497 ----
  	      poly_int64 offset = ep->offset;
  
  	      if (insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx)
! 		offset -= note_spoff (lra_get_insn_recog_data (insn)->sp_offset);
  	      return
  		plus_constant (Pmode,
  			       gen_rtx_MULT (Pmode, to, XEXP (x, 1)),
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 571,576 ****
--- 576,584 ----
      case POST_INC:
      case PRE_DEC:
      case POST_DEC:
+       /* Recurse to adjust elimination offsets in a spilled pseudo.  */
+       if (GET_CODE (XEXP (x, 0)) == MEM)
+ 	break;
        /* We do not support elimination of a register that is modified.
  	 elimination_effects has already make sure that this does not
  	 happen.  */
*************** lra_eliminate_regs_1 (rtx_insn *insn, rt
*** 578,583 ****
--- 586,594 ----
  
      case PRE_MODIFY:
      case POST_MODIFY:
+       /* Recurse to adjust elimination offsets in a spilled pseudo.  */
+       if (GET_CODE (XEXP (x, 0)) == MEM)
+ 	break;
        /* We do not support elimination of a hard register that is
  	 modified.  LRA has already make sure that this does not
  	 happen. The only remaining case we need to consider here is
*************** update_reg_eliminate (bitmap insns_with_
*** 1172,1178 ****
        /* If it is a currently used elimination: update the previous
  	 offset.  */
        if (elimination_map[ep->from] == ep)
! 	ep->previous_offset = ep->offset;
  
        prev = ep->prev_can_eliminate;
        setup_can_eliminate (ep, targetm.can_eliminate (ep->from, ep->to));
--- 1183,1198 ----
        /* If it is a currently used elimination: update the previous
  	 offset.  */
        if (elimination_map[ep->from] == ep)
! 	{
! 	  ep->previous_offset = ep->offset;
! 	  /* Restore the stack_pointer_rtx into to_rtx, that
! 	     lra_update_fp2sp_elimination set to from_rtx, so that the assert
! 	     below still checks what it was supposed to check.  */
! 	  if (ep->from_rtx == ep->to_rtx
! 	      && ep->from != ep->to
! 	      && ep->from == FRAME_POINTER_REGNUM)
! 	    ep->to_rtx = stack_pointer_rtx;
! 	}
  
        prev = ep->prev_can_eliminate;
        setup_can_eliminate (ep, targetm.can_eliminate (ep->from, ep->to));
*************** update_reg_eliminate (bitmap insns_with_
*** 1198,1205 ****
  	     pointer elimination the condition is a bit relaxed and we just require
  	     that actual elimination has not been done yet.   */
  	  gcc_assert (ep->to_rtx != stack_pointer_rtx
! 		      || (ep->from == FRAME_POINTER_REGNUM
! 			  && !elimination_fp2sp_occured_p)
  		      || (ep->from < FIRST_PSEUDO_REGISTER
  			  && fixed_regs [ep->from]));
  
--- 1218,1224 ----
  	     pointer elimination the condition is a bit relaxed and we just require
  	     that actual elimination has not been done yet.   */
  	  gcc_assert (ep->to_rtx != stack_pointer_rtx
! 		      || !elimination_2sp_occurred_p
  		      || (ep->from < FIRST_PSEUDO_REGISTER
  			  && fixed_regs [ep->from]));
  
*************** lra_update_fp2sp_elimination (int *spill
*** 1414,1430 ****
  
    if (frame_pointer_needed || !targetm.frame_pointer_required ())
      return 0;
!   gcc_assert (!elimination_fp2sp_occured_p);
    if (lra_dump_file != NULL)
      fprintf (lra_dump_file,
  	     "	   Frame pointer can not be eliminated anymore\n");
    frame_pointer_needed = true;
    CLEAR_HARD_REG_SET (set);
    add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM);
    n = spill_pseudos (set, spilled_pseudos);
-   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
-     if (ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM)
-       setup_can_eliminate (ep, false);
    return n;
  }
  
--- 1433,1469 ----
  
    if (frame_pointer_needed || !targetm.frame_pointer_required ())
      return 0;
!   gcc_assert (!elimination_2sp_occurred_p);
!   ep = elimination_map[FRAME_POINTER_REGNUM];
!   if (ep->to == STACK_POINTER_REGNUM)
!     {
!       /* Prevent any further uses of fp, say in spill addresses, from being
! 	 eliminated to sp and affected by sp offsets.  Alas, deactivating the
! 	 elimination altogether causes the next chosen fp elimination to miss
! 	 the offset propagation, so it may keep -1 as its prev_offset, and that
! 	 will make subsequent offsets incorrect.  */
!       ep->to_rtx = ep->from_rtx;
!       setup_can_eliminate (ep, false);
!     }
!   else
!     for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
!       if (ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM)
! 	setup_can_eliminate (ep, false);
    if (lra_dump_file != NULL)
      fprintf (lra_dump_file,
  	     "	   Frame pointer can not be eliminated anymore\n");
    frame_pointer_needed = true;
+   /* If !lra_reg_spill_p, we likely have incomplete range information
+      for pseudos assigned to the frame pointer that will have to be
+      spilled, and so we may end up incorrectly sharing them unless we
+      get live range information for them.  */
+   if (lra_complete_live_ranges ())
+     /* If lives ranges changed, update the aggregate live ranges in
+        slots as well before spilling any further pseudos.  */
+     lra_recompute_slots_live_ranges ();
    CLEAR_HARD_REG_SET (set);
    add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM);
    n = spill_pseudos (set, spilled_pseudos);
    return n;
  }
  
*************** lra_eliminate (bool final_p, bool first_
*** 1464,1470 ****
  
    if (first_p)
      {
!       elimination_fp2sp_occured_p = false;
        init_elimination ();
      }
  
--- 1503,1509 ----
  
    if (first_p)
      {
!       elimination_2sp_occurred_p = false;
        init_elimination ();
      }
  
diff -Nrcpad gcc-16-20250622/gcc/lra-int.h gcc-16-20250629/gcc/lra-int.h
*** gcc-16-20250622/gcc/lra-int.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lra-int.h	Sun Jun 29 22:32:28 2025
*************** extern int *lra_point_freq;
*** 381,387 ****
--- 381,389 ----
  extern int lra_hard_reg_usage[FIRST_PSEUDO_REGISTER];
  
  extern int lra_live_range_iter;
+ extern void lra_reset_live_range_list (lra_live_range_t &);
  extern void lra_create_live_ranges (bool, bool);
+ extern bool lra_complete_live_ranges (void);
  extern lra_live_range_t lra_copy_live_range_list (lra_live_range_t);
  extern lra_live_range_t lra_merge_live_ranges (lra_live_range_t,
  					       lra_live_range_t);
*************** extern bool lra_need_for_scratch_reg_p (
*** 417,422 ****
--- 419,425 ----
  extern bool lra_need_for_spills_p (void);
  extern void lra_spill (void);
  extern void lra_final_code_change (void);
+ extern void lra_recompute_slots_live_ranges (void);
  
  /* lra-remat.cc:  */
  
diff -Nrcpad gcc-16-20250622/gcc/lra-lives.cc gcc-16-20250629/gcc/lra-lives.cc
*** gcc-16-20250622/gcc/lra-lives.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lra-lives.cc	Sun Jun 29 22:32:28 2025
*************** free_live_range_list (lra_live_range_t l
*** 113,118 ****
--- 113,127 ----
      }
  }
  
+ /* Reset and release live range list LR.  */
+ void
+ lra_reset_live_range_list (lra_live_range_t &lr)
+ {
+   lra_live_range_t first = lr;
+   lr = NULL;
+   free_live_range_list (first);
+ }
+ 
  /* Create and return pseudo live range with given attributes.  */
  static lra_live_range_t
  create_live_range (int regno, int start, int finish, lra_live_range_t next)
*************** lra_create_live_ranges (bool all_p, bool
*** 1524,1529 ****
--- 1533,1551 ----
    lra_assert (! res);
  }
  
+ /* Run lra_create_live_ranges if !complete_info_p.  Return FALSE iff
+    live ranges are known to have remained unchanged.  */
+ 
+ bool
+ lra_complete_live_ranges (void)
+ {
+   if (complete_info_p)
+     return false;
+ 
+   lra_create_live_ranges (true, true);
+   return true;
+ }
+ 
  /* Finish all live ranges.  */
  void
  lra_clear_live_ranges (void)
diff -Nrcpad gcc-16-20250622/gcc/lra-spills.cc gcc-16-20250629/gcc/lra-spills.cc
*** gcc-16-20250622/gcc/lra-spills.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lra-spills.cc	Sun Jun 29 22:32:28 2025
*************** assign_spill_hard_regs (int *pseudo_regn
*** 261,266 ****
--- 261,267 ----
    for (res = i = 0; i < n; i++)
      {
        regno = pseudo_regnos[i];
+       gcc_assert (lra_reg_info[regno].live_ranges);
        rclass = lra_get_allocno_class (regno);
        if (bitmap_bit_p (setjump_crosses, regno)
  	  || (spill_class
*************** add_pseudo_to_slot (int regno, int slot_
*** 346,360 ****
--- 347,397 ----
        first = pseudo_slots[regno].first = &pseudo_slots[slots[slot_num].regno];
        pseudo_slots[regno].next = first->next;
        first->next = &pseudo_slots[regno];
+       lra_assert (slots[slot_num].live_ranges);
      }
    pseudo_slots[regno].mem = NULL_RTX;
    pseudo_slots[regno].slot_num = slot_num;
+ 
+   /* Pseudos with empty ranges shouldn't need to be spilled; if we get
+      an empty range added to a slot, something fishy is going on, such
+      as missing live range information, and without that information
+      we may generate wrong code.  We can probably relax this to an
+      lra_assert at some point.  Likewise the analogous one in
+      assign_spill_hard_regs.  */
+   gcc_assert (lra_reg_info[regno].live_ranges);
+ 
    slots[slot_num].live_ranges
      = lra_merge_live_ranges (slots[slot_num].live_ranges,
  			     lra_copy_live_range_list
  			     (lra_reg_info[regno].live_ranges));
  }
  
+ /* Recompute the combined live ranges of pseudos assigned to stack
+    slots.  This brings the live ranges of slots back in sync with
+    those of pseudos, after recomputing live ranges for pseudos.  */
+ void
+ lra_recompute_slots_live_ranges (void)
+ {
+   for (int i = 0; i < slots_num; i++)
+     {
+       if (slots[i].regno < 0)
+ 	continue;
+       lra_reset_live_range_list (slots[i].live_ranges);
+       for (struct pseudo_slot *next = pseudo_slots[slots[i].regno].first;
+ 	   next; next = next->next)
+ 	{
+ 	  int regno = next - pseudo_slots;
+ 	  lra_assert (!(lra_intersected_live_ranges_p
+ 			(lra_reg_info[regno].live_ranges,
+ 			 slots[i].live_ranges)));
+ 	  slots[i].live_ranges
+ 	    = lra_merge_live_ranges (slots[i].live_ranges,
+ 				     lra_copy_live_range_list
+ 				     (lra_reg_info[regno].live_ranges));
+ 	}
+     }
+ }
+ 
  /* Assign stack slot numbers to pseudos in array PSEUDO_REGNOS of
     length N.  Sort pseudos in PSEUDO_REGNOS for subsequent assigning
     memory stack slots.	*/
diff -Nrcpad gcc-16-20250622/gcc/lto-ltrans-cache.cc gcc-16-20250629/gcc/lto-ltrans-cache.cc
*** gcc-16-20250622/gcc/lto-ltrans-cache.cc	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lto-ltrans-cache.cc	Sun Jun 29 22:32:28 2025
*************** write_cache_item (FILE* f, ltrans_file_c
*** 210,217 ****
  ltrans_file_cache::ltrans_file_cache (const char* dir, const char* prefix,
  				      const char* suffix,
  				      size_t soft_cache_size):
!   dir (dir), prefix (prefix), suffix (suffix),
!   soft_cache_size (soft_cache_size)
  {
    if (!dir) return;
  
--- 210,216 ----
  ltrans_file_cache::ltrans_file_cache (const char* dir, const char* prefix,
  				      const char* suffix,
  				      size_t soft_cache_size):
!   dir (dir), suffix (suffix),  soft_cache_size (soft_cache_size)
  {
    if (!dir) return;
  
diff -Nrcpad gcc-16-20250622/gcc/lto-ltrans-cache.h gcc-16-20250629/gcc/lto-ltrans-cache.h
*** gcc-16-20250622/gcc/lto-ltrans-cache.h	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/lto-ltrans-cache.h	Sun Jun 29 22:32:28 2025
*************** private:
*** 122,129 ****
    std::map<checksum_t, item*> map_checksum;
    std::map<std::string, item*> map_input;
  
!   /* Cached filenames are in format "prefix%d[.ltrans]suffix".  */
!   const char* prefix;
    const char* suffix;
  
    /* If cache items count is larger, prune deletes old items.  */
--- 122,128 ----
    std::map<checksum_t, item*> map_checksum;
    std::map<std::string, item*> map_input;
  
!   /* Cached filenames are in format "cache_prefix%d[.ltrans]suffix".  */
    const char* suffix;
  
    /* If cache items count is larger, prune deletes old items.  */
diff -Nrcpad gcc-16-20250622/gcc/m2/ChangeLog gcc-16-20250629/gcc/m2/ChangeLog
*** gcc-16-20250622/gcc/m2/ChangeLog	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/m2/ChangeLog	Sun Jun 29 22:32:28 2025
***************
*** 1,3 ****
--- 1,10 ----
+ 2025-06-22  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120731
+ 	* gm2-libs-log/Strings.def (Delete): Rewrite comment.
+ 	* gm2-libs-log/Strings.mod (Pos): Rewrite.
+ 	(PosLower): New procedure function.
+ 
  2025-06-21  Gaius Mulley  <gaiusmod2@gmail.com>
  
  	* gm2-compiler/M2GCCDeclare.mod (StartDeclareModuleScopeSeparate):
diff -Nrcpad gcc-16-20250622/gcc/match.pd gcc-16-20250629/gcc/match.pd
*** gcc-16-20250622/gcc/match.pd	Sun Jun 22 22:32:20 2025
--- gcc-16-20250629/gcc/match.pd	Sun Jun 29 22:32:29 2025
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 2357,2363 ****
  /* ~~x -> x */
  (simplify
    (bit_not (bit_not @0))
!   @0)
  
  /* zero_one_valued_p will match when a value is known to be either
     0 or 1 including constants 0 or 1.
--- 2357,2363 ----
  /* ~~x -> x */
  (simplify
    (bit_not (bit_not @0))
!   (non_lvalue @0))
  
  /* zero_one_valued_p will match when a value is known to be either
     0 or 1 including constants 0 or 1.
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 4037,4043 ****
    (negate (nop_convert? (negate @1)))
    (if (!TYPE_OVERFLOW_SANITIZED (type)
         && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@1)))
!    (view_convert @1)))
  
   /* We can't reassociate floating-point unless -fassociative-math
      or fixed-point plus or minus because of saturation to +-Inf.  */
--- 4037,4043 ----
    (negate (nop_convert? (negate @1)))
    (if (!TYPE_OVERFLOW_SANITIZED (type)
         && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@1)))
!    (non_lvalue (view_convert @1))))
  
   /* We can't reassociate floating-point unless -fassociative-math
      or fixed-point plus or minus because of saturation to +-Inf.  */
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 5767,5773 ****
  (simplify
   (conj (convert? (conj @0)))
   (if (tree_nop_conversion_p (TREE_TYPE (@0), type))
!   (convert @0)))
  
  /* conj({x,y}) -> {x,-y}  */
  (simplify
--- 5767,5773 ----
  (simplify
   (conj (convert? (conj @0)))
   (if (tree_nop_conversion_p (TREE_TYPE (@0), type))
!   (non_lvalue (convert @0))))
  
  /* conj({x,y}) -> {x,-y}  */
  (simplify
diff -Nrcpad gcc-16-20250622/gcc/opts-diagnostic.cc gcc-16-20250629/gcc/opts-diagnostic.cc
*** gcc-16-20250622/gcc/opts-diagnostic.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/opts-diagnostic.cc	Sun Jun 29 22:32:29 2025
*************** along with GCC; see the file COPYING3.
*** 19,25 ****
  
  
  /* This file implements the options -fdiagnostics-add-output=,
!    -fdiagnostics-set-output=, and their domain-specific language.  */
  
  #include "config.h"
  #define INCLUDE_ARRAY
--- 19,26 ----
  
  
  /* This file implements the options -fdiagnostics-add-output=,
!    -fdiagnostics-set-output=.  Most of the work is done
!    by diagnostic-output-spec.cc so it can be shared by libgdiagnostics.  */
  
  #include "config.h"
  #define INCLUDE_ARRAY
*************** along with GCC; see the file COPYING3.
*** 30,615 ****
  #include "version.h"
  #include "intl.h"
  #include "diagnostic.h"
! #include "diagnostic-color.h"
! #include "diagnostic-format.h"
! #include "diagnostic-format-html.h"
! #include "diagnostic-format-text.h"
! #include "diagnostic-format-sarif.h"
! #include "selftest.h"
! #include "selftest-diagnostic.h"
! #include "pretty-print-markup.h"
  #include "opts.h"
  #include "options.h"
  
- /* A namespace for handling the DSL of the arguments of
-    -fdiagnostics-add-output= and -fdiagnostics-set-output=.  */
- 
- namespace gcc {
- namespace diagnostics_output_spec {
- 
  /* Decls.  */
  
! struct context
  {
  public:
!   context (const gcc_options &opts,
! 	   diagnostic_context &dc,
! 	   line_maps *location_mgr,
! 	   location_t loc,
! 	   const char *option_name)
!   : m_opts (opts), m_dc (dc), m_location_mgr (location_mgr), m_loc (loc),
!     m_option_name (option_name)
    {}
  
!   void
!   report_error (const char *gmsgid, ...) const
!     ATTRIBUTE_GCC_DIAG(2,3);
! 
!   void
!   report_unknown_key (const char *unparsed_arg,
! 		      const std::string &key,
! 		      const std::string &scheme_name,
! 		      auto_vec<const char *> &known_keys) const;
! 
!   void
!   report_missing_key (const char *unparsed_arg,
! 		      const std::string &key,
! 		      const std::string &scheme_name,
! 		      const char *metavar) const;
! 
!   diagnostic_output_file
!   open_output_file (label_text &&filename) const;
! 
!   const gcc_options &m_opts;
!   diagnostic_context &m_dc;
!   line_maps *m_location_mgr;
!   location_t m_loc;
!   const char *m_option_name;
! };
! 
! struct scheme_name_and_params
! {
!   std::string m_scheme_name;
!   std::vector<std::pair<std::string, std::string>> m_kvs;
! };
! 
! static std::unique_ptr<scheme_name_and_params>
! parse (const context &ctxt, const char *unparsed_arg);
! 
! /* Class for parsing the arguments of -fdiagnostics-add-output= and
!    -fdiagnostics-set-output=, and making diagnostic_output_format
!    instances (or issuing errors).  */
! 
! class output_factory
! {
! public:
!   class scheme_handler
    {
!   public:
!     scheme_handler (std::string scheme_name)
!     : m_scheme_name (std::move (scheme_name))
!     {}
!     virtual ~scheme_handler () {}
! 
!     const std::string &get_scheme_name () const { return m_scheme_name; }
! 
!     virtual std::unique_ptr<diagnostic_output_format>
!     make_sink (const context &ctxt,
! 	       const char *unparsed_arg,
! 	       const scheme_name_and_params &parsed_arg) const = 0;
! 
!   protected:
!     bool
!     parse_bool_value (const context &ctxt,
! 		      const char *unparsed_arg,
! 		      const std::string &key,
! 		      const std::string &value,
! 		      bool &out) const
!     {
!       if (value == "yes")
! 	{
! 	  out = true;
! 	  return true;
! 	}
!       else if (value == "no")
! 	{
! 	  out = false;
! 	  return true;
! 	}
!       else
! 	{
! 	  ctxt.report_error
! 	    ("%<%s%s%>:"
! 	     " unexpected value %qs for key %qs; expected %qs or %qs",
! 	     ctxt.m_option_name, unparsed_arg,
! 	     value.c_str (),
! 	     key.c_str (),
! 	     "yes", "no");
! 
! 	  return false;
! 	}
!     }
!     template <typename EnumType, size_t NumValues>
!     bool
!     parse_enum_value (const context &ctxt,
! 		      const char *unparsed_arg,
! 		      const std::string &key,
! 		      const std::string &value,
! 		      const std::array<std::pair<const char *, EnumType>, NumValues> &value_names,
! 		      EnumType &out) const
!     {
!       for (auto &iter : value_names)
! 	if (value == iter.first)
! 	  {
! 	    out = iter.second;
! 	    return true;
! 	  }
! 
!       auto_vec<const char *> known_values;
!       for (auto iter : value_names)
! 	known_values.safe_push (iter.first);
!       pp_markup::comma_separated_quoted_strings e (known_values);
!       ctxt.report_error
! 	("%<%s%s%>:"
! 	 " unexpected value %qs for key %qs; known values: %e",
! 	 ctxt.m_option_name, unparsed_arg,
! 	 value.c_str (),
! 	 key.c_str (),
! 	 &e);
!       return false;
!     }
! 
!   private:
!     const std::string m_scheme_name;
!   };
! 
!   output_factory ();
! 
!   std::unique_ptr<diagnostic_output_format>
!   make_sink (const context &ctxt,
! 	     const char *unparsed_arg,
! 	     const scheme_name_and_params &parsed_arg);
! 
!   const scheme_handler *get_scheme_handler (const std::string &scheme_name);
! 
! private:
!   std::vector<std::unique_ptr<scheme_handler>> m_scheme_handlers;
! };
! 
! class text_scheme_handler : public output_factory::scheme_handler
! {
! public:
!   text_scheme_handler () : scheme_handler ("text") {}
! 
!   std::unique_ptr<diagnostic_output_format>
!   make_sink (const context &ctxt,
! 	     const char *unparsed_arg,
! 	     const scheme_name_and_params &parsed_arg) const final override;
! };
! 
! class sarif_scheme_handler : public output_factory::scheme_handler
! {
! public:
!   sarif_scheme_handler () : scheme_handler ("sarif") {}
! 
!   std::unique_ptr<diagnostic_output_format>
!   make_sink (const context &ctxt,
! 	     const char *unparsed_arg,
! 	     const scheme_name_and_params &parsed_arg) const final override;
! };
! 
! class html_scheme_handler : public output_factory::scheme_handler
! {
! public:
!   html_scheme_handler () : scheme_handler ("experimental-html") {}
  
!   std::unique_ptr<diagnostic_output_format>
!   make_sink (const context &ctxt,
! 	     const char *unparsed_arg,
! 	     const scheme_name_and_params &parsed_arg) const final override;
  };
  
! /* struct context.  */
! 
! void
! context::report_error (const char *gmsgid, ...) const
! {
!   m_dc.begin_group ();
!   va_list ap;
!   va_start (ap, gmsgid);
!   rich_location richloc (m_location_mgr, m_loc);
!   m_dc.diagnostic_impl (&richloc, nullptr, -1, gmsgid, &ap, DK_ERROR);
!   va_end (ap);
!   m_dc.end_group ();
! }
! 
! void
! context::report_unknown_key (const char *unparsed_arg,
! 			     const std::string &key,
! 			     const std::string &scheme_name,
! 			     auto_vec<const char *> &known_keys) const
! {
!   pp_markup::comma_separated_quoted_strings e (known_keys);
!   report_error
!     ("%<%s%s%>:"
!      " unknown key %qs for format %qs; known keys: %e",
!      m_option_name, unparsed_arg,
!      key.c_str (), scheme_name.c_str (), &e);
! }
! 
! void
! context::report_missing_key (const char *unparsed_arg,
! 			     const std::string &key,
! 			     const std::string &scheme_name,
! 			     const char *metavar) const
! {
!   report_error
!     ("%<%s%s%>:"
!      " missing required key %qs for format %qs;"
!      " try %<%s%s:%s=%s%>",
!      m_option_name, unparsed_arg,
!      key.c_str (), scheme_name.c_str (),
!      m_option_name, scheme_name.c_str (), key.c_str (), metavar);
! }
! 
! std::unique_ptr<scheme_name_and_params>
! parse (const context &ctxt, const char *unparsed_arg)
! {
!   scheme_name_and_params result;
!   if (const char *const colon = strchr (unparsed_arg, ':'))
!     {
!       result.m_scheme_name = std::string (unparsed_arg, colon - unparsed_arg);
!       /* Expect zero of more of KEY=VALUE,KEY=VALUE, etc  .*/
!       const char *iter = colon + 1;
!       const char *last_separator = ":";
!       while (iter)
! 	{
! 	  /* Look for a non-empty key string followed by '='.  */
! 	  const char *eq = strchr (iter, '=');
! 	  if (eq == nullptr || eq == iter)
! 	    {
! 	      /* Missing '='.  */
! 	      ctxt.report_error
! 		("%<%s%s%>:"
! 		 " expected KEY=VALUE-style parameter for format %qs"
! 		 " after %qs;"
! 		 " got %qs",
! 		 ctxt.m_option_name, unparsed_arg,
! 		 result.m_scheme_name.c_str (),
! 		 last_separator,
! 		 iter);
! 	      return nullptr;
! 	    }
! 	  std::string key = std::string (iter, eq - iter);
! 	  std::string value;
! 	  const char *comma = strchr (iter, ',');
! 	  if (comma)
! 	    {
! 	      value = std::string (eq + 1, comma - (eq + 1));
! 	      iter = comma + 1;
! 	      last_separator = ",";
! 	    }
! 	  else
! 	    {
! 	      value = std::string (eq + 1);
! 	      iter = nullptr;
! 	    }
! 	  result.m_kvs.push_back ({std::move (key), std::move (value)});
! 	}
!     }
!   else
!     result.m_scheme_name = unparsed_arg;
!   return std::make_unique<scheme_name_and_params> (std::move (result));
! }
! 
! /* class output_factory::scheme_handler.  */
! 
! /* class output_factory.  */
! 
! output_factory::output_factory ()
! {
!   m_scheme_handlers.push_back (std::make_unique<text_scheme_handler> ());
!   m_scheme_handlers.push_back (std::make_unique<sarif_scheme_handler> ());
!   m_scheme_handlers.push_back (std::make_unique<html_scheme_handler> ());
! }
! 
! const output_factory::scheme_handler *
! output_factory::get_scheme_handler (const std::string &scheme_name)
! {
!   for (auto &iter : m_scheme_handlers)
!     if (iter->get_scheme_name () == scheme_name)
!       return iter.get ();
!   return nullptr;
! }
! 
! std::unique_ptr<diagnostic_output_format>
! output_factory::make_sink (const context &ctxt,
! 			   const char *unparsed_arg,
! 			   const scheme_name_and_params &parsed_arg)
! {
!   auto scheme_handler = get_scheme_handler (parsed_arg.m_scheme_name);
!   if (!scheme_handler)
!     {
!       auto_vec<const char *> strings;
!       for (auto &iter : m_scheme_handlers)
! 	strings.safe_push (iter->get_scheme_name ().c_str ());
!       pp_markup::comma_separated_quoted_strings e (strings);
!       ctxt.report_error ("%<%s%s%>:"
! 			 " unrecognized format %qs; known formats: %e",
! 			 ctxt.m_option_name, unparsed_arg,
! 			 parsed_arg.m_scheme_name.c_str (), &e);
!       return nullptr;
!     }
! 
!   return scheme_handler->make_sink (ctxt, unparsed_arg, parsed_arg);
! }
! 
! /* class text_scheme_handler : public output_factory::scheme_handler.  */
! 
! std::unique_ptr<diagnostic_output_format>
! text_scheme_handler::make_sink (const context &ctxt,
! 				const char *unparsed_arg,
! 				const scheme_name_and_params &parsed_arg) const
! {
!   bool show_color = pp_show_color (ctxt.m_dc.get_reference_printer ());
!   bool show_nesting = false;
!   bool show_locations_in_nesting = true;
!   bool show_levels = false;
!   for (auto& iter : parsed_arg.m_kvs)
!     {
!       const std::string &key = iter.first;
!       const std::string &value = iter.second;
!       if (key == "color")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_color))
! 	    return nullptr;
! 	  continue;
! 	}
!       if (key == "experimental-nesting")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
! 				 show_nesting))
! 	    return nullptr;
! 	  continue;
! 	}
!       if (key == "experimental-nesting-show-locations")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
! 				 show_locations_in_nesting))
! 	    return nullptr;
! 	  continue;
! 	}
!       if (key == "experimental-nesting-show-levels")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_levels))
! 	    return nullptr;
! 	  continue;
! 	}
! 
!       /* Key not found.  */
!       auto_vec<const char *> known_keys;
!       known_keys.safe_push ("color");
!       known_keys.safe_push ("experimental-nesting");
!       known_keys.safe_push ("experimental-nesting-show-locations");
!       known_keys.safe_push ("experimental-nesting-show-levels");
!       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
! 			       known_keys);
!       return nullptr;
!     }
! 
!   auto sink = std::make_unique<diagnostic_text_output_format> (ctxt.m_dc);
!   sink->set_show_nesting (show_nesting);
!   sink->set_show_locations_in_nesting (show_locations_in_nesting);
!   sink->set_show_nesting_levels (show_levels);
!   return sink;
! }
! 
! diagnostic_output_file
! context::open_output_file (label_text &&filename) const
! {
!   FILE *outf = fopen (filename.get (), "w");
!   if (!outf)
!     {
!       rich_location richloc (m_location_mgr, m_loc);
!       m_dc.emit_diagnostic_with_group
! 	(DK_ERROR, richloc, nullptr, 0,
! 	 "unable to open %qs: %m", filename.get ());
!       return diagnostic_output_file (nullptr, false, std::move (filename));
!     }
!   return diagnostic_output_file (outf, true, std::move (filename));
! }
! 
! /* class sarif_scheme_handler : public output_factory::scheme_handler.  */
! 
! std::unique_ptr<diagnostic_output_format>
! sarif_scheme_handler::make_sink (const context &ctxt,
! 				 const char *unparsed_arg,
! 				 const scheme_name_and_params &parsed_arg) const
! {
!   label_text filename;
!   enum sarif_serialization_kind serialization_kind
!     = sarif_serialization_kind::json;
!   enum sarif_version version = sarif_version::v2_1_0;
!   for (auto& iter : parsed_arg.m_kvs)
!     {
!       const std::string &key = iter.first;
!       const std::string &value = iter.second;
!       if (key == "file")
! 	{
! 	  filename = label_text::take (xstrdup (value.c_str ()));
! 	  continue;
! 	}
!       if (key == "serialization")
! 	{
! 	  static const std::array<std::pair<const char *, enum sarif_serialization_kind>,
! 				  (size_t)sarif_serialization_kind::num_values> value_names
! 	    {{{"json", sarif_serialization_kind::json}}};
! 
! 	  if (!parse_enum_value<enum sarif_serialization_kind>
! 		 (ctxt, unparsed_arg,
! 		  key, value,
! 		  value_names,
! 		  serialization_kind))
! 	    return nullptr;
! 	  continue;
! 	}
!       if (key == "version")
! 	{
! 	  static const std::array<std::pair<const char *, enum sarif_version>,
! 				  (size_t)sarif_version::num_versions> value_names
! 	    {{{"2.1", sarif_version::v2_1_0},
! 	      {"2.2-prerelease", sarif_version::v2_2_prerelease_2024_08_08}}};
! 
! 	    if (!parse_enum_value<enum sarif_version> (ctxt, unparsed_arg,
! 						       key, value,
! 						       value_names,
! 						       version))
! 	    return nullptr;
! 	  continue;
! 	}
! 
!       /* Key not found.  */
!       auto_vec<const char *> known_keys;
!       known_keys.safe_push ("file");
!       known_keys.safe_push ("serialization");
!       known_keys.safe_push ("version");
!       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
! 			       known_keys);
!       return nullptr;
!     }
! 
!   diagnostic_output_file output_file;
!   if (filename.get ())
!     output_file = ctxt.open_output_file (std::move (filename));
!   else
!     // Default filename
!     {
!       const char *basename = (ctxt.m_opts.x_dump_base_name
! 			      ? ctxt.m_opts.x_dump_base_name
! 			      : ctxt.m_opts.x_main_input_basename);
!       output_file = diagnostic_output_format_open_sarif_file (ctxt.m_dc,
! 							      line_table,
! 							      basename,
! 							      serialization_kind);
!     }
!   if (!output_file)
!     return nullptr;
! 
!   sarif_generation_options sarif_gen_opts;
!   sarif_gen_opts.m_version = version;
! 
!   std::unique_ptr<sarif_serialization_format> serialization_obj;
!   switch (serialization_kind)
!     {
!     default:
!       gcc_unreachable ();
!     case sarif_serialization_kind::json:
!       serialization_obj
! 	= std::make_unique<sarif_serialization_format_json> (true);
!       break;
!     }
! 
!   auto sink = make_sarif_sink (ctxt.m_dc,
! 			       *line_table,
! 			       std::move (serialization_obj),
! 			       sarif_gen_opts,
! 			       std::move (output_file));
!   return sink;
! }
! 
! /* class html_scheme_handler : public output_factory::scheme_handler.  */
! 
! std::unique_ptr<diagnostic_output_format>
! html_scheme_handler::make_sink (const context &ctxt,
! 				const char *unparsed_arg,
! 				const scheme_name_and_params &parsed_arg) const
! {
!   bool css = true;
!   label_text filename;
!   bool javascript = true;
!   for (auto& iter : parsed_arg.m_kvs)
!     {
!       const std::string &key = iter.first;
!       const std::string &value = iter.second;
!       if (key == "css")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
! 				 css))
! 	    return nullptr;
! 	  continue;
! 	}
!       if (key == "file")
! 	{
! 	  filename = label_text::take (xstrdup (value.c_str ()));
! 	  continue;
! 	}
!       if (key == "javascript")
! 	{
! 	  if (!parse_bool_value (ctxt, unparsed_arg, key, value,
! 				 javascript))
! 	    return nullptr;
! 	  continue;
! 	}
! 
!       /* Key not found.  */
!       auto_vec<const char *> known_keys;
!       known_keys.safe_push ("css");
!       known_keys.safe_push ("file");
!       known_keys.safe_push ("javascript");
!       ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (),
! 			       known_keys);
!       return nullptr;
!     }
! 
!   diagnostic_output_file output_file;
!   if (filename.get ())
!     output_file = ctxt.open_output_file (std::move (filename));
!   else
!     // Default filename
!     {
!       const char *basename = (ctxt.m_opts.x_dump_base_name
! 			      ? ctxt.m_opts.x_dump_base_name
! 			      : ctxt.m_opts.x_main_input_basename);
!       output_file = diagnostic_output_format_open_html_file (ctxt.m_dc,
! 							     line_table,
! 							     basename);
!     }
!   if (!output_file)
!     return nullptr;
! 
!   html_generation_options html_gen_opts;
!   html_gen_opts.m_css = css;
!   html_gen_opts.m_javascript = javascript;
! 
!   auto sink = make_html_sink (ctxt.m_dc,
! 			      *line_table,
! 			      html_gen_opts,
! 			      std::move (output_file));
!   return sink;
! }
! 
! } // namespace diagnostics_output_spec
! } // namespace gcc
  
  void
  handle_OPT_fdiagnostics_add_output_ (const gcc_options &opts,
--- 31,72 ----
  #include "version.h"
  #include "intl.h"
  #include "diagnostic.h"
! #include "diagnostic-output-spec.h"
  #include "opts.h"
  #include "options.h"
  
  /* Decls.  */
  
! namespace {
! 
! struct opt_spec_context : public diagnostics_output_spec::gcc_spec_context
  {
  public:
!   opt_spec_context (const gcc_options &opts,
! 		    diagnostic_context &dc,
! 		    line_maps *location_mgr,
! 		    location_t loc,
! 		    const char *option_name)
!   : gcc_spec_context (dc,
! 		      location_mgr,
! 		      location_mgr,
! 		      loc,
! 		      option_name),
!     m_opts (opts)
    {}
  
!   const char *
!   get_base_filename () const final override
    {
!     return (m_opts.x_dump_base_name
! 	    ? m_opts.x_dump_base_name
! 	    : m_opts.x_main_input_basename);
!   }
  
!   const gcc_options &m_opts;
  };
  
! } // anon namespace
  
  void
  handle_OPT_fdiagnostics_add_output_ (const gcc_options &opts,
*************** handle_OPT_fdiagnostics_add_output_ (con
*** 621,634 ****
    gcc_assert (line_table);
  
    const char *const option_name = "-fdiagnostics-add-output=";
!   gcc::diagnostics_output_spec::context ctxt (opts, dc, line_table, loc,
! 					      option_name);
!   auto result = gcc::diagnostics_output_spec::parse (ctxt, arg);
!   if (!result)
!     return;
! 
!   gcc::diagnostics_output_spec::output_factory factory;
!   auto sink = factory.make_sink (ctxt, arg, *result);
    if (!sink)
      return;
  
--- 78,85 ----
    gcc_assert (line_table);
  
    const char *const option_name = "-fdiagnostics-add-output=";
!   opt_spec_context ctxt (opts, dc, line_table, loc, option_name);
!   auto sink = ctxt.parse_and_make_sink (arg, dc);
    if (!sink)
      return;
  
*************** handle_OPT_fdiagnostics_set_output_ (con
*** 646,828 ****
    gcc_assert (line_table);
  
    const char *const option_name = "-fdiagnostics-set-output=";
!   gcc::diagnostics_output_spec::context ctxt (opts, dc, line_table, loc,
! 					      option_name);
!   auto result = gcc::diagnostics_output_spec::parse (ctxt, arg);
!   if (!result)
!     return;
! 
!   gcc::diagnostics_output_spec::output_factory factory;
!   auto sink = factory.make_sink (ctxt, arg, *result);
    if (!sink)
      return;
  
    sink->set_main_input_filename (opts.x_main_input_filename);
    dc.set_output_format (std::move (sink));
  }
- 
- #if CHECKING_P
- 
- namespace selftest {
- 
- /* RAII class to temporarily override "progname" to the
-    string "PROGNAME".  */
- 
- class auto_fix_progname
- {
- public:
-   auto_fix_progname ()
-   {
-     m_old_progname = progname;
-     progname = "PROGNAME";
-   }
- 
-   ~auto_fix_progname ()
-   {
-     progname = m_old_progname;
-   }
- 
- private:
-   const char *m_old_progname;
- };
- 
- struct parser_test
- {
-   parser_test ()
-   : m_opts (),
-     m_dc (),
-     m_ctxt (m_opts, m_dc, line_table, UNKNOWN_LOCATION, "-fOPTION="),
-     m_fmt (m_dc.get_output_format (0))
-   {
-     pp_buffer (m_fmt.get_printer ())->m_flush_p = false;
-   }
- 
-   std::unique_ptr<gcc::diagnostics_output_spec::scheme_name_and_params>
-   parse (const char *unparsed_arg)
-   {
-     return gcc::diagnostics_output_spec::parse (m_ctxt, unparsed_arg);
-   }
- 
-   bool execution_failed_p () const
-   {
-     return m_dc.execution_failed_p ();
-   }
- 
-   const char *
-   get_diagnostic_text () const
-   {
-     return pp_formatted_text (m_fmt.get_printer ());
-   }
- 
- private:
-   const gcc_options m_opts;
-   test_diagnostic_context m_dc;
-   gcc::diagnostics_output_spec::context m_ctxt;
-   diagnostic_output_format &m_fmt;
- };
- 
- /* Selftests.  */
- 
- static void
- test_output_arg_parsing ()
- {
-   auto_fix_quotes fix_quotes;
-   auto_fix_progname fix_progname;
- 
-   /* Minimal correct example.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo");
-     ASSERT_EQ (result->m_scheme_name, "foo");
-     ASSERT_EQ (result->m_kvs.size (), 0);
-     ASSERT_FALSE (pt.execution_failed_p ());
-   }
- 
-   /* Stray trailing colon with no key/value pairs.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:");
-     ASSERT_EQ (result, nullptr);
-     ASSERT_TRUE (pt.execution_failed_p ());
-     ASSERT_STREQ (pt.get_diagnostic_text (),
- 		  "PROGNAME: error: `-fOPTION=foo:':"
- 		  " expected KEY=VALUE-style parameter for format `foo'"
- 		  " after `:';"
- 		  " got `'\n");
-   }
- 
-   /* No key before '='.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:=");
-     ASSERT_EQ (result, nullptr);
-     ASSERT_TRUE (pt.execution_failed_p ());
-     ASSERT_STREQ (pt.get_diagnostic_text (),
- 		  "PROGNAME: error: `-fOPTION=foo:=':"
- 		  " expected KEY=VALUE-style parameter for format `foo'"
- 		  " after `:';"
- 		  " got `='\n");
-   }
- 
-   /* No value for key.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:key,");
-     ASSERT_EQ (result, nullptr);
-     ASSERT_TRUE (pt.execution_failed_p ());
-     ASSERT_STREQ (pt.get_diagnostic_text (),
- 		  "PROGNAME: error: `-fOPTION=foo:key,':"
- 		  " expected KEY=VALUE-style parameter for format `foo'"
- 		  " after `:';"
- 		  " got `key,'\n");
-   }
- 
-   /* Correct example, with one key/value pair.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:key=value");
-     ASSERT_EQ (result->m_scheme_name, "foo");
-     ASSERT_EQ (result->m_kvs.size (), 1);
-     ASSERT_EQ (result->m_kvs[0].first, "key");
-     ASSERT_EQ (result->m_kvs[0].second, "value");
-     ASSERT_FALSE (pt.execution_failed_p ());
-   }
- 
-   /* Stray trailing comma.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:key=value,");
-     ASSERT_EQ (result, nullptr);
-     ASSERT_TRUE (pt.execution_failed_p ());
-     ASSERT_STREQ (pt.get_diagnostic_text (),
- 		  "PROGNAME: error: `-fOPTION=foo:key=value,':"
- 		  " expected KEY=VALUE-style parameter for format `foo'"
- 		  " after `,';"
- 		  " got `'\n");
-   }
- 
-   /* Correct example, with two key/value pairs.  */
-   {
-     parser_test pt;
-     auto result = pt.parse ("foo:color=red,shape=circle");
-     ASSERT_EQ (result->m_scheme_name, "foo");
-     ASSERT_EQ (result->m_kvs.size (), 2);
-     ASSERT_EQ (result->m_kvs[0].first, "color");
-     ASSERT_EQ (result->m_kvs[0].second, "red");
-     ASSERT_EQ (result->m_kvs[1].first, "shape");
-     ASSERT_EQ (result->m_kvs[1].second, "circle");
-     ASSERT_FALSE (pt.execution_failed_p ());
-   }
- }
- 
- /* Run all of the selftests within this file.  */
- 
- void
- opts_diagnostic_cc_tests ()
- {
-   test_output_arg_parsing ();
- }
- 
- } // namespace selftest
- 
- #endif /* #if CHECKING_P */
--- 97,107 ----
    gcc_assert (line_table);
  
    const char *const option_name = "-fdiagnostics-set-output=";
!   opt_spec_context ctxt (opts, dc, line_table, loc, option_name);
!   auto sink = ctxt.parse_and_make_sink (arg, dc);
    if (!sink)
      return;
  
    sink->set_main_input_filename (opts.x_main_input_filename);
    dc.set_output_format (std::move (sink));
  }
diff -Nrcpad gcc-16-20250622/gcc/opts.cc gcc-16-20250629/gcc/opts.cc
*** gcc-16-20250622/gcc/opts.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/opts.cc	Sun Jun 29 22:32:29 2025
*************** common_handle_option (struct gcc_options
*** 2872,2878 ****
        break;
  
      case OPT_Wfatal_errors:
!       dc->m_fatal_errors = value;
        break;
  
      case OPT_Wstack_usage_:
--- 2872,2878 ----
        break;
  
      case OPT_Wfatal_errors:
!       dc->set_fatal_errors (value);
        break;
  
      case OPT_Wstack_usage_:
diff -Nrcpad gcc-16-20250622/gcc/params.opt gcc-16-20250629/gcc/params.opt
*** gcc-16-20250622/gcc/params.opt	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/params.opt	Sun Jun 29 22:32:29 2025
*************** predicate chain.
*** 1185,1190 ****
--- 1185,1194 ----
  Common Joined UInteger Var(param_uninit_max_num_chains) Init(8) IntegerRange(1, 128) Param Optimization
  Maximum number of predicates ored in the normalized predicate chain.
  
+ -param=uninit-max-prune-work=
+ Common Joined UInteger Var(param_uninit_max_prune_work) Init(100000) Param Optimization
+ Maximum amount of work done to prune paths where the variable is always initialized.
+ 
  -param=uninlined-function-insns=
  Common Joined UInteger Var(param_uninlined_function_insns) Init(2) Optimization IntegerRange(0, 1000000) Param
  Instruction accounted for function prologue, epilogue and other overhead.
diff -Nrcpad gcc-16-20250622/gcc/passes.def gcc-16-20250629/gcc/passes.def
*** gcc-16-20250622/gcc/passes.def	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/passes.def	Sun Jun 29 22:32:29 2025
*************** along with GCC; see the file COPYING3.
*** 47,52 ****
--- 47,55 ----
  
    /* Interprocedural optimization passes.  */
    INSERT_PASSES_AFTER (all_small_ipa_passes)
+   /* auto_profile_offline uses dwarf_name hook that only
+      works before free_lang_data.  */
+   NEXT_PASS (pass_ipa_auto_profile_offline);
    NEXT_PASS (pass_ipa_free_lang_data);
    NEXT_PASS (pass_ipa_function_and_variable_visibility);
    NEXT_PASS (pass_ipa_strub_mode);
diff -Nrcpad gcc-16-20250622/gcc/pex.cc gcc-16-20250629/gcc/pex.cc
*** gcc-16-20250622/gcc/pex.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/pex.cc	Sun Jun 29 22:32:29 2025
***************
*** 0 ****
--- 1,80 ----
+ /* C++ wrapper around libiberty's pex API.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #define INCLUDE_STRING
+ #define INCLUDE_VECTOR
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+ #include "pex.h"
+ 
+ /* Read the contents of FILE into memory, or return nullptr
+    if there are any problems.  */
+ 
+ static std::unique_ptr<std::vector<char>>
+ read_all_of_file (FILE *f_in)
+ {
+   /* Read content, allocating a buffer for it.  */
+   auto result = std::make_unique<std::vector<char>> ();
+   char buf[4096];
+   size_t iter_sz_in;
+ 
+   while ( (iter_sz_in = fread (buf, 1, sizeof (buf), f_in)) )
+     {
+       size_t old_total_sz = result->size ();
+       size_t new_total_sz = old_total_sz + iter_sz_in;
+       size_t old_alloc_sz = result->capacity ();
+       if (new_total_sz > old_alloc_sz)
+ 	{
+ 	  size_t new_alloc_sz = std::max (old_alloc_sz * 2, new_total_sz);
+ 	  result->reserve (new_alloc_sz);
+ 	}
+       gcc_assert (result->capacity () >= new_total_sz);
+       result->resize (new_total_sz);
+       memcpy (result->data () + old_total_sz, buf, iter_sz_in);
+     }
+ 
+   if (!feof (f_in))
+     return nullptr;
+ 
+   return result;
+ }
+ 
+ // struct file_wrapper
+ 
+ std::unique_ptr<std::vector<char>>
+ file_wrapper::read_all ()
+ {
+   return read_all_of_file (m_file);
+ }
+ 
+ // struct pex
+ 
+ const char *
+ pex::run (int flags, const char *executable, const std::vector<std::string> &args,
+ 	  const char *outname, const char *errname, int *err)
+ {
+   std::vector<char *> argv;
+   for (auto &iter : args)
+     argv.push_back (const_cast<char *> (iter.c_str ()));
+   argv.push_back (nullptr);
+   return pex_run (m_obj, flags, executable, argv.data (),
+ 		  outname, errname, err);
+ }
diff -Nrcpad gcc-16-20250622/gcc/pex.h gcc-16-20250629/gcc/pex.h
*** gcc-16-20250622/gcc/pex.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/pex.h	Sun Jun 29 22:32:29 2025
***************
*** 0 ****
--- 1,100 ----
+ /* C++ wrapper around libiberty's pex API.
+    Copyright (C) 2025 Free Software Foundation, Inc.
+    Contributed by David Malcolm <dmalcolm@redhat.com>.
+ 
+ This file is part of GCC.
+ 
+ GCC 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.
+ 
+ GCC 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/>.  */
+ 
+ #ifndef GCC_PEX_H
+ #define GCC_PEX_H
+ 
+ struct file_wrapper
+ {
+   enum class ownership { owned, borrowed };
+ 
+   file_wrapper (FILE *file, enum ownership ownership)
+   : m_file (file),
+     m_ownership (ownership)
+   {
+   }
+   ~file_wrapper ()
+   {
+     if (m_ownership == ownership::owned)
+       {
+ 	gcc_assert (m_file);
+ 	fclose (m_file);
+       }
+   }
+ 
+   std::unique_ptr<std::vector<char>>
+   read_all ();
+ 
+   FILE *m_file;
+   enum ownership m_ownership;
+ };
+ 
+ // RAII wrapper around pex_obj
+ 
+ struct pex
+ {
+   pex (int flags, const char *pname, const char *tempbase)
+   : m_obj (pex_init (flags, pname, tempbase))
+   {
+   }
+ 
+   ~pex ()
+   {
+     pex_free (m_obj);
+   }
+ 
+   const char *
+   run (int flags, const char *executable, char * const *argv,
+        const char *outname, const char *errname, int *err)
+   {
+     return pex_run (m_obj, flags, executable, argv, outname, errname, err);
+   }
+ 
+   const char *
+   run (int flags, const char *executable, const std::vector<std::string> &args,
+        const char *outname, const char *errname, int *err);
+ 
+   file_wrapper
+   input_file (int flags, const char *in_name)
+   {
+     return file_wrapper (pex_input_file (m_obj, flags, in_name),
+ 			 /* closed on first call to pex_run.  */
+ 			 file_wrapper::ownership::borrowed);
+   }
+ 
+   file_wrapper
+   input_pipe (bool binary = true)
+   {
+     return file_wrapper (pex_input_pipe (m_obj, binary),
+ 			 /* closed on first call to pex_run.  */
+ 			 file_wrapper::ownership::borrowed);
+   }
+ 
+   file_wrapper
+   read_output (bool binary = true)
+   {
+     return file_wrapper (pex_read_output (m_obj, binary),
+ 			 file_wrapper::ownership::borrowed);
+   }
+ 
+   pex_obj *m_obj;
+ };
+ 
+ #endif /* GCC_PEX_H */
diff -Nrcpad gcc-16-20250622/gcc/print-tree.cc gcc-16-20250629/gcc/print-tree.cc
*** gcc-16-20250622/gcc/print-tree.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/print-tree.cc	Sun Jun 29 22:32:29 2025
*************** debug_tree (tree node)
*** 1149,1154 ****
--- 1149,1160 ----
  }
  
  DEBUG_FUNCTION void
+ debug (tree node)
+ {
+   debug_tree (node);
+ }
+ 
+ DEBUG_FUNCTION void
  debug_raw (const tree_node &ref)
  {
    debug_tree (const_cast <tree> (&ref));
diff -Nrcpad gcc-16-20250622/gcc/print-tree.h gcc-16-20250629/gcc/print-tree.h
*** gcc-16-20250622/gcc/print-tree.h	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/print-tree.h	Sun Jun 29 22:32:29 2025
*************** along with GCC; see the file COPYING3.
*** 21,26 ****
--- 21,27 ----
  #define GCC_PRINT_TREE_H
  
  extern void debug_tree (tree);
+ extern void debug (tree);
  extern void debug_raw (const tree_node &ref);
  extern void debug_raw (const tree_node *ptr);
  extern void debug (const tree_node &ref);
diff -Nrcpad gcc-16-20250622/gcc/range-op-mixed.h gcc-16-20250629/gcc/range-op-mixed.h
*** gcc-16-20250622/gcc/range-op-mixed.h	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/range-op-mixed.h	Sun Jun 29 22:32:29 2025
*************** public:
*** 558,565 ****
    void update_bitmask (irange &r, const irange &lh,
  		       const irange &rh) const final override;
  
!   virtual bool overflow_free_p (const irange &lh, const irange &rh,
! 				relation_trio = TRIO_VARYING) const;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
--- 558,565 ----
    void update_bitmask (irange &r, const irange &lh,
  		       const irange &rh) const final override;
  
!   bool overflow_free_p (const irange &lh, const irange &rh,
! 			relation_trio = TRIO_VARYING) const final override;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
*************** public:
*** 634,641 ****
    void update_bitmask (irange &r, const irange &lh,
  		       const irange &rh) const final override;
  
!   virtual bool overflow_free_p (const irange &lh, const irange &rh,
! 				relation_trio = TRIO_VARYING) const;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
--- 634,641 ----
    void update_bitmask (irange &r, const irange &lh,
  		       const irange &rh) const final override;
  
!   bool overflow_free_p (const irange &lh, const irange &rh,
! 			relation_trio = TRIO_VARYING) const final override;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
*************** public:
*** 720,727 ****
  		const REAL_VALUE_TYPE &lh_lb, const REAL_VALUE_TYPE &lh_ub,
  		const REAL_VALUE_TYPE &rh_lb, const REAL_VALUE_TYPE &rh_ub,
  		relation_kind kind) const final override;
!   virtual bool overflow_free_p (const irange &lh, const irange &rh,
! 				relation_trio = TRIO_VARYING) const;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
--- 720,727 ----
  		const REAL_VALUE_TYPE &lh_lb, const REAL_VALUE_TYPE &lh_ub,
  		const REAL_VALUE_TYPE &rh_lb, const REAL_VALUE_TYPE &rh_ub,
  		relation_kind kind) const final override;
!   bool overflow_free_p (const irange &lh, const irange &rh,
! 			relation_trio = TRIO_VARYING) const final override;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
diff -Nrcpad gcc-16-20250622/gcc/range-op-ptr.cc gcc-16-20250629/gcc/range-op-ptr.cc
*** gcc-16-20250622/gcc/range-op-ptr.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/range-op-ptr.cc	Sun Jun 29 22:32:29 2025
*************** public:
*** 315,321 ****
    virtual relation_kind lhs_op1_relation (const prange &lhs,
  					  const prange &op1,
  					  const irange &op2,
! 					  relation_kind) const;
    void update_bitmask (prange &r, const prange &lh, const irange &rh) const
      { update_known_bitmask (r, POINTER_PLUS_EXPR, lh, rh); }
  } op_pointer_plus;
--- 315,321 ----
    virtual relation_kind lhs_op1_relation (const prange &lhs,
  					  const prange &op1,
  					  const irange &op2,
! 					  relation_kind) const final override;
    void update_bitmask (prange &r, const prange &lh, const irange &rh) const
      { update_known_bitmask (r, POINTER_PLUS_EXPR, lh, rh); }
  } op_pointer_plus;
diff -Nrcpad gcc-16-20250622/gcc/range-op.cc gcc-16-20250629/gcc/range-op.cc
*** gcc-16-20250622/gcc/range-op.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/range-op.cc	Sun Jun 29 22:32:29 2025
*************** class operator_div : public cross_produc
*** 2455,2461 ****
  public:
    operator_div (tree_code div_kind) { m_code = div_kind; }
    bool op2_range (irange &r, tree type, const irange &lhs, const irange &,
! 		  relation_trio) const;
    virtual void wi_fold (irange &r, tree type,
  		        const wide_int &lh_lb,
  		        const wide_int &lh_ub,
--- 2455,2461 ----
  public:
    operator_div (tree_code div_kind) { m_code = div_kind; }
    bool op2_range (irange &r, tree type, const irange &lhs, const irange &,
! 		  relation_trio) const final override;
    virtual void wi_fold (irange &r, tree type,
  		        const wide_int &lh_lb,
  		        const wide_int &lh_ub,
*************** public:
*** 2464,2470 ****
    virtual bool wi_op_overflows (wide_int &res, tree type,
  				const wide_int &, const wide_int &)
      const final override;
!   void update_bitmask (irange &r, const irange &lh, const irange &rh) const
      { update_known_bitmask (r, m_code, lh, rh); }
  protected:
    tree_code m_code;
--- 2464,2471 ----
    virtual bool wi_op_overflows (wide_int &res, tree type,
  				const wide_int &, const wide_int &)
      const final override;
!   void update_bitmask (irange &r, const irange &lh, const irange &rh)
!     const final override
      { update_known_bitmask (r, m_code, lh, rh); }
  protected:
    tree_code m_code;
*************** class operator_logical_and : public rang
*** 3233,3250 ****
    using range_operator::op1_range;
    using range_operator::op2_range;
  public:
!   virtual bool fold_range (irange &r, tree type,
! 			   const irange &lh,
! 			   const irange &rh,
! 			   relation_trio rel = TRIO_VARYING) const;
!   virtual bool op1_range (irange &r, tree type,
! 			  const irange &lhs,
! 			  const irange &op2,
! 			  relation_trio rel = TRIO_VARYING) const;
!   virtual bool op2_range (irange &r, tree type,
! 			  const irange &lhs,
! 			  const irange &op1,
! 			  relation_trio rel = TRIO_VARYING) const;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
--- 3234,3251 ----
    using range_operator::op1_range;
    using range_operator::op2_range;
  public:
!   bool fold_range (irange &r, tree type,
! 		   const irange &lh,
! 		   const irange &rh,
! 		   relation_trio rel = TRIO_VARYING) const final override;
!   bool op1_range (irange &r, tree type,
! 		  const irange &lhs,
! 		  const irange &op2,
! 		  relation_trio rel = TRIO_VARYING) const final override;
!   bool op2_range (irange &r, tree type,
! 		  const irange &lhs,
! 		  const irange &op1,
! 		  relation_trio rel = TRIO_VARYING) const final override;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
*************** class operator_logical_or : public range
*** 3757,3774 ****
    using range_operator::op1_range;
    using range_operator::op2_range;
  public:
!   virtual bool fold_range (irange &r, tree type,
! 			   const irange &lh,
! 			   const irange &rh,
! 			   relation_trio rel = TRIO_VARYING) const;
!   virtual bool op1_range (irange &r, tree type,
! 			  const irange &lhs,
! 			  const irange &op2,
! 			  relation_trio rel = TRIO_VARYING) const;
!   virtual bool op2_range (irange &r, tree type,
! 			  const irange &lhs,
! 			  const irange &op1,
! 			  relation_trio rel = TRIO_VARYING) const;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
--- 3758,3775 ----
    using range_operator::op1_range;
    using range_operator::op2_range;
  public:
!   bool fold_range (irange &r, tree type,
! 		   const irange &lh,
! 		   const irange &rh,
! 		   relation_trio rel = TRIO_VARYING) const final override;
!   bool op1_range (irange &r, tree type,
! 		  const irange &lhs,
! 		  const irange &op2,
! 		  relation_trio rel = TRIO_VARYING) const final override;
!   bool op2_range (irange &r, tree type,
! 		  const irange &lhs,
! 		  const irange &op1,
! 		  relation_trio rel = TRIO_VARYING) const final override;
    // Check compatibility of all operands.
    bool operand_check_p (tree t1, tree t2, tree t3) const final override
      { return range_compatible_p (t1, t2) && range_compatible_p (t1, t3); }
*************** class operator_logical_not : public rang
*** 4203,4216 ****
    using range_operator::fold_range;
    using range_operator::op1_range;
  public:
!   virtual bool fold_range (irange &r, tree type,
! 			   const irange &lh,
! 			   const irange &rh,
! 			   relation_trio rel = TRIO_VARYING) const;
!   virtual bool op1_range (irange &r, tree type,
! 			  const irange &lhs,
! 			  const irange &op2,
! 			  relation_trio rel = TRIO_VARYING) const;
    // Check compatibility of LHS and op1.
    bool operand_check_p (tree t1, tree t2, tree) const final override
      { return range_compatible_p (t1, t2); }
--- 4204,4217 ----
    using range_operator::fold_range;
    using range_operator::op1_range;
  public:
!   bool fold_range (irange &r, tree type,
! 		   const irange &lh,
! 		   const irange &rh,
! 		   relation_trio rel = TRIO_VARYING) const final override;
!   bool op1_range (irange &r, tree type,
! 		  const irange &lhs,
! 		  const irange &op2,
! 		  relation_trio rel = TRIO_VARYING) const final override;
    // Check compatibility of LHS and op1.
    bool operand_check_p (tree t1, tree t2, tree) const final override
      { return range_compatible_p (t1, t2); }
*************** class operator_absu : public range_opera
*** 4484,4490 ****
   public:
    virtual void wi_fold (irange &r, tree type,
  			const wide_int &lh_lb, const wide_int &lh_ub,
! 			const wide_int &rh_lb, const wide_int &rh_ub) const;
    virtual void update_bitmask (irange &r, const irange &lh,
  			       const irange &rh) const final override;
  } op_absu;
--- 4485,4492 ----
   public:
    virtual void wi_fold (irange &r, tree type,
  			const wide_int &lh_lb, const wide_int &lh_ub,
! 			const wide_int &rh_lb, const wide_int &rh_ub)
!     const final override;
    virtual void update_bitmask (irange &r, const irange &lh,
  			       const irange &rh) const final override;
  } op_absu;
diff -Nrcpad gcc-16-20250622/gcc/rtl-ssa/changes.cc gcc-16-20250629/gcc/rtl-ssa/changes.cc
*** gcc-16-20250622/gcc/rtl-ssa/changes.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/rtl-ssa/changes.cc	Sun Jun 29 22:32:29 2025
*************** rtl_ssa::changes_are_worthwhile (array_s
*** 258,285 ****
  void
  function_info::process_uses_of_deleted_def (set_info *set)
  {
!   if (!set->has_any_uses ())
!     return;
! 
!   auto *use = *set->all_uses ().begin ();
!   do
      {
!       auto *next_use = use->next_use ();
        if (use->is_in_phi ())
  	{
! 	  // This call will not recurse.
! 	  process_uses_of_deleted_def (use->phi ());
! 	  delete_phi (use->phi ());
  	}
        else
  	{
  	  gcc_assert (use->is_live_out_use ());
  	  remove_use (use);
  	}
!       use = next_use;
      }
-   while (use);
-   gcc_assert (!set->has_any_uses ());
  }
  
  // Update the REG_NOTES of INSN, whose pattern has just been changed.
--- 258,297 ----
  void
  function_info::process_uses_of_deleted_def (set_info *set)
  {
!   // Each member of the worklist is either SET or a dead phi.
!   auto_vec<set_info *, 16> worklist;
!   worklist.quick_push (set);
!   while (!worklist.is_empty ())
      {
!       auto *this_set = worklist.pop ();
!       auto *use = this_set->first_use ();
!       if (!use)
! 	{
! 	  if (this_set != set)
! 	    delete_phi (as_a<phi_info *> (this_set));
! 	  continue;
! 	}
        if (use->is_in_phi ())
  	{
! 	  // Removing all uses from the phi ensures that we'll only add
! 	  // the phi to the worklist once.
! 	  auto *phi = use->phi ();
! 	  for (auto *input : phi->inputs ())
! 	    {
! 	      remove_use (input);
! 	      input->set_def (nullptr);
! 	    }
! 	  worklist.safe_push (phi);
  	}
        else
  	{
  	  gcc_assert (use->is_live_out_use ());
  	  remove_use (use);
  	}
!       // The phi handling above might have removed multiple uses of THIS_SET.
!       if (this_set->has_any_uses ())
! 	worklist.safe_push (this_set);
      }
  }
  
  // Update the REG_NOTES of INSN, whose pattern has just been changed.
diff -Nrcpad gcc-16-20250622/gcc/rust/ChangeLog gcc-16-20250629/gcc/rust/ChangeLog
*** gcc-16-20250622/gcc/rust/ChangeLog	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/rust/ChangeLog	Sun Jun 29 22:32:29 2025
***************
*** 1,3 ****
--- 1,8 ----
+ 2025-06-26  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
+ 	(BorrowCheckerDiagnostics::get_loan): Type cast loan to uint32_t.
+ 
  2025-04-28  Owen Avery  <powerboat9.gamer@gmail.com>
  
  	* checks/errors/borrowck/rust-bir-place.h
diff -Nrcpad gcc-16-20250622/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc gcc-16-20250629/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc
*** gcc-16-20250622/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/rust/checks/errors/borrowck/rust-borrow-checker-diagnostics.cc	Sun Jun 29 22:32:30 2025
*************** BorrowCheckerDiagnostics::get_statement
*** 142,148 ****
  const BIR::Loan &
  BorrowCheckerDiagnostics::get_loan (Polonius::Loan loan)
  {
!   return bir_function.place_db.get_loans ()[{loan}];
  }
  
  const HIR::LifetimeParam *
--- 142,148 ----
  const BIR::Loan &
  BorrowCheckerDiagnostics::get_loan (Polonius::Loan loan)
  {
!   return bir_function.place_db.get_loans ()[{(uint32_t) loan}];
  }
  
  const HIR::LifetimeParam *
diff -Nrcpad gcc-16-20250622/gcc/sarif-replay.cc gcc-16-20250629/gcc/sarif-replay.cc
*** gcc-16-20250622/gcc/sarif-replay.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/sarif-replay.cc	Sun Jun 29 22:32:30 2025
*************** along with GCC; see the file COPYING3.
*** 19,24 ****
--- 19,25 ----
  <http://www.gnu.org/licenses/>.  */
  
  #include "config.h"
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "system.h"
  #include "coretypes.h"
*************** struct options
*** 48,53 ****
--- 49,55 ----
  
    replay_options m_replay_opts;
    std::vector<const char *> m_sarif_filenames;
+   std::vector<std::string> m_extra_output_specs;
  };
  
  static void
*************** static const char *const usage_msg = (
*** 70,75 ****
--- 72,81 ----
  "\n"
  "Options:\n"
  "\n"
+ "  -fdiagnostics-add-output=SCHEME\n"
+ "     Add an additional output sink when replaying diagnostics, as\n"
+ "     per the gcc option\n"
+ "\n"
  "  -fdiagnostics-color={never|always|auto}\n"
  "     Control colorization of diagnostics.  Default: auto.\n"
  "\n"
*************** print_usage ()
*** 95,100 ****
--- 101,119 ----
    fprintf (stderr, usage_msg);
  }
  
+ /* If STR starts with PREFIX, return the rest of STR.
+    Otherwise return nullptr.  */
+ 
+ static const char *
+ str_starts_with (const char *str, const char *prefix)
+ {
+   size_t prefix_len = strlen (prefix);
+   if (0 == strncmp (str, prefix, prefix_len))
+     return str + prefix_len;
+   else
+     return nullptr;
+ }
+ 
  static bool
  parse_options (int argc, char **argv,
  	       options &opts,
*************** parse_options (int argc, char **argv,
*** 128,133 ****
--- 147,159 ----
  	  opts.m_replay_opts.m_echo_file = true;
  	  handled = true;
  	}
+ #define ADD_OUTPUT_OPTION "-fdiagnostics-add-output="
+       else if (const char *arg
+ 		= str_starts_with (option, ADD_OUTPUT_OPTION))
+ 	{
+ 	  opts.m_extra_output_specs.push_back (std::string (arg));
+ 	  handled = true;
+ 	}
        else if (strcmp (option, "-fdiagnostics-color=never") == 0)
  	{
  	  opts.m_replay_opts.m_diagnostics_colorize = DIAGNOSTIC_COLORIZE_NO;
*************** main (int argc, char **argv)
*** 221,226 ****
--- 247,258 ----
        libgdiagnostics::manager playback_mgr;
        playback_mgr.add_text_sink (stderr,
  				  opts.m_replay_opts.m_diagnostics_colorize);
+       for (auto spec : opts.m_extra_output_specs)
+ 	if (playback_mgr.add_sink_from_spec
+ 	      (ADD_OUTPUT_OPTION,
+ 	       spec.c_str (),
+ 	       libgdiagnostics::manager (control_mgr.m_inner, false)))
+ 	  return -1;
  
        int result = sarif_replay_path (filename,
  				      playback_mgr.m_inner,
diff -Nrcpad gcc-16-20250622/gcc/selftest-run-tests.cc gcc-16-20250629/gcc/selftest-run-tests.cc
*** gcc-16-20250622/gcc/selftest-run-tests.cc	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/selftest-run-tests.cc	Sun Jun 29 22:32:30 2025
*************** selftest::run_tests ()
*** 81,86 ****
--- 81,87 ----
    ordered_hash_map_tests_cc_tests ();
    splay_tree_cc_tests ();
    xml_cc_tests ();
+   graphviz_cc_tests ();
  
    /* Mid-level data structures.  */
    input_cc_tests ();
*************** selftest::run_tests ()
*** 102,107 ****
--- 103,109 ----
    diagnostic_format_html_cc_tests ();
    diagnostic_format_json_cc_tests ();
    diagnostic_format_sarif_cc_tests ();
+   diagnostic_output_spec_cc_tests ();
    edit_context_cc_tests ();
    fold_const_cc_tests ();
    spellcheck_cc_tests ();
*************** selftest::run_tests ()
*** 111,117 ****
    simple_diagnostic_path_cc_tests ();
    lazy_diagnostic_path_cc_tests ();
    attribs_cc_tests ();
-   opts_diagnostic_cc_tests ();
    path_coverage_cc_tests ();
  
    /* This one relies on most of the above.  */
--- 113,118 ----
diff -Nrcpad gcc-16-20250622/gcc/selftest.h gcc-16-20250629/gcc/selftest.h
*** gcc-16-20250622/gcc/selftest.h	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/selftest.h	Sun Jun 29 22:32:30 2025
*************** extern void diagnostic_color_cc_tests ()
*** 225,230 ****
--- 225,231 ----
  extern void diagnostic_format_html_cc_tests ();
  extern void diagnostic_format_json_cc_tests ();
  extern void diagnostic_format_sarif_cc_tests ();
+ extern void diagnostic_output_spec_cc_tests ();
  extern void diagnostic_path_output_cc_tests ();
  extern void diagnostic_show_locus_cc_tests ();
  extern void digraph_cc_tests ();
*************** extern void gcc_urlifier_cc_tests ();
*** 239,244 ****
--- 240,246 ----
  extern void ggc_tests_cc_tests ();
  extern void gimple_cc_tests ();
  extern void gimple_range_tests ();
+ extern void graphviz_cc_tests ();
  extern void hash_map_tests_cc_tests ();
  extern void hash_set_tests_cc_tests ();
  extern void input_cc_tests ();
*************** extern void lazy_diagnostic_path_cc_test
*** 249,255 ****
  extern void opt_suggestions_cc_tests ();
  extern void optinfo_emit_json_cc_tests ();
  extern void opts_cc_tests ();
- extern void opts_diagnostic_cc_tests ();
  extern void ordered_hash_map_tests_cc_tests ();
  extern void path_coverage_cc_tests ();
  extern void predict_cc_tests ();
--- 251,256 ----
diff -Nrcpad gcc-16-20250622/gcc/testsuite/ChangeLog gcc-16-20250629/gcc/testsuite/ChangeLog
*** gcc-16-20250622/gcc/testsuite/ChangeLog	Sun Jun 22 22:32:21 2025
--- gcc-16-20250629/gcc/testsuite/ChangeLog	Sun Jun 29 22:32:30 2025
***************
*** 1,3 ****
--- 1,513 ----
+ 2025-06-28  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/concat6.adb: New test.
+ 
+ 2025-06-28  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/120644
+ 	* g++.dg/modules/auto-7.h: New test.
+ 	* g++.dg/modules/auto-7_a.H: New test.
+ 	* g++.dg/modules/auto-7_b.C: New test.
+ 
+ 2025-06-28  Lili Cui  <lili.cui@intel.com>
+ 
+ 	PR target/120818
+ 	* g++.target/i386/shrink_wrap_separate.C: Relax the check.
+ 
+ 2025-06-28  Jan Hubicka  <hubicka@ucw.cz>
+ 	    Kugan Vivekanandarajah   <kvivekananda@nvidia.com>
+ 
+ 	* gcc.dg/tree-prof/clone-test.c: New test.
+ 	* gcc.dg/tree-prof/clone-merge-1.c: Updae template.
+ 
+ 2025-06-27  Marek Polacek  <polacek@redhat.com>
+ 
+ 	PR c++/120756
+ 	* g++.dg/warn/deprecated-22.C: New test.
+ 
+ 2025-06-27  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/abi/mangle81.C: Add -fno-implicit-constexpr.
+ 	* g++.dg/init/vbase1.C: Likewise.
+ 	* g++.dg/ipa/ipa-icf-4.C: Likewise.
+ 
+ 2025-06-27  Eric Botcazou  <ebotcazou@adacore.com>
+ 
+ 	* gnat.dg/sso20.adb: New test.
+ 
+ 2025-06-27  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120777
+ 	* g++.dg/cpp26/constexpr-virt-inherit1.C: New test.
+ 	* g++.dg/cpp26/constexpr-virt-inherit2.C: New test.
+ 	* g++.dg/cpp26/constexpr-virt-inherit3.C: New test.
+ 	* g++.dg/cpp26/feat-cxx26.C: Add __cpp_constexpr_virtual_inheritance
+ 	tersts.
+ 	* g++.dg/cpp2a/constexpr-dtor3.C: Don't expect one error for C++26.
+ 	* g++.dg/cpp2a/constexpr-dtor16.C: Don't expect errors for C++26.
+ 	* g++.dg/cpp2a/constexpr-dynamic10.C: Likewise.
+ 	* g++.dg/cpp0x/constexpr-ice21.C: Likewise.
+ 	* g++.dg/cpp0x/constexpr-ice4.C: Likewise.
+ 	* g++.dg/abi/mangle1.C: Guard the test on c++23_down.
+ 	* g++.dg/abi/mangle81.C: New test.
+ 	* g++.dg/ipa/ipa-icf-4.C (A::A): For
+ 	__cpp_constexpr_virtual_inheritance >= 202506L add user provided
+ 	non-constexpr constructor.
+ 
+ 2025-06-27  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/120784
+ 	* gfortran.dg/interface_63.f90: Extend testcase.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/98735
+ 	PR c++/118904
+ 	* g++.dg/modules/src-loc-1.h: New test.
+ 	* g++.dg/modules/src-loc-1_a.H: New test.
+ 	* g++.dg/modules/src-loc-1_b.C: New test.
+ 	* g++.dg/modules/src-loc-1_c.C: New test.
+ 	* g++.dg/modules/ubsan-1_a.C: New test.
+ 	* g++.dg/modules/ubsan-1_b.C: New test.
+ 	* g++.dg/ubsan/module-1-aux.cc: New test.
+ 	* g++.dg/ubsan/module-1.C: New test.
+ 
+ 2025-06-27  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/120040
+ 	* g++.dg/modules/pr120040_a.C: New test.
+ 	* g++.dg/modules/pr120040_b.C: New test.
+ 
+ 2025-06-27  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* gcc.dg/tree-prof/afdo-crossmodule-1.c: Update template.
+ 
+ 2025-06-27  Jeff Law  <jlaw@ventanamicro.com>
+ 
+ 	PR target/119971
+ 	* gcc.target/riscv/pr119971.c: Fix typo.
+ 
+ 2025-06-27  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120808
+ 	* gcc.dg/vect/bb-slp-pr120808.c: Now also expect FMADDSUB
+ 	patterns to be matched.
+ 
+ 2025-06-27  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120830
+ 	* g++.target/i386/pr120830.C: New test.
+ 
+ 2025-06-26  Dimitar Dimitrov  <dimitar@dinux.eu>
+ 
+ 	* gcc.target/pru/mov64-subreg-1.c: New test.
+ 	* gcc.target/pru/mov64-subreg-2.c: New test.
+ 
+ 2025-06-26  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/120809
+ 	* gcc.dg/analyzer/state-diagram-5.c: Split out into...
+ 	* gcc.dg/analyzer/state-diagram-5-html.c: ...this, adding
+ 	dg-require-dot...
+ 	* gcc.dg/analyzer/state-diagram-5-sarif.c: ...and this.
+ 
+ 2025-06-26  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* g++.dg/cpp26/type-order1.C: New test.
+ 	* g++.dg/cpp26/type-order2.C: New test.
+ 	* g++.dg/cpp26/type-order3.C: New test.
+ 
+ 2025-06-26  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	PR target/120719
+ 	* gcc.target/i386/crc-builtin-crc32.c: New test.
+ 
+ 2025-06-26  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* gcc.dg/tree-prof/afdo-crossmodule-1.c: New test.
+ 	* gcc.dg/tree-prof/afdo-crossmodule-1b.c: New test.
+ 
+ 2025-06-26  Andre Vehreschild  <vehre@gcc.gnu.org>
+ 
+ 	PR fortran/120711
+ 	* gfortran.dg/asan/array_constructor_1.f90: New test.
+ 
+ 2025-06-26  Jan Hubicka  <hubicka@ucw.cz>
+ 
+ 	* gcc.dg/tree-prof/indir-call-prof-2.c: Update template.
+ 
+ 2025-06-26  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120819
+ 	* g++.target/i386/pr120819.C: New test.
+ 
+ 2025-06-26  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/119628
+ 	* gcc.target/i386/no-callee-saved-3.c: Adjust error location.
+ 	* gcc.target/i386/no-callee-saved-19a.c: New test.
+ 	* gcc.target/i386/no-callee-saved-19b.c: Likewise.
+ 	* gcc.target/i386/no-callee-saved-19c.c: Likewise.
+ 	* gcc.target/i386/no-callee-saved-19d.c: Likewise.
+ 	* gcc.target/i386/no-callee-saved-19e.c: Likewise.
+ 	* gcc.target/i386/preserve-none-1.c: Likewise.
+ 	* gcc.target/i386/preserve-none-2.c: Likewise.
+ 	* gcc.target/i386/preserve-none-3.c: Likewise.
+ 	* gcc.target/i386/preserve-none-4.c: Likewise.
+ 	* gcc.target/i386/preserve-none-5.c: Likewise.
+ 	* gcc.target/i386/preserve-none-6.c: Likewise.
+ 	* gcc.target/i386/preserve-none-7.c: Likewise.
+ 	* gcc.target/i386/preserve-none-8.c: Likewise.
+ 	* gcc.target/i386/preserve-none-9.c: Likewise.
+ 	* gcc.target/i386/preserve-none-10.c: Likewise.
+ 	* gcc.target/i386/preserve-none-11.c: Likewise.
+ 	* gcc.target/i386/preserve-none-12.c: Likewise.
+ 	* gcc.target/i386/preserve-none-13.c: Likewise.
+ 	* gcc.target/i386/preserve-none-14.c: Likewise.
+ 	* gcc.target/i386/preserve-none-15.c: Likewise.
+ 	* gcc.target/i386/preserve-none-16.c: Likewise.
+ 	* gcc.target/i386/preserve-none-17.c: Likewise.
+ 	* gcc.target/i386/preserve-none-18.c: Likewise.
+ 	* gcc.target/i386/preserve-none-19.c: Likewise.
+ 	* gcc.target/i386/preserve-none-20.c: Likewise.
+ 	* gcc.target/i386/preserve-none-21.c: Likewise.
+ 	* gcc.target/i386/preserve-none-22.c: Likewise.
+ 	* gcc.target/i386/preserve-none-23.c: Likewise.
+ 	* gcc.target/i386/preserve-none-24.c: Likewise.
+ 	* gcc.target/i386/preserve-none-25.c: Likewise.
+ 	* gcc.target/i386/preserve-none-26.c: Likewise.
+ 	* gcc.target/i386/preserve-none-27.c: Likewise.
+ 	* gcc.target/i386/preserve-none-28.c: Likewise.
+ 	* gcc.target/i386/preserve-none-29.c: Likewise.
+ 	* gcc.target/i386/preserve-none-30a.c: Likewise.
+ 	* gcc.target/i386/preserve-none-30b.c: Likewise.
+ 
+ 2025-06-25  Luis Silva  <luiss@synopsys.com>
+ 
+ 	* gcc.target/arc/mult-cmp0.c: New test.
+ 
+ 2025-06-25  Luis Silva  <luiss@synopsys.com>
+ 
+ 	* gcc.target/arc/overflow-1.c: Replace mov.hs with rlc.
+ 
+ 2025-06-25  Shahab Vahedi  <shahab@synopsys.com>
+ 
+ 	* gcc.target/arc/overflow-2.c: New file.
+ 
+ 2025-06-25  Shahab Vahedi  <shahab@synopsys.com>
+ 
+ 	* gcc.target/arc/overflow-1.c: New file
+ 
+ 2025-06-25  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/109892
+ 	* gcc.dg/vect/vect-reduc-fma-1.c: New testcase.
+ 	* gcc.dg/vect/vect-reduc-fma-2.c: Likewise.
+ 	* gcc.dg/vect/vect-reduc-fma-3.c: Likewise.
+ 
+ 2025-06-25  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/120808
+ 	* gcc.dg/vect/bb-slp-pr120808.c: New testcase.
+ 
+ 2025-06-25  Alfie Richards  <alfie.richards@arm.com>
+ 
+ 	* gcc.target/aarch64/sve/adr_7.c: New test.
+ 
+ 2025-06-25  Jiawei  <jiawei@iscas.ac.cn>
+ 
+ 	* gcc.target/riscv/arch-rva23s.c: New test.
+ 	* gcc.target/riscv/arch-rvb23s.c: New test.
+ 
+ 2025-06-24  Paul-Antoine Arras  <parras@baylibre.com>
+ 
+ 	PR target/119100
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c: Add vfmacc and vfmsac.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h: Add support for acc
+ 	variants.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c: Define
+ 	TEST_OUT.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c: Likewise.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c: New test.
+ 
+ 2025-06-24  Harald Anlauf  <anlauf@gmx.de>
+ 	    Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 	    Mikael Morin  <mikael@gcc.gnu.org>
+ 
+ 	PR fortran/120743
+ 	* gfortran.dg/pr120743.f90: New test.
+ 
+ 2025-06-24  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120773
+ 	* g++.dg/parse/linkage5.C: Don't expect error on
+ 	extern "C++" int main ();.
+ 	* g++.dg/parse/linkage7.C: New test.
+ 	* g++.dg/parse/linkage8.C: New test.
+ 	* g++.dg/modules/main-2.C: New test.
+ 	* g++.dg/modules/main-3.C: New test.
+ 
+ 2025-06-24  Juergen Christ  <jchrist@linux.ibm.com>
+ 
+ 	* gcc.target/s390/vector/vec-extract-1.c: Fix test on arch11.
+ 	* gcc.target/s390/vector/vec-set-1.c: Run test on arch11.
+ 	* gcc.target/s390/vector/vec-extract-2.c: New test.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* gcc.target/aarch64/autovec_param_asimd-only_2.c: New test.
+ 	* gcc.target/aarch64/autovec_param_default_2.c: New test.
+ 	* gcc.target/aarch64/autovec_param_prefer-asimd_2.c: New test.
+ 	* gcc.target/aarch64/autovec_param_prefer-sve_2.c: New test.
+ 	* gcc.target/aarch64/autovec_param_sve-only_2.c: New test.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* gcc.target/aarch64/sve/cost_model_17.c: New test.
+ 	* gcc.target/aarch64/sve/cost_model_18.c: New test.
+ 
+ 2025-06-24  Mikael Morin  <morin-mikael@orange.fr>
+ 
+ 	* gfortran.dg/select_type_51.f90: New test.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* gcc.target/aarch64/unroll-vect.c: New test.
+ 
+ 2025-06-24  Tamar Christina  <tamar.christina@arm.com>
+ 
+ 	* gcc.target/i386/pr64110.c: Update testcase.
+ 
+ 2025-06-24  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	* gcc.target/i386/keylocker-aesdecwide128kl.c: Updated to expect
+ 	movdqa instead pxor.
+ 	* gcc.target/i386/keylocker-aesdecwide256kl.c: Likewise.
+ 	* gcc.target/i386/keylocker-aesencwide128kl.c: Likewise.
+ 	* gcc.target/i386/keylocker-aesencwide256kl.c: Likewise.
+ 	* gcc.target/i386/pr92080-4.c: New test.
+ 	* gcc.target/i386/pr92080-5.c: Likewise.
+ 	* gcc.target/i386/pr92080-6.c: Likewise.
+ 	* gcc.target/i386/pr92080-7.c: Likewise.
+ 	* gcc.target/i386/pr92080-8.c: Likewise.
+ 	* gcc.target/i386/pr92080-9.c: Likewise.
+ 	* gcc.target/i386/pr92080-10.c: Likewise.
+ 	* gcc.target/i386/pr92080-11.c: Likewise.
+ 	* gcc.target/i386/pr92080-12.c: Likewise.
+ 	* gcc.target/i386/pr92080-13.c: Likewise.
+ 	* gcc.target/i386/pr92080-14.c: Likewise.
+ 	* gcc.target/i386/pr92080-15.c: Likewise.
+ 	* gcc.target/i386/pr92080-16.c: Likewise.
+ 	* gcc.target/i386/pr92080-17.c: Likewise.
+ 	* gcc.target/i386/pr92080-18.c: Likewise.
+ 	* gcc.target/i386/pr92080-19.c: Likewise.
+ 	* gcc.target/i386/pr92080-20.c: Likewise.
+ 
+ 2025-06-24  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/70308
+ 	PR target/101366
+ 	PR target/102294
+ 	PR target/108585
+ 	PR target/118276
+ 	PR target/119596
+ 	PR target/119703
+ 	PR target/119704
+ 	* g++.target/i386/memset-pr101366-1.C: New test.
+ 	* g++.target/i386/memset-pr101366-2.C: Likewise.
+ 	* g++.target/i386/memset-pr108585-1a.C: Likewise.
+ 	* g++.target/i386/memset-pr108585-1b.C: Likewise.
+ 	* g++.target/i386/memset-pr118276-1a.C: Likewise.
+ 	* g++.target/i386/memset-pr118276-1b.C: Likewise.
+ 	* g++.target/i386/memset-pr118276-1c.C: Likewise.
+ 	* gcc.target/i386/memcpy-strategy-12.c: Likewise.
+ 	* gcc.target/i386/memcpy-strategy-13.c: Likewise.
+ 	* gcc.target/i386/memset-pr70308-1a.c: Likewise.
+ 	* gcc.target/i386/memset-pr70308-1b.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-25.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-26.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-27.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-28.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-29.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-30.c: Likewise.
+ 	* gcc.target/i386/memset-strategy-31.c: Likewise.
+ 	* gcc.target/i386/auto-init-padding-3.c: Expect XMM stores.
+ 	* gcc.target/i386/auto-init-padding-9.c: Likewise.
+ 	* gcc.target/i386/mvc17.c: Fail with "rep mov"
+ 	* gcc.target/i386/pr111657-1.c: Scan for unrolled loop.  Fail
+ 	with "rep mov".
+ 	* gcc.target/i386/shrink_wrap_1.c: Also pass
+ 	-mmemset-strategy=rep_8byte:-1:align.
+ 	* gcc.target/i386/sw-1.c: Also pass -mstringop-strategy=rep_byte.
+ 
+ 2025-06-24  Lili Cui  <lili.cui@intel.com>
+ 
+ 	PR target/120741
+ 	* gcc.target/i386/pr120741.c: New test.
+ 	* gcc.target/i386/shrink-wrap-separate-mingw.c: Likewise.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	PR testsuite/116163
+ 	PR sarif-replay/120792
+ 	* sarif-replay.dg/2.1.0-valid/signal-1-check-html.py: New test
+ 	script.
+ 	* sarif-replay.dg/2.1.0-valid/signal-1.c.sarif: Add html and sarif
+ 	generation to options.  Invoke the new script to verify that HTML
+ 	and SARIF is generated.
+ 	* sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py: New file.
+ 
+ 2025-06-23  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* c-c++-common/goacc/acc-wait-1.c: New test.
+ 	* gfortran.dg/goacc/acc-wait-1.f90: New test.
+ 
+ 2025-06-23  Harald Anlauf  <anlauf@gmx.de>
+ 
+ 	PR fortran/120784
+ 	* gfortran.dg/interface_63.f90: New test.
+ 
+ 2025-06-23  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR other/116792
+ 	* g++.dg/analyzer/state-diagram.C: New test.
+ 	* gcc.dg/analyzer/analyzer-decls.h (__analyzer_dump_dot): New
+ 	decl.
+ 	(__analyzer_dump_xml): New decl.
+ 	* gcc.dg/analyzer/state-diagram-1-sarif.py: New test script.
+ 	* gcc.dg/analyzer/state-diagram-1.c: New test.
+ 	* gcc.dg/analyzer/state-diagram-2.c: New test.
+ 	* gcc.dg/analyzer/state-diagram-3.c: New test.
+ 	* gcc.dg/analyzer/state-diagram-4.c: New test.
+ 	* gcc.dg/analyzer/state-diagram-5-html.py: New test script.
+ 	* gcc.dg/analyzer/state-diagram-5-sarif.py: New test script.
+ 	* gcc.dg/analyzer/state-diagram-5.c: New test.
+ 	* gcc.dg/plugin/analyzer_cpython_plugin.cc: Define INCLUDE_STRING.
+ 	* gcc.dg/plugin/analyzer_gil_plugin.cc: Likewise.
+ 	* gcc.dg/plugin/analyzer_kernel_plugin.cc: Likewise.
+ 	* gcc.dg/plugin/analyzer_known_fns_plugin.cc: Likewise.
+ 	* lib/htmltest.py (ns): Add SVG namespace.
+ 	* lib/sarif.py (get_result_by_index): New.
+ 	(get_xml_state): New.
+ 
+ 2025-06-23  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c: Add asm check
+ 	for vsaddu.vx combine.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c: Ditto.
+ 
+ 2025-06-23  Pan Li  <pan2.li@intel.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c: Add asm check.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c: Ditto.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h: Add test
+ 	helper macros.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h: Add test
+ 	data for run test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c: New test.
+ 	* gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c: New test.
+ 
+ 2025-06-23  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/120608
+ 	* c-c++-common/asan/pr120608-1.c: New test.
+ 	* c-c++-common/asan/pr120608-2.c: New test.
+ 
+ 2025-06-23  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/120608
+ 	* g++.dg/asan/pr120608.C: New test.
+ 
+ 2025-06-23  Pengfei Li  <Pengfei.Li2@arm.com>
+ 
+ 	* gcc.dg/vect/vect-early-break_133_pfa6.c: Adjust test.
+ 
+ 2025-06-23  Mikael Morin  <morin-mikael@orange.fr>
+ 
+ 	* gfortran.dg/non_lvalue_1.f90: New test.
+ 
+ 2025-06-23  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR rtl-optimization/120721
+ 	* g++.dg/torture/pr120721.C: New test.
+ 
+ 2025-06-23  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR target/120728
+ 	* gcc.target/i386/avx512bw-vmovdqu16-1.c: Scan vmovdqu for
+ 	non-EVEX register operands.
+ 	* gcc.target/i386/avx512bw-vmovdqu8-1.c: Likewise.
+ 	* gcc.target/i386/avx512fp16-13.c: Likewise.
+ 	* gcc.target/i386/pr100865-10b.c: Likewise.
+ 	* gcc.target/i386/pr100865-3.c: Likewise.
+ 	* gcc.target/i386/pr100865-4b.c: Likewise.
+ 	* gcc.target/i386/pr100865-5b.c: Likewise.
+ 	* gcc.target/i386/pr90773-15.c: Likewise.
+ 	* gcc.target/i386/pr90773-16.c: Likewise.
+ 	* gcc.target/i386/pr90773-17.c: Likewise.
+ 	* gcc.target/i386/pr95483-5.c: Likewise.
+ 	* gcc.target/i386/pr120728.c: New test.
+ 
+ 2025-06-22  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	PR target/119830
+ 	* gcc.target/riscv/pr119830.c: New test.
+ 
+ 2025-06-22  Gaius Mulley  <gaiusmod2@gmail.com>
+ 
+ 	PR modula2/120731
+ 	* gm2/pimlib/logitech/run/pass/teststrings.mod: New test.
+ 
  2025-06-21  Jeff Law  <jlaw@ventanamicro.com>
  
  	PR target/118241
diff -Nrcpad gcc-16-20250622/gcc/testsuite/c-c++-common/asan/pr120608-1.c gcc-16-20250629/gcc/testsuite/c-c++-common/asan/pr120608-1.c
*** gcc-16-20250622/gcc/testsuite/c-c++-common/asan/pr120608-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/c-c++-common/asan/pr120608-1.c	Sun Jun 29 22:32:35 2025
***************
*** 0 ****
--- 1,43 ----
+ /* PR middle-end/120608 */
+ /* { dg-do run { target musttail } } */
+ /* { dg-options "-O2 -fsanitize=address" } */
+ 
+ __attribute__((noipa)) void
+ foo (int *x, int *y, int *z)
+ {
+   ++x[0];
+   ++y[0];
+   ++z[0];
+ }
+ 
+ __attribute__((noipa)) void
+ bar (int *x, int *y, int *z)
+ {
+   if (x || y || z)
+     __builtin_abort ();
+ }
+ 
+ __attribute__((noipa)) void
+ baz (int *x, int *y, int *z)
+ {
+   (void) x; (void) y; (void) z;
+   int a = 42, b = -42, c = 0;
+   foo (&a, &b, &c);
+   [[gnu::musttail]] return bar (0, 0, 0);
+ }
+ 
+ __attribute__((noipa)) void
+ qux (int *x, int *y, int *z)
+ {
+   (void) x; (void) y; (void) z;
+   int a = 42, b = -42, c = 0;
+   foo (&a, &b, &c);
+   [[gnu::musttail]] return bar (0, 0, 0);
+ }
+ 
+ int
+ main ()
+ {
+   baz (0, 0, 0);
+   qux (0, 0, 0);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/c-c++-common/asan/pr120608-2.c gcc-16-20250629/gcc/testsuite/c-c++-common/asan/pr120608-2.c
*** gcc-16-20250622/gcc/testsuite/c-c++-common/asan/pr120608-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/c-c++-common/asan/pr120608-2.c	Sun Jun 29 22:32:35 2025
***************
*** 0 ****
--- 1,39 ----
+ /* PR middle-end/120608 */
+ /* { dg-do run { target musttail } } */
+ /* { dg-options "-O2 -fsanitize=address" } */
+ /* { dg-set-target-env-var ASAN_OPTIONS "detect_stack_use_after_return=1" } */
+ /* { dg-shouldfail "asan" } */
+ 
+ __attribute__((noipa)) void
+ foo (int *x, int *y, int *z)
+ {
+   ++x[0];
+   ++y[0];
+   ++z[0];
+ }
+ 
+ __attribute__((noipa)) void
+ bar (int *x, int *y, int *z)
+ {
+   volatile int a = x[0] + y[0] + z[0];
+ }
+ 
+ __attribute__((noipa)) void
+ baz (int *x, int *y, int *z)
+ {
+   (void) x; (void) y; (void) z;
+   int a = 42, b = -42, c = 0;
+   foo (&a, &b, &c);
+   [[gnu::musttail]] return bar (&a, &b, &c);	/* { dg-warning "address of automatic variable 'a' passed to 'musttail' call argument" } */
+ }						/* { dg-warning "address of automatic variable 'b' passed to 'musttail' call argument" "" { target *-*-* } .-1 } */
+ 						/* { dg-warning "address of automatic variable 'c' passed to 'musttail' call argument" "" { target *-*-* } .-2 } */
+ 
+ int
+ main ()
+ {
+   baz (0, 0, 0);
+ }
+ 
+ // { dg-output "ERROR: AddressSanitizer: stack-use-after-return on address.*(\n|\r\n|\r)" }
+ // { dg-output "READ of size .*" }
+ // { dg-output ".*'a' \\(line 25\\) <== Memory access at offset \[0-9\]* is inside this variable.*" }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/c-c++-common/goacc/acc-wait-1.c gcc-16-20250629/gcc/testsuite/c-c++-common/goacc/acc-wait-1.c
*** gcc-16-20250622/gcc/testsuite/c-c++-common/goacc/acc-wait-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/c-c++-common/goacc/acc-wait-1.c	Sun Jun 29 22:32:35 2025
***************
*** 0 ****
--- 1,51 ----
+ // { dg-do compile }
+ // { dg-additional-options "-fdump-tree-original" }
+ 
+ void f0 (int x)
+ {
+   #pragma acc wait(x) if(false) async
+ }
+ // { dg-final { scan-tree-dump-times "if \\(0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-1, 1, x\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-not "__builtin_GOACC_wait \\(-1, 1, x\\);" "original" { target c++ } } }
+ 
+ 
+ void f1 (int y, int ia)
+ {
+   #pragma acc wait(y) if(true) async(ia)
+ }
+ // { dg-final { scan-tree-dump-times "if \\(1\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(ia, 1, y\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-times "__builtin_GOACC_wait \\(ia, 1, y\\)" 1 "original" { target c++ } } }
+ // { dg-final { scan-tree-dump-not "if \\(\[^\\n\\r\]+\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(ia, 1, y\\);" "original" { target c++ } } }
+ 
+ 
+ void fl (int z, bool ll)
+ {
+   #pragma acc wait(z) if(ll) async(3)
+ }
+ // { dg-final { scan-tree-dump-times "if \\(ll != 0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(3, 1, z\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-times "if \\(ll\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(3, 1, z\\);" 1 "original" { target c++ } } }
+ 
+ 
+ void a0 (int a)
+ {
+   #pragma acc wait(a) if(false)
+ }
+ // { dg-final { scan-tree-dump-times "if \\(0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, a\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-not "__builtin_GOACC_wait \\(-2, 1, a\\);" "original" { target c++ } } }
+ 
+ 
+ void a1 (int b)
+ {
+   #pragma acc wait(b) if(true)
+ }
+ // { dg-final { scan-tree-dump-times "if \\(1\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, b\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-times "__builtin_GOACC_wait \\(-2, 1, b\\)" 1 "original" { target c++ } } }
+ // { dg-final { scan-tree-dump-not "if \\(\[^\\n\\r\]+\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, b\\);" "original" { target c++ } } }
+ 
+ 
+ void al (int c, bool qq)
+ {
+   #pragma acc wait(c) if(qq)
+ }
+ // { dg-final { scan-tree-dump-times "if \\(qq != 0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, c\\);" 1 "original" { target c } } }
+ // { dg-final { scan-tree-dump-times "if \\(qq\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, c\\);" 1 "original" { target c++ } } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/abi/mangle1.C gcc-16-20250629/gcc/testsuite/g++.dg/abi/mangle1.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/abi/mangle1.C	Sun Jun 22 22:32:24 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/abi/mangle1.C	Sun Jun 29 22:32:38 2025
***************
*** 1,6 ****
  // Test for mangling of simple testcase involving construction vtables.
  
! // { dg-do compile }
  // { dg-options "-fno-inline -fabi-compat-version=0" }
  
  struct A {
--- 1,8 ----
  // Test for mangling of simple testcase involving construction vtables.
  
! // For C++26, the ctor is constant evaluated and so construction vtables
! // aren't needed.
! // { dg-do compile { target c++23_down } }
  // { dg-options "-fno-inline -fabi-compat-version=0" }
  
  struct A {
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/abi/mangle81.C gcc-16-20250629/gcc/testsuite/g++.dg/abi/mangle81.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/abi/mangle81.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/abi/mangle81.C	Sun Jun 29 22:32:38 2025
***************
*** 0 ****
--- 1,29 ----
+ // Test for mangling of simple testcase involving construction vtables.
+ 
+ // { dg-do compile }
+ // { dg-options "-fno-inline -fabi-compat-version=0 -fno-implicit-constexpr" }
+ 
+ struct A {
+   virtual void f () { }
+   A () {}
+ };
+ 
+ struct B: public virtual A { };
+ struct C: public B { };
+ 
+ C c;
+ 
+ // { dg-final { scan-assembler "\n_?_ZN1A1fEv\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZN1AC2Ev\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZN1BC2Ev\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZN1CC1Ev\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTC1C0_1B\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTI1A\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTI1B\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTI1C\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTS1A\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTS1B\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTS1C\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTT1C\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTV1A\[: \t\n\]" } }
+ // { dg-final { scan-assembler "\n_?_ZTV1C\[: \t\n\]" } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/analyzer/state-diagram.C gcc-16-20250629/gcc/testsuite/g++.dg/analyzer/state-diagram.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/analyzer/state-diagram.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/analyzer/state-diagram.C	Sun Jun 29 22:32:38 2025
***************
*** 0 ****
--- 1,15 ----
+ #include "../../gcc.dg/analyzer/analyzer-decls.h"
+ 
+ struct foo
+ {
+   virtual ~foo () {}
+ 
+   foo (int i) : m_i (i) {}
+ 
+   int m_i;
+ };
+ 
+ void test ()
+ {
+   foo *f = new foo (42);
+ } // { dg-warning "leak of 'f'" }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/asan/pr120608.C gcc-16-20250629/gcc/testsuite/g++.dg/asan/pr120608.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/asan/pr120608.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/asan/pr120608.C	Sun Jun 29 22:32:38 2025
***************
*** 0 ****
--- 1,17 ----
+ // PR middle-end/120608
+ // { dg-do compile { target musttail } }
+ // { dg-options "-fsanitize=address" }
+ // { dg-skip-if "" { *-*-* } { "*" } { "-O0" } }
+ 
+ struct A;
+ struct B { unsigned long b; };
+ typedef const char *(*F) (void *u, const char *v, void *w, const struct A *x,
+ 			  unsigned long y, struct B z);
+ struct A { F a; };
+ 
+ const char *
+ foo (void *u, const char *v, void *w, const struct A *x, unsigned long y,
+      struct B z)
+ {
+   [[gnu::musttail]] return x->a (u, v, w, x, y, z);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C	Sun Jun 22 22:32:25 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp0x/constexpr-ice21.C	Sun Jun 29 22:32:47 2025
*************** struct NoMut1 { int a, b; };
*** 5,17 ****
  struct NoMut3 : virtual NoMut1 {
    constexpr NoMut3(int a, int b)
      : NoMut1{a, b}
!   {} // { dg-error "virtual base" }
  };
  void mutable_subobjects() {
!   constexpr NoMut3 nm3 = {1, 2}; // { dg-error "call to non" }
    struct A {
      void f() {
!       static_assert(nm3.a == 1, ""); // { dg-error "local variable" }
      }
    };
  }
--- 5,17 ----
  struct NoMut3 : virtual NoMut1 {
    constexpr NoMut3(int a, int b)
      : NoMut1{a, b}
!   {} // { dg-error "virtual base" "" { target c++23_down } }
  };
  void mutable_subobjects() {
!   constexpr NoMut3 nm3 = {1, 2}; // { dg-error "call to non" "" { target c++23_down } }
    struct A {
      void f() {
!       static_assert(nm3.a == 1, ""); // { dg-error "local variable" "" { target c++23_down } }
      }
    };
  }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C	Sun Jun 22 22:32:25 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp0x/constexpr-ice4.C	Sun Jun 29 22:32:47 2025
*************** struct A {};
*** 5,9 ****
  
  struct B : virtual A
  {
!   constexpr B() { } // { dg-error "has virtual base classes" }
  };
--- 5,9 ----
  
  struct B : virtual A
  {
!   constexpr B() { } // { dg-error "has virtual base classes" "" { target c++23_down } }
  };
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit1.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,189 ----
+ // C++26 P3533R2 - constexpr virtual inheritance
+ // { dg-do compile { target c++26 } }
+ 
+ struct A {
+   int a;
+   constexpr virtual int foo () { return a; };
+   constexpr A () : a (42) {}
+   constexpr A (int x) : a (x) {}
+   constexpr virtual ~A () { if (a < 42 || a > 62) asm (""); }
+ };
+ struct B : public A {
+   int b;
+   constexpr virtual int foo () { return a + b; }
+   constexpr B () : A (43), b (42) {}
+   constexpr B (int x, int y) : A (x), b (y) {}
+   constexpr virtual ~B () { if (b < 42 || b > 62) asm (""); }
+ };
+ struct C : virtual public B {
+   int c;
+   constexpr C () : B (44, 43), c (45) {}
+   constexpr C (int x) : B (44, 43), c (x) {}
+   constexpr virtual int bar () { return a + b + c; }
+   constexpr virtual ~C () { if (c < 42 || c > 62) asm (""); }
+ };
+ struct D : virtual public B {
+   int d;
+   constexpr D () : B (44, 43), d (45) {}
+   constexpr D (int x) : B (44, 43), d (x) {}
+   constexpr virtual int baz () { return a + b + d; }
+   constexpr virtual ~D () { if (d < 42 || d > 62) asm (""); }
+ };
+ struct E : public C, D {
+   int e;
+   constexpr E () : B (), C (), D (), e (58) {}
+   constexpr E (int x, int y, int z, int w, int v) : B (x, y), C (z), D (w), e (v) {}
+   constexpr virtual ~E () { if (e < 42 || e > 62) asm (""); }
+ };
+ 
+ constexpr bool
+ qux ()
+ {
+   E f (45, 46, 47, 48, 49);
+   f.a++;
+   f.b++;
+   f.c++;
+   f.d++;
+   f.e++;
+   C *c = static_cast <C *> (&f);
+   D *d = static_cast <D *> (&f);
+   B *b = static_cast <B *> (&f);
+   A *a = static_cast <A *> (&f);
+   if (f.foo () != 46 + 47)
+     return false;
+   if (f.bar () != 46 + 47 + 48)
+     return false;
+   if (f.baz () != 46 + 47 + 49)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   c->c += 4;
+   c->a += 5;
+   d->d += 6;
+   d->a += 7;
+   if (c->foo () != 60 + 50)
+     return false;
+   c->b -= 3;
+   if (d->foo () != 60 + 47)
+     return false;
+   if (f.a != 60 || f.b != 47 || f.c != 52 || f.d != 55 || f.e != 50)
+     return false;
+   C g (48);
+   c = static_cast <C *> (&g);
+   b = static_cast <B *> (&g);
+   a = static_cast <A *> (&g);
+   g.a++;
+   g.b++;
+   g.c++;
+   if (g.foo () != 45 + 44)
+     return false;
+   if (g.bar () != 45 + 44 + 49)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   c->c += 4;
+   if (c->foo () != 47 + 47)
+     return false;
+   if (g.a != 47 || g.b != 47 || g.c != 53)
+     return false;
+   D h (49);
+   d = static_cast <D *> (&h);
+   b = static_cast <B *> (&h);
+   a = static_cast <A *> (&h);
+   h.a++;
+   h.b++;
+   h.d++;
+   if (h.foo () != 45 + 44)
+     return false;
+   if (h.baz () != 45 + 44 + 50)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   d->d += 4;
+   if (d->foo () != 47 + 47)
+     return false;
+   if (h.a != 47 || h.b != 47 || h.d != 54)
+     return false;
+   return true;
+ }
+ 
+ constexpr bool
+ corge ()
+ {
+   E *f = new E (45, 46, 47, 48, 49);
+   f->a++;
+   f->b++;
+   f->c++;
+   f->d++;
+   f->e++;
+   C *c = static_cast <C *> (f);
+   D *d = static_cast <D *> (f);
+   B *b = static_cast <B *> (f);
+   A *a = static_cast <A *> (f);
+   if (f->foo () != 46 + 47)
+     return false;
+   if (f->bar () != 46 + 47 + 48)
+     return false;
+   if (f->baz () != 46 + 47 + 49)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   c->c += 4;
+   c->a += 5;
+   d->d += 6;
+   d->a += 7;
+   if (c->foo () != 60 + 50)
+     return false;
+   c->b -= 3;
+   if (d->foo () != 60 + 47)
+     return false;
+   if (f->a != 60 || f->b != 47 || f->c != 52 || f->d != 55 || f->e != 50)
+     return false;
+   C *g = new C (48);
+   c = static_cast <C *> (g);
+   b = static_cast <B *> (g);
+   a = static_cast <A *> (g);
+   g->a++;
+   g->b++;
+   g->c++;
+   if (g->foo () != 45 + 44)
+     return false;
+   if (g->bar () != 45 + 44 + 49)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   c->c += 4;
+   if (c->foo () != 47 + 47)
+     return false;
+   if (g->a != 47 || g->b != 47 || g->c != 53)
+     return false;
+   D *h = new D (49);
+   d = static_cast <D *> (h);
+   b = static_cast <B *> (h);
+   a = static_cast <A *> (h);
+   h->a++;
+   h->b++;
+   h->d++;
+   if (h->foo () != 45 + 44)
+     return false;
+   if (h->baz () != 45 + 44 + 50)
+     return false;
+   a->a += 2;
+   b->b += 3;
+   d->d += 4;
+   if (d->foo () != 47 + 47)
+     return false;
+   if (h->a != 47 || h->b != 47 || h->d != 54)
+     return false;
+   delete h;
+   delete g;
+   delete f;
+   return true;
+ }
+ 
+ static_assert (qux ());
+ static_assert (corge ());
+ constexpr E a;
+ constexpr E b (45, 46, 47, 48, 49);
+ constexpr C c;
+ constexpr C d (50);
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit2.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,18 ----
+ // C++26 P3533R2 - constexpr virtual inheritance
+ // { dg-do compile { target c++26 } }
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C : virtual public A, B { int c; };
+ 
+ constexpr C
+ foo ()
+ {
+   C c;
+   c.a = 1;
+   c.b = 2;
+   c.c = 3;
+   return c;
+ }
+ 
+ static_assert (foo ().a == 1 && foo ().b == 2 && foo ().c == 3);
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/constexpr-virt-inherit3.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,91 ----
+ // C++26 P3533R2 - constexpr virtual inheritance
+ // { dg-do compile { target c++26 } }
+ 
+ #define M(N, P1, P2, P3, P4, P5, P6, N1, N2, N3) \
+ struct S##N {								\
+   int a, b;								\
+   constexpr S##N () : a (0), b (0) {}					\
+   constexpr virtual int bar (int) { return 0; }				\
+ };									\
+ struct T##N : virtual P1 S##N {						\
+   int c, d;								\
+   constexpr T##N () : c (0), d (0) {}					\
+ };									\
+ struct U##N : virtual P2 S##N, virtual P3 T##N {			\
+   int e;								\
+   constexpr U##N () : e (0) {}						\
+ };									\
+ struct V##N : virtual P4 S##N, virtual P5 T##N, virtual P6 U##N {	\
+   int f;								\
+   constexpr V##N () : f (0) {}						\
+   constexpr const S##N *foo () const { return (const S##N *)this; }	\
+ };									\
+ constexpr V##N v##N;							\
+ static_assert (N1 !!dynamic_cast<const V##N *> (v##N.foo ()));		\
+ static_assert (N2 !!dynamic_cast<const T##N *> (v##N.foo ()));		\
+ static_assert (N3 !!dynamic_cast<const U##N *> (v##N.foo ()));
+ 
+ M(0, public, public, public, public, public, public, , , )
+ M(1, private, public, public, public, public, public, , , )
+ M(2, public, private, public, public, public, public, , , )
+ M(3, private, private, public, public, public, public, , , )
+ M(4, public, public, private, public, public, public, , , )
+ M(5, private, public, private, public, public, public, , , )
+ M(6, public, private, private, public, public, public, , , )
+ M(7, private, private, private, public, public, public, , , )
+ M(8, public, public, public, private, public, public, , , )
+ M(9, private, public, public, private, public, public, , , )
+ M(10, public, private, public, private, public, public, , , )
+ M(11, private, private, public, private, public, public, !, !, !)
+ M(12, public, public, private, private, public, public, , , )
+ M(13, private, public, private, private, public, public, , , )
+ M(14, public, private, private, private, public, public, , , )
+ M(15, private, private, private, private, public, public, !, !, !)
+ M(16, public, public, public, public, private, public, , , )
+ M(17, private, public, public, public, private, public, , , )
+ M(18, public, private, public, public, private, public, , , )
+ M(19, private, private, public, public, private, public, , , )
+ M(20, public, public, private, public, private, public, , !, )
+ M(21, private, public, private, public, private, public, , !, )
+ M(22, public, private, private, public, private, public, , !, )
+ M(23, private, private, private, public, private, public, , !, )
+ M(24, public, public, public, private, private, public, , , )
+ M(25, private, public, public, private, private, public, , , )
+ M(26, public, private, public, private, private, public, , , )
+ M(27, private, private, public, private, private, public, !, !, !)
+ M(28, public, public, private, private, private, public, , !, )
+ M(29, private, public, private, private, private, public, , !, )
+ M(30, public, private, private, private, private, public, !, !, !)
+ M(31, private, private, private, private, private, public, !, !, !)
+ M(32, public, public, public, public, public, private, , , !)
+ M(33, private, public, public, public, public, private, , , !)
+ M(34, public, private, public, public, public, private, , , !)
+ M(35, private, private, public, public, public, private, , , !)
+ M(36, public, public, private, public, public, private, , , !)
+ M(37, private, public, private, public, public, private, , , !)
+ M(38, public, private, private, public, public, private, , , !)
+ M(39, private, private, private, public, public, private, , , !)
+ M(40, public, public, public, private, public, private, , , !)
+ M(41, private, public, public, private, public, private, !, !, !)
+ M(42, public, private, public, private, public, private, , , !)
+ M(43, private, private, public, private, public, private, !, !, !)
+ M(44, public, public, private, private, public, private, , , !)
+ M(45, private, public, private, private, public, private, !, !, !)
+ M(46, public, private, private, private, public, private, , , !)
+ M(47, private, private, private, private, public, private, !, !, !)
+ M(48, public, public, public, public, private, private, , !, !)
+ M(49, private, public, public, public, private, private, , !, !)
+ M(50, public, private, public, public, private, private, , !, !)
+ M(51, private, private, public, public, private, private, , !, !)
+ M(52, public, public, private, public, private, private, , !, !)
+ M(53, private, public, private, public, private, private, , !, !)
+ M(54, public, private, private, public, private, private, , !, !)
+ M(55, private, private, private, public, private, private, , !, !)
+ M(56, public, public, public, private, private, private, !, !, !)
+ M(57, private, public, public, private, private, private, !, !, !)
+ M(58, public, private, public, private, private, private, !, !, !)
+ M(59, private, private, public, private, private, private, !, !, !)
+ M(60, public, public, private, private, private, private, !, !, !)
+ M(61, private, public, private, private, private, private, !, !, !)
+ M(62, public, private, private, private, private, private, !, !, !)
+ M(63, private, private, private, private, private, private, !, !, !)
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C	Sun Jun 22 22:32:25 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/feat-cxx26.C	Sun Jun 29 22:32:48 2025
***************
*** 634,636 ****
--- 634,642 ----
  #elif __cpp_pp_embed != 202502
  #  error "__cpp_pp_embed != 202502"
  #endif
+ 
+ #ifndef __cpp_constexpr_virtual_inheritance
+ # error "__cpp_constexpr_virtual_inheritance"
+ #elif __cpp_constexpr_virtual_inheritance != 202506
+ #  error "__cpp_constexpr_virtual_inheritance != 202506"
+ #endif
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order1.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order1.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order1.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,94 ----
+ // C++26 P2830R10 - Constexpr Type Ordering
+ // { dg-do compile { target c++26 } }
+ 
+ namespace std {
+   using type = enum _Ord { equivalent = 0, less = -1, greater = 1 };
+   struct strong_ordering {
+     type _M_value;
+     constexpr strong_ordering (_Ord x) : _M_value (x) {}
+     static const strong_ordering less;
+     static const strong_ordering equal;
+     static const strong_ordering greater;
+     constexpr bool operator== (const strong_ordering &x) const { return _M_value == x._M_value; }
+     constexpr bool operator!= (const strong_ordering &x) const { return _M_value != x._M_value; }
+   };
+   constexpr strong_ordering strong_ordering::equal (_Ord::equivalent);
+   constexpr strong_ordering strong_ordering::less (_Ord::less);
+   constexpr strong_ordering strong_ordering::greater (_Ord::greater);
+ 
+   template <typename T, typename U>
+   struct type_order
+   {
+     static constexpr strong_ordering value = __builtin_type_order (T, U);
+   };
+ 
+   template <typename T, typename U>
+   inline constexpr strong_ordering type_order_v = __builtin_type_order (T, U);
+ }
+ 
+ struct S;
+ struct T;
+ template <typename T>
+ struct U
+ {
+ };
+ typedef int int2;
+ struct V {};
+ namespace
+ {
+   struct W {};
+ }
+ 
+ template <typename T, typename U>
+ struct eq
+ {
+   constexpr eq ()
+   {
+     static_assert (std::type_order <T, U>::value == std::strong_ordering::equal);
+     static_assert (std::type_order <U, T>::value == std::strong_ordering::equal);
+     static_assert (std::type_order_v <T, U> == std::strong_ordering::equal);
+     static_assert (std::type_order_v <U, T> == std::strong_ordering::equal);
+   }
+ };
+ template <typename T, typename U>
+ struct ne
+ {
+   constexpr ne ()
+   {
+     static_assert (std::type_order <T, U>::value != std::strong_ordering::equal);
+     static_assert (std::type_order <U, T>::value != std::strong_ordering::equal);
+     static_assert (std::type_order <T, U>::value == std::strong_ordering::greater
+ 		   ? std::type_order <U, T>::value == std::strong_ordering::less
+ 		   : std::type_order <U, T>::value == std::strong_ordering::greater);
+     static_assert (std::type_order_v <T, U> != std::strong_ordering::equal);
+     static_assert (std::type_order_v <U, T> != std::strong_ordering::equal);
+     static_assert (std::type_order_v <T, U> == std::strong_ordering::greater
+ 		   ? std::type_order_v <U, T> == std::strong_ordering::less
+ 		   : std::type_order_v <U, T> == std::strong_ordering::greater);
+   }
+ };
+ 
+ constexpr eq <void, void> a;
+ constexpr eq <const void, const void> b;
+ constexpr eq <int, int> c;
+ constexpr eq <long int, long int> d;
+ constexpr eq <const volatile unsigned, const volatile unsigned> e;
+ constexpr eq <S, S> f;
+ constexpr eq <U <int>, U <int>> g;
+ constexpr eq <unsigned[2], unsigned[2]> h;
+ constexpr eq <int, int2> i;
+ constexpr eq <int (*) (int, long), int (*) (int, long)> j;
+ constexpr ne <int, long> k;
+ constexpr ne <const int, int> l;
+ constexpr ne <S, T> m;
+ constexpr ne <int &, int &&> n;
+ constexpr ne <U <S>, U <T>> o;
+ constexpr ne <U <short>, U <char>> p;
+ static_assert (std::type_order_v <S, T> != std::strong_ordering::less
+ 	       || std::type_order_v <T, V> != std::strong_ordering::less
+ 	       || std::type_order_v <S, V> == std::strong_ordering::less);
+ constexpr ne <int (*) (int, long), int (*) (int, int)> q;
+ constexpr eq <W, W> r;
+ constexpr ne <V, W> s;
+ constexpr eq <U <W>, U <W>> t;
+ constexpr ne <U <V>, U <W>> u;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order2.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order2.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order2.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,4 ----
+ // C++26 P2830R10 - Constexpr Type Ordering
+ // { dg-do compile { target c++26 } }
+ 
+ constexpr auto a = __builtin_type_order (int, long);	// { dg-error "'strong_ordering' is not a member of 'std'" }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order3.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order3.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp26/type-order3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp26/type-order3.C	Sun Jun 29 22:32:48 2025
***************
*** 0 ****
--- 1,8 ----
+ // C++26 P2830R10 - Constexpr Type Ordering
+ // { dg-do compile { target c++26 } }
+ 
+ namespace std {
+   struct strong_ordering {
+   };
+ }
+ constexpr auto a = __builtin_type_order (int, long);	// { dg-error "'(equal|greater|less)' is not a member of 'std::strong_ordering'" }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C	Sun Jun 22 22:32:26 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor16.C	Sun Jun 29 22:32:48 2025
***************
*** 3,7 ****
  
  struct A { virtual ~A (); };
  struct B : virtual A { constexpr ~B () {} };
! // { dg-error "'constexpr' destructor in 'struct B' that has virtual base classes" "" { target c++20 } .-1 }
  // { dg-error "'constexpr' destructors only available with" "" { target c++17_down } .-2 }
--- 3,7 ----
  
  struct A { virtual ~A (); };
  struct B : virtual A { constexpr ~B () {} };
! // { dg-error "'constexpr' destructor in 'struct B' that has virtual base classes" "" { target { c++20 && c++23_down } } .-1 }
  // { dg-error "'constexpr' destructors only available with" "" { target c++17_down } .-2 }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C	Sun Jun 22 22:32:26 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor3.C	Sun Jun 29 22:32:48 2025
*************** struct U : public S
*** 23,29 ****
  struct V : virtual public S
  {
    V () : v (0) {}
!   constexpr ~V () = default;	// { dg-error "explicitly defaulted function 'constexpr V::~V\\(\\)' cannot be declared 'constexpr' because the implicit declaration is not 'constexpr'" }
    int v;
  };
  struct W0
--- 23,29 ----
  struct V : virtual public S
  {
    V () : v (0) {}
!   constexpr ~V () = default;	// { dg-error "explicitly defaulted function 'constexpr V::~V\\(\\)' cannot be declared 'constexpr' because the implicit declaration is not 'constexpr'" "" { target c++23_down } }
    int v;
  };
  struct W0
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C	Sun Jun 22 22:32:26 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/cpp2a/constexpr-dynamic10.C	Sun Jun 29 22:32:48 2025
***************
*** 5,12 ****
  
  struct C { virtual void a(); };
  struct B { virtual void b(); };
! struct A : virtual B, C { virtual void c(); }; // { dg-error "virtual base classes" }
  
! constexpr A a; // { dg-error "call" }
  
  constexpr bool b1 = (dynamic_cast<C&>((B&)a), false);
--- 5,12 ----
  
  struct C { virtual void a(); };
  struct B { virtual void b(); };
! struct A : virtual B, C { virtual void c(); }; // { dg-error "virtual base classes" "" { target c++23_down } }
  
! constexpr A a; // { dg-error "call" "" { target c++23_down } }
  
  constexpr bool b1 = (dynamic_cast<C&>((B&)a), false);
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/init/vbase1.C gcc-16-20250629/gcc/testsuite/g++.dg/init/vbase1.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/init/vbase1.C	Sun Jun 22 22:32:27 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/init/vbase1.C	Sun Jun 29 22:32:51 2025
***************
*** 1,5 ****
  // PR c++/50618
! // { dg-options "-fdump-rtl-expand" }
  // { dg-do run }
  
  struct Base
--- 1,5 ----
  // PR c++/50618
! // { dg-options "-fdump-rtl-expand -fno-implicit-constexpr" }
  // { dg-do run }
  
  struct Base
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/ipa/ipa-icf-4.C gcc-16-20250629/gcc/testsuite/g++.dg/ipa/ipa-icf-4.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/ipa/ipa-icf-4.C	Sun Jun 22 22:32:27 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/ipa/ipa-icf-4.C	Sun Jun 29 22:32:51 2025
***************
*** 1,10 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-ipa-icf-optimized-missed -fno-inline -fno-ipa-modref" } */
  
  namespace {
  struct A
  {
    virtual void foo(void) {}
  };
  struct B: virtual A
  {
--- 1,13 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -fdump-ipa-icf-optimized-missed -fno-inline -fno-ipa-modref -fno-implicit-constexpr" } */
  
  namespace {
  struct A
  {
    virtual void foo(void) {}
+ #if __cpp_constexpr_virtual_inheritance >= 202506L
+   A() {}
+ #endif
  };
  struct B: virtual A
  {
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7.h gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7.h
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7.h	Sun Jun 29 22:32:51 2025
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/120644
+ 
+ enum class E { E0, E1 };
+ 
+ template <typename T>
+ constexpr auto fmt_kind = E::E0;
+ 
+ template <typename T>
+ class opt{};
+ 
+ template <typename T>
+ constexpr auto fmt_kind<opt<T>> = E::E1;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7_a.H gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7_a.H
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7_a.H	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7_a.H	Sun Jun 29 22:32:51 2025
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/120644
+ // { dg-additional-options "-fmodule-header" }
+ // { dg-module-cmi {} }
+ 
+ #include "auto-7.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7_b.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7_b.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/auto-7_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/auto-7_b.C	Sun Jun 29 22:32:51 2025
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/120644
+ // { dg-additional-options "-fmodules -fno-module-lazy" }
+ 
+ #include "auto-7.h"
+ import "auto-7_a.H";
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/main-2.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/main-2.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/main-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/main-2.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,4 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ export module M;
+ extern "C++" int main() {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/main-3.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/main-3.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/main-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/main-3.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,7 ----
+ // { dg-additional-options "-fmodules" }
+ 
+ export module M;
+ extern "C++" {
+   int main() {}
+ }
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/pr120040_a.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/pr120040_a.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/pr120040_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/pr120040_a.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,19 ----
+ // PR c++/120040
+ // { dg-additional-options "-fmodules -std=c++20" }
+ // { dg-module-cmi M }
+ 
+ export module M;
+ 
+ struct S {
+   constexpr ~S() {}
+ };
+ 
+ export constexpr bool foo() {
+   S* a = new S[3];
+   delete[] a;
+   return true;
+ }
+ 
+ export constexpr S* bar() {
+   return new S[3];
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/pr120040_b.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/pr120040_b.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/pr120040_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/pr120040_b.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,15 ----
+ // PR c++/120040
+ // { dg-additional-options "-fmodules -std=c++20" }
+ 
+ import M;
+ 
+ constexpr bool qux() {
+   auto* s = bar();
+   delete[] s;
+   return true;
+ }
+ 
+ int main() {
+   static_assert(foo());
+   static_assert(qux());
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1.h gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1.h
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1.h	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,6 ----
+ // PR c++/118904
+ 
+ #include <source_location>
+ inline std::source_location foo() {
+   return std::source_location::current();
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_a.H gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_a.H
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_a.H	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_a.H	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,7 ----
+ // PR c++/118904
+ // { dg-additional-options "-fmodule-header -std=c++20 -fdump-lang-module-uid" }
+ // { dg-module-cmi {} }
+ 
+ #include "src-loc-1.h"
+ 
+ // { dg-final { scan-lang-dump {Written:-[0-9]* internal identifier:[^\n\r]*Lsrc_loc} module } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_b.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_b.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_b.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,5 ----
+ // PR c++/118904
+ // { dg-additional-options "-fmodules -std=c++20 -fno-module-lazy" }
+ 
+ #include "src-loc-1.h"
+ import "src-loc-1_a.H";
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_c.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_c.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/src-loc-1_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/src-loc-1_c.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,16 ----
+ // PR c++/118904
+ // { dg-module-do run }
+ // { dg-additional-options "-fmodules -std=c++20 -fdump-lang-module-uid" }
+ 
+ import "src-loc-1_a.H";
+ 
+ int main() {
+   const char* a = foo().function_name();
+   const char* b = std::source_location::current().function_name();
+   if (__builtin_strcmp(a, "std::source_location foo()"))
+     __builtin_abort();
+   if (__builtin_strcmp(b, "int main()"))
+     __builtin_abort();
+ }
+ 
+ // { dg-final { scan-lang-dump {Read internal identifier:-[0-9]* [^\n\r]*Lsrc_loc} module } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/ubsan-1_a.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/ubsan-1_a.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/ubsan-1_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/ubsan-1_a.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,10 ----
+ // PR c++/98735
+ // { dg-additional-options "-fmodules -fsanitize=undefined -Wno-return-type" }
+ // { dg-module-cmi X }
+ 
+ export module X;
+ 
+ export inline int f(int x) {
+     if (x > 0)
+       return x * 5;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/modules/ubsan-1_b.C gcc-16-20250629/gcc/testsuite/g++.dg/modules/ubsan-1_b.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/modules/ubsan-1_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/modules/ubsan-1_b.C	Sun Jun 29 22:32:52 2025
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/98735
+ // { dg-additional-options "-fmodules -fsanitize=undefined -Wno-return-type" }
+ // Note: can't work out how to do a link test here.
+ 
+ int g(int x) {
+   if (x > 0)
+     return x - 5;
+ }
+ 
+ import X;
+ 
+ int main() {
+   f(123);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage5.C gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage5.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage5.C	Sun Jun 22 22:32:28 2025
--- gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage5.C	Sun Jun 29 22:32:53 2025
***************
*** 1,5 ****
  // { dg-do compile }
! // The main function shall not be declared with a linkage-specification.
  
  extern "C" {
    int main();  // { dg-error "linkage" }
--- 1,6 ----
  // { dg-do compile }
! // The main function shall not be declared with a linkage-specification
! // other than "C++".
  
  extern "C" {
    int main();  // { dg-error "linkage" }
*************** namespace foo {
*** 9,14 ****
    extern "C" int main();  // { dg-error "linkage" }
  }
  
! extern "C++" int main(); // { dg-error "linkage" }
  
  extern "C" struct S { int main(); };  // OK
--- 10,15 ----
    extern "C" int main();  // { dg-error "linkage" }
  }
  
! extern "C++" int main();
  
  extern "C" struct S { int main(); };  // OK
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage7.C gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage7.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage7.C	Sun Jun 29 22:32:53 2025
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do compile }
+ // The main function shall not be declared with a linkage-specification
+ // other than "C++".
+ 
+ extern "C++" {
+   int main();
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage8.C gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage8.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/parse/linkage8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/parse/linkage8.C	Sun Jun 29 22:32:53 2025
***************
*** 0 ****
--- 1,5 ----
+ // { dg-do compile }
+ // The main function shall not be declared with a linkage-specification
+ // other than "C++".
+ 
+ extern "C" int main();	// { dg-error "linkage" }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/torture/pr120721.C gcc-16-20250629/gcc/testsuite/g++.dg/torture/pr120721.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/torture/pr120721.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/torture/pr120721.C	Sun Jun 29 22:32:53 2025
***************
*** 0 ****
--- 1,39 ----
+ // { dg-additional-options "-w -fno-vect-cost-model" }
+ 
+ template <int __v> struct integral_constant {
+   static constexpr int value = __v;
+ };
+ template <bool __v> using __bool_constant = integral_constant<__v>;
+ template <bool> using enable_if_t = int;
+ struct function_ref {
+   template <typename Callable>
+   function_ref(
+       Callable,
+       enable_if_t<__bool_constant<__is_same(int, int)>::value> * = nullptr);
+ };
+ struct ArrayRef {
+   int Data;
+   long Length;
+   int *begin();
+   int *end();
+ };
+ struct StringRef {
+   char Data;
+   long Length;
+ };
+ void attributeObject(function_ref);
+ struct ScopedPrinter {
+   virtual void printBinaryImpl(StringRef, StringRef, ArrayRef, bool, unsigned);
+ };
+ struct JSONScopedPrinter : ScopedPrinter {
+   JSONScopedPrinter();
+   void printBinaryImpl(StringRef, StringRef, ArrayRef Value, bool,
+                        unsigned StartOffset) {
+     attributeObject([&] {
+       StartOffset;
+       for (char Val : Value)
+         ;
+     });
+   }
+ };
+ JSONScopedPrinter::JSONScopedPrinter() {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/ubsan/module-1-aux.cc gcc-16-20250629/gcc/testsuite/g++.dg/ubsan/module-1-aux.cc
*** gcc-16-20250622/gcc/testsuite/g++.dg/ubsan/module-1-aux.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/ubsan/module-1-aux.cc	Sun Jun 29 22:32:54 2025
***************
*** 0 ****
--- 1,12 ----
+ // PR c++/98735
+ 
+ int g(int x) {
+   if (x > 0)
+     return x - 5;
+ }
+ 
+ import X;
+ 
+ int main() {
+   f(123);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/ubsan/module-1.C gcc-16-20250629/gcc/testsuite/g++.dg/ubsan/module-1.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/ubsan/module-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/ubsan/module-1.C	Sun Jun 29 22:32:54 2025
***************
*** 0 ****
--- 1,11 ----
+ // PR c++/98735
+ // { dg-do run { target c++17 } }
+ // { dg-options "-fmodules -fsanitize=undefined -Wno-return-type" }
+ // { dg-additional-sources module-1-aux.cc }
+ 
+ export module X;
+ 
+ export inline int f(int x) {
+     if (x > 0)
+       return x * 5;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.dg/warn/deprecated-22.C gcc-16-20250629/gcc/testsuite/g++.dg/warn/deprecated-22.C
*** gcc-16-20250622/gcc/testsuite/g++.dg/warn/deprecated-22.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.dg/warn/deprecated-22.C	Sun Jun 29 22:32:54 2025
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/120756
+ // { dg-do compile { target c++11 } }
+ 
+ struct A {
+     template <long> [[deprecated]] void foo ();
+ };
+ 
+ template <long t> [[deprecated]] auto bar () -> decltype (&A::foo<t>);
+ 
+ void foo ()
+ {
+   bar<0> ();  // { dg-warning "deprecated" }
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr101366-1.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr101366-1.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr101366-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr101366-1.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64-v2 -std=gnu++17" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z4TestPc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	movzbl	-1\(%rdi\), %eax
+ **	pxor	%xmm1, %xmm1
+ **	movd	%eax, %xmm0
+ **	pshufb	%xmm1, %xmm0
+ **	movups	%xmm0, \(%rdi\)
+ **	movups	%xmm0, 16\(%rdi\)
+ **	movups	%xmm0, 32\(%rdi\)
+ **	movups	%xmm0, 48\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ #include <x86intrin.h>
+ 
+ void 
+ Test (char* dst)
+ {
+   __m128i pattern = _mm_set1_epi8(dst[-1]);
+   for (int i = 0; i < 4; i++)
+     _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + 16 * i), pattern);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr101366-2.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr101366-2.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr101366-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr101366-2.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,26 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64-v2 -std=gnu++17" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z4TestPc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	movsbl	-1\(%rdi\), %eax
+ **	pxor	%xmm1, %xmm1
+ **	movd	%eax, %xmm0
+ **	pshufb	%xmm1, %xmm0
+ **	movups	%xmm0, \(%rdi\)
+ **	movups	%xmm0, 16\(%rdi\)
+ **	movups	%xmm0, 32\(%rdi\)
+ **	movups	%xmm0, 48\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ void 
+ Test (char*s)
+ {
+   __builtin_memset (s, s[-1], 64);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr108585-1a.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr108585-1a.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr108585-1a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr108585-1a.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,43 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64 -std=c++20 -DUSE_CHAR" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z6squarei:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$104, %rsp
+ **	.cfi_def_cfa_offset 112
+ **	pxor	%xmm0, %xmm0
+ **	movq	%rsp, %rdi
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm0, 16\(%rsp\)
+ **	movaps	%xmm0, 32\(%rsp\)
+ **	movaps	%xmm0, 48\(%rsp\)
+ **	movaps	%xmm0, 64\(%rsp\)
+ **	movaps	%xmm0, 80\(%rsp\)
+ **	call	_Z3fooPc
+ **	addq	\$104, %rsp
+ **	.cfi_def_cfa_offset 8
+ **	ret
+ **...
+ */
+ 
+ #include <cstddef>
+ 
+ #ifdef USE_CHAR
+ # define TYPE char
+ #else
+ # define TYPE std::byte
+ #endif
+ 
+ extern int foo(TYPE *arr);
+ 
+ int square(int num)
+ {
+     TYPE arr[96] = {};
+     return foo(arr);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr108585-1b.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr108585-1b.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr108585-1b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr108585-1b.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,43 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64 -std=c++20" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z6squarei:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$104, %rsp
+ **	.cfi_def_cfa_offset 112
+ **	pxor	%xmm0, %xmm0
+ **	movq	%rsp, %rdi
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm0, 16\(%rsp\)
+ **	movaps	%xmm0, 32\(%rsp\)
+ **	movaps	%xmm0, 48\(%rsp\)
+ **	movaps	%xmm0, 64\(%rsp\)
+ **	movaps	%xmm0, 80\(%rsp\)
+ **	call	_Z3fooPSt4byte
+ **	addq	\$104, %rsp
+ **	.cfi_def_cfa_offset 8
+ **	ret
+ **...
+ */
+ 
+ #include <cstddef>
+ 
+ #ifdef USE_CHAR
+ # define TYPE char
+ #else
+ # define TYPE std::byte
+ #endif
+ 
+ extern int foo(TYPE *arr);
+ 
+ int square(int num)
+ {
+     TYPE arr[96] = {};
+     return foo(arr);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1a.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1a.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1a.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64 -std=c++17 -DMODE=0" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z22makeDefaultConstructedv:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	pxor	%xmm0, %xmm0
+ **	movq	\$0, 80\(%rdi\)
+ **	movq	%rdi, %rax
+ **	movups	%xmm0, \(%rdi\)
+ **	movups	%xmm0, 16\(%rdi\)
+ **	movups	%xmm0, 32\(%rdi\)
+ **	movups	%xmm0, 48\(%rdi\)
+ **	movups	%xmm0, 64\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ struct S {
+     long int c[10] = {};
+     int x{};
+ #if MODE == 0
+ #elif MODE == 1
+     S() = default;
+ #elif MODE == 2
+     S() noexcept {}
+ #endif
+ };
+ 
+ S makeDefaultConstructed() { return S{}; }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1b.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1b.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1b.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64 -std=c++17 -DMODE=1" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z22makeDefaultConstructedv:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	pxor	%xmm0, %xmm0
+ **	movq	\$0, 80\(%rdi\)
+ **	movq	%rdi, %rax
+ **	movups	%xmm0, \(%rdi\)
+ **	movups	%xmm0, 16\(%rdi\)
+ **	movups	%xmm0, 32\(%rdi\)
+ **	movups	%xmm0, 48\(%rdi\)
+ **	movups	%xmm0, 64\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ #include "memset-pr118276-1a.C"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1c.C gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1c.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/memset-pr118276-1c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/memset-pr118276-1c.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=x86-64 -std=c++17 -DMODE=2" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **_Z22makeDefaultConstructedv:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	pxor	%xmm0, %xmm0
+ **	movl	\$0, 80\(%rdi\)
+ **	movq	%rdi, %rax
+ **	movups	%xmm0, \(%rdi\)
+ **	movups	%xmm0, 16\(%rdi\)
+ **	movups	%xmm0, 32\(%rdi\)
+ **	movups	%xmm0, 48\(%rdi\)
+ **	movups	%xmm0, 64\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ #include "memset-pr118276-1a.C"
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/pr120819.C gcc-16-20250629/gcc/testsuite/g++.target/i386/pr120819.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/pr120819.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/pr120819.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,37 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -march=znver2 -std=gnu++17 -w" } */
+ 
+ typedef float a __attribute__ ((__vector_size__ (16)));
+ typedef long long b __attribute__ ((__vector_size__ (16)));
+ int c;
+ a d, e, f;
+ b g, h;
+ struct i
+ {
+   i (b j) : k (j) {}
+   i ();
+   b k;
+ };
+ i
+ l (int j)
+ {
+   g = (b)(__attribute__ ((__vector_size__ (4 * sizeof (1)))) int){ j, j, j,
+                                                                    j };
+   return g;
+ }
+ extern int m ();
+ void
+ n ()
+ {
+   h = (__attribute__ ((
+       __vector_size__ (2 * sizeof (long long)))) long long){ c };
+   i o, p = l (2147483647 * 2 + 1);
+   f = __builtin_ia32_blendvps (a (p.k), d, e);
+   if (m ())
+     {
+       i q = l (2147483647 * 2 + 1);
+       a r = __builtin_ia32_blendvps (a (q.k), d, e);
+       o = b (r);
+       i s;
+     }
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/pr120830.C gcc-16-20250629/gcc/testsuite/g++.target/i386/pr120830.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/pr120830.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/pr120830.C	Sun Jun 29 22:32:56 2025
***************
*** 0 ****
--- 1,211 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=znver4 -std=gnu++17" } */
+ 
+ typedef double __m128d __attribute__ ((__vector_size__ (16)));
+ typedef double __m512d __attribute__ ((__vector_size__ (64)));
+ enum
+ {
+   ColMajor
+ };
+ enum
+ {
+   DefaultProduct
+ };
+ template <typename> struct EigenBase
+ {
+ };
+ struct
+ {
+   template <typename OtherDerived>
+   void
+   operator= (OtherDerived other)
+   {
+     call_assignment_no_alias (other);
+   }
+ } __trans_tmp_6;
+ template <typename, typename, int = DefaultProduct> struct Product
+ {
+ };
+ template <typename> struct unpacket_traits;
+ template <typename Packet>
+ Packet ploadu (const typename unpacket_traits<Packet>::type *);
+ template <typename Packet>
+ Packet pset1 (const typename unpacket_traits<Packet>::type &);
+ struct Packet1cd
+ {
+   Packet1cd (__m128d a) : v (a) {}
+   __m128d v;
+ };
+ template <> struct unpacket_traits<Packet1cd>
+ {
+   typedef int type;
+ };
+ template <>
+ Packet1cd
+ ploadu (const int *from)
+ {
+   return *(
+       __attribute__ ((__vector_size__ (2 * sizeof (double)))) double *)from;
+ }
+ template <>
+ Packet1cd
+ pset1 (const int &from)
+ {
+   return ploadu<Packet1cd> (&from);
+ }
+ struct Packet4cd
+ {
+   Packet4cd (__m512d);
+ };
+ template <> struct unpacket_traits<Packet4cd>
+ {
+   typedef int type;
+ };
+ __m512d pset1___trans_tmp_3;
+ template <>
+ Packet4cd
+ pset1 (const int &from)
+ {
+   Packet1cd __trans_tmp_1 = pset1<Packet1cd> (from);
+   __m512d __trans_tmp_2;
+   pset1___trans_tmp_3 = __builtin_ia32_broadcastf64x2_512_mask (
+       __trans_tmp_1.v, __trans_tmp_2, -1);
+   return pset1___trans_tmp_3;
+ }
+ template <typename> struct assign_op
+ {
+ };
+ template <typename, typename, typename> struct Assignment;
+ assign_op<int> call_assignment_no_alias_func;
+ EigenBase<int> call_assignment_no_alias_dst;
+ template <typename Src>
+ void
+ call_assignment_no_alias (Src src)
+ {
+   Assignment<EigenBase<int>, Src, assign_op<int>>::run (
+       call_assignment_no_alias_dst, src, call_assignment_no_alias_func);
+ }
+ template <typename, typename, typename, int>
+ struct general_matrix_matrix_product;
+ struct blas_data_mapper
+ {
+   blas_data_mapper (int *, int);
+ };
+ template <typename LhsScalar, typename RhsScalar, typename Index,
+           typename DataMapper>
+ struct gebp_kernel
+ {
+   typedef LhsScalar ResScalar;
+   void operator() (const DataMapper &, const LhsScalar *, const RhsScalar *,
+                    Index, Index, Index, ResScalar, Index = 1, Index = 1,
+                    Index = 0, Index = 0);
+ };
+ struct lhs_process_one_packet
+ {
+   void
+   operator() (blas_data_mapper, const int *, const int *, int alpha, long,
+               long peelEnd, long, long, long, long, int, long, long, long,
+               long, long)
+   {
+     for (; peelEnd;)
+       pset1<Packet4cd> (alpha);
+     pset1<Packet4cd> (alpha);
+   }
+ };
+ template <typename LhsScalar, typename RhsScalar, typename Index,
+           typename DataMapper>
+ __attribute__ ((noinline)) void
+ gebp_kernel<LhsScalar, RhsScalar, Index, DataMapper>::operator() (
+     const DataMapper &res, const LhsScalar *blockA, const RhsScalar *blockB,
+     Index rows, Index depth, Index cols, ResScalar alpha, Index, Index, Index,
+     Index)
+ {
+   Index packet_cols4, peeled_mc2;
+   enum
+   {
+     pk
+   } peeled_kc;
+   int prefetch_res_offset;
+   lhs_process_one_packet p;
+   p (res, blockA, blockB, alpha, peeled_mc2, rows, 1, 1, 0, 0,
+      prefetch_res_offset, peeled_kc, pk, cols, depth, packet_cols4);
+ }
+ long parallelize_gemm_rows;
+ template <int, typename Functor>
+ void
+ parallelize_gemm (Functor func)
+ {
+   long actualBlockCols;
+   func (0, actualBlockCols, 0, parallelize_gemm_rows);
+ }
+ template <typename> struct generic_product_impl;
+ template <typename DstXprType, typename Lhs, typename Rhs, int Options,
+           typename Scalar>
+ struct Assignment<DstXprType, Product<Lhs, Rhs, Options>, assign_op<Scalar>>
+ {
+   static void
+   run (DstXprType dst, Product<Lhs, Rhs>, assign_op<Scalar>)
+   {
+     EigenBase<int> __trans_tmp_4, __trans_tmp_8;
+     generic_product_impl<Rhs>::evalTo (dst, __trans_tmp_4, __trans_tmp_8);
+   }
+ };
+ template <typename Index, typename LhsScalar, typename RhsScalar>
+ struct general_matrix_matrix_product<Index, LhsScalar, RhsScalar, ColMajor>
+ {
+   typedef LhsScalar ResScalar;
+   static void
+   run ()
+   {
+     ResScalar alpha, _res, blockA, blockB;
+     Index resIncr, actual_kc;
+     blas_data_mapper res (&_res, resIncr);
+     gebp_kernel<LhsScalar, RhsScalar, Index, blas_data_mapper> gebp;
+     gebp (res, &blockA, &blockB, 0, actual_kc, 0, alpha);
+   }
+ };
+ template <typename Lhs, typename Rhs, typename BlockingType>
+ struct gemm_functor
+ {
+   gemm_functor (Lhs, Rhs, EigenBase<int>, double, BlockingType);
+   void
+   operator() (long, long, long, int)
+   {
+     general_matrix_matrix_product<long, int, int, 0>::run ();
+   }
+ };
+ template <typename> struct generic_product_impl
+ {
+   template <typename Dst>
+   static void
+   evalTo (Dst dst, EigenBase<int>, EigenBase<int>)
+   {
+     scaleAndAddTo (dst);
+   }
+   template <typename Dest>
+   static void
+   scaleAndAddTo (Dest dst)
+   {
+     int lhs, rhs;
+     void blocking ();
+     parallelize_gemm<0> (gemm_functor (lhs, rhs, dst, 0, blocking));
+   }
+ };
+ struct ComplexEigenSolver
+ {
+   template <typename InputType> void compute (const EigenBase<InputType> &);
+ };
+ Product<int, int> __trans_tmp_7;
+ template <typename InputType>
+ void
+ ComplexEigenSolver::compute (const EigenBase<InputType> &)
+ {
+   __trans_tmp_6 = __trans_tmp_7;
+ }
+ void
+ compute_eigenvec ()
+ {
+   EigenBase<int> Mtilde_eig_cmplx;
+   ComplexEigenSolver ces;
+   ces.compute (Mtilde_eig_cmplx);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/g++.target/i386/shrink_wrap_separate.C gcc-16-20250629/gcc/testsuite/g++.target/i386/shrink_wrap_separate.C
*** gcc-16-20250622/gcc/testsuite/g++.target/i386/shrink_wrap_separate.C	Sun Jun 22 22:32:30 2025
--- gcc-16-20250629/gcc/testsuite/g++.target/i386/shrink_wrap_separate.C	Sun Jun 29 22:32:56 2025
*************** bool k() {
*** 21,25 ****
    b *n;
   return h(l->g, n);
  }
! /* { dg-final { scan-rtl-dump "The components we wrap separately are \\\[sep 3 4\\\]" "pro_and_epilogue" { target { ia32 } } } } */
! /* { dg-final { scan-rtl-dump "The components we wrap separately are \\\[sep 40 41 42 43\\\]" "pro_and_epilogue" { target { ! ia32 } } } } */
--- 21,24 ----
    b *n;
   return h(l->g, n);
  }
! /* { dg-final { scan-rtl-dump "The components we wrap separately are" "pro_and_epilogue" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h	Sun Jun 22 22:32:32 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/analyzer-decls.h	Sun Jun 29 22:32:59 2025
*************** extern void __analyzer_dump (void);
*** 30,35 ****
--- 30,39 ----
  /* Emit a warning describing the size of the base region of (*ptr).  */
  extern void __analyzer_dump_capacity (const void *ptr);
  
+ /* When reached, dump GraphViz .dot source to stderr for a diagram
+    describing the analyzer’s state.  */
+ extern void __analyzer_dump_dot (void);
+ 
  /* Dump information about what decls have escaped at this point on the path.  */
  extern void __analyzer_dump_escaped (void);
  
*************** extern void __analyzer_dump_region_model
*** 58,63 ****
--- 62,70 ----
     This is for use when debugging, and may be of use in DejaGnu tests.  */
  extern void __analyzer_dump_state (const char *name, ...);
  
+ /* Dump copious information about the analyzer’s state when reached.  */
+ extern void __analyzer_dump_xml (void);
+ 
  /* Emit a warning with text "TRUE", FALSE" or "UNKNOWN" based on the
     truthfulness of the argument.  */
  extern void __analyzer_eval (int);
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-1-sarif.py gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-1-sarif.py
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-1-sarif.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-1-sarif.py	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,32 ----
+ from sarif import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def sarif():
+     return sarif_from_env()
+ 
+ def test_xml_state(sarif):
+     result = get_result_by_index(sarif, 0)
+ 
+     assert result['level'] == 'warning'
+     assert result['ruleId'] == '-Wanalyzer-use-after-free'
+ 
+     # TODO: check code flow
+     events = result["codeFlows"][0]["threadFlows"][0]['locations']
+ 
+     # Event "(1)": "entry to 'test'" (index == 0)
+     assert events[0]['location']['message']['text'] == "entry to 'test'"
+     state0 = get_xml_state(events, 0)
+     memory_regions = state0.find('memory-regions')
+     assert memory_regions is not None
+     stack = memory_regions.find('stack')
+     assert stack is not None
+     frame = stack.find('stack-frame')
+     assert frame.get('function') == 'test'
+ 
+     # Final event:
+     assert events[-1]['location']['message']['text'].startswith("use after 'free' of ")
+     state = get_xml_state(events, -1)
+     # TODO
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-1.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-1.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-additional-options "-fdiagnostics-add-output=sarif:xml-state=yes" } */
+ 
+ #include "analyzer-decls.h"
+ 
+ struct node
+ {
+   struct node *m_next;
+   int m_val;
+ };
+ 
+ struct node *first;
+ 
+ struct node *
+ append_value (int value)
+ {
+   struct node *n = __builtin_malloc (sizeof (struct node));
+   if (!n)
+     return 0;
+   n->m_val = value;
+   
+   n->m_next = first;
+   first = n;
+ 
+   return n;
+ }
+ 
+ int g;
+ 
+ void
+ test ()
+ {
+   if (!append_value (42))
+     return;
+   if (!append_value (1066))
+     return;
+   if (!append_value (1776))
+     return;
+ 
+   __builtin_free (first->m_next->m_next);
+   first->m_next->m_next->m_next->m_next = NULL;  /* { dg-warning "-Wanalyzer-use-after-free" } */
+ }
+ 
+ /* Verify that some JSON was written to a file with the expected name.  */
+ /* { dg-final { verify-sarif-file } } */
+ 
+ /* Use a Python script to verify various properties about the generated
+    .sarif file:
+    { dg-final { run-sarif-pytest state-diagram-1.c "state-diagram-1-sarif.py" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-2.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-2.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,17 ----
+ #include "analyzer-decls.h"
+ #include <stdio.h>
+ 
+ int g;
+ int h;
+ 
+ int
+ test_pointer_to_global (FILE *f)
+ {
+   int *p = &g;
+   int *q = &h;
+ 
+   fread (&g, sizeof (g), 1, f);
+   fread (&h, sizeof (h), 1, f);
+ 
+   return *p / *q; /* { dg-warning "-Wanalyzer-tainted-divisor" } */
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-3.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-3.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,20 ----
+ #include "analyzer-decls.h"
+ 
+ int
+ inner (int *p)
+ {
+   return *p; /* { dg-warning "-Wanalyzer-use-of-uninitialized-value" } */
+ }
+ 
+ int
+ middle (int *q)
+ {
+   return inner (q);
+ }
+ 
+ int
+ outer ()
+ {
+   int i;
+   return middle (&i);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-4.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-4.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-4.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,8 ----
+ #include "analyzer-decls.h"
+ 
+ void test ()
+ {
+   void *p = __builtin_malloc (1024);
+   __builtin_free (p);
+   __builtin_free (p); /* { dg-warning "-Wanalyzer-double-free" } */
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,41 ----
+ /* { dg-require-dot "" } */
+ /* { dg-additional-options "-fdiagnostics-add-output=experimental-html:javascript=no,show-state-diagrams=yes" } */
+ /* { dg-additional-options "-fdiagnostics-show-caret" } */
+ 
+ #include "analyzer-decls.h"
+ 
+ struct foo
+ {
+   int m_ints[4];
+ };
+ 
+ struct bar
+ {
+   struct foo m_foos[3];
+   int m_int;
+   char m_ch;
+ };
+ 
+ struct baz
+ {
+   struct bar m_bars[2];
+   struct foo m_foos[5];
+ };
+ 
+ void test (void)
+ {
+   struct baz baz_arr[2];
+   baz_arr[1].m_bars[1].m_foos[2].m_ints[1] = 42;
+   __analyzer_dump_path (); /* { dg-message "path" } */
+ }
+ 
+ /* We need -fdiagnostics-show-caret for the HTML output to show the source,
+    and thus to show event labels.  */
+ 
+ /* { dg-begin-multiline-output "" }
+   __analyzer_dump_path ();
+    { dg-end-multiline-output "" } */
+ 
+ /* Use a Python script to verify various properties about the generated
+    .html file:
+    { dg-final { run-html-pytest state-diagram-5-html.c "state-diagram-5-html.py" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.py gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.py
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-html.py	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,29 ----
+ # Smoketest of HTML state diagram output
+ 
+ from htmltest import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def html_tree():
+     return html_tree_from_env()
+ 
+ def test_state_diagram(html_tree):
+     diag = get_diag_by_index(html_tree, 0)
+     assert diag is not None
+ 
+     path = diag.find('xhtml:div[@id="execution-path"]', ns)
+     assert path is not None
+ 
+     event_label = path.find('.//xhtml:span[@id="gcc-diag-0-event-0"]', ns)
+     assert event_label is not None
+     assert event_label.get('class') == 'event'
+ 
+     assert event_label.text == '(1) here'
+ 
+     state_diagram = event_label.find('xhtml:div[@class="state-diagram"]', ns)
+     assert state_diagram is not None
+     assert state_diagram.get('id') == 'gcc-diag-0-event-0-state-diagram'
+ 
+     svg = state_diagram.find('.//svg:svg', ns)
+     assert svg is not None
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.c gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.c	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-additional-options "-fdiagnostics-add-output=sarif:xml-state=yes" } */
+ 
+ #include "analyzer-decls.h"
+ 
+ struct foo
+ {
+   int m_ints[4];
+ };
+ 
+ struct bar
+ {
+   struct foo m_foos[3];
+   int m_int;
+   char m_ch;
+ };
+ 
+ struct baz
+ {
+   struct bar m_bars[2];
+   struct foo m_foos[5];
+ };
+ 
+ void test (void)
+ {
+   struct baz baz_arr[2];
+   baz_arr[1].m_bars[1].m_foos[2].m_ints[1] = 42;
+   __analyzer_dump_path (); /* { dg-message "path" } */
+ }
+ 
+ /* Verify that some JSON was written to a file with the expected name.  */
+ /* { dg-final { verify-sarif-file } } */
+ 
+ /* Use a Python script to verify various properties about the generated
+    .sarif file:
+    { dg-final { run-sarif-pytest state-diagram-5-sarif.c "state-diagram-5-sarif.py" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.py gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.py
*** gcc-16-20250622/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/analyzer/state-diagram-5-sarif.py	Sun Jun 29 22:33:00 2025
***************
*** 0 ****
--- 1,73 ----
+ import xml.etree.ElementTree as ET
+ 
+ from sarif import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def sarif():
+     return sarif_from_env()
+ 
+ def test_nested_types_in_xml_state(sarif):
+     result = get_result_by_index(sarif, 0)
+ 
+     assert result['level'] == 'note'
+ 
+     events = result["codeFlows"][0]["threadFlows"][0]['locations']
+ 
+     assert events[0]['location']['message']['text'] == 'here'
+     state = get_xml_state(events, 0)
+ 
+     memory_regions = state.find('memory-regions')
+     assert memory_regions is not None
+ 
+     stack = memory_regions.find('stack')
+     assert stack is not None
+ 
+     frame = stack.find('stack-frame')
+     assert frame.get('function') == 'test'
+ 
+     # We have:
+     #   baz_arr[1].m_bars[1].m_foos[2].m_ints[1] = 42;
+ 
+     # Verify that we correctly expand from the analyzer's bit-offset
+     # representation to nested elements and fields.
+ 
+     # "baz_arr":
+     baz_arr = frame.find("variable[@name='baz_arr']")
+     assert baz_arr.get('type') == 'struct baz[2]'
+ 
+     # "baz_arr[1]":
+     baz_arr_1 = baz_arr.find("element[@index='1']")
+     assert baz_arr_1.get('type') == 'struct baz'
+ 
+     assert baz_arr.find("element[@index='0']") is None
+ 
+     # "baz_arr[1].m_bars":
+     baz_arr_1_m_bars = baz_arr_1.find("field[@name='m_bars']")
+     assert baz_arr_1_m_bars.get('type') == 'struct bar[2]'
+ 
+     # "baz_arr[1].m_bars[1]"
+     baz_arr_1_m_bars_1 = baz_arr_1_m_bars.find("element[@index='1']")
+     assert baz_arr_1_m_bars_1.get('type') == 'struct bar'
+ 
+     # "baz_arr[1].m_bars[1].m_foos"
+     baz_arr_1_m_bars_1_m_foos = baz_arr_1_m_bars_1.find("field[@name='m_foos']")
+     assert baz_arr_1_m_bars_1_m_foos.get('type') == 'struct foo[3]'
+ 
+     # "baz_arr[1].m_bars[1].m_foos[2]"
+     baz_arr_1_m_bars_1_m_foos_2 = baz_arr_1_m_bars_1_m_foos.find("element[@index='2']")
+     assert baz_arr_1_m_bars_1_m_foos_2.get('type') == 'struct foo'
+     
+     # "baz_arr[1].m_bars[1].m_foos[2].m_ints"
+     baz_arr_1_m_bars_1_m_foos_2_m_ints = baz_arr_1_m_bars_1_m_foos_2.find('field[@name="m_ints"]')
+     assert baz_arr_1_m_bars_1_m_foos_2_m_ints.get('type') == 'int[4]'
+     
+     # "baz_arr[1].m_bars[1].m_foos[2].m_ints[1]"
+     baz_arr_1_m_bars_1_m_foos_2_m_ints_1 = baz_arr_1_m_bars_1_m_foos_2_m_ints.find('element[@index="1"]')
+     assert baz_arr_1_m_bars_1_m_foos_2_m_ints_1.get('type') == 'int'
+ 
+     value = baz_arr_1_m_bars_1_m_foos_2_m_ints_1.find('value-of-region')
+     constant = value.find('constant')
+     assert constant.get('value') == '42'
+     assert constant.get('type') == 'int'
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc
*** gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc	Sun Jun 22 22:32:33 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_cpython_plugin.cc	Sun Jun 29 22:33:10 2025
***************
*** 2,7 ****
--- 2,8 ----
  /* { dg-options "-g" } */
  
  #define INCLUDE_MEMORY
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "gcc-plugin.h"
  #include "config.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc
*** gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc	Sun Jun 22 22:32:33 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc	Sun Jun 29 22:33:10 2025
***************
*** 5,10 ****
--- 5,11 ----
  /* { dg-options "-g" } */
  
  #define INCLUDE_MEMORY
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "gcc-plugin.h"
  #include "config.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc
*** gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc	Sun Jun 22 22:32:33 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.cc	Sun Jun 29 22:33:10 2025
***************
*** 2,7 ****
--- 2,8 ----
  /* { dg-options "-g" } */
  
  #define INCLUDE_MEMORY
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "gcc-plugin.h"
  #include "config.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc
*** gcc-16-20250622/gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc	Sun Jun 22 22:32:33 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.cc	Sun Jun 29 22:33:10 2025
***************
*** 2,7 ****
--- 2,8 ----
  /* { dg-options "-g" } */
  
  #define INCLUDE_MEMORY
+ #define INCLUDE_STRING
  #define INCLUDE_VECTOR
  #include "gcc-plugin.h"
  #include "config.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1.c gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1.c	Sun Jun 29 22:33:12 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-require-effective-target lto } */
+ /* { dg-additional-sources "afdo-crossmodule-1b.c" } */
+ /* { dg-options "-O3 -flto -fdump-ipa-afdo_offline -fdump-tree-einline-details" } */
+ /* { dg-require-profiling "-fauto-profile" } */ 
+ volatile int c;
+ 
+ int foo2 ()
+ {
+ 	c++;
+ 	return 1;
+ }
+ int foo (int (*fooptr) ())
+ {
+ 	return fooptr ();
+ }
+ extern int bar (int (*fooptr) (int (*)()));
+ 	     
+ int
+ main()
+ {
+ 	int n = 1000000;
+ 	int s = 0;
+ 	for (int i = 0; i < n; i++)
+ 		s += bar (foo);
+ 	return n != s;
+ }
+ /* { dg-final-use-autofdo { scan-ipa-dump "Removing external inline: main:5 bar" "afdo_offline"} } */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Offlining function inlined to other module: bar:2 foo" "afdo_offline"} } */
+ /* { dg-final-use-autofdo { scan-tree-dump "Indirect call -> speculative call foo.. => foo2" "einline"} } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1b.c gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1b.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/afdo-crossmodule-1b.c	Sun Jun 29 22:33:12 2025
***************
*** 0 ****
--- 1,10 ----
+ extern int foo2 ();
+ 
+ int bar (int (*fooptr) (int (*)()))
+ {
+ 	return fooptr (foo2);
+ }
+ /* { dg-final-use-autofdo { scan-ipa-dump "Offlining function inlined to other module: main:5 bar" "afdo_offline"} } */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Offlining function inlined to other module: bar:2 main:5 foo" "afdo_offline"} } */
+ /* It would be nice to speculate call to foo, but offlining does not preserve jump target
+    and currently afdo does not do cross-module indirect call promotion.  */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c	Sun Jun 22 22:32:34 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/clone-merge-1.c	Sun Jun 29 22:33:12 2025
***************
*** 1,4 ****
! /* { dg-options "-O3 -fno-early-inlining -fdump-ipa-afdo-all" } */
  /* { dg-require-profiling "-fauto-profile" } */ 
  
  __attribute__ ((used))
--- 1,4 ----
! /* { dg-options "-O3 -fno-early-inlining -fdump-ipa-afdo_offline-all" } */
  /* { dg-require-profiling "-fauto-profile" } */ 
  
  __attribute__ ((used))
*************** int main()
*** 31,34 ****
  }
  /* We will have profiles for test2 and test2.constprop.0 that will have to be
     merged,  */
! /* { dg-final-use-autofdo { scan-ipa-dump "note: Merging profile for test2" "afdo"} } */
--- 31,34 ----
  }
  /* We will have profiles for test2 and test2.constprop.0 that will have to be
     merged,  */
! /* { dg-final-use-autofdo { scan-ipa-dump "Merging duplicate symbol test2" "afdo_offline"} } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/clone-test.c gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/clone-test.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/clone-test.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/clone-test.c	Sun Jun 29 22:33:12 2025
***************
*** 0 ****
--- 1,63 ----
+ /* { dg-options "-O3 -fno-early-inlining -fdump-ipa-afdo-all" } */
+ /* { dg-require-profiling "-fauto-profile" } */ 
+ 
+ #define N 5000
+ __attribute__ ((used))
+ int a[N+1];
+ 
+ __attribute__ ((noinline))
+ static void
+ test2(int sz)
+ {
+   a[sz]++;
+   asm volatile (""::"m"(a));
+ }
+ 
+ struct list
+ {
+   struct list *next;
+   int val;
+ };
+ 
+ __attribute__ ((noinline))
+ static int
+ test3(volatile struct list l, int v)
+ {
+  a [(l.val + v) % N] = v;
+ }
+ 
+ __attribute__ ((noinline))
+ void
+ test1 (int sz)
+ {
+   volatile struct list l = {0};
+   __attribute__ ((noinline))
+   void inner(int i)
+     {
+       if (i % 2)
+ 	test2 (500);
+       if (i % 3)
+ 	test3 (l,200);
+       else
+ 	test2 (i);
+     }
+   for (int i = 0; i < N; i++)
+     inner(i);
+ 
+ }
+ 
+ int main()
+ {
+   for (int i = 0; i < N; i++)
+     {
+       test1 (N);
+     }
+   return 0;
+ }
+ /* Profile will have test1.constprop.0 */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Annotating BB profile of test1" "afdo"} } */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Annotating BB profile of test2" "afdo"} } */
+ /* Profile will have test3.constprop.0.isra.0 */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Annotating BB profile of test3" "afdo"} } */
+ /* { dg-final-use-autofdo { scan-ipa-dump "Annotating BB profile of inner" "afdo"} } */
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c	Sun Jun 22 22:32:34 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-2.c	Sun Jun 29 22:33:12 2025
***************
*** 1,4 ****
! /* { dg-options "-O2 -fno-early-inlining -fdump-ipa-profile-optimized -fdump-ipa-afdo-optimized" } */
  volatile int one;
  static int
  add1 (int val)
--- 1,4 ----
! /* { dg-options "-O2 -fno-early-inlining -fdump-ipa-profile-details -fdump-tree-einline-details" } */
  volatile int one;
  static int
  add1 (int val)
*************** main (void)
*** 31,35 ****
  }
  /* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* add1 .will resolve by ipa-profile" "profile"} } */
  /* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* sub1 .will resolve by ipa-profile" "profile"} } */
! /* { dg-final-use-autofdo { scan-tree-dump "Inlining add1/. into main/" "einline"} } */
! /* { dg-final-use-autofdo { scan-tree-dump "Inlining sub1/. into main/" "einline"} } */
--- 31,35 ----
  }
  /* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* add1 .will resolve by ipa-profile" "profile"} } */
  /* { dg-final-use-not-autofdo { scan-ipa-dump "Indirect call -> direct call.* sub1 .will resolve by ipa-profile" "profile"} } */
! /* { dg-final-use-autofdo { scan-tree-dump "Inlining using auto-profile add1/. into do_op/. which is transitively inlined to main/" "einline"} } */
! /* { dg-final-use-autofdo { scan-tree-dump "Inlining using auto-profile sub1/. into do_op/. which is transitively inlined to main/" "einline"} } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/vect/bb-slp-pr120808.c gcc-16-20250629/gcc/testsuite/gcc.dg/vect/bb-slp-pr120808.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/vect/bb-slp-pr120808.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/vect/bb-slp-pr120808.c	Sun Jun 29 22:33:14 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-ffp-contract=on" } */
+ /* { dg-additional-options "-mfma -mfpmath=sse" { target { x86_64-*-* i?86-*-* } } } */
+ 
+ void f(double x[restrict], double *y, double *z)
+ {
+     x[0] = x[0] * y[0] + z[0];
+     x[1] = x[1] * y[1] - z[1];
+ }
+ 
+ /* The following should check for SLP build covering the loads.  */
+ /* { dg-final { scan-tree-dump "Found VEC_FMSUBADD pattern" "slp2" { target { x86_64-*-* i?86-*-* } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c	Sun Jun 22 22:32:34 2025
--- gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-early-break_133_pfa6.c	Sun Jun 29 22:33:15 2025
*************** unsigned test4(char x, char *vect_a, cha
*** 20,23 ****
   return ret;
  }
  
! /* { dg-final { scan-tree-dump "Versioning for alignment will be applied" "vect" } } */
--- 20,23 ----
   return ret;
  }
  
! /* { dg-final { scan-tree-dump "Both peeling and versioning will be applied" "vect" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-1.c gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-1.c	Sun Jun 29 22:33:15 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-mfma" { target { x86_64-*-* i?86-*-* } } } */
+ 
+ double f(double x[], long n)
+ {
+     double r0 = 0, r1 = 0;
+     for (; n; x += 2, n--) {
+         r0 = __builtin_fma(x[0], x[0], r0);
+         r1 = __builtin_fma(x[1], x[1], r1);
+     }
+     return r0 + r1;
+ }
+ 
+ /* We should vectorize this as SLP reduction.  */
+ /* { dg-final { scan-tree-dump "loop vectorized using 16 byte vectors and unroll factor 1" "vect" { target { x86_64-*-* i?86-*-* } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-2.c gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-2.c	Sun Jun 29 22:33:15 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-ffp-contract=on" } */
+ /* { dg-additional-options "-mfma" { target { x86_64-*-* i?86-*-* } } } */
+ 
+ static double muladd(double x, double y, double z)
+ {
+     return x * y + z;
+ }
+ double g(double x[], long n)
+ {
+     double r0 = 0, r1 = 0;
+     for (; n; x += 2, n--) {
+         r0 = muladd(x[0], x[0], r0);
+         r1 = muladd(x[1], x[1], r1);
+     }
+     return r0 + r1;
+ }
+ 
+ /* We should vectorize this as SLP reduction.  */
+ /* { dg-final { scan-tree-dump "loop vectorized using 16 byte vectors and unroll factor 1" "vect" { target { x86_64-*-* i?86-*-* } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-3.c gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.dg/vect/vect-reduc-fma-3.c	Sun Jun 29 22:33:15 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-ffast-math" } */
+ /* { dg-additional-options "-mfma" { target { x86_64-*-* i?86-*-* } } } */
+ 
+ double f(double x[], long n)
+ {
+     double r0 = 0, r1 = 0;
+     for (; n; x += 2, n--) {
+         r0 = __builtin_fma(x[0], x[0], r0);
+         r1 = __builtin_fma(x[1], x[1], r1);
+     }
+     return r0 + r1;
+ }
+ 
+ /* We should vectorize this as SLP reduction, higher VF possible.  */
+ /* { dg-final { scan-tree-dump "optimized: loop vectorized" "vect" { target { x86_64-*-* i?86-*-* } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only_2.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only_2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_asimd-only_2.c	Sun Jun 29 22:33:16 2025
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-options "-mautovec-preference=asimd-only" } */
+ 
+ void
+ foo (void) {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_default_2.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_default_2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_default_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_default_2.c	Sun Jun 29 22:33:16 2025
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-options "-mautovec-preference=default" } */
+ 
+ void
+ foo (void) {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd_2.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd_2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-asimd_2.c	Sun Jun 29 22:33:16 2025
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-options "-mautovec-preference=prefer-asimd" } */
+ 
+ void
+ foo (void) {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve_2.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve_2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_prefer-sve_2.c	Sun Jun 29 22:33:16 2025
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-options "-mautovec-preference=prefer-sve" } */
+ 
+ void
+ foo (void) {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only_2.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only_2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only_2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/autovec_param_sve-only_2.c	Sun Jun 29 22:33:16 2025
***************
*** 0 ****
--- 1,4 ----
+ /* { dg-options "-mautovec-preference=sve-only" } */
+ 
+ void
+ foo (void) {}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/adr_7.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/adr_7.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/adr_7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/adr_7.c	Sun Jun 29 22:33:18 2025
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3" } */
+ 
+ #include <arm_sve.h>
+ 
+ void f(int *p1, int *p2, unsigned long step, unsigned long end, svbool_t pg) {
+     for (unsigned long i = 0; i < end; i += step) {
+         svst1(pg, p1, svld1_s32(pg, p2));
+         p1 += step;
+         p2 += step;
+     }
+ }
+ 
+ // Checking that the induction variables are combined into a single variable,
+ // which is used for all addressing.
+ // (ie, theres only one scalar add, rather than 3, and the loads and stores use the
+ // more complex addressing modes)
+ 
+ /* { dg-final { scan-assembler-not {\tld1w\tz[0-9]+\.d, p[0-9]+/z\[x[0-9]+\.d\]} } } */
+ /* { dg-final { scan-assembler-not {\tst1w\tz[0-9]+\.d, p[0-9]+/z\[x[0-9]+\.d\]} } } */
+ 
+ /* { dg-final { scan-assembler-times {\tadd\tx[0-9]+, x[0-9]+, x[0-9]+} 1 } } */
+ /* { dg-final { scan-assembler-times {\tld1w\tz[0-9]+\.s, p[0-9]+/z, \[x[0-9]+, x[0-9]+, lsl 2\]} 1 } } */
+ /* { dg-final { scan-assembler-times {\tst1w\tz[0-9]+\.s, p[0-9]+, \[x[0-9]+, x[0-9]+, lsl 2\]} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/cost_model_17.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/cost_model_17.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/cost_model_17.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/cost_model_17.c	Sun Jun 29 22:33:18 2025
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Ofast -march=armv8-a+sve -mmax-vectorization -fdump-tree-vect-details" } */
+ 
+ void
+ foo (char *restrict a, int *restrict b, int *restrict c,
+      int *restrict d, int stride)
+ {
+     if (stride <= 1)
+         return;
+ 
+     for (int i = 0; i < 3; i++)
+         {
+             int res = c[i];
+             int t = b[i * stride];
+             if (a[i] != 0)
+                 res = t * d[i];
+             c[i] = res;
+         }
+ }
+ 
+ /* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/cost_model_18.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/cost_model_18.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/sve/cost_model_18.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/sve/cost_model_18.c	Sun Jun 29 22:33:18 2025
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Ofast -march=armv8-a+sve -fdump-tree-vect-details" } */
+ 
+ void __attribute__ (( target ("max-vectorization")))
+ foo (char *restrict a, int *restrict b, int *restrict c,
+      int *restrict d, int stride)
+ {
+     if (stride <= 1)
+         return;
+ 
+     for (int i = 0; i < 3; i++)
+         {
+             int res = c[i];
+             int t = b[i * stride];
+             if (a[i] != 0)
+                 res = t * d[i];
+             c[i] = res;
+         }
+ }
+ 
+ /* { dg-final { scan-tree-dump "vectorized 1 loops in function" "vect" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/unroll-vect.c gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/unroll-vect.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/aarch64/unroll-vect.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/aarch64/unroll-vect.c	Sun Jun 29 22:33:41 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-O3 -march=armv8-a --param aarch64-autovec-preference=asimd-only -std=gnu99" } */
+ /* { dg-final { check-function-bodies "**" "" "" } } */
+ 
+ /*
+ ** f1:
+ **	...
+ **	add	v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ **	add	v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ **	add	v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ **	add	v[0-9]+.4s, v[0-9]+.4s, v[0-9]+.4s
+ **	...
+ */
+ void f1 (int *restrict a, int n)
+ {
+ #pragma GCC unroll 16
+   for (int i = 0; i < n; i++)
+     a[i] *= 2;
+ }
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/arc/mult-cmp0.c gcc-16-20250629/gcc/testsuite/gcc.target/arc/mult-cmp0.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/arc/mult-cmp0.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/arc/mult-cmp0.c	Sun Jun 29 22:33:42 2025
***************
*** 0 ****
--- 1,66 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1" } */
+ 
+ /* mpy.f   r1,r0,r1
+    mov_s   r0,5    ;3
+    j_s.d   [blink]
+    mov.ne  r0,r1 */
+ unsigned int
+ ubar (unsigned int a, unsigned int b)
+ {
+ 	unsigned int c = a * b;
+ 	if (c == 0)
+ 	{
+ 		return 5;
+ 	}
+ 	return c;
+ }
+ 
+ /*  mpy.f   r1,r0,r1
+     mov_s   r0,5    ;3
+     j_s.d   [blink]
+     mov.ne  r0,r1 */
+ signed int
+ bar (signed int a, signed int b)
+ {
+ 	signed int c = a * b;
+ 	if (c == 0)
+ 	{
+ 		return 5;
+ 	}
+ 	return c;
+ }
+ 
+ /* mpy.f   0,r0,r1
+    mov_s   r0,1    ;3
+    j_s.d   [blink]
+    mov.eq  r0,5 */
+ unsigned int
+ ufoo (unsigned int a, unsigned int b)
+ {
+ 	if (a * b == 0)
+ 	{
+ 		return 5;
+ 	}
+ 	return 1;
+ }
+ 
+ /*  mpy.f   0,r0,r1
+     mov_s   r0,1    ;3
+     j_s.d   [blink]
+     mov.eq  r0,5 */
+ unsigned int
+ foo (signed int a, signed int b)
+ {
+ 	if (a * b == 0)
+ 	{
+ 		return 5;
+ 	}
+ 	return 1;
+ }
+ 
+ /* { dg-final { scan-assembler-times "mpy\\.f\\s+0" 2 } } */
+ /* { dg-final { scan-assembler-times "mov\\.ne\\s+" 2 } } */
+ /* { dg-final { scan-assembler-times "mpy\\.f\\s+r" 2 } } */
+ /* { dg-final { scan-assembler-times "mov\\.eq\\s+" 2 } } */
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/arc/overflow-1.c gcc-16-20250629/gcc/testsuite/gcc.target/arc/overflow-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/arc/overflow-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/arc/overflow-1.c	Sun Jun 29 22:33:42 2025
***************
*** 0 ****
--- 1,98 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1" } */
+ 
+ #include <stdbool.h>
+ #include <stdint.h>
+ 
+ /*
+  * add.f  r0,r0,r1
+  * st_s   r0,[r2]
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool add_overflow (int32_t a, int32_t b, int32_t *res)
+ {
+   return __builtin_add_overflow (a, b, res);
+ }
+ 
+ /*
+  * add.f  r0,r0,-1234
+  * st_s   r0,[r1]
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool addi_overflow (int32_t a, int32_t *res)
+ {
+   return __builtin_add_overflow (a, -1234, res);
+ }
+ 
+ /*
+  * add.f  r0,r0,r1
+  * st_s   r0,[r2]
+  * j_s.d  [blink]
+  * rlc    r0,0
+  */
+ bool uadd_overflow (uint32_t a, uint32_t b, uint32_t *res)
+ {
+   return __builtin_add_overflow (a, b, res);
+ }
+ 
+ /*
+  * add.f  r2,r0, 4321
+  * seths  r0,r0,-4321
+  * j_s.d  [blink]
+  * st_s   r2,[r1]
+  */
+ bool uaddi_overflow (uint32_t a, uint32_t *res)
+ {
+   return __builtin_add_overflow (a, 4321, res);
+ }
+ 
+ /*
+  * add.f   r0,r0,r1
+  * mov_s   r0,1
+  * j_s.d   [blink]
+  * mov.nv  r0,0
+  */
+ bool add_overflow_p (int32_t a, int32_t b, int32_t res)
+ {
+   return __builtin_add_overflow_p (a, b, res);
+ }
+ 
+ /*
+  * add.f   r0,r0,-1000
+  * mov_s   r0,1
+  * j_s.d   [blink]
+  * mov.nv  r0,0
+  */
+ bool addi_overflow_p (int32_t a, int32_t res)
+ {
+   return __builtin_add_overflow_p (a, -1000, res);
+ }
+ 
+ /*
+  * add.f   0,r0,r1
+  * j_s.d   [blink]
+  * rlc     r0,0
+  */
+ bool uadd_overflow_p (uint32_t a, uint32_t b, uint32_t res)
+ {
+   return __builtin_add_overflow_p (a, b, res);
+ }
+ 
+ /*
+  * j_s.d   [blink]
+  * seths   r0,r0,-2000
+  */
+ bool uaddi_overflow_p (uint32_t a, uint32_t res)
+ {
+   return __builtin_add_overflow_p (a, 2000, res);
+ }
+ 
+ /* { dg-final { scan-assembler-times "add.f\\s\+"   7 } } */
+ /* { dg-final { scan-assembler-times "mov\.nv\\s\+" 4 } } */
+ /* { dg-final { scan-assembler-times "rlc\\s\+"     2 } } */
+ /* { dg-final { scan-assembler-times "seths\\s\+"   2 } } */
+ /* { dg-final { scan-assembler-not   "cmp" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/arc/overflow-2.c gcc-16-20250629/gcc/testsuite/gcc.target/arc/overflow-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/arc/overflow-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/arc/overflow-2.c	Sun Jun 29 22:33:42 2025
***************
*** 0 ****
--- 1,97 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1" } */
+ 
+ #include <stdbool.h>
+ #include <stdint.h>
+ 
+ /*
+  * sub.f  r0,r0,r1
+  * st_s   r0,[r2]
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool sub_overflow (int32_t a, int32_t b, int32_t *res)
+ {
+   return __builtin_sub_overflow (a, b, res);
+ }
+ 
+ /*
+  * sub.f  r0,r0,-1234
+  * st_s   r0,[r1]
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool subi_overflow (int32_t a, int32_t *res)
+ {
+   return __builtin_sub_overflow (a, -1234, res);
+ }
+ 
+ /*
+  * sub.f  r3,r0,r1
+  * st_s   r3,[r2]
+  * j_s.d  [blink]
+  * setlo  r0,r0,r1
+  */
+ bool usub_overflow (uint32_t a, uint32_t b, uint32_t *res)
+ {
+   return __builtin_sub_overflow (a, b, res);
+ }
+ 
+ /*
+  * sub.f  r2,r0,4321
+  * seths  r0,4320,r0
+  * j_s.d  [blink]
+  * st_s   r2,[r1]
+  */
+ bool usubi_overflow (uint32_t a, uint32_t *res)
+ {
+   return __builtin_sub_overflow (a, 4321, res);
+ }
+ 
+ /*
+  * sub.f  r0,r0,r1
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool sub_overflow_p (int32_t a, int32_t b, int32_t res)
+ {
+   return __builtin_sub_overflow_p (a, b, res);
+ }
+ 
+ /*
+  * sub.f  r0,r0,-1000
+  * mov_s  r0,1
+  * j_s.d  [blink]
+  * mov.nv r0,0
+  */
+ bool subi_overflow_p (int32_t a, int32_t res)
+ {
+   return __builtin_sub_overflow_p (a, -1000, res);
+ }
+ 
+ /*
+  * j_s.d  [blink]
+  * setlo  r0,r0,r1
+  */
+ bool usub_overflow_p (uint32_t a, uint32_t b, uint32_t res)
+ {
+   return __builtin_sub_overflow_p (a, b, res);
+ }
+ 
+ /*
+  * seths  r0,1999,r0
+  * j_s.d  [blink]
+  */
+ bool usubi_overflow_p (uint32_t a, uint32_t res)
+ {
+   return __builtin_sub_overflow_p (a, 2000, res);
+ }
+ 
+ /* { dg-final { scan-assembler-times "sub.f\\s\+"   6 } } */
+ /* { dg-final { scan-assembler-times "mov\.nv\\s\+" 4 } } */
+ /* { dg-final { scan-assembler-times "setlo\\s\+"   2 } } */
+ /* { dg-final { scan-assembler-times "seths\\s\+"   2 } } */
+ /* { dg-final { scan-assembler-not   "cmp" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/auto-init-padding-3.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/auto-init-padding-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/auto-init-padding-3.c	Sun Jun 22 22:32:53 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/auto-init-padding-3.c	Sun Jun 29 22:33:47 2025
*************** int foo ()
*** 23,30 ****
    return var.four.internal1;
  }
  
! /* { dg-final { scan-assembler "movl\t\\\$0," } } */
! /* { dg-final { scan-assembler "movl\t\\\$16," { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler "rep stosq" { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler "movl\t\\\$32," { target ia32 } } } */
! /* { dg-final { scan-assembler "rep stosl" { target ia32 } } } */
--- 23,27 ----
    return var.four.internal1;
  }
  
! /* { dg-final { scan-assembler-times "pxor\t%xmm0, %xmm0" 1 } } */
! /* { dg-final { scan-assembler-times "movaps\t%xmm0, " 8 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/auto-init-padding-9.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/auto-init-padding-9.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/auto-init-padding-9.c	Sun Jun 22 22:32:53 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/auto-init-padding-9.c	Sun Jun 29 22:33:47 2025
***************
*** 2,7 ****
--- 2,26 ----
     padding.  */ 
  /* { dg-do compile } */
  /* { dg-options "-ftrivial-auto-var-init=zero -march=x86-64" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **...
+ **	pxor	%xmm0, %xmm0
+ **...
+ **.L[0-9]+:
+ **	movl	%esi, %ecx
+ **	movaps	%xmm0, \(%rdx,%rcx\)
+ **	movaps	%xmm0, 16\(%rdx,%rcx\)
+ **	movaps	%xmm0, 32\(%rdx,%rcx\)
+ **	movaps	%xmm0, 48\(%rdx,%rcx\)
+ **	addl	\$64, %esi
+ **	cmpl	%edi, %esi
+ **	jb	.L[0-9]+
+ **...
+ */
  
  struct test_trailing_hole {
          int one;
*************** int foo ()
*** 18,25 ****
    return var[2].four;
  }
  
! /* { dg-final { scan-assembler "movl\t\\\$0," } } */
! /* { dg-final { scan-assembler "movl\t\\\$20," { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler "rep stosq" { target { ! ia32 } } } } */
! /* { dg-final { scan-assembler "movl\t\\\$40," { target ia32} } } */
! /* { dg-final { scan-assembler "rep stosl" { target ia32 } } } */
--- 37,40 ----
    return var[2].four;
  }
  
! /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c	Sun Jun 22 22:32:54 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu16-1.c	Sun Jun 29 22:33:48 2025
***************
*** 16,26 ****
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu16|vinserti128)\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu16|vextracti128)\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 16,26 ----
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu|vinserti128)\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu|vextracti128)\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c	Sun Jun 22 22:32:54 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512bw-vmovdqu8-1.c	Sun Jun 29 22:33:48 2025
***************
*** 16,24 ****
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 16,24 ----
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovdqu8\[ \\t\]+\[^\{\n\]*%zmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512fp16-13.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512fp16-13.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/avx512fp16-13.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/avx512fp16-13.c	Sun Jun 29 22:33:48 2025
*************** load256u_ph (void const *p)
*** 71,77 ****
    return _mm256_loadu_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]*\[^,\]*,\[^\{\n\]*%ymm\[0-9\]" 1 } } */
  
  __m128h
  __attribute__ ((noinline, noclone))
--- 71,77 ----
    return _mm256_loadu_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]*\[^,\]*,\[^\{\n\]*%ymm\[0-9\]" 1 } } */
  
  __m128h
  __attribute__ ((noinline, noclone))
*************** load128u_ph (void const *p)
*** 80,86 ****
    return _mm_loadu_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]*\[^,\]*,\[^\{\n\]*%xmm\[0-9\]" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
--- 80,86 ----
    return _mm_loadu_ph (p);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]*\[^,\]*,\[^\{\n\]*%xmm\[0-9\]" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
*************** store512u_ph (void *p, __m512h a)
*** 89,95 ****
    return _mm512_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]*\[^\{\n\]*%zmm\[0-9\], *\[^,\]*" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
--- 89,95 ----
    return _mm512_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]*\[^\{\n\]*%zmm\[0-9\], *\[^,\]*" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
*************** store256u_ph (void *p, __m256h a)
*** 98,104 ****
    return _mm256_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]*\[^\{\n\]*%ymm\[0-9\], *\[^,\]*" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
--- 98,104 ----
    return _mm256_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]*\[^\{\n\]*%ymm\[0-9\], *\[^,\]*" 1 } } */
  
  void
  __attribute__ ((noinline, noclone))
*************** storeu_ph (void *p, __m128h a)
*** 107,113 ****
    return _mm_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu16\[ \\t\]*\[^\{\n\]*%xmm\[0-9\], *\[^,\]*" 1 } } */
  
  __m512h
  __attribute__ ((noinline, noclone))
--- 107,113 ----
    return _mm_storeu_ph (p, a);
  }
  
! /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]*\[^\{\n\]*%xmm\[0-9\], *\[^,\]*" 1 } } */
  
  __m512h
  __attribute__ ((noinline, noclone))
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/crc-builtin-crc32.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/crc-builtin-crc32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/crc-builtin-crc32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/crc-builtin-crc32.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,22 ----
+ /* PR target/120719 */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mcrc32" } */
+ 
+ #include <stdint-gcc.h>
+ 
+ int32_t rev_crc32_data8 (int8_t v)
+ {
+   return __builtin_rev_crc32_data8 (0xffffffff, v, 0x1EDC6F41);
+ }
+ 
+ int32_t rev_crc32_data16 (int16_t v)
+ {
+   return __builtin_rev_crc32_data16 (0xffffffff, v, 0x1EDC6F41);
+ }
+ 
+ int32_t rev_crc32_data32 (int32_t v)
+ {
+   return __builtin_rev_crc32_data32 (0xffffffff, v, 0x1EDC6F41);
+ } 
+ 
+ /* { dg-final { scan-assembler-times "\tcrc32" 3 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide128kl.c	Sun Jun 29 22:33:48 2025
***************
*** 19,32 ****
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm0, %xmm0" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm1, %xmm1" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm2, %xmm2" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm3, %xmm3" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm4, %xmm4" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm5, %xmm5" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm6, %xmm6" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
  
  #include <immintrin.h>
  
--- 19,32 ----
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm0" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm1" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm2" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm3" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm4" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm5" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm6" } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesdecwide256kl.c	Sun Jun 29 22:33:48 2025
***************
*** 19,32 ****
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm0, %xmm0" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm1, %xmm1" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm2, %xmm2" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm3, %xmm3" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm4, %xmm4" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm5, %xmm5" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm6, %xmm6" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
  
  #include <immintrin.h>
  
--- 19,32 ----
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm0" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm1" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm2" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm3" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm4" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm5" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm6" } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesencwide128kl.c	Sun Jun 29 22:33:48 2025
***************
*** 19,32 ****
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm0, %xmm0" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm1, %xmm1" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm2, %xmm2" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm3, %xmm3" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm4, %xmm4" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm5, %xmm5" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm6, %xmm6" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
  
  #include <immintrin.h>
  
--- 19,32 ----
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm0" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm1" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm2" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm3" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm4" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm5" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm6" } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/keylocker-aesencwide256kl.c	Sun Jun 29 22:33:48 2025
***************
*** 19,32 ****
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm0, %xmm0" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm1, %xmm1" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm2, %xmm2" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm3, %xmm3" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm4, %xmm4" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm5, %xmm5" } } */
- /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm6, %xmm6" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
  
  #include <immintrin.h>
  
--- 19,32 ----
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm5,\[^\\n\\r\]*80\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm6,\[^\\n\\r\]*96\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "(?:movdqu|movups)\[ \\t\]+\[^\\n\\r\]*%xmm7,\[^\\n\\r\]*112\[^\\n\\r\]*" } } */
  /* { dg-final { scan-assembler "pxor\[ \t\]+%xmm7, %xmm7" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm0" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm1" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm2" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm3" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm4" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm5" } } */
+ /* { dg-final { scan-assembler "movdqa\[ \t\]+%xmm7, %xmm6" } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memcpy-strategy-12.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,34 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **...
+ **	xorl	%edx, %edx
+ **...
+ **.L[0-9]+:
+ **	movl	%edx, %eax
+ **	addl	\$32, %edx
+ **	movq	\(%rsi,%rax\), %r10
+ **	movq	8\(%rsi,%rax\), %r9
+ **	movq	16\(%rsi,%rax\), %r8
+ **	movq	24\(%rsi,%rax\), %rcx
+ **	movq	%r10, \(%rdi,%rax\)
+ **	movq	%r9, 8\(%rdi,%rax\)
+ **	movq	%r8, 16\(%rdi,%rax\)
+ **	movq	%rcx, 24\(%rdi,%rax\)
+ **	cmpl	\$224, %edx
+ **	jb	.L[0-9]+
+ **...
+ */
+ 
+ void
+ foo (char *dest, char *src)
+ {
+   __builtin_memcpy (dest, src, 253);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep mov" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memcpy-strategy-13.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-avx" } */
+ /* { dg-final { scan-assembler "jmp\tmemcpy" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler "call\tmemcpy" { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "rep movsb" } } */
+ 
+ void
+ foo (char *dest, char *src)
+ {
+   __builtin_memcpy (dest, src, 257);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-pr70308-1a.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,46 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$16, %rsp
+ **	.cfi_def_cfa_offset 24
+ **	pxor	%xmm0, %xmm0
+ **	movaps	%xmm0, -120\(%rsp\)
+ **	movaps	%xmm0, -104\(%rsp\)
+ **	movaps	%xmm0, -88\(%rsp\)
+ **	movaps	%xmm0, -72\(%rsp\)
+ **	movaps	%xmm0, -56\(%rsp\)
+ **	movaps	%xmm0, -40\(%rsp\)
+ **	movaps	%xmm0, -24\(%rsp\)
+ **	movaps	%xmm0, -8\(%rsp\)
+ **	xorl	%eax, %eax
+ **	addq	\$16, %rsp
+ **	.cfi_def_cfa_offset 8
+ **	ret
+ **...
+ */
+ 
+ extern int scanf (const char *, ...);
+ extern void *memset (void *, int, __SIZE_TYPE__);
+ 
+ int
+ foo (void)
+ {
+   char buf[128];
+ 
+ #if USE_SCANF
+   if (scanf("%s", buf) != 1)
+     return 42;
+ #endif
+ 
+   memset (buf,0, sizeof (buf));
+   asm volatile("": : :"memory");
+   return 0;
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-pr70308-1b.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,61 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64 -DUSE_SCANF" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$136, %rsp
+ **	.cfi_def_cfa_offset 144
+ **	xorl	%eax, %eax
+ **	movl	\$.LC[0-9]+, %edi
+ **	movq	%rsp, %rsi
+ **	call	scanf
+ **	cmpl	\$1, %eax
+ **	je	.L[0-9]+
+ **	movl	\$42, %eax
+ **	addq	\$136, %rsp
+ **	.cfi_remember_state
+ **	.cfi_def_cfa_offset 8
+ **	ret
+ **	.p2align 4,,10
+ **	.p2align 3
+ **.L[0-9]+:
+ **	.cfi_restore_state
+ **	pxor	%xmm0, %xmm0
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm0, 16\(%rsp\)
+ **	movaps	%xmm0, 32\(%rsp\)
+ **	movaps	%xmm0, 48\(%rsp\)
+ **	movaps	%xmm0, 64\(%rsp\)
+ **	movaps	%xmm0, 80\(%rsp\)
+ **	movaps	%xmm0, 96\(%rsp\)
+ **	movaps	%xmm0, 112\(%rsp\)
+ **	xorl	%eax, %eax
+ **	addq	\$136, %rsp
+ **	.cfi_def_cfa_offset 8
+ **	ret
+ **...
+ */
+ 
+ extern int scanf (const char *, ...);
+ extern void *memset (void *, int, __SIZE_TYPE__);
+ 
+ int
+ foo (void)
+ {
+   char buf[128];
+ 
+ #if USE_SCANF
+   if (scanf("%s", buf) != 1)
+     return 42;
+ #endif
+ 
+   memset (buf,0, sizeof (buf));
+   asm volatile("": : :"memory");
+   return 0;
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-25.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-25.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-25.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-25.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	xorl	%eax, %eax
+ **.L[0-9]+:
+ **	movl	%eax, %edx
+ **	addl	\$32, %eax
+ **	movq	\$0, \(%rdi,%rdx\)
+ **	movq	\$0, 8\(%rdi,%rdx\)
+ **	movq	\$0, 16\(%rdi,%rdx\)
+ **	movq	\$0, 24\(%rdi,%rdx\)
+ **	cmpl	\$224, %eax
+ **	jb	.L[0-9]+
+ **...
+ */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 253);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-26.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-26.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-26.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-26.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* { dg-final { scan-assembler-not "jmp\tmemset" } } */
+ /* { dg-final { scan-assembler-not "rep stosb" } } */
+ 
+ struct foo
+ {
+   char buf[41];
+ };
+ 
+ void
+ zero(struct foo *f)
+ {
+   __builtin_memset(f->buf, 0, sizeof(f->buf));
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-27.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-27.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-27.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-27.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-avx" } */
+ /* { dg-final { scan-assembler "jmp\tmemset" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler "call\tmemset" { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "rep stosb" } } */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 257);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-28.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-28.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-28.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-28.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	movq	\$0, \(%rdi\)
+ **	movq	\$0, 8\(%rdi\)
+ **	movq	\$0, 16\(%rdi\)
+ **	movq	\$0, 24\(%rdi\)
+ **	movq	\$0, 32\(%rdi\)
+ **	movq	\$0, 40\(%rdi\)
+ **	movq	\$0, 48\(%rdi\)
+ **	movq	\$0, 56\(%rdi\)
+ **	movb	\$0, 64\(%rdi\)
+ **	ret
+ **...
+ */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 65);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-29.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-29.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-29.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-29.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **...
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	xorl	%eax, %eax
+ **.L[0-9]+:
+ **	movl	%eax, %edx
+ **	addl	\$32, %eax
+ **	movq	\$0, \(%rdi,%rdx\)
+ **	movq	\$0, 8\(%rdi,%rdx\)
+ **	movq	\$0, 16\(%rdi,%rdx\)
+ **	movq	\$0, 24\(%rdi,%rdx\)
+ **	cmpl	\$64, %eax
+ **	jb	.L[0-9]+
+ **...
+ */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 81);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-30.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-30.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-30.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-30.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-sse" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **...
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	xorl	%eax, %eax
+ **.L[0-9]+:
+ **	movl	%eax, %edx
+ **	addl	\$32, %eax
+ **	movq	\$0, \(%rdi,%rdx\)
+ **	movq	\$0, 8\(%rdi,%rdx\)
+ **	movq	\$0, 16\(%rdi,%rdx\)
+ **	movq	\$0, 24\(%rdi,%rdx\)
+ **	cmpl	\$64, %eax
+ **	jb	.L[0-9]+
+ **...
+ */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 95);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-31.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-31.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/memset-strategy-31.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/memset-strategy-31.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune=generic -mno-avx -msse2" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **foo:
+ **.LFB[0-9]+:
+ **...
+ **	pxor	%xmm0, %xmm0
+ **	xorl	%eax, %eax
+ **.L[0-9]+:
+ **	movl	%eax, %edx
+ **	addl	\$64, %eax
+ **	movups	%xmm0, \(%rdi,%rdx\)
+ **	movups	%xmm0, 16\(%rdi,%rdx\)
+ **	movups	%xmm0, 32\(%rdi,%rdx\)
+ **	movups	%xmm0, 48\(%rdi,%rdx\)
+ **	cmpl	\$192, %eax
+ **	jb	.L[0-9]+
+ **...
+ */
+ 
+ void
+ foo (char *dest)
+ {
+   __builtin_memset (dest, 0, 254);
+ }
+ 
+ /* { dg-final { scan-assembler-not "rep stos" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/mvc17.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/mvc17.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/mvc17.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/mvc17.c	Sun Jun 29 22:33:48 2025
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-require-ifunc "" } */
  /* { dg-options "-O2 -march=x86-64" } */
! /* { dg-final { scan-assembler-times "rep mov" 1 } } */
  
  __attribute__((target_clones("default","arch=icelake-server")))
  void
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-require-ifunc "" } */
  /* { dg-options "-O2 -march=x86-64" } */
! /* { dg-final { scan-assembler-not "rep mov" } } */
  
  __attribute__((target_clones("default","arch=icelake-server")))
  void
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,166 ----
+ /* { dg-do compile { target { *-*-linux* && lp64 } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /* end must be empty.  */
+ 
+ /*
+ **end:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #define NEXT { op_t *op = next; [[gnu::musttail]] return (*op)(op + 1); }
+ #ifdef __x86_64__
+ # define CLOBBER asm("" ::: "r12","r13","r14","r15","rbp","rbx")
+ #else
+ # define CLOBBER asm("" ::: "ebp","ebx")
+ #endif
+ #define DONT_SAVE_REGS __attribute__((no_callee_saved_registers))
+ #define SAVE_REGS __attribute__((no_caller_saved_registers))
+ 
+ typedef DONT_SAVE_REGS void (*op_t)(void *next); 
+ 
+ extern int accumulator;
+ 
+ static DONT_SAVE_REGS void end(void *next)
+ {
+ }
+ 
+ /* inc doesn't have any callee saved registers.  */
+ 
+ /*
+ **inc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	addl	\$1, accumulator\(%rip\)
+ **	movq	\(%rdi\), %rax
+ **	addq	\$8, %rdi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ static DONT_SAVE_REGS void inc(void *next)
+ {	
+   accumulator += 1;
+   CLOBBER;
+   NEXT;
+ }
+ 
+ /* dec doesn't have any callee saved registers.  */
+ 
+ /*
+ **dec:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$1, accumulator\(%rip\)
+ **	movq	\(%rdi\), %rax
+ **	addq	\$8, %rdi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ static DONT_SAVE_REGS void dec(void *next)
+ {
+   accumulator -= 1;
+   CLOBBER;
+   NEXT;
+ }
+ 
+ op_t code[] = { inc, inc, dec, end, };
+ 
+ /* start must save and restore all caller saved registers.  */
+ 
+ /*
+ **start:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$376, %rsp
+ **...
+ **	movq	%rax, 256\(%rsp\)
+ **	movq	%rdx, 264\(%rsp\)
+ **	movq	%rcx, 272\(%rsp\)
+ **	movq	%rbx, 280\(%rsp\)
+ **	movq	%rsi, 288\(%rsp\)
+ **	movq	%rdi, 296\(%rsp\)
+ **...
+ **	movl	\$code\+8, %edi
+ **	movq	%rbp, 304\(%rsp\)
+ **	movq	%r8, 312\(%rsp\)
+ **	movq	%r9, 320\(%rsp\)
+ **	movq	%r10, 328\(%rsp\)
+ **	movq	%r11, 336\(%rsp\)
+ **	movq	%r12, 344\(%rsp\)
+ **	movq	%r13, 352\(%rsp\)
+ **	movq	%r14, 360\(%rsp\)
+ **	movq	%r15, 368\(%rsp\)
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm1, 16\(%rsp\)
+ **	movaps	%xmm2, 32\(%rsp\)
+ **	movaps	%xmm3, 48\(%rsp\)
+ **	movaps	%xmm4, 64\(%rsp\)
+ **	movaps	%xmm5, 80\(%rsp\)
+ **	movaps	%xmm6, 96\(%rsp\)
+ **	movaps	%xmm7, 112\(%rsp\)
+ **	movaps	%xmm8, 128\(%rsp\)
+ **	movaps	%xmm9, 144\(%rsp\)
+ **	movaps	%xmm10, 160\(%rsp\)
+ **	movaps	%xmm11, 176\(%rsp\)
+ **	movaps	%xmm12, 192\(%rsp\)
+ **	movaps	%xmm13, 208\(%rsp\)
+ **	movaps	%xmm14, 224\(%rsp\)
+ **	movaps	%xmm15, 240\(%rsp\)
+ **...
+ **	call	\*code\(%rip\)
+ **	movaps	\(%rsp\), %xmm0
+ **	movaps	16\(%rsp\), %xmm1
+ **	movaps	32\(%rsp\), %xmm2
+ **	movaps	48\(%rsp\), %xmm3
+ **	movaps	64\(%rsp\), %xmm4
+ **	movaps	80\(%rsp\), %xmm5
+ **	movaps	96\(%rsp\), %xmm6
+ **	movaps	112\(%rsp\), %xmm7
+ **	movaps	128\(%rsp\), %xmm8
+ **	movaps	144\(%rsp\), %xmm9
+ **	movaps	160\(%rsp\), %xmm10
+ **	movaps	176\(%rsp\), %xmm11
+ **	movaps	192\(%rsp\), %xmm12
+ **	movaps	208\(%rsp\), %xmm13
+ **	movq	256\(%rsp\), %rax
+ **	movq	264\(%rsp\), %rdx
+ **	movq	272\(%rsp\), %rcx
+ **	movq	280\(%rsp\), %rbx
+ **	movq	288\(%rsp\), %rsi
+ **	movq	296\(%rsp\), %rdi
+ **	movq	304\(%rsp\), %rbp
+ **	movq	312\(%rsp\), %r8
+ **	movq	320\(%rsp\), %r9
+ **	movq	328\(%rsp\), %r10
+ **	movq	336\(%rsp\), %r11
+ **	movq	344\(%rsp\), %r12
+ **	movq	352\(%rsp\), %r13
+ **	movq	360\(%rsp\), %r14
+ **	movaps	224\(%rsp\), %xmm14
+ **	movq	368\(%rsp\), %r15
+ **	movaps	240\(%rsp\), %xmm15
+ **	addq	\$376, %rsp
+ **...
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* This function should have normal ABI to interoperate with others */
+ SAVE_REGS void start()
+ {
+   void *next = code;
+ 
+   // musttail doesn't work here because the registers need to be restored
+   code[0](code + 1);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,129 ----
+ /* { dg-do compile { target { *-*-linux* && maybe_x32 } } } */
+ /* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /* end must be empty.  */
+ 
+ /*
+ **end:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* inc doesn't have any callee saved registers.  */
+ 
+ /*
+ **inc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	addl	\$1, accumulator\(%rip\)
+ **	movq	%rdi, %rax
+ **	movl	\(%eax\), %eax
+ **	leal	4\(%rdi\), %edi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* dec doesn't have any callee saved registers.  */
+ 
+ /*
+ **dec:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$1, accumulator\(%rip\)
+ **	movq	%rdi, %rax
+ **	movl	\(%eax\), %eax
+ **	leal	4\(%rdi\), %edi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* start must save and restore all caller saved registers.  */
+ 
+ /*
+ **start:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$376, %esp
+ **...
+ **	movq	%rax, 256\(%rsp\)
+ **	movq	%rdx, 264\(%rsp\)
+ **	movq	%rcx, 272\(%rsp\)
+ **	movq	%rbx, 280\(%rsp\)
+ **	movq	%rsi, 288\(%rsp\)
+ **	movq	%rdi, 296\(%rsp\)
+ **...
+ **	movl	\$code\+4, %edi
+ **	movq	%rbp, 304\(%rsp\)
+ **	movq	%r8, 312\(%rsp\)
+ **	movq	%r9, 320\(%rsp\)
+ **	movq	%r10, 328\(%rsp\)
+ **	movq	%r11, 336\(%rsp\)
+ **	movq	%r12, 344\(%rsp\)
+ **	movq	%r13, 352\(%rsp\)
+ **	movq	%r14, 360\(%rsp\)
+ **	movq	%r15, 368\(%rsp\)
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm1, 16\(%rsp\)
+ **	movaps	%xmm2, 32\(%rsp\)
+ **	movaps	%xmm3, 48\(%rsp\)
+ **	movaps	%xmm4, 64\(%rsp\)
+ **	movaps	%xmm5, 80\(%rsp\)
+ **	movaps	%xmm6, 96\(%rsp\)
+ **	movaps	%xmm7, 112\(%rsp\)
+ **	movaps	%xmm8, 128\(%rsp\)
+ **	movaps	%xmm9, 144\(%rsp\)
+ **	movaps	%xmm10, 160\(%rsp\)
+ **	movaps	%xmm11, 176\(%rsp\)
+ **	movaps	%xmm12, 192\(%rsp\)
+ **	movaps	%xmm13, 208\(%rsp\)
+ **	movaps	%xmm14, 224\(%rsp\)
+ **	movaps	%xmm15, 240\(%rsp\)
+ **...
+ **	movl	code\(%rip\), %ebp
+ **	call	\*%rbp
+ **	movaps	\(%rsp\), %xmm0
+ **	movaps	16\(%rsp\), %xmm1
+ **	movaps	32\(%rsp\), %xmm2
+ **	movaps	48\(%rsp\), %xmm3
+ **	movaps	64\(%rsp\), %xmm4
+ **	movaps	80\(%rsp\), %xmm5
+ **	movaps	96\(%rsp\), %xmm6
+ **	movaps	112\(%rsp\), %xmm7
+ **	movaps	128\(%rsp\), %xmm8
+ **	movaps	144\(%rsp\), %xmm9
+ **	movaps	160\(%rsp\), %xmm10
+ **	movaps	176\(%rsp\), %xmm11
+ **	movaps	192\(%rsp\), %xmm12
+ **	movaps	208\(%rsp\), %xmm13
+ **	movaps	224\(%rsp\), %xmm14
+ **	movaps	240\(%rsp\), %xmm15
+ **	movq	256\(%rsp\), %rax
+ **	movq	264\(%rsp\), %rdx
+ **	movq	272\(%rsp\), %rcx
+ **	movq	280\(%rsp\), %rbx
+ **	movq	288\(%rsp\), %rsi
+ **	movq	296\(%rsp\), %rdi
+ **	movq	304\(%rsp\), %rbp
+ **	movq	312\(%rsp\), %r8
+ **	movq	320\(%rsp\), %r9
+ **	movq	328\(%rsp\), %r10
+ **	movq	336\(%rsp\), %r11
+ **	movq	344\(%rsp\), %r12
+ **	movq	352\(%rsp\), %r13
+ **	movq	360\(%rsp\), %r14
+ **	movq	368\(%rsp\), %r15
+ **	addl	\$376, %esp
+ **...
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include "no-callee-saved-19a.c"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,94 ----
+ /* { dg-do compile { target { *-*-linux* && ia32 } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /* end must be empty.  */
+ 
+ /*
+ **end:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* inc doesn't have any callee saved registers.  */
+ 
+ /*
+ **inc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	addl	\$1, accumulator
+ **	movl	4\(%esp\), %eax
+ **	leal	4\(%eax\), %edx
+ **	movl	%edx, 4\(%esp\)
+ **	jmp	\*\(%eax\)
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* dec doesn't have any callee saved registers.  */
+ 
+ /*
+ **dec:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$1, accumulator
+ **	movl	4\(%esp\), %eax
+ **	leal	4\(%eax\), %edx
+ **	movl	%edx, 4\(%esp\)
+ **	jmp	\*\(%eax\)
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* start must save and restore all caller saved registers.  */
+ 
+ /*
+ **start:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **...
+ **	movl	%eax, 140\(%esp\)
+ **	movl	%edx, 144\(%esp\)
+ **	movl	%ecx, 148\(%esp\)
+ **	movl	%ebx, 152\(%esp\)
+ **	movl	%esi, 156\(%esp\)
+ **	movl	%edi, 160\(%esp\)
+ **	movl	%ebp, 164\(%esp\)
+ **	movaps	%xmm0, 12\(%esp\)
+ **	movaps	%xmm1, 28\(%esp\)
+ **	movaps	%xmm2, 44\(%esp\)
+ **	movaps	%xmm3, 60\(%esp\)
+ **	movaps	%xmm4, 76\(%esp\)
+ **	movaps	%xmm5, 92\(%esp\)
+ **	movaps	%xmm6, 108\(%esp\)
+ **	movaps	%xmm7, 124\(%esp\)
+ **...
+ **	pushl	\$code\+4
+ **...
+ **	call	\*code
+ **	movaps	16\(%esp\), %xmm0
+ **	movaps	32\(%esp\), %xmm1
+ **	movaps	48\(%esp\), %xmm2
+ **	movaps	64\(%esp\), %xmm3
+ **	movaps	80\(%esp\), %xmm4
+ **	movaps	96\(%esp\), %xmm5
+ **	movaps	112\(%esp\), %xmm6
+ **	movaps	128\(%esp\), %xmm7
+ **	movl	144\(%esp\), %eax
+ **	movl	148\(%esp\), %edx
+ **	movl	152\(%esp\), %ecx
+ **	movl	156\(%esp\), %ebx
+ **	movl	160\(%esp\), %esi
+ **	movl	164\(%esp\), %edi
+ **	movl	168\(%esp\), %ebp
+ **...
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include "no-callee-saved-19a.c"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,159 ----
+ /* { dg-do compile { target { *-*-linux* && lp64 } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mapxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /* end must be empty.  */
+ 
+ /*
+ **end:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* inc doesn't have any callee saved registers.  */
+ 
+ /*
+ **inc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	addl	\$1, accumulator\(%rip\)
+ **	movq	\(%rdi\), %rax
+ **	addq	\$8, %rdi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* dec doesn't have any callee saved registers.  */
+ 
+ /*
+ **dec:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$1, accumulator\(%rip\)
+ **	movq	\(%rdi\), %rax
+ **	addq	\$8, %rdi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* start must save and restore all caller saved registers.  */
+ 
+ /*
+ **start:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$504, %rsp
+ **...
+ **	movq	%rax, 256\(%rsp\)
+ **	movq	%rdx, 264\(%rsp\)
+ **	movq	%rcx, 272\(%rsp\)
+ **	movq	%rbx, 280\(%rsp\)
+ **	movq	%rsi, 288\(%rsp\)
+ **	movq	%rdi, 296\(%rsp\)
+ **...
+ **	movl	\$code\+8, %edi
+ **	movq	%rbp, 304\(%rsp\)
+ **	movq	%r8, 312\(%rsp\)
+ **	movq	%r9, 320\(%rsp\)
+ **	movq	%r10, 328\(%rsp\)
+ **	movq	%r11, 336\(%rsp\)
+ **	movq	%r12, 344\(%rsp\)
+ **	movq	%r13, 352\(%rsp\)
+ **	movq	%r14, 360\(%rsp\)
+ **	movq	%r15, 368\(%rsp\)
+ **	movq	%r16, 376\(%rsp\)
+ **	movq	%r17, 384\(%rsp\)
+ **	movq	%r18, 392\(%rsp\)
+ **	movq	%r19, 400\(%rsp\)
+ **	movq	%r20, 408\(%rsp\)
+ **	movq	%r21, 416\(%rsp\)
+ **	movq	%r22, 424\(%rsp\)
+ **	movq	%r23, 432\(%rsp\)
+ **	movq	%r24, 440\(%rsp\)
+ **	movq	%r25, 448\(%rsp\)
+ **	movq	%r26, 456\(%rsp\)
+ **	movq	%r27, 464\(%rsp\)
+ **	movq	%r28, 472\(%rsp\)
+ **	movq	%r29, 480\(%rsp\)
+ **	movq	%r30, 488\(%rsp\)
+ **	movq	%r31, 496\(%rsp\)
+ **...
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm1, 16\(%rsp\)
+ **	movaps	%xmm2, 32\(%rsp\)
+ **	movaps	%xmm3, 48\(%rsp\)
+ **	movaps	%xmm4, 64\(%rsp\)
+ **	movaps	%xmm5, 80\(%rsp\)
+ **	movaps	%xmm6, 96\(%rsp\)
+ **	movaps	%xmm7, 112\(%rsp\)
+ **	movaps	%xmm8, 128\(%rsp\)
+ **	movaps	%xmm9, 144\(%rsp\)
+ **	movaps	%xmm10, 160\(%rsp\)
+ **	movaps	%xmm11, 176\(%rsp\)
+ **	movaps	%xmm12, 192\(%rsp\)
+ **	movaps	%xmm13, 208\(%rsp\)
+ **	movaps	%xmm14, 224\(%rsp\)
+ **	movaps	%xmm15, 240\(%rsp\)
+ **...
+ **	call	\*code\(%rip\)
+ **	movaps	\(%rsp\), %xmm0
+ **	movaps	16\(%rsp\), %xmm1
+ **	movaps	32\(%rsp\), %xmm2
+ **	movaps	48\(%rsp\), %xmm3
+ **	movaps	64\(%rsp\), %xmm4
+ **	movaps	80\(%rsp\), %xmm5
+ **	movaps	96\(%rsp\), %xmm6
+ **	movaps	112\(%rsp\), %xmm7
+ **	movaps	128\(%rsp\), %xmm8
+ **	movaps	144\(%rsp\), %xmm9
+ **	movaps	160\(%rsp\), %xmm10
+ **	movaps	176\(%rsp\), %xmm11
+ **	movaps	192\(%rsp\), %xmm12
+ **	movaps	208\(%rsp\), %xmm13
+ **	movq	256\(%rsp\), %rax
+ **	movq	264\(%rsp\), %rdx
+ **	movq	272\(%rsp\), %rcx
+ **	movq	280\(%rsp\), %rbx
+ **	movq	288\(%rsp\), %rsi
+ **	movq	296\(%rsp\), %rdi
+ **	movq	304\(%rsp\), %rbp
+ **	movq	312\(%rsp\), %r8
+ **	movq	320\(%rsp\), %r9
+ **	movq	328\(%rsp\), %r10
+ **	movq	336\(%rsp\), %r11
+ **	movq	344\(%rsp\), %r12
+ **	movq	352\(%rsp\), %r13
+ **	movq	360\(%rsp\), %r14
+ **	movq	368\(%rsp\), %r15
+ **	movq	376\(%rsp\), %r16
+ **	movaps	224\(%rsp\), %xmm14
+ **	movaps	240\(%rsp\), %xmm15
+ **	movq	384\(%rsp\), %r17
+ **	movq	392\(%rsp\), %r18
+ **	movq	400\(%rsp\), %r19
+ **	movq	408\(%rsp\), %r20
+ **	movq	416\(%rsp\), %r21
+ **	movq	424\(%rsp\), %r22
+ **	movq	432\(%rsp\), %r23
+ **	movq	440\(%rsp\), %r24
+ **	movq	448\(%rsp\), %r25
+ **	movq	456\(%rsp\), %r26
+ **	movq	464\(%rsp\), %r27
+ **	movq	472\(%rsp\), %r28
+ **	movq	480\(%rsp\), %r29
+ **	movq	488\(%rsp\), %r30
+ **	movq	496\(%rsp\), %r31
+ **	addq	\$504, %rsp
+ **...
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include "no-callee-saved-19a.c"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,162 ----
+ /* { dg-do compile { target { *-*-linux* && maybe_x32 } } } */
+ /* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mapxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /* end must be empty.  */
+ 
+ /*
+ **end:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* inc doesn't have any callee saved registers.  */
+ 
+ /*
+ **inc:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	addl	\$1, accumulator\(%rip\)
+ **	movq	%rdi, %rax
+ **	movl	\(%eax\), %eax
+ **	leal	4\(%rdi\), %edi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* dec doesn't have any callee saved registers.  */
+ 
+ /*
+ **dec:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$1, accumulator\(%rip\)
+ **	movq	%rdi, %rax
+ **	movl	\(%eax\), %eax
+ **	leal	4\(%rdi\), %edi
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ /* start must save and restore all caller saved registers.  */
+ 
+ /*
+ **start:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$504, %esp
+ **...
+ **	movq	%rax, 256\(%rsp\)
+ **	movq	%rdx, 264\(%rsp\)
+ **	movq	%rcx, 272\(%rsp\)
+ **	movq	%rbx, 280\(%rsp\)
+ **	movq	%rsi, 288\(%rsp\)
+ **	movq	%rdi, 296\(%rsp\)
+ **...
+ **	movl	\$code\+4, %edi
+ **	movq	%rbp, 304\(%rsp\)
+ **	movq	%r8, 312\(%rsp\)
+ **	movq	%r9, 320\(%rsp\)
+ **	movq	%r10, 328\(%rsp\)
+ **	movq	%r11, 336\(%rsp\)
+ **	movq	%r12, 344\(%rsp\)
+ **	movq	%r13, 352\(%rsp\)
+ **	movq	%r14, 360\(%rsp\)
+ **	movq	%r15, 368\(%rsp\)
+ **	movq	%r16, 376\(%rsp\)
+ **	movq	%r17, 384\(%rsp\)
+ **	movq	%r18, 392\(%rsp\)
+ **	movq	%r19, 400\(%rsp\)
+ **	movq	%r20, 408\(%rsp\)
+ **	movq	%r21, 416\(%rsp\)
+ **	movq	%r22, 424\(%rsp\)
+ **	movq	%r23, 432\(%rsp\)
+ **	movq	%r24, 440\(%rsp\)
+ **	movq	%r25, 448\(%rsp\)
+ **	movq	%r26, 456\(%rsp\)
+ **	movq	%r27, 464\(%rsp\)
+ **	movq	%r28, 472\(%rsp\)
+ **	movq	%r29, 480\(%rsp\)
+ **	movq	%r30, 488\(%rsp\)
+ **	movq	%r31, 496\(%rsp\)
+ **...
+ **	movl	code\(%rip\), %ebp
+ **	movaps	%xmm0, \(%rsp\)
+ **	movaps	%xmm1, 16\(%rsp\)
+ **	movaps	%xmm2, 32\(%rsp\)
+ **	movaps	%xmm3, 48\(%rsp\)
+ **	movaps	%xmm4, 64\(%rsp\)
+ **	movaps	%xmm5, 80\(%rsp\)
+ **	movaps	%xmm6, 96\(%rsp\)
+ **	movaps	%xmm7, 112\(%rsp\)
+ **	movaps	%xmm8, 128\(%rsp\)
+ **	movaps	%xmm9, 144\(%rsp\)
+ **	movaps	%xmm10, 160\(%rsp\)
+ **	movaps	%xmm11, 176\(%rsp\)
+ **	movaps	%xmm12, 192\(%rsp\)
+ **	movaps	%xmm13, 208\(%rsp\)
+ **	movaps	%xmm14, 224\(%rsp\)
+ **	movaps	%xmm15, 240\(%rsp\)
+ **...
+ **	call	\*%rbp
+ **	movaps	\(%rsp\), %xmm0
+ **	movaps	16\(%rsp\), %xmm1
+ **	movaps	32\(%rsp\), %xmm2
+ **	movaps	48\(%rsp\), %xmm3
+ **	movaps	64\(%rsp\), %xmm4
+ **	movaps	80\(%rsp\), %xmm5
+ **	movaps	96\(%rsp\), %xmm6
+ **	movaps	112\(%rsp\), %xmm7
+ **	movaps	128\(%rsp\), %xmm8
+ **	movaps	144\(%rsp\), %xmm9
+ **	movaps	160\(%rsp\), %xmm10
+ **	movaps	176\(%rsp\), %xmm11
+ **	movaps	192\(%rsp\), %xmm12
+ **	movaps	208\(%rsp\), %xmm13
+ **	movaps	224\(%rsp\), %xmm14
+ **	movaps	240\(%rsp\), %xmm15
+ **	movq	256\(%rsp\), %rax
+ **	movq	264\(%rsp\), %rdx
+ **	movq	272\(%rsp\), %rcx
+ **	movq	280\(%rsp\), %rbx
+ **	movq	288\(%rsp\), %rsi
+ **	movq	296\(%rsp\), %rdi
+ **	movq	304\(%rsp\), %rbp
+ **	movq	312\(%rsp\), %r8
+ **	movq	320\(%rsp\), %r9
+ **	movq	328\(%rsp\), %r10
+ **	movq	336\(%rsp\), %r11
+ **	movq	344\(%rsp\), %r12
+ **	movq	352\(%rsp\), %r13
+ **	movq	360\(%rsp\), %r14
+ **	movq	368\(%rsp\), %r15
+ **	movq	376\(%rsp\), %r16
+ **	movq	384\(%rsp\), %r17
+ **	movq	392\(%rsp\), %r18
+ **	movq	400\(%rsp\), %r19
+ **	movq	408\(%rsp\), %r20
+ **	movq	416\(%rsp\), %r21
+ **	movq	424\(%rsp\), %r22
+ **	movq	432\(%rsp\), %r23
+ **	movq	440\(%rsp\), %r24
+ **	movq	448\(%rsp\), %r25
+ **	movq	456\(%rsp\), %r26
+ **	movq	464\(%rsp\), %r27
+ **	movq	472\(%rsp\), %r28
+ **	movq	480\(%rsp\), %r29
+ **	movq	488\(%rsp\), %r30
+ **	movq	496\(%rsp\), %r31
+ **	addl	\$504, %esp
+ **...
+ **	ret
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include "no-callee-saved-19a.c"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-3.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/no-callee-saved-3.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/no-callee-saved-3.c	Sun Jun 29 22:33:48 2025
***************
*** 3,8 ****
  
  __attribute__ ((no_callee_saved_registers, no_caller_saved_registers))
  void
! foo (void) /* { dg-error "attributes are not compatible" } */
! {
  }
--- 3,8 ----
  
  __attribute__ ((no_callee_saved_registers, no_caller_saved_registers))
  void
! foo (void)
! { /* { dg-error "attributes are not compatible" } */
  }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-10b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-10b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-10b.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-10b.c	Sun Jun 29 22:33:48 2025
***************
*** 4,7 ****
  #include "pr100865-10a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]%ymm\[0-9\]+, " 8 } } */
--- 4,7 ----
  #include "pr100865-10a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 8 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-3.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-3.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-3.c	Sun Jun 29 22:33:48 2025
*************** foo (void)
*** 11,16 ****
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %xmm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %xmm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
--- 11,16 ----
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %xmm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %xmm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-4b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-4b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-4b.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-4b.c	Sun Jun 29 22:33:48 2025
***************
*** 5,11 ****
  #include "pr100865-4a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]%ymm\[0-9\]+, " 2 } } */
  /* { dg-final { scan-assembler-times "vzeroupper" 1 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
--- 5,11 ----
  #include "pr100865-4a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 2 } } */
  /* { dg-final { scan-assembler-times "vzeroupper" 1 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-5b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-5b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr100865-5b.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr100865-5b.c	Sun Jun 29 22:33:48 2025
***************
*** 5,10 ****
  #include "pr100865-5a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu16\[\\t \]%ymm\[0-9\]+, " 4 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
--- 5,10 ----
  #include "pr100865-5a.c"
  
  /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 4 } } */
  /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
  /* { dg-final { scan-assembler-not "vmovdqa" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr111657-1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr111657-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr111657-1.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr111657-1.c	Sun Jun 29 22:33:48 2025
***************
*** 1,5 ****
--- 1,26 ----
  /* { dg-do assemble } */
  /* { dg-options "-O2 -mno-sse -mtune=generic -save-temps" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target lp64 } {^\t?\.} } } */
+ 
+ /*
+ **bar:
+ **...
+ **.L[0-9]+:
+ **	movl	%edx, %eax
+ **	addl	\$32, %edx
+ **	movq	%gs:m\(%rax\), %r9
+ **	movq	%gs:m\+8\(%rax\), %r8
+ **	movq	%gs:m\+16\(%rax\), %rsi
+ **	movq	%gs:m\+24\(%rax\), %rcx
+ **	movq	%r9, \(%rdi,%rax\)
+ **	movq	%r8, 8\(%rdi,%rax\)
+ **	movq	%rsi, 16\(%rdi,%rax\)
+ **	movq	%rcx, 24\(%rdi,%rax\)
+ **	cmpl	\$224, %edx
+ **	jb	.L[0-9]+
+ **...
+ */
  
  typedef unsigned long uword __attribute__ ((mode (word)));
  
*************** struct a { uword arr[30]; };
*** 8,12 ****
  __seg_gs struct a m;
  void bar (struct a *dst) { *dst = m; }
  
! /* { dg-final { scan-assembler "gs\[ \t\]+rep\[; \t\]+movs(l|q)" { target { ! x32 } } } } */
! /* { dg-final { scan-assembler-not "gs\[ \t\]+rep\[; \t\]+movs(l|q)" { target x32 } } } */
--- 29,32 ----
  __seg_gs struct a m;
  void bar (struct a *dst) { *dst = m; }
  
! /* { dg-final { scan-assembler-not "rep movs" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr120728.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr120728.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr120728.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr120728.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,27 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vmovdqu\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+, " 3 } } */
+ /* { dg-final { scan-assembler-not "vmovdqu8" } } */
+ /* { dg-final { scan-assembler-not "vmovdqu16" } } */
+ 
+ typedef char __v32qi __attribute__ ((__vector_size__ (32)));
+ typedef char __v32qi_u __attribute__ ((__vector_size__ (32),
+ 				       __aligned__ (1)));
+ typedef short __v16hi __attribute__ ((__vector_size__ (32)));
+ typedef short __v16hi_u __attribute__ ((__vector_size__ (32),
+ 					   __aligned__ (1)));
+ typedef _Float16 __v16hf __attribute__ ((__vector_size__ (32)));
+ typedef _Float16 __v16hf_u __attribute__ ((__vector_size__ (32),
+ 					   __aligned__ (1)));
+ 
+ extern __v32qi_u v1;
+ extern __v16hi_u v2;
+ extern __v16hf_u v3;
+ 
+ void
+ foo (__v32qi x1, __v16hi x2, __v16hf x3)
+ {
+   v1 = x1;
+   v2 = x2;
+   v3 = x3;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr120741.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr120741.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr120741.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr120741.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mstack-arg-probe" } */
+ 
+ short __mingw_swformat_format;
+ __builtin_va_list __mingw_swformat_arg;
+ int __mingw_swformat_fc;
+ typedef struct {
+   void *fp;
+   int bch[1024];
+ } _IFP;
+ void __mingw_swformat(_IFP *s) {
+   if (s->fp)
+     while (__mingw_swformat_format)
+       if (__mingw_swformat_fc == 'A')
+ 	*__builtin_va_arg(__mingw_swformat_arg, double *) = 0;
+ }
+ void
+ __mingw_vswscanf (void)
+ {
+   _IFP ifp;
+   __mingw_swformat(&ifp);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr64110.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr64110.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr64110.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr64110.c	Sun Jun 29 22:33:48 2025
***************
*** 1,6 ****
  /* { dg-do compile } */
  /* { dg-options "-O3 -march=core-avx2" } */
! /* { dg-final { scan-assembler "vmovd\[\\t \]" } } */
  
  int foo (void);
  int a;
--- 1,6 ----
  /* { dg-do compile } */
  /* { dg-options "-O3 -march=core-avx2" } */
! /* { dg-final { scan-assembler "vmovd\[\\t \]" { target { ! ilp32 } } } } */
  
  int foo (void);
  int a;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-15.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-15.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-15.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-15.c	Sun Jun 29 22:33:48 2025
*************** foo (int c)
*** 10,14 ****
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastb\[\\t \]+%.*, %xmm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "movb\[\\t \]+%.*, 16\\(%\[\^,\]+\\)" 1 } } */
--- 10,14 ----
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastb\[\\t \]+%.*, %xmm\[0-9\]+" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "movb\[\\t \]+%.*, 16\\(%\[\^,\]+\\)" 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-16.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-16.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-16.c	Sun Jun 29 22:33:48 2025
*************** foo (void)
*** 10,14 ****
  }
  
  /* { dg-final { scan-assembler-times "(?:vpcmpeqd|vpternlogd)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "movb\[\\t \]+\\\$-1, 16\\(%\[\^,\]+\\)" 1 } } */
--- 10,14 ----
  }
  
  /* { dg-final { scan-assembler-times "(?:vpcmpeqd|vpternlogd)" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "movb\[\\t \]+\\\$-1, 16\\(%\[\^,\]+\\)" 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-17.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-17.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr90773-17.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr90773-17.c	Sun Jun 29 22:33:48 2025
*************** foo (void)
*** 11,15 ****
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovd\[\\t \]+%xmm\[0-9\]+, 16\\(%\[\^,\]+\\)" 1 { xfail *-*-* } } } */
--- 11,15 ----
  }
  
  /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
! /* { dg-final { scan-assembler-times "vmovdqu\[\\t \]+%xmm\[0-9\]+, \\(%\[\^,\]+\\)" 1 } } */
  /* { dg-final { scan-assembler-times "vmovd\[\\t \]+%xmm\[0-9\]+, 16\\(%\[\^,\]+\\)" 1 { xfail *-*-* } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-10.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-10.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-10.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=sapphirerapids -Ofast" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastw" 1 } } */
+ 
+ extern short write_picture_p_Vid_0;
+ extern unsigned short *write_picture_p_2_0_0;
+ extern int write_picture_p_0, write_picture_p_1, write_picture_i;
+ void write_picture() {
+   unsigned short cr_val = 1 << write_picture_p_Vid_0;
+   for (; write_picture_p_1;)
+     for (; write_picture_i < write_picture_p_0; write_picture_i++)
+       write_picture_p_2_0_0[write_picture_i] = cr_val;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-11.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-11.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-11.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-do run { target { avx512f_runtime } } } */
+ /* { dg-options "-mavx512f -mtune=icelake-server -O3" } */
+ 
+ struct s {
+   char s[sizeof(long double)];
+ };
+ 
+ union u {
+   long double d;
+   struct s s;
+ };
+ 
+ int main()
+ {
+   union u x = {0};
+ #if __SIZEOF_LONG_DOUBLE__ == 16
+   x.s = (struct s){"xxxxxxxxxxxxxxxx"};
+ #elif __SIZEOF_LONG_DOUBLE__ == 12
+   x.s = (struct s){"xxxxxxxxxxxx"};
+ #elif __SIZEOF_LONG_DOUBLE__ == 8
+   x.s = (struct s){"xxxxxxxx"};
+ #elif __SIZEOF_LONG_DOUBLE__ == 4
+   x.s = (struct s){"xxxx"};
+ #endif
+ 
+   union u y = x;
+ 
+   for (unsigned char *p = (unsigned char *)&y + sizeof y;
+        p-- > (unsigned char *)&y;)
+     if (*p != (unsigned char)'x')
+       __builtin_abort ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-12.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-12.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-12.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-O3 -mno-mmx -march=icelake-server" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastb" 1 } } */
+ 
+ signed char a;
+ signed char f (int i, int j)
+ {
+   signed char c;
+   while (i != 0)
+   {
+     a ^= j;
+     ++c;
+     ++i;
+   }
+   return c;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-13.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-13.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-13.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,32 ----
+ /* { dg-do run { target { avx512f_runtime } } } */
+ /* { dg-options "-mavx512f -mtune=icelake-server -O2 -save-temps" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 2 } } */
+ 
+ #include <assert.h>
+ 
+ #define CONTAINER_KIND union
+ 
+ typedef CONTAINER_KIND container { int value; } container;
+ 
+ void move(container* end, container* start) {
+     container* p;
+     for (p = end; p > start; p--) {
+ 	(p)->value = (p-1)->value;
+     }
+ }
+ 
+ #define N 100
+ 
+ int main(int argc, char* argv[]) {
+     container vals[N];
+     int i;
+     for (i=0; i<N; i++) {
+         vals[i].value = argc + i;
+     }
+     move(&vals[N-1], &vals[0]);
+     assert(vals[0].value == argc + 0);
+     for (i=1; i<N; i++) {
+         assert(vals[i].value == argc + i - 1);
+     }
+     return 0;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-14.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-14.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-14.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
+ 
+ typedef int v16si __attribute__((vector_size(64)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v4si __attribute__((vector_size(16)));
+ 
+ extern v16si sinksz;
+ extern v8si sinksy;
+ extern v4si sinksx;
+ extern v4si sinksx1;
+ 
+ extern void bar (void);
+ 
+ void
+ foo (char c, int i)
+ {
+   sinksz = __extension__(v16si){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   if (i == 1)
+     {
+       sinksy = __extension__(v8si){c,c,c,c,c,c,c,c};
+       bar ();
+     }
+   else if (i == 2)
+     {
+       sinksx = __extension__(v4si){c,c,c,c};
+       bar ();
+     }
+   sinksx1 = __extension__(v4si){c,c,c,c};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-15.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-15.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-15.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-15.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 3 } } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v16si __attribute__((vector_size(64)));
+ 
+ extern v4si *s1;
+ extern v8si *s2;
+ extern v16si *s3;
+ 
+ int
+ foo (int i, int j)
+ {
+   if (j == 1)
+    s1[i] = __extension__(v4si){34, 34, 34, 34};
+   else if (i == 1)
+     s2[j] = __extension__(v8si){34, 34, 34, 34, 34, 34, 34, 34};
+   if ((i + j) == 1234)
+     i = foo (j, i);
+   s3[i + j] = __extension__(v16si){34, 34, 34, 34, 34, 34, 34, 34,
+ 				   34, 34, 34, 34, 34, 34, 34, 34};
+   return i - j;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-16.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-16.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,26 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v16si __attribute__((vector_size(64)));
+ 
+ extern v4si *s1;
+ extern v8si *s2;
+ extern v16si *s3;
+ 
+ int
+ foo (int i, int j)
+ {
+   if (j == 1)
+     {
+       s1[i] = __extension__(v4si){34, 34, 34, 34};
+       s2[j] = __extension__(v8si){34, 34, 34, 34, 34, 34, 34, 34};
+       s3[i + j] = __extension__(v16si){34, 34, 34, 34, 34, 34, 34, 34,
+ 				       34, 34, 34, 34, 34, 34, 34, 34};
+     }
+   if ((i + j) == 1234)
+     i = foo (j, i);
+   return i - j;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-17.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-17.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-17.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-17.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,40 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v3" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target { ! ia32 } } {^\t?\.}  } } */
+ 
+ /*
+ **foo:
+ **.LFB0:
+ **	.cfi_startproc
+ **	vpbroadcastw	cost\(%rip\), %xmm0
+ **	vmovq	%xmm0, cost1\(%rip\)
+ **	vmovdqu	%xmm0, cost2\(%rip\)
+ **	ret
+ **...
+ */
+ 
+ extern struct {
+   short cost[4];
+ } cost1;
+ extern struct {
+   short cost[8];
+ } cost2;
+ extern int cost;
+ 
+ void
+ foo (void)
+ {
+   cost1.cost[0] = cost;
+   cost1.cost[1] = cost;
+   cost1.cost[2] = cost;
+   cost1.cost[3] = cost;
+   cost2.cost[0] = cost;
+   cost2.cost[1] = cost;
+   cost2.cost[2] = cost;
+   cost2.cost[3] = cost;
+   cost2.cost[4] = cost;
+   cost2.cost[5] = cost;
+   cost2.cost[6] = cost;
+   cost2.cost[7] = cost;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-18.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-18.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-18.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-18.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vbroadcastsd" 1 } } */
+ 
+ typedef double v2df __attribute__((vector_size(16)));
+ typedef double v4df __attribute__((vector_size(32)));
+ typedef double v8df __attribute__((vector_size(64)));
+ 
+ extern v2df d1;
+ extern v4df d2;
+ extern v8df d3;
+ 
+ void
+ foo ()
+ {
+   d1 = __extension__(v2df){2.34, 2.34};
+   d2 = __extension__(v4df){2.34, 2.34, 2.34, 2.34};
+   d3 = __extension__(v8df){2.34, 2.34, 2.34, 2.34, 2.34, 2.34, 2.34, 2.34};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-19.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-19.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-19.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-19.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastq" 1 } } */
+ 
+ typedef long long v2di __attribute__((vector_size(16)));
+ typedef long long v4di __attribute__((vector_size(32)));
+ typedef long long v8di __attribute__((vector_size(64)));
+ 
+ extern v2di d1;
+ extern v4di d2;
+ extern v8di d3;
+ 
+ void
+ foo (long long a1, long long a2, long long a3, long long a4,
+      long long a5, long long a6, long long a7)
+ {
+   d1 = __extension__(v2di){a7, a7};
+   d2 = __extension__(v4di){a7, a7, a7, a7};
+   d3 = __extension__(v8di){a7, a7, a7, a7, a7, a7, a7, a7};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-20.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-20.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-20.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-20.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vbroadcastsd" 1 } } */
+ 
+ typedef double v2di __attribute__((vector_size(16)));
+ typedef double v4di __attribute__((vector_size(32)));
+ typedef double v8di __attribute__((vector_size(64)));
+ 
+ extern v2di d1;
+ extern v4di d2;
+ extern v8di d3;
+ 
+ void
+ foo (double a1, double a2, double a3, double a4,
+      double a5, double a6, double a7)
+ {
+   d1 = __extension__(v2di){a7, a7};
+   d2 = __extension__(v4di){a7, a7, a7, a7};
+   d3 = __extension__(v8di){a7, a7, a7, a7, a7, a7, a7, a7};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-4.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-4.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-4.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastb" 1 } } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
+ /* { dg-final { scan-assembler-times "vpbroadcastw" 1 } } */
+ 
+ typedef int v16si __attribute__((vector_size(64)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v4si __attribute__((vector_size(16)));
+ 
+ typedef short v32hi __attribute__((vector_size(64)));
+ typedef short v16hi __attribute__((vector_size(32)));
+ typedef short v8hi __attribute__((vector_size(16)));
+ 
+ typedef char v64qi __attribute__((vector_size(64)));
+ typedef char v32qi __attribute__((vector_size(32)));
+ typedef char v16qi __attribute__((vector_size(16)));
+ 
+ extern v16si sinksz;
+ extern v8si sinksy;
+ extern v4si sinksx;
+ extern v32hi sinkhz;
+ extern v16hi sinkhy;
+ extern v8hi sinkhx;
+ extern v64qi sinkbz;
+ extern v32qi sinkby;
+ extern v16qi sinkbx;
+ 
+ void foo(char c) {
+   sinksz = __extension__(v16si){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   sinksy = __extension__(v8si){c,c,c,c,c,c,c,c};
+   sinksx = __extension__(v4si){c,c,c,c};
+ }
+ 
+ void foo1(char c) {
+   sinkhz = __extension__(v32hi){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,
+     c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   sinkhy = __extension__(v16hi){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   sinkhx = __extension__(v8hi){c,c,c,c,c,c,c,c};
+ }
+ 
+ void foo2(char c) {
+   sinkbz = __extension__(v64qi){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,
+     c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,
+     c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,
+     c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   sinkby = __extension__(v32qi){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,
+     c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+   sinkbx = __extension__(v16qi){c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-5.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-5.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-5.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,109 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=x86-64-v4" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 3 } } */
+ /* { dg-final { scan-assembler-times "vpbroadcastq" 1 } } */
+ /* { dg-final { scan-assembler-times "vbroadcastsd" 1 } } */
+ /* { dg-final { scan-assembler-times "vbroadcastss" 1 } } */
+ 
+ typedef long long v2di __attribute__((vector_size(16)));
+ typedef long long v4di __attribute__((vector_size(32)));
+ typedef long long v8di __attribute__((vector_size(64)));
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v16si __attribute__((vector_size(64)));
+ typedef short v8hi __attribute__((vector_size(16)));
+ typedef short v16hi __attribute__((vector_size(32)));
+ typedef short v32hi __attribute__((vector_size(64)));
+ typedef char v16qi __attribute__((vector_size(16)));
+ typedef char v32qi __attribute__((vector_size(32)));
+ typedef char v64qi __attribute__((vector_size(64)));
+ typedef float v4sf __attribute__((vector_size(16)));
+ typedef float v8sf __attribute__((vector_size(32)));
+ typedef float v16sf __attribute__((vector_size(64)));
+ typedef double v2df __attribute__((vector_size(16)));
+ typedef double v4df __attribute__((vector_size(32)));
+ typedef double v8df __attribute__((vector_size(64)));
+ 
+ extern v16qi b1;
+ extern v8hi h1;
+ extern v4si s1;
+ extern v2di l1;
+ extern v4sf f1;
+ extern v2df d1;
+ extern v32qi b2;
+ extern v16hi h2;
+ extern v8si s2;
+ extern v4di l2;
+ extern v8sf f2;
+ extern v4df d2;
+ extern v64qi b3;
+ extern v32hi h3;
+ extern v16si s3;
+ extern v8di l3;
+ extern v16sf f3;
+ extern v8df d3;
+ 
+ void
+ foo1 ()
+ {
+   b1 = __extension__(v16qi){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+   b2 = __extension__(v32qi){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+   b3 = __extension__(v64qi){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+ }
+ 
+ void
+ foo2 ()
+ {
+   h1 = __extension__(v8hi){34, 34, 34, 34, 34, 34, 34, 34};
+   h2 = __extension__(v16hi){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+   h3 = __extension__(v32hi){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+ }
+ 
+ void
+ foo3 ()
+ {
+   s1 = __extension__(v4si){34, 34, 34, 34};
+   s2 = __extension__(v8si){34, 34, 34, 34, 34, 34, 34, 34};
+   s3 = __extension__(v16si){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+ }
+ 
+ void
+ foo4 ()
+ {
+   l1 = __extension__(v2di){34, 34};
+   l2 = __extension__(v4di){34, 34, 34, 34};
+   l3 = __extension__(v8di){34, 34, 34, 34, 34, 34, 34, 34};
+ }
+ 
+ void
+ foo5 ()
+ {
+   f1 = __extension__(v4sf){34, 34, 34, 34};
+   f2 = __extension__(v8sf){34, 34, 34, 34, 34, 34, 34, 34};
+   f3 = __extension__(v16sf){34, 34, 34, 34, 34, 34, 34, 34,
+ 			    34, 34, 34, 34, 34, 34, 34, 34};
+ }
+ 
+ void
+ foo6 ()
+ {
+   d1 = __extension__(v2df){34, 34};
+   d2 = __extension__(v4df){34, 34, 34, 34};
+   d3 = __extension__(v8df){34, 34, 34, 34, 34, 34, 34, 34};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-6.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-6.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-6.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastb" 1 } } */
+ 
+ #include <immintrin.h>
+ 
+ extern __m512i sinkz;
+ extern __m256i sinky;
+ extern char f;
+ 
+ void
+ foo(char c, int x)
+ {
+   c += f;
+   sinkz = _mm512_set1_epi8(c);
+   if (x == 2)
+     f += 3;
+   sinky = _mm256_set1_epi8(c);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-7.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-7.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-7.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,20 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastb" 1 } } */
+ 
+ #include <immintrin.h>
+ 
+ extern __m512i sinkz;
+ extern __m256i sinky;
+ extern char f;
+ extern void bar (void);
+ 
+ void
+ foo(char c, int x)
+ {
+   c += f;
+   sinkz = _mm512_set1_epi8(c);
+   if (x == 2)
+     bar ();
+   sinky = _mm256_set1_epi8(c);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-8.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-8.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
+ /* { dg-final { scan-assembler-times "vpbroadcastq" 1 } } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef long long int v2di __attribute__((vector_size(16)));
+ extern v4si s;
+ extern v2di l;
+ 
+ void
+ foo(void)
+ {
+   l = __extension__(v2di){2,2};
+   s = __extension__(v4si){2,2,2,2};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-9.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-9.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr92080-9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr92080-9.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,81 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=x86-64-v4 -O2" } */
+ /* { dg-final { scan-assembler-times "vpbroadcastd" 1 } } */
+ /* { dg-final { scan-assembler-times "vmovdqa\[\\t \]+" 8 } } */
+ /* { dg-final { scan-assembler-times "vmovdqa64\[\\t \]+" 3 } } */
+ /* { dg-final { scan-assembler-times "vmovdqa32\[\\t \]+" 1 } } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef long long int v2di __attribute__((vector_size(16)));
+ typedef long long v2di __attribute__((vector_size(16)));
+ typedef long long v4di __attribute__((vector_size(32)));
+ typedef long long v8di __attribute__((vector_size(64)));
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v8si __attribute__((vector_size(32)));
+ typedef int v16si __attribute__((vector_size(64)));
+ typedef short v8hi __attribute__((vector_size(16)));
+ typedef short v16hi __attribute__((vector_size(32)));
+ typedef short v32hi __attribute__((vector_size(64)));
+ typedef char v16qi __attribute__((vector_size(16)));
+ typedef char v32qi __attribute__((vector_size(32)));
+ typedef char v64qi __attribute__((vector_size(64)));
+ 
+ extern v16qi b1;
+ extern v8hi h1;
+ extern v4si s1;
+ extern v2di l1;
+ extern v32qi b2;
+ extern v16hi h2;
+ extern v8si s2;
+ extern v4di l2;
+ extern v64qi b3;
+ extern v32hi h3;
+ extern v16si s3;
+ extern v8di l3;
+ 
+ void
+ foo(void)
+ {
+   b1 = __extension__(v16qi){0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22};
+   h1 = __extension__(v8hi){0x2222, 0x2222, 0x2222, 0x2222,
+ 			   0x2222, 0x2222, 0x2222, 0x2222};
+   s1 = __extension__(v4si){0x22222222,0x22222222,0x22222222,0x22222222};
+   l1 = __extension__(v2di){0x2222222222222222ULL,0x2222222222222222ULL};
+   b2 = __extension__(v32qi){0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22};
+   h2 = __extension__(v16hi){0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222};
+   s2 = __extension__(v8si){0x22222222,0x22222222,0x22222222,0x22222222,
+ 			   0x22222222,0x22222222,0x22222222,0x22222222};
+   l2 = __extension__(v4di){0x2222222222222222ULL,0x2222222222222222ULL,
+ 			   0x2222222222222222ULL,0x2222222222222222ULL};
+   b3 = __extension__(v64qi){0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 			    0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22};
+   h3 = __extension__(v32hi){0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222,
+ 			    0x2222, 0x2222, 0x2222, 0x2222};
+   s3 = __extension__(v16si){0x22222222,0x22222222,0x22222222,0x22222222,
+ 			    0x22222222,0x22222222,0x22222222,0x22222222,
+ 			    0x22222222,0x22222222,0x22222222,0x22222222,
+ 			    0x22222222,0x22222222,0x22222222,0x22222222};
+   l3 = __extension__(v8di){0x2222222222222222ULL,0x2222222222222222ULL,
+ 			   0x2222222222222222ULL,0x2222222222222222ULL,
+ 			   0x2222222222222222ULL,0x2222222222222222ULL,
+ 			   0x2222222222222222ULL,0x2222222222222222ULL};
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr95483-5.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr95483-5.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/pr95483-5.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/pr95483-5.c	Sun Jun 29 22:33:48 2025
***************
*** 1,7 ****
  /* { dg-do compile } */
  /* { dg-options "-mavx512bw -mavx512vl -O2" } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu8|vinserti128)\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu8|vextracti128)\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
--- 1,7 ----
  /* { dg-do compile } */
  /* { dg-options "-mavx512bw -mavx512vl -O2" } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu|vinserti128)\[ \\t\]+\[^\{\n\]*\\)\[^\n\]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
! /* { dg-final { scan-assembler-times "(?:vmovdqu|vextracti128)\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\[^\n\]*\\)(?:\n|\[ \\t\]+#)" 1 } } */
  
  #include <immintrin.h>
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-1.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile { target { ! ia32 } } } */
+ /* { dg-options "-O2" } */
+ 
+ extern void boring(void);
+ 
+ extern void continuation(void *, void *, void *, void *)
+   __attribute__((preserve_none));
+ 
+ __attribute__((preserve_none))
+ void entry(void *a, void *b, void *c, void *d)
+ {
+   boring();
+   continuation(a, b, c, d);
+ }
+ 
+ /* { dg-final { scan-assembler-not "movq" } } */
+ /* { dg-final { scan-assembler "jmp\[\\t \]+_?continuation" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-10.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-10.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-10.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-10.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ typedef void (*fn_t) (void *) __attribute__ ((preserve_none));
+ 
+ void
+ foo (void *frame)
+ {
+ }
+ 
+ fn_t func = foo; /* { dg-error "incompatible pointer type" } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-11.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-11.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-11.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-11.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ typedef void (*fn_t) (void *) __attribute__ ((preserve_none));
+ 
+ __attribute__ ((preserve_none))
+ void
+ foo (void *frame)
+ {
+ }
+ 
+ fn_t func = foo;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-12.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-12.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-12.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,49 ----
+ /* { dg-do compile { target *-*-linux* } } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ extern void bar (void) __attribute__ ((preserve_none));
+ 
+ void
+ foo (void)
+ {
+   bar ();
+ }
+ 
+ /* foo must save and restore all caller saved registers since bar won't
+    preserve any.  */
+ /* { dg-final { scan-assembler-not "jmp\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-13.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-13.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-13.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do compile { target *-*-linux* } } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ extern fn_t bar;
+ 
+ void
+ foo (void)
+ {
+   bar ();
+ }
+ 
+ /* foo must save and restore all caller saved registers since bar won't
+    preserve any.  */
+ /* { dg-final { scan-assembler-not "jmp" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-14.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-14.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-14.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,49 ----
+ /* { dg-do compile { target *-*-linux* } } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ 
+ void
+ foo (fn_t bar)
+ {
+   bar ();
+ }
+ 
+ /* foo must save and restore all caller saved registers since bar won't
+    preserve any.  */
+ /* { dg-final { scan-assembler-not "jmp" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-15.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-15.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-15.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-15.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,46 ----
+ /* { dg-do compile { target *-*-linux* } } */
+ /* { dg-options "-O2 -mgeneral-regs-only -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ extern void bar (void) __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_caller_saved_registers))
+ void
+ foo (void)
+ {
+   bar ();
+ }
+ 
+ /* foo must save and restore all caller saved registers since bar won't
+    preserve any.  */
+ /* { dg-final { scan-assembler-not "jmp\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)ax" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r8" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r9" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r10" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r11" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)ax" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r8" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r9" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r10" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r11" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-16.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-16.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ extern void foo (void); /* { dg-note "previous declaration" } */
+ 
+ __attribute__ ((preserve_none))
+ void
+ foo (void) /* { dg-error "conflicting types" } */
+ {
+ }
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-17.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-17.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-17.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-17.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ extern void foo (void) __attribute__ ((preserve_none)); /* { dg-note "previous declaration" } */
+ 
+ void
+ foo (void) /* { dg-error "conflicting types" } */
+ {
+ }
+ 
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-18.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-18.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-18.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-18.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ /* { dg-additional-options "-fno-PIE" { target ia32 } } */
+ 
+ extern void foo (void);
+ 
+ __attribute__ ((preserve_none))
+ void
+ bar (void)
+ {
+   foo ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
+ /* { dg-final { scan-assembler-not "call\[\\t \]+_?foo" } } */
+ /* { dg-final { scan-assembler "jmp\[\\t \]+_?foo" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-19.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-19.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-19.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-19.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ /* { dg-additional-options "-fno-PIE" { target ia32 } } */
+ 
+ extern void bar (void) __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_callee_saved_registers))
+ void
+ foo (void)
+ {
+   bar ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
+ /* { dg-final { scan-assembler "jmp\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler-not "call\[\\t \]+_?bar" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-2.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-2.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ typedef void (*fn_t) (void *) __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_callee_saved_registers))
+ void
+ foo (void *frame)
+ {
+ }
+ 
+ fn_t func = foo; /* { dg-error "incompatible pointer type" "" { target { ! ia32 } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-20.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-20.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-20.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-20.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ /* { dg-additional-options "-fno-PIE" { target ia32 } } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((no_callee_saved_registers));
+ extern fn_t bar;
+ 
+ __attribute__ ((preserve_none))
+ void
+ foo (void)
+ {
+   bar ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
+ /* { dg-final { scan-assembler "jmp" } } */
+ /* { dg-final { scan-assembler-not "call\[\\t \]+" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-21.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-21.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-21.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-21.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_callee_saved_registers))
+ void
+ foo (fn_t bar)
+ {
+   bar ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
+ /* { dg-final { scan-assembler "jmp" } } */
+ /* { dg-final { scan-assembler-not "call\[\\t \]+" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-22.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-22.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-22.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-22.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ /* { dg-additional-options "-fno-PIE" { target ia32 } } */
+ 
+ extern void foo (void) __attribute__ ((no_caller_saved_registers));
+ 
+ __attribute__ ((preserve_none))
+ void
+ bar (void)
+ {
+   foo ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
+ /* { dg-final { scan-assembler-not "call\[\\t \]+_?foo" } } */
+ /* { dg-final { scan-assembler "jmp\[\\t \]+_?foo" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-23.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-23.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-23.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-23.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,51 ----
+ /* { dg-do compile { target *-*-linux* } } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move" } */
+ 
+ #include <stdint.h>
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ 
+ void
+ foo (uintptr_t p)
+ {
+   ((fn_t) p) ();
+ }
+ 
+ /* foo must save and restore all caller saved registers since bar won't
+    preserve any.  */
+ /* { dg-final { scan-assembler-not "jmp" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)ax" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rdi" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r8" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r9" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r10" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%r11" { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r12" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r13" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r14" 1 { target { ! ia32 } } } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r15" 1 { target { ! ia32 } } } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-24.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-24.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-24.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-24.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ __attribute__ ((preserve_none, no_callee_saved_registers))
+ void
+ foo (void)
+ { /* { dg-error "attributes are not compatible" } */
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-25.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-25.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-25.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-25.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,27 ----
+ /* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /*
+ **entry:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	movq	%rdi, %r12
+ **	movq	%rsi, %r13
+ **	movq	%rdx, %r14
+ **	movq	%rcx, %r15
+ **	jmp	continuation
+ **	.cfi_endproc
+ **...
+ */
+ 
+ extern void continuation (void *, void *, void *, void *)
+   __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_callee_saved_registers))
+ void
+ entry (void *a, void *b, void *c, void *d)
+ {
+   continuation (a, b, c, d);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-26.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-26.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-26.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-26.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,27 ----
+ /* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /*
+ **entry:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	movq	%r15, %rcx
+ **	movq	%r14, %rdx
+ **	movq	%r13, %rsi
+ **	movq	%r12, %rdi
+ **	jmp	continuation
+ **	.cfi_endproc
+ **...
+ */
+ 
+ extern void continuation (void *, void *, void *, void *)
+   __attribute__ ((no_callee_saved_registers));
+ 
+ __attribute__ ((preserve_none))
+ void
+ entry (void *a, void *b, void *c, void *d)
+ {
+   continuation(a, b, c, d);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-27.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-27.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-27.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-27.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,33 ----
+ /* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /*
+ **entry:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **...
+ **	movl	%edi, %r12d
+ **	movl	%esi, %r13d
+ **	movl	%edx, %r14d
+ **	pushq	\$-559038737
+ **...
+ **	movl	%ecx, %r15d
+ **	movl	%r9d, %esi
+ **	movl	%r8d, %edi
+ **	xorl	%eax, %eax
+ **...
+ **	call	continuation
+ **...
+ */
+ 
+ extern void continuation (int, int, int, int, int, int, ...)
+   __attribute__ ((preserve_none));
+ 
+ __attribute__ ((no_callee_saved_registers))
+ void
+ entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+ {
+   continuation (arg1, arg2, arg3, arg4, arg5, arg6, 0xdeadbeef);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-28.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-28.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-28.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-28.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,48 ----
+ /* { dg-do run { target { *-*-linux* && { ! ia32 } } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ 
+ #include <stdlib.h>
+ 
+ __attribute__ ((preserve_none, weak))
+ void
+ continuation (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+ {
+   if (arg1 != 17)
+     abort ();
+   if (arg2 != 8)
+     abort ();
+   if (arg3 != 20)
+     abort ();
+   if (arg4 != -3)
+     abort ();
+   if (arg5 != -4)
+     abort ();
+   if (arg6 != 26)
+     abort ();
+ }
+ 
+ __attribute__ ((no_callee_saved_registers, weak))
+ void
+ entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+ {
+   if (arg1 != 17)
+     abort ();
+   if (arg2 != 8)
+     abort ();
+   if (arg3 != 20)
+     abort ();
+   if (arg4 != -3)
+     abort ();
+   if (arg5 != -4)
+     abort ();
+   if (arg6 != 26)
+     abort ();
+   continuation (arg1, arg2, arg3, arg4, arg5, arg6);
+ }
+ 
+ int
+ main (void)
+ {
+   entry (17, 8, 20, -3, -4, 26);
+   return 0;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-29.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-29.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-29.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-29.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,57 ----
+ /* { dg-do run { target { *-*-linux* && { ! ia32 } } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ 
+ #include <stdarg.h>
+ #include <stdlib.h>
+ 
+ __attribute__ ((preserve_none, weak))
+ void
+ continuation (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6,
+ 	      ...)
+ {
+   int a;
+   va_list va_arglist;
+   va_start (va_arglist, arg6);
+   if (arg1 != 17)
+     abort ();
+   if (arg2 != 8)
+     abort ();
+   if (arg3 != 20)
+     abort ();
+   if (arg4 != -3)
+     abort ();
+   if (arg5 != -4)
+     abort ();
+   if (arg6 != 26)
+     abort ();
+   a = va_arg (va_arglist, int);
+   if (a != 0xdeadbeef)
+     abort ();
+   va_end (va_arglist);
+ }
+ 
+ __attribute__ ((no_callee_saved_registers, weak))
+ void
+ entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+ {
+   if (arg1 != 17)
+     abort ();
+   if (arg2 != 8)
+     abort ();
+   if (arg3 != 20)
+     abort ();
+   if (arg4 != -3)
+     abort ();
+   if (arg5 != -4)
+     abort ();
+   if (arg6 != 26)
+     abort ();
+   continuation (arg1, arg2, arg3, arg4, arg5, arg6, 0xdeadbeef);
+ }
+ 
+ int
+ main (void)
+ {
+   entry (17, 8, 20, -3, -4, 26);
+   return 0;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-3.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-3.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-3.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mnoreturn-no-callee-saved-registers" } */
+ 
+ extern void bar (void) __attribute__ ((preserve_none));
+ extern void fn (void) __attribute__ ((noreturn));
+ 
+ __attribute__ ((noreturn))
+ void
+ foo (void)
+ {
+   bar ();
+   fn ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "pop\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "jmp\[\\t \]+_?bar" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+_?bar" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-30a.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-30a.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-30a.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-30a.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do compile { target { *-*-linux* && lp64 } } } */
+ /* { dg-options "-O2 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /*
+ **entry:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subq	\$8, %rsp
+ **	.cfi_def_cfa_offset 16
+ **	call	boring
+ **	addq	\$8, %rsp
+ **	.cfi_def_cfa_offset 8
+ **	jmp	\*continuation\(%rip\)
+ **	.cfi_endproc
+ **...
+ */
+ 
+ extern void boring (void);
+ 
+ extern void (*continuation) (void *, void *, void *, void *)
+   __attribute__ ((preserve_none));
+ 
+ __attribute__ ((preserve_none))
+ void
+ entry (void *a, void *b, void *c, void *d)
+ {
+   boring ();
+   continuation (a, b, c, d);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-30b.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-30b.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-30b.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-30b.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile { target { *-*-linux* && maybe_x32 } } } */
+ /* { dg-options "-O2 -mx32 -fno-pic -mtune=generic -msse2 -mno-apxf -mtune-ctrl=prologue_using_move,epilogue_using_move" } */
+ /* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+ /* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+ 
+ /*
+ **entry:
+ **.LFB[0-9]+:
+ **	.cfi_startproc
+ **	subl	\$8, %esp
+ **	.cfi_def_cfa_offset 16
+ **	call	boring
+ **	movl	continuation\(%rip\), %eax
+ **	addl	\$8, %esp
+ **	.cfi_def_cfa_offset 8
+ **	jmp	\*%rax
+ **	.cfi_endproc
+ **...
+ */
+ 
+ #include "preserve-none-30a.c"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-4.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-4.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-4.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-4.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,19 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mnoreturn-no-callee-saved-registers" } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ extern fn_t bar;
+ extern void fn (void) __attribute__ ((noreturn));
+ 
+ __attribute__ ((noreturn))
+ void
+ foo (void)
+ {
+   bar ();
+   fn ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "pop\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "jmp" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-5.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-5.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-5.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-5.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mnoreturn-no-callee-saved-registers" } */
+ 
+ typedef void (*fn_t) (void) __attribute__ ((preserve_none));
+ extern void fn (void) __attribute__ ((noreturn));
+ 
+ __attribute__ ((noreturn))
+ void
+ foo (fn_t bar)
+ {
+   bar ();
+   fn ();
+ }
+ 
+ /* { dg-final { scan-assembler-not "push\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "pop\[^\n\r\]*(?:\[abcd\]x|\[sd\]i|sp|r\[0-9\]|\[xyz\]mm)" } } */
+ /* { dg-final { scan-assembler-not "jmp" } } */
+ /* { dg-final { scan-assembler "call\[\\t \]+" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-6.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-6.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-6.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer" } */
+ 
+ extern int bar (int)
+ #ifndef __x86_64__
+ __attribute__ ((regparm(3)))
+ #endif
+ ;
+ 
+ __attribute__ ((preserve_none))
+ void
+ foo (void *frame)
+ {
+   int a,b,c,d,e,f,i;
+   a = bar (5);
+   b = bar (a);
+   c = bar (b);
+   d = bar (c);
+   e = bar (d);
+   f = bar (e);
+   for (i = 1; i < 10; i++)
+   {
+     a += bar (a + i) + bar (b + i) +
+ 	 bar (c + i) + bar (d + i) +
+ 	 bar (e + i) + bar (f + i);
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-7.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-7.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-7.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-7.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,30 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer" } */
+ 
+ extern int bar (int) __attribute__ ((no_caller_saved_registers))
+ #ifndef __x86_64__
+ __attribute__ ((regparm(3)))
+ #endif
+ ;
+ 
+ __attribute__ ((preserve_none))
+ void
+ foo (void *frame)
+ {
+   int a,b,c,d,e,f,i;
+   a = bar (5);
+   b = bar (a);
+   c = bar (b);
+   d = bar (c);
+   e = bar (d);
+   f = bar (e);
+   for (i = 1; i < 10; i++)
+   {
+     a += bar (a + i) + bar (b + i) +
+ 	 bar (c + i) + bar (d + i) +
+ 	 bar (e + i) + bar (f + i);
+   }
+ }
+ 
+ /* { dg-final { scan-assembler-not "push" } } */
+ /* { dg-final { scan-assembler-not "pop" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-8.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-8.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ __attribute__ ((preserve_none, no_caller_saved_registers))
+ void
+ foo (void)
+ { /* { dg-error "attributes are not compatible" } */
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-9.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-9.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/preserve-none-9.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/preserve-none-9.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mgeneral-regs-only" } */
+ 
+ __attribute__ ((preserve_none, interrupt))
+ void
+ foo (void *frame) /* { dg-error "attributes are not compatible" } */
+ {
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink-wrap-separate-mingw.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink-wrap-separate-mingw.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink-wrap-separate-mingw.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink-wrap-separate-mingw.c	Sun Jun 29 22:33:48 2025
***************
*** 0 ****
--- 1,22 ----
+ /* { dg-do compile { target *-*-mingw* *-*-cygwin* } } */
+ /* { dg-options "-std=gnu99 -O2" } */
+ 
+ short __mingw_swformat_format;
+ __builtin_va_list __mingw_swformat_arg;
+ int __mingw_swformat_fc;
+ typedef struct {
+   void *fp;
+   int bch[1024];
+ } _IFP;
+ void __mingw_swformat(_IFP *s) {
+   if (s->fp)
+     while (__mingw_swformat_format)
+       if (__mingw_swformat_fc == 'A')
+         *__builtin_va_arg(__mingw_swformat_arg, double *) = 0;
+ }
+ void
+ __mingw_vswscanf (void)
+ {
+   _IFP ifp;
+   __mingw_swformat(&ifp);
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink_wrap_1.c	Sun Jun 29 22:33:48 2025
***************
*** 1,5 ****
  /* { dg-do compile { target { ! ia32 } } } */
! /* { dg-options "-O2 -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */
  
  enum machine_mode
  {
--- 1,5 ----
  /* { dg-do compile { target { ! ia32 } } } */
! /* { dg-options "-O2 -mmemset-strategy=rep_8byte:-1:align -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */
  
  enum machine_mode
  {
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c	Sun Jun 22 22:32:56 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/shrink_wrap_separate_check_lea.c	Sun Jun 29 22:33:48 2025
*************** int foo (int num)
*** 26,29 ****
    return 1;
  }
  /* { dg-final { scan-rtl-dump "The components we wrap separately are \\\[sep 40\\\]" "pro_and_epilogue" } } */
! /* { dg-final { scan-assembler "leaq.*(%rsp)" } } */
--- 26,29 ----
    return 1;
  }
  /* { dg-final { scan-rtl-dump "The components we wrap separately are \\\[sep 40\\\]" "pro_and_epilogue" } } */
! /* { dg-final { scan-assembler "lea(l|q).*(%rsp)" } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/i386/sw-1.c gcc-16-20250629/gcc/testsuite/gcc.target/i386/sw-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/i386/sw-1.c	Sun Jun 22 22:32:57 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/i386/sw-1.c	Sun Jun 29 22:33:48 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=generic -fshrink-wrap -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */
  /* { dg-additional-options "-mno-avx" { target ia32 } } */
  /* { dg-skip-if "No shrink-wrapping preformed" { x86_64-*-mingw* } } */
  
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -mtune=generic -mstringop-strategy=rep_byte -fshrink-wrap -fdump-rtl-pro_and_epilogue -fno-stack-protector" } */
  /* { dg-additional-options "-mno-avx" { target ia32 } } */
  /* { dg-skip-if "No shrink-wrapping preformed" { x86_64-*-mingw* } } */
  
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/pru/mov64-subreg-1.c gcc-16-20250629/gcc/testsuite/gcc.target/pru/mov64-subreg-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/pru/mov64-subreg-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/pru/mov64-subreg-1.c	Sun Jun 29 22:33:50 2025
***************
*** 0 ****
--- 1,9 ----
+ /* { dg-do assemble } */
+ /* { dg-options "-Os" } */
+ /* { dg-final { object-size text == 8 } } */
+ 
+ 
+ unsigned test(char a, unsigned long long b)
+ {
+         return b;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/pru/mov64-subreg-2.c gcc-16-20250629/gcc/testsuite/gcc.target/pru/mov64-subreg-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/pru/mov64-subreg-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/pru/mov64-subreg-2.c	Sun Jun 29 22:33:50 2025
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do assemble } */
+ /* { dg-options "-Os" } */
+ /* { dg-final { object-size text == 12 } } */
+ 
+ unsigned long long test(void)
+ {
+ 	return 0xffffffff00000000UL;
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/arch-rva23s.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/arch-rva23s.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/arch-rva23s.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/arch-rva23s.c	Sun Jun 29 22:33:50 2025
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rva23s64 -mabi=lp64d" } */
+ 
+ void foo(){}
+ 
+ /* { dg-final { scan-assembler-times ".attribute arch, \"rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0"
+ "_b1p0_v1p0_zic64b1p0_zicbom1p0_zicbop1p0_zicboz1p0_ziccamoa1p0_ziccif1p0_zicclsm1p0"
+ "_ziccrse1p0_zicntr2p0_zicond1p0_zicsr2p0_zihintntl1p0_zihintpause2p0_zihpm2p0_zimop1p0"
+ "_za64rs1p0_zaamo1p0_zalrsc1p0_zawrs1p0_zfa1p0_zfhmin1p0_zca1p0_zcb1p0_zcd1p0_zcmop1p0"
+ "_zba1p0_zbb1p0_zbs1p0_zkt1p0_zvbb1p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0"
+ "_zvfhmin1p0_zvkb1p0_zvkt1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0_sha1p0_shcounterenw1p0"
+ "_shgatpa1p0_shtvala1p0_shvsatpa1p0_shvstvala1p0_shvstvecd1p0_ssccptr1p0_sscofpmf1p0"
+ "_sscounterenw1p0_ssnpm1p0_ssstateen1p0_sstc1p0_sstvala1p0_sstvecd1p0_ssu64xl1p0_supm1p0"
+ "_svade1p0_svbare1p0_svinval1p0_svnapot1p0_svpbmt1p0\" 1} } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/arch-rvb23s.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/arch-rvb23s.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/arch-rvb23s.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/arch-rvb23s.c	Sun Jun 29 22:33:50 2025
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-march=rvb23s64 -mabi=lp64d" } */
+ 
+ void foo(){}
+ 
+ /* { dg-final { scan-assembler-times ".attribute arch, \"rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0"
+ "_b1p0_zic64b1p0_zicbom1p0_zicbop1p0_zicboz1p0_ziccamoa1p0_ziccif1p0_zicclsm1p0_ziccrse1p0"
+ "_zicntr2p0_zicond1p0_zicsr2p0_zihintntl1p0_zihintpause2p0_zihpm2p0_zimop1p0_zmmul1p0"
+ "_za64rs1p0_zaamo1p0_zalrsc1p0_zawrs1p0_zfa1p0_zfhmin1p0_zca1p0_zcb1p0_zcd1p0_zcmop1p0"
+ "_zba1p0_zbb1p0_zbs1p0_zkt1p0_zvbb1p0_zve32f1p0_zve32x1p0_zvfhmin1p0_zvkb1p0_zvkt1p0"
+ "_zvl32b1p0_ssccptr1p0_sscofpmf1p0_sscounterenw1p0_sstc1p0_sstvala1p0_sstvecd1p0"
+ "_ssu64xl1p0_supm1p0_svade1p0_svbare1p0_svinval1p0_svnapot1p0_svpbmt1p0\" 1} } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/pr119971.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/pr119971.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/pr119971.c	Sun Jun 22 22:33:03 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/pr119971.c	Sun Jun 29 22:33:50 2025
***************
*** 1,6 ****
  /* { dg-do compile { target rv64 } } */
  /* { dg-options "-march=rv64gcb -mabi=lp64" } */
! /* { dg-skip-if "" { *-*-* } { "-O0" "-g" "-Oz" "-Os" } } */
  
  __attribute__ ((noipa)) unsigned
  foo (unsigned b, unsigned e, unsigned i)
--- 1,6 ----
  /* { dg-do compile { target rv64 } } */
  /* { dg-options "-march=rv64gcb -mabi=lp64" } */
! /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Oz" "-Os" } } */
  
  __attribute__ ((noipa)) unsigned
  foo (unsigned b, unsigned e, unsigned i)
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0 (_Float16, +, +, add
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_0 (_Float16, -, +, sub)
  DEF_VF_MULOP_CASE_0 (_Float16, +, -, nadd)
  DEF_VF_MULOP_CASE_0 (_Float16, -, -, nsub)
+ DEF_VF_MULOP_ACC_CASE_0 (_Float16, +, +, acc)
+ DEF_VF_MULOP_ACC_CASE_0 (_Float16, -, +, sac)
  
  /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0 (float, +, +, add)
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_0 (float, -, +, sub)
  DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
  DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
+ DEF_VF_MULOP_ACC_CASE_0 (float, +, +, acc)
+ DEF_VF_MULOP_ACC_CASE_0 (float, -, +, sac)
  
  /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-1-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0 (double, +, +, add)
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_0 (double, -, +, sub)
  DEF_VF_MULOP_CASE_0 (double, +, -, nadd)
  DEF_VF_MULOP_CASE_0 (double, -, -, nsub)
+ DEF_VF_MULOP_ACC_CASE_0 (double, +, +, acc)
+ DEF_VF_MULOP_ACC_CASE_0 (double, -, +, sac)
  
  /* { dg-final { scan-assembler-times {vfmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfmsub.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmadd.vf} 1 } } */
  /* { dg-final { scan-assembler-times {vfnmsub.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmacc.vf} 1 } } */
+ /* { dg-final { scan-assembler-times {vfmsac.vf} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f16.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_0 (_Float16, +, +, add)
! DEF_VF_MULOP_CASE_0 (_Float16, -, +, sub)
! DEF_VF_MULOP_CASE_0 (_Float16, +, -, nadd)
! DEF_VF_MULOP_CASE_0 (_Float16, -, -, nsub)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf-1-f16.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f32.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_0 (float, +, +, add)
! DEF_VF_MULOP_CASE_0 (float, -, +, sub)
! DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
! DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf-1-f32.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-2-f64.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_0 (float, +, +, add)
! DEF_VF_MULOP_CASE_0 (float, -, +, sub)
! DEF_VF_MULOP_CASE_0 (float, +, -, nadd)
! DEF_VF_MULOP_CASE_0 (float, -, -, nsub)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=1" } */
  
! #include "vf-1-f64.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_1 (_Float16, +, +, add
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_1 (_Float16, -, +, sub, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (_Float16, +, -, nadd, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (_Float16, -, -, nsub, VF_MULOP_BODY_X16)
+ DEF_VF_MULOP_ACC_CASE_1 (_Float16, +, +, acc, VF_MULOP_ACC_BODY_X128)
+ DEF_VF_MULOP_ACC_CASE_1 (_Float16, -, +, sac, VF_MULOP_ACC_BODY_X128)
  
  /* { dg-final { scan-assembler {vfmadd.vf} } } */
  /* { dg-final { scan-assembler {vfmsub.vf} } } */
  /* { dg-final { scan-assembler {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_1 (float, +, +, add, V
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_1 (float, -, +, sub, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (float, +, -, nadd, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (float, -, -, nsub, VF_MULOP_BODY_X16)
+ DEF_VF_MULOP_ACC_CASE_1 (float, +, +, acc, VF_MULOP_ACC_BODY_X128)
+ DEF_VF_MULOP_ACC_CASE_1 (float, -, +, sac, VF_MULOP_ACC_BODY_X128)
  
  /* { dg-final { scan-assembler {vfmadd.vf} } } */
  /* { dg-final { scan-assembler {vfmsub.vf} } } */
  /* { dg-final { scan-assembler {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-3-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_1 (double, +, +, add,
*** 7,14 ****
--- 7,18 ----
  DEF_VF_MULOP_CASE_1 (double, -, +, sub, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (double, +, -, nadd, VF_MULOP_BODY_X16)
  DEF_VF_MULOP_CASE_1 (double, -, -, nsub, VF_MULOP_BODY_X16)
+ DEF_VF_MULOP_ACC_CASE_1 (double, +, +, acc, VF_MULOP_ACC_BODY_X128)
+ DEF_VF_MULOP_ACC_CASE_1 (double, -, +, sac, VF_MULOP_ACC_BODY_X128)
  
  /* { dg-final { scan-assembler {vfmadd.vf} } } */
  /* { dg-final { scan-assembler {vfmsub.vf} } } */
  /* { dg-final { scan-assembler {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f16.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_1 (_Float16, +, +, add, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (_Float16, -, +, sub, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (_Float16, +, -, nadd, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (_Float16, -, -, nsub, VF_MULOP_BODY_X16)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf-3-f16.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f32.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_1 (float, +, +, add, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (float, -, +, sub, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (float, +, -, nadd, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (float, -, -, nsub, VF_MULOP_BODY_X16)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf-3-f32.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf-4-f64.c	Sun Jun 29 22:33:51 2025
***************
*** 1,14 ****
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf_mulop.h"
! 
! DEF_VF_MULOP_CASE_1 (double, +, +, add, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (double, -, +, sub, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (double, +, -, nadd, VF_MULOP_BODY_X16)
! DEF_VF_MULOP_CASE_1 (double, -, -, nsub, VF_MULOP_BODY_X16)
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
--- 1,11 ----
  /* { dg-do compile } */
  /* { dg-options "-march=rv64gcv -mabi=lp64d --param=fpr2vr-cost=4" } */
  
! #include "vf-3-f64.c"
  
  /* { dg-final { scan-assembler-not {vfmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfmsub.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmadd.vf} } } */
  /* { dg-final { scan-assembler-not {vfnmsub.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmacc.vf} } } */
+ /* { dg-final { scan-assembler-not {vfmsac.vf} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop.h	Sun Jun 29 22:33:51 2025
***************
*** 17,22 ****
--- 17,39 ----
  #define RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)                       \
    RUN_VF_MULOP_CASE_0(T, NAME, out, in, x, n)
  
+ #define DEF_VF_MULOP_ACC_CASE_0(T, OP, NEG, NAME)                              \
+   T test_vf_mulop_acc_##NAME##_##T##_case_0 (T *restrict out, T *restrict in,  \
+ 					     T f, unsigned n)                  \
+   {                                                                            \
+     unsigned i;                                                                \
+     for (i = 0; i < n; i++)                                                    \
+       out[i] = NEG (f * in[i] OP out[i]);                                      \
+     /* Ensure that we get acc rather than add by reusing the multiplicand. */  \
+     return in[i - 1];                                                          \
+   }
+ #define DEF_VF_MULOP_ACC_CASE_0_WRAP(T, OP, NEG, NAME)                         \
+   DEF_VF_MULOP_ACC_CASE_0 (T, OP, NEG, NAME)
+ #define RUN_VF_MULOP_ACC_CASE_0(T, NAME, out, in, x, n)                        \
+   test_vf_mulop_acc_##NAME##_##T##_case_0 (out, in, x, n)
+ #define RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, out, in, x, n)                   \
+   RUN_VF_MULOP_ACC_CASE_0 (T, NAME, out, in, x, n)
+ 
  #define VF_MULOP_BODY(op, neg)                                                 \
    out[k + 0] = neg (tmp * out[k + 0] op in[k + 0]);                            \
    out[k + 1] = neg (tmp * out[k + 1] op in[k + 1]);                            \
***************
*** 62,65 ****
--- 79,131 ----
  #define DEF_VF_MULOP_CASE_1_WRAP(T, OP, NEG, NAME, BODY)                       \
    DEF_VF_MULOP_CASE_1 (T, OP, NEG, NAME, BODY)
  
+ #define VF_MULOP_ACC_BODY(op, neg)                                             \
+   out[k + 0] = neg (tmp * in[k + 0] op out[k + 1]);                            \
+   out[k + 1] = neg (tmp * in[k + 1] op out[k + 1]);                            \
+   k += 2;
+ 
+ #define VF_MULOP_ACC_BODY_X4(op, neg)                                          \
+   VF_MULOP_ACC_BODY (op, neg)                                                  \
+   VF_MULOP_ACC_BODY (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X8(op, neg)                                          \
+   VF_MULOP_ACC_BODY_X4 (op, neg)                                               \
+   VF_MULOP_ACC_BODY_X4 (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X16(op, neg)                                         \
+   VF_MULOP_ACC_BODY_X8 (op, neg)                                               \
+   VF_MULOP_ACC_BODY_X8 (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X32(op, neg)                                         \
+   VF_MULOP_ACC_BODY_X16 (op, neg)                                              \
+   VF_MULOP_ACC_BODY_X16 (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X64(op, neg)                                         \
+   VF_MULOP_ACC_BODY_X32 (op, neg)                                              \
+   VF_MULOP_ACC_BODY_X32 (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X128(op, neg)                                        \
+   VF_MULOP_ACC_BODY_X64 (op, neg)                                              \
+   VF_MULOP_ACC_BODY_X64 (op, neg)
+ 
+ #define VF_MULOP_ACC_BODY_X256(op, neg)                                        \
+   VF_MULOP_ACC_BODY_X128 (op, neg)                                             \
+   VF_MULOP_ACC_BODY_X128 (op, neg)
+ 
+ #define DEF_VF_MULOP_ACC_CASE_1(T, OP, NEG, NAME, BODY)                        \
+   T test_vf_mulop_acc_##NAME##_##T##_case_1 (T *restrict out, T *restrict in,  \
+ 					     T x, unsigned n)                  \
+   {                                                                            \
+     unsigned k = 0;                                                            \
+     T tmp = x + 3;                                                             \
+                                                                                \
+     while (k < n)                                                              \
+       {                                                                        \
+ 	tmp = tmp * 0x3f;                                                      \
+ 	BODY (OP, NEG)                                                         \
+       }                                                                        \
+   }
+ #define DEF_VF_MULOP_ACC_CASE_1_WRAP(T, OP, NEG, NAME, BODY)                   \
+   DEF_VF_MULOP_ACC_CASE_1 (T, OP, NEG, NAME, BODY)
+ 
  #endif
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_mulop_run.h	Sun Jun 29 22:33:51 2025
*************** main ()
*** 14,28 ****
    for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
      {
        T f = TEST_DATA[i][0][0];
!       T *in = TEST_DATA[i][1];
!       T *out = TEST_DATA[i][2];
        T *expect = TEST_DATA[i][3];
  
!       TEST_RUN (T, NAME, out, in, f, N);
  
        for (k = 0; k < N; k++)
  	{
! 	  T diff = expect[k] - out[k];
  	  if (TYPE_FABS (diff, T) > .01 * TYPE_FABS (expect[k], T))
  	    __builtin_abort ();
  	}
--- 14,28 ----
    for (i = 0; i < sizeof (TEST_DATA) / sizeof (TEST_DATA[0]); i++)
      {
        T f = TEST_DATA[i][0][0];
!       T *b = TEST_DATA[i][1];
!       T *c = TEST_DATA[i][2];
        T *expect = TEST_DATA[i][3];
  
!       TEST_RUN (T, NAME, c, b, f, N);
  
        for (k = 0; k < N; k++)
  	{
! 	  T diff = expect[k] - TEST_OUT[k];
  	  if (TYPE_FABS (diff, T) > .01 * TYPE_FABS (expect[k], T))
  	    __builtin_abort ();
  	}
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f16.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    _Float16
+ #define NAME add
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, +, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f32.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    float
+ #define NAME add
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, +, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmacc-run-1-f64.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    double
+ #define NAME add
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, +, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmadd-run-1-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, +, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f16.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    _Float16
+ #define NAME sub
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, -, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f32.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    float
+ #define NAME sub
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, -, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsac-run-1-f64.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,16 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "--param=fpr2vr-cost=0" } */
+ 
+ #include "vf_mulop.h"
+ #include "vf_mulop_data.h"
+ 
+ #define T    double
+ #define NAME sub
+ 
+ DEF_VF_MULOP_ACC_CASE_0_WRAP (T, -, +, NAME)
+ 
+ #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
+ #define TEST_RUN(T, NAME, c, b, x, n) RUN_VF_MULOP_ACC_CASE_0_WRAP(T, NAME, b, c, x, n)
+ #define TEST_OUT b
+ 
+ #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfmsub-run-1-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, +, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP(T, +, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, +, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmadd-run-1-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, +, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vf_vfnmsub-run-1-f64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VF_MULOP_CASE_0_WRAP (T, -, -, NAME)
*** 11,15 ****
--- 11,16 ----
  
  #define TEST_DATA                        TEST_MULOP_DATA_WRAP(T, NAME)
  #define TEST_RUN(T, NAME, out, in, x, n) RUN_VF_MULOP_CASE_0_WRAP(T, NAME, out, in, x, n)
+ #define TEST_OUT c
  
  #include "vf_mulop_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u16.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-times {vremu.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmaxu.vx} 2 } } */
  /* { dg-final { scan-assembler-times {vminu.vx} 2 } } */
+ /* { dg-final { scan-assembler-times {vsaddu.vx} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u32.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-times {vremu.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmaxu.vx} 2 } } */
  /* { dg-final { scan-assembler-times {vminu.vx} 2 } } */
+ /* { dg-final { scan-assembler-times {vsaddu.vx} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u64.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-times {vremu.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmaxu.vx} 2 } } */
  /* { dg-final { scan-assembler-times {vminu.vx} 2 } } */
+ /* { dg-final { scan-assembler-times {vsaddu.vx} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-1-u8.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-times {vremu.vx} 1 } } */
  /* { dg-final { scan-assembler-times {vmaxu.vx} 2 } } */
  /* { dg-final { scan-assembler-times {vminu.vx} 2 } } */
+ /* { dg-final { scan-assembler-times {vsaddu.vx} 1 } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u16.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u32.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u64.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-2-u8.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u16.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u32.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u64.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-3-u8.c	Sun Jun 29 22:33:51 2025
*************** TEST_BINARY_VX_UNSIGNED_0(T)
*** 17,19 ****
--- 17,20 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-4-u8.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_1_WRAP(T, %, rem, VX_
*** 16,21 ****
--- 16,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_
*** 27,29 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-5-u8.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u16.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u32.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X4)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X4)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u64.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY)
  
  /* { dg-final { scan-assembler-not {vadd.vx} } } */
  /* { dg-final { scan-assembler-not {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler-not {vremu.vx} } } */
  /* { dg-final { scan-assembler-not {vmaxu.vx} } } */
  /* { dg-final { scan-assembler-not {vminu.vx} } } */
+ /* { dg-final { scan-assembler-not {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx-6-u8.c	Sun Jun 29 22:33:51 2025
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_0_
*** 17,22 ****
--- 17,23 ----
  DEF_VX_BINARY_CASE_3_WRAP(T, MAX_FUNC_1_WARP(T), max, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_0_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
  DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_WARP(T), min, VX_BINARY_FUNC_BODY_X8)
+ DEF_VX_BINARY_CASE_3_WRAP(T, SAT_U_ADD_FUNC_WRAP(T), sat_add, VX_BINARY_FUNC_BODY_X8)
  
  /* { dg-final { scan-assembler {vadd.vx} } } */
  /* { dg-final { scan-assembler {vsub.vx} } } */
*************** DEF_VX_BINARY_CASE_3_WRAP(T, MIN_FUNC_1_
*** 28,30 ****
--- 29,32 ----
  /* { dg-final { scan-assembler {vremu.vx} } } */
  /* { dg-final { scan-assembler {vmaxu.vx} } } */
  /* { dg-final { scan-assembler {vminu.vx} } } */
+ /* { dg-final { scan-assembler {vsaddu.vx} } } */
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary.h	Sun Jun 29 22:33:51 2025
*************** test_vx_binary_##NAME##_##FUNC##_##T##_c
*** 270,275 ****
--- 270,290 ----
    VX_BINARY_FUNC_BODY_X64(op)        \
    VX_BINARY_FUNC_BODY_X64(op)
  
+ #define DEF_SAT_U_ADD(T)                   \
+ T                                          \
+ test_##T##_sat_add (T a, T b)              \
+ {                                          \
+   return (a + b) | (-(T)((T)(a + b) < a)); \
+ }
+ 
+ DEF_SAT_U_ADD(uint8_t)
+ DEF_SAT_U_ADD(uint16_t)
+ DEF_SAT_U_ADD(uint32_t)
+ DEF_SAT_U_ADD(uint64_t)
+ 
+ #define SAT_U_ADD_FUNC(T) test_##T##_sat_add
+ #define SAT_U_ADD_FUNC_WRAP(T) SAT_U_ADD_FUNC(T)
+ 
  #define TEST_BINARY_VX_SIGNED_0(T)                      \
    DEF_VX_BINARY_CASE_0_WRAP(T, +, add)                  \
    DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)                  \
*************** test_vx_binary_##NAME##_##FUNC##_##T##_c
*** 285,302 ****
    DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_0_WARP(T), min) \
    DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_1_WARP(T), min)
  
! #define TEST_BINARY_VX_UNSIGNED_0(T)                    \
!   DEF_VX_BINARY_CASE_0_WRAP(T, +, add)                  \
!   DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)                  \
!   DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)         \
!   DEF_VX_BINARY_CASE_0_WRAP(T, &, and)                  \
!   DEF_VX_BINARY_CASE_0_WRAP(T, |, or)                   \
!   DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)                  \
!   DEF_VX_BINARY_CASE_0_WRAP(T, /, div)                  \
!   DEF_VX_BINARY_CASE_0_WRAP(T, %, rem)                  \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MAX_FUNC_0_WARP(T), max) \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MAX_FUNC_1_WARP(T), max) \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_0_WARP(T), min) \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_1_WARP(T), min)
  
  #endif
--- 300,318 ----
    DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_0_WARP(T), min) \
    DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_1_WARP(T), min)
  
! #define TEST_BINARY_VX_UNSIGNED_0(T)                       \
!   DEF_VX_BINARY_CASE_0_WRAP(T, +, add)                     \
!   DEF_VX_BINARY_CASE_0_WRAP(T, -, sub)                     \
!   DEF_VX_BINARY_REVERSE_CASE_0_WRAP(T, -, rsub)            \
!   DEF_VX_BINARY_CASE_0_WRAP(T, &, and)                     \
!   DEF_VX_BINARY_CASE_0_WRAP(T, |, or)                      \
!   DEF_VX_BINARY_CASE_0_WRAP(T, ^, xor)                     \
!   DEF_VX_BINARY_CASE_0_WRAP(T, /, div)                     \
!   DEF_VX_BINARY_CASE_0_WRAP(T, %, rem)                     \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MAX_FUNC_0_WARP(T), max)    \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MAX_FUNC_1_WARP(T), max)    \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_0_WARP(T), min)    \
!   DEF_VX_BINARY_CASE_2_WRAP(T, MIN_FUNC_1_WARP(T), min)    \
!   DEF_VX_BINARY_CASE_2_WRAP(T, SAT_U_ADD_FUNC(T), sat_add)
  
  #endif
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h	Sun Jun 22 22:33:05 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_binary_data.h	Sun Jun 29 22:33:51 2025
*************** uint64_t TEST_BINARY_DATA(uint64_t, min)
*** 4122,4125 ****
--- 4122,4321 ----
    },
  };
  
+ uint8_t TEST_BINARY_DATA(uint8_t, sat_add)[][3][N] =
+ {
+   {
+     { 0 },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     { 127 },
+     {
+        127,  127,  127,  127,
+        128,  128,  128,  128,
+        255,  255,  255,  255,
+          1,    1,    1,    1,
+     },
+     {
+        254,  254,  254,  254,
+        255,  255,  255,  255,
+        255,  255,  255,  255,
+        128,  128,  128,  128,
+     },
+   },
+   {
+     { 254 },
+     {
+        128,  128,  128,  128,
+        255,  255,  255,  255,
+        127,  127,  127,  127,
+          2,    2,    2,    2,
+     },
+     {
+        255,  255,  255,  255,
+        255,  255,  255,  255,
+        255,  255,  255,  255,
+        255,  255,  255,  255,
+     },
+   },
+ };
+ 
+ uint16_t TEST_BINARY_DATA(uint16_t, sat_add)[][3][N] =
+ {
+   {
+     { 0 },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     { 32767 },
+     {
+        32767,  32767,  32767,  32767,
+        32768,  32768,  32768,  32768,
+        65535,  65535,  65535,  65535,
+            1,      1,      1,      1,
+     },
+     {
+        65534,  65534,  65534,  65534,
+        65535,  65535,  65535,  65535,
+        65535,  65535,  65535,  65535,
+        32768,  32768,  32768,  32768,
+     },
+   },
+   {
+     { 65534 },
+     {
+        32768,  32768,  32768,  32768,
+        65535,  65535,  65535,  65535,
+        32767,  32767,  32767,  32767,
+            2,      2,      2,      2,
+     },
+     {
+        65535,  65535,  65535,  65535,
+        65535,  65535,  65535,  65535,
+        65535,  65535,  65535,  65535,
+        65535,  65535,  65535,  65535,
+     },
+   },
+ };
+ 
+ uint32_t TEST_BINARY_DATA(uint32_t, sat_add)[][3][N] =
+ {
+   {
+     { 0 },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     { 2147483647 },
+     {
+        2147483647,  2147483647,  2147483647,  2147483647,
+        2147483648,  2147483648,  2147483648,  2147483648,
+        4294967295,  4294967295,  4294967295,  4294967295,
+                 1,           1,           1,           1,
+     },
+     {
+        4294967294,  4294967294,  4294967294,  4294967294,
+        4294967295,  4294967295,  4294967295,  4294967295,
+        4294967295,  4294967295,  4294967295,  4294967295,
+        2147483648,  2147483648,  2147483648,  2147483648,
+     },
+   },
+   {
+     { 4294967294 },
+     {
+        2147483648,  2147483648,  2147483648,  2147483648,
+        4294967295,  4294967295,  4294967295,  4294967295,
+        2147483647,  2147483647,  2147483647,  2147483647,
+                 2,           2,           2,           2,
+     },
+     {
+        4294967295,  4294967295,  4294967295,  4294967295,
+        4294967295,  4294967295,  4294967295,  4294967295,
+        4294967295,  4294967295,  4294967295,  4294967295,
+        4294967295,  4294967295,  4294967295,  4294967295,
+     },
+   },
+ };
+ 
+ uint64_t TEST_BINARY_DATA(uint64_t, sat_add)[][3][N] =
+ {
+   {
+     { 0 },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+     {
+        2,  2,  2,  2,
+        1,  1,  1,  1,
+        0,  0,  0,  0,
+        4,  4,  4,  4,
+     },
+   },
+   {
+     { 9223372036854775807ull },
+     {
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+        9223372036854775808ull,  9223372036854775808ull,  9223372036854775808ull,  9223372036854775808ull,
+       18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull,
+                             1,                       1,                       1,                       1,
+     },
+     {
+        18446744073709551614ull,  18446744073709551614ull,  18446744073709551614ull,  18446744073709551614ull,
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+         9223372036854775808ull,   9223372036854775808ull,   9223372036854775808ull,   9223372036854775808ull,
+     },
+   },
+   {
+     { 18446744073709551614ull },
+     {
+        9223372036854775808ull,  9223372036854775808ull,  9223372036854775808ull,  9223372036854775808ull,
+       18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull, 18446744073709551615ull,
+        9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,  9223372036854775807ull,
+                             2,                       2,                       2,                       2,
+     },
+     {
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+        18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,  18446744073709551615ull,
+     },
+   },
+ };
+ 
  #endif
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u16.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T          uint16_t
+ #define NAME       sat_add
+ #define FUNC       SAT_U_ADD_FUNC_WRAP(T)
+ #define TEST_DATA  TEST_BINARY_DATA_WRAP(T, NAME)
+ 
+ DEF_VX_BINARY_CASE_2_WRAP(T, FUNC, NAME)
+ 
+ #define TEST_RUN(T, NAME, out, in, x, n) \
+   RUN_VX_BINARY_CASE_2_WRAP(T, NAME, FUNC, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u32.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T          uint32_t
+ #define NAME       sat_add
+ #define FUNC       SAT_U_ADD_FUNC_WRAP(T)
+ #define TEST_DATA  TEST_BINARY_DATA_WRAP(T, NAME)
+ 
+ DEF_VX_BINARY_CASE_2_WRAP(T, FUNC, NAME)
+ 
+ #define TEST_RUN(T, NAME, out, in, x, n) \
+   RUN_VX_BINARY_CASE_2_WRAP(T, NAME, FUNC, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u64.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T          uint64_t
+ #define NAME       sat_add
+ #define FUNC       SAT_U_ADD_FUNC_WRAP(T)
+ #define TEST_DATA  TEST_BINARY_DATA_WRAP(T, NAME)
+ 
+ DEF_VX_BINARY_CASE_2_WRAP(T, FUNC, NAME)
+ 
+ #define TEST_RUN(T, NAME, out, in, x, n) \
+   RUN_VX_BINARY_CASE_2_WRAP(T, NAME, FUNC, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/riscv/rvv/autovec/vx_vf/vx_vsadd-run-1-u8.c	Sun Jun 29 22:33:51 2025
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do run { target { riscv_v } } } */
+ /* { dg-additional-options "-std=c99 --param=gpr2vr-cost=0" } */
+ 
+ #include "vx_binary.h"
+ #include "vx_binary_data.h"
+ 
+ #define T          uint8_t
+ #define NAME       sat_add
+ #define FUNC       SAT_U_ADD_FUNC_WRAP(T)
+ #define TEST_DATA  TEST_BINARY_DATA_WRAP(T, NAME)
+ 
+ DEF_VX_BINARY_CASE_2_WRAP(T, FUNC, NAME)
+ 
+ #define TEST_RUN(T, NAME, out, in, x, n) \
+   RUN_VX_BINARY_CASE_2_WRAP(T, NAME, FUNC, out, in, x, n)
+ 
+ #include "vx_binary_run.h"
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c	Sun Jun 22 22:33:07 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-extract-1.c	Sun Jun 29 22:33:52 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=z14 -mzarch" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  typedef double V2DF __attribute__((vector_size(16)));
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=arch11 -mzarch" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  typedef double V2DF __attribute__((vector_size(16)));
*************** extractnthfloat (V4SF x, int n)
*** 111,127 ****
  }
  
  /*
- ** sumfirstfloat:
- **	vfasb	%v0,%v24,%v26
- **	br	%r14
- */
- float
- sumfirstfloat (V4SF x, V4SF y)
- {
-   return (x + y)[0];
- }
- 
- /*
  ** extractfirst2:
  **	vlr	%v0,%v24
  **	br	%r14
--- 111,116 ----
*************** extractsingled (V1DF x)
*** 179,186 ****
  
  /*
  ** extractsingleld:
! **	vlr	(%v.),%v24
! **	vst	\1,0\(%r2\),3
  **	br	%r14
  */
  long double
--- 168,174 ----
  
  /*
  ** extractsingleld:
! **	vst	%v24,0\(%r2\),3
  **	br	%r14
  */
  long double
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-extract-2.c gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-extract-2.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-extract-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-extract-2.c	Sun Jun 29 22:33:52 2025
***************
*** 0 ****
--- 1,168 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=arch11 -mzarch" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ typedef double V2DF __attribute__((vector_size(16)));
+ typedef float V4SF __attribute__((vector_size(16)));
+ typedef float V2SF __attribute__((vector_size(8)));
+ typedef double V1DF __attribute__((vector_size(8)));
+ typedef float V1SF __attribute__((vector_size(4)));
+ typedef long double V1TF __attribute__((vector_size(16)));
+ 
+ /*
+ ** extractfirstdouble:
+ **	vsteg	%v24,0\(%r2\),0
+ **	br	%r14
+ */
+ void
+ extractfirstdouble (double *res, V2DF x)
+ {
+   *res = x[0];
+ }
+ 
+ /*
+ ** extractseconddouble:
+ **	vsteg	%v24,0\(%r2\),1
+ **	br	%r14
+ */
+ void
+ extractseconddouble (double *res, V2DF x)
+ {
+   *res = x[1];
+ }
+ 
+ /*
+ ** extractnthdouble:
+ **	vlgvg	(%r.),%v24,0\(%r3\)
+ **	stg	\1,0\(%r2\)
+ **	br	%r14
+ */
+ void
+ extractnthdouble (double *res, V2DF x, int n)
+ {
+   *res = x[n];
+ }
+ 
+ /*
+ ** extractfirstfloat:
+ **	vstef	%v24,0\(%r2\),0
+ **	br	%r14
+ */
+ void
+ extractfirstfloat (float *res, V4SF x)
+ {
+   *res = x[0];
+ }
+ 
+ /*
+ ** extractsecondfloat:
+ **	vstef	%v24,0\(%r2\),1
+ **	br	%r14
+ */
+ void
+ extractsecondfloat (float *res, V4SF x)
+ {
+   *res = x[1];
+ }
+ 
+ /*
+ ** extractthirdfloat:
+ **	vstef	%v24,0\(%r2\),2
+ **	br	%r14
+ */
+ void
+ extractthirdfloat (float *res, V4SF x)
+ {
+   *res = x[2];
+ }
+ 
+ /*
+ ** extractfourthfloat:
+ **	vstef	%v24,0\(%r2\),3
+ **	br	%r14
+ */
+ void
+ extractfourthfloat (float *res, V4SF x)
+ {
+   *res = x[3];
+ }
+ 
+ /*
+ ** extractnthfloat:
+ **	vlgvf	(%r.),%v24,0\(%r3\)
+ **	st	\1,0\(%r2\)
+ **	br	%r14
+ */
+ void
+ extractnthfloat (float *res, V4SF x, int n)
+ {
+   *res = x[n];
+ }
+ 
+ /*
+ ** extractfirst2:
+ **	vstef	%v24,0\(%r2\),0
+ **	br	%r14
+ */
+ void
+ extractfirst2 (float *res, V2SF x)
+ {
+   *res = x[0];
+ }
+ 
+ /*
+ ** extractsecond2:
+ **	vstef	%v24,0\(%r2\),1
+ **	br	%r14
+ */
+ void
+ extractsecond2 (float *res, V2SF x)
+ {
+   *res = x[1];
+ }
+ 
+ /*
+ ** extractnth2:
+ **	vlgvf	(%r.),%v24,0\(%r3\)
+ **	st	\1,0\(%r2\)
+ **	br	%r14
+ */
+ void
+ extractnth2 (float *res, V2SF x, int n)
+ {
+   *res = x[n];
+ }
+ 
+ /*
+ ** extractsinglef:
+ **	vlr	%v(.),%v24
+ **	ste	%f\1,0\(%r2\)
+ **	br	%r14
+ */
+ void
+ extractsinglef (float *res, V1SF x)
+ {
+   *res = x[0];
+ }
+ 
+ /*
+ ** extractsingled:
+ **	vsteg	%v24,0\(%r2\),0
+ **	br	%r14
+ */
+ void
+ extractsingled (double *res, V1DF x)
+ {
+   *res = x[0];
+ }
+ 
+ /*
+ ** extractsingleld:
+ **	vst	%v24,0\(%r2\),3
+ **	br	%r14
+ */
+ void
+ extractsingleld (long double *res, V1TF x)
+ {
+   *res = x[0];
+ }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c
*** gcc-16-20250622/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c	Sun Jun 22 22:33:07 2025
--- gcc-16-20250629/gcc/testsuite/gcc.target/s390/vector/vec-set-1.c	Sun Jun 29 22:33:52 2025
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=z14 -mzarch" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  typedef double V2DF __attribute__((vector_size(16)));
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O2 -march=arch11 -mzarch" } */
  /* { dg-final { check-function-bodies "**" "" } } */
  
  typedef double V2DF __attribute__((vector_size(16)));
*************** set1dfn (V1DF x, double y, int n)
*** 69,75 ****
  
  /*
  ** setsf0:
! **	lgdr	(%r.),%f0
  **	vlvgf	%v24,\1,0
  **	br	%r14
  */
--- 69,75 ----
  
  /*
  ** setsf0:
! **	vlgvf	(%r.),%v0,0
  **	vlvgf	%v24,\1,0
  **	br	%r14
  */
*************** setsf0 (V4SF x, float y)
*** 82,88 ****
  
  /*
  ** setsf1:
! **	lgdr	(%r.),%f0
  **	vlvgf	%v24,\1,1
  **	br	%r14
  */
--- 82,88 ----
  
  /*
  ** setsf1:
! **	vlgvf	(%r.),%v0,0
  **	vlvgf	%v24,\1,1
  **	br	%r14
  */
*************** setsf1 (V4SF x, float y)
*** 94,101 ****
  }
  
  /*
! ** setsf0:
! **	lgdr	(%r.),%f0
  **	vlvgf	%v24,\1,2
  **	br	%r14
  */
--- 94,101 ----
  }
  
  /*
! ** setsf2:
! **	vlgvf	(%r.),%v0,0
  **	vlvgf	%v24,\1,2
  **	br	%r14
  */
*************** setsf2 (V4SF x, float y)
*** 107,114 ****
  }
  
  /*
! ** setsf1:
! **	lgdr	(%r.),%f0
  **	vlvgf	%v24,\1,3
  **	br	%r14
  */
--- 107,114 ----
  }
  
  /*
! ** setsf3:
! **	vlgvf	(%r.),%v0,0
  **	vlvgf	%v24,\1,3
  **	br	%r14
  */
*************** setsf3 (V4SF x, float y)
*** 121,127 ****
  
  /*
  ** setsfn:
! **	lgdr	(%r.),%f0
  **	vlvgf	%v24,\1,0\(%r2\)
  **	br	%r14
  */
--- 121,127 ----
  
  /*
  ** setsfn:
! **	vlgvf	(%r.),%v0,0
  **	vlvgf	%v24,\1,0\(%r2\)
  **	br	%r14
  */
*************** V4SF
*** 129,133 ****
--- 129,140 ----
  setsfn (V4SF x, float y, int n)
  {
    x[n] = y;
+   /* Make sure to read all FPRs such that the "save GPRs in FPRs" optimization
+      cannot be used.  That optimization has a memory clobber on SP restore
+      causing DSE to fail to eliminate dead stores in leaf functions using this
+      optimization.  */
+   asm volatile ("" : : "f" (y), "f" (y), "f" (y), "f" (y), "f" (y), "f" (y),
+ 		       "f" (y), "f" (y), "f" (y), "f" (y), "f" (y), "f" (y),
+ 		       "f" (y), "f" (y), "f" (y), "f" (y));
    return x;
  }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/asan/array_constructor_1.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/asan/array_constructor_1.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/asan/array_constructor_1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/asan/array_constructor_1.f90	Sun Jun 29 22:33:55 2025
***************
*** 0 ****
--- 1,23 ----
+ !{ dg-do run }
+ 
+ ! Contributed by Christopher Albert  <albert@tugraz.at>
+ 
+ program grow_type_array
+     type :: container
+         integer, allocatable :: arr(:)
+     end type container
+     
+     type(container), allocatable :: list(:)
+ 
+     list = [list, new_elem(5)]
+ 
+     deallocate(list)
+ 
+ contains
+ 
+     type(container) function new_elem(s) result(out)
+         integer :: s
+         allocate(out%arr(s))
+     end function new_elem
+       
+ end program grow_type_array
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/goacc/acc-wait-1.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/goacc/acc-wait-1.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/goacc/acc-wait-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/goacc/acc-wait-1.f90	Sun Jun 29 22:33:56 2025
***************
*** 0 ****
--- 1,47 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ 
+ subroutine f0(x)
+   implicit none
+   integer, value :: x
+   !$acc wait(x) if(.false.) async
+ end
+ 
+ subroutine f1(y, ia)
+   implicit none
+   integer, value :: y, ia
+   !$acc wait(y) if(.true.) async(ia)
+ end
+ 
+ subroutine fl(z, ll)
+   implicit none
+   integer, value :: z
+   logical, value :: ll
+   !$acc wait(z) if(ll) async(3)
+ end
+ 
+ subroutine a0(a)
+   implicit none
+   integer, value :: a
+   !$acc wait(a) if(.false.)
+ end
+ 
+ subroutine a1(b)
+   implicit none
+   integer, value :: b
+   !$acc wait(b) if(.true.)
+ end
+ 
+ subroutine al(c, qq)
+   implicit none
+   integer, value :: c
+   logical, value :: qq
+   !$acc wait(c) if(qq)
+ end
+ 
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = x;\[\\n\\r\]+ *if \\(0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-1, 1, D\.\[0-9\]+\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = ia;\[\\n\\r\]+ *D\.\[0-9\]+ = y;\[\\n\\r\]+ *if \\(1\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(D\.\[0-9\]+, 1, D\.\[0-9\]+\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = z;\[\\n\\r\]+ *D\.\[0-9\]+ = ll;\[\\n\\r\]+ *if \\(D\.\[0-9\]+\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(3, 1, D\.\[0-9\]+\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = a;\[\\n\\r\]+ *if \\(0\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, D\.\[0-9\]+\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = b;\[\\n\\r\]+ *if \\(1\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, D\.\[0-9\]+\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "D\.\[0-9\]+ = c;\[\\n\\r\]+ *D\.\[0-9\]+ = qq;\[\\n\\r\]+ *if \\(D\.\[0-9\]+\\)\[\\n\\r\]+ *\{\[\\n\\r\]+ *__builtin_GOACC_wait \\(-2, 1, D\.\[0-9\]+\\);" 1 "original" } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/interface_63.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/interface_63.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/interface_63.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/interface_63.f90	Sun Jun 29 22:33:56 2025
***************
*** 0 ****
--- 1,97 ----
+ ! { dg-do compile }
+ ! PR fortran/120784 - fix checking of renamed-on-use interface name
+ !
+ ! Contributed by Matt Thompson  <matthew.thompson at nasa dot gov>
+ 
+ module A_mod
+   implicit none
+ 
+   interface Get
+      procedure :: get_1
+      procedure :: get_2
+   end interface Get
+ 
+ contains
+ 
+   subroutine get_1(i)
+     integer :: i
+     i = 5
+   end subroutine get_1
+ 
+   subroutine get_2(x)
+     real :: x
+     x = 4
+   end subroutine get_2
+ end module A_mod
+ 
+ module B_mod
+   use A_mod, only : MyGet => Get
+   implicit none
+ 
+   interface MyGet
+      procedure :: other_get
+   end interface MyGet
+ 
+ contains
+ 
+   subroutine other_get(c)
+     character(1) :: c
+     c = 'a'
+   end subroutine other_get
+ 
+   subroutine check_get ()
+     character :: c
+     integer   :: i
+     real      :: r
+     call myget (c)
+     call myget (i)
+     call myget (r)
+   end subroutine check_get
+ 
+ end module B_MOD
+ 
+ program p
+   use b_mod, only: myget
+   implicit none
+   character :: c
+   integer   :: i
+   real      :: r
+   call myget (c)
+   call myget (i)
+   call myget (r)
+ end
+ 
+ ! Check that we do not regress on the following:
+ 
+ module mod1
+   implicit none
+ 
+   interface local
+     module procedure local_data
+   end interface local
+ 
+ contains
+ 
+   logical function local_data (data) result (local)
+     real, intent(in) :: data
+     local = .true.
+   end function local_data
+ 
+ end module mod1
+ 
+ module mod2
+   use mod1, only: local
+   implicit none
+ 
+   interface local
+      module procedure local_invt
+   end interface local
+ 
+ contains
+ 
+   logical function local_invt (invt) result (local)
+     integer, intent(in) :: invt
+     local = .true.
+   end function local_invt
+ 
+ end module mod2
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/non_lvalue_1.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/non_lvalue_1.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/non_lvalue_1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/non_lvalue_1.f90	Sun Jun 29 22:33:56 2025
***************
*** 0 ****
--- 1,32 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ !
+ ! Check the generation of NON_LVALUE_EXPR expressions in cases where a unary
+ ! operator expression would simplify to a bare data reference.
+ 
+ ! A NON_LVALUE_EXPR is generated for a double negation that would simplify to
+ ! a bare data reference.
+ function f1 (f1_arg1)
+   integer, value :: f1_arg1
+   integer :: f1
+   f1 = -(-f1_arg1)
+ end function
+ ! { dg-final { scan-tree-dump "__result_f1 = NON_LVALUE_EXPR <f1_arg1>;" "original" } }
+ 
+ ! A NON_LVALUE_EXPR is generated for a double complement that would simplify to
+ ! a bare data reference.
+ function f2 (f2_arg1)
+   integer, value :: f2_arg1
+   integer :: f2
+   f2 = not(not(f2_arg1))
+ end function
+ ! { dg-final { scan-tree-dump "__result_f2 = NON_LVALUE_EXPR <f2_arg1>;" "original" } }
+ 
+ ! A NON_LVALUE_EXPR is generated for a double complex conjugate that would
+ ! simplify to a bare data reference.
+ function f3 (f3_arg1)
+   complex, value :: f3_arg1
+   complex :: f3
+   f3 = conjg(conjg(f3_arg1))
+ end function
+ ! { dg-final { scan-tree-dump "__result_f3 = NON_LVALUE_EXPR <f3_arg1>;" "original" } }
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/pr120743.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/pr120743.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/pr120743.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/pr120743.f90	Sun Jun 29 22:33:56 2025
***************
*** 0 ****
--- 1,38 ----
+ ! { dg-do compile }
+ ! PR fortran/120743 - ICE in verify_gimple_in_seq with substrings
+ !
+ ! Testcase as reduced by Jerry DeLisle 
+ 
+ module what
+   implicit none
+   CHARACTER(LEN=:), ALLOCATABLE :: attrlist
+ contains
+   SUBROUTINE get_c_attr ( attrname, attrval_c )
+     !
+     ! returns attrval_c='' if not found
+     !
+     IMPLICIT NONE
+     CHARACTER(LEN=*), INTENT(IN) :: attrname
+     CHARACTER(LEN=*), INTENT(OUT) :: attrval_c
+     !
+     CHARACTER(LEN=1) :: quote
+     INTEGER :: j0, j1
+     LOGICAL :: found
+     !
+     ! search for attribute name in attrlist: attr1="val1" attr2="val2" ...
+     !
+     attrval_c = ''
+     if ( .not. allocated(attrlist) ) return
+     if ( len_trim(attrlist) < 1 ) return
+     !
+     j0 = 1
+     do while ( j0 < len_trim(attrlist) )
+        ! locate = and first quote
+        j1 = index ( attrlist(j0:), '=' )
+        quote = attrlist(j0+j1:j0+j1)
+        ! next line: something is not right
+        if ( quote /= '"' .and. quote /= "'" ) return
+     end do
+     !
+   END SUBROUTINE get_c_attr
+ end module what
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gfortran.dg/select_type_51.f90 gcc-16-20250629/gcc/testsuite/gfortran.dg/select_type_51.f90
*** gcc-16-20250622/gcc/testsuite/gfortran.dg/select_type_51.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gfortran.dg/select_type_51.f90	Sun Jun 29 22:33:56 2025
***************
*** 0 ****
--- 1,37 ----
+ ! { dg-do compile }
+ !
+ ! Check the support by the compiler of very long symbol names in SELECT TYPE
+ ! and TYPE IS statements.
+ !
+ ! Original testcase by Harald Anlauf.
+ 
+ module m
+   implicit none
+   type t2345678901234567890123456789012345678901234567890123456789_123
+      integer :: i
+   end type t2345678901234567890123456789012345678901234567890123456789_123
+   class(*), allocatable :: a, &
+        c2345678901234567890123456789012345678901234567890123456789_123
+ contains
+   subroutine check_type_is_intrinsic()
+     select type (s2345678901234567890123456789012345678901234567890123456789_123 &
+          => c2345678901234567890123456789012345678901234567890123456789_123)
+     type is (integer(kind=4))
+        print *, s2345678901234567890123456789012345678901234567890123456789_123
+     end select
+   end subroutine
+   subroutine check_type_is_derived()
+     select type (s2345678901234567890123456789012345678901234567890123456789_123 &
+          => c2345678901234567890123456789012345678901234567890123456789_123)
+     type is (t2345678901234567890123456789012345678901234567890123456789_123)
+        print *, s2345678901234567890123456789012345678901234567890123456789_123%i
+     end select
+   end subroutine
+   subroutine check_type_is_class()
+     select type (s2345678901234567890123456789012345678901234567890123456789_123 &
+          => c2345678901234567890123456789012345678901234567890123456789_123)
+     class is (t2345678901234567890123456789012345678901234567890123456789_123)
+        print *, s2345678901234567890123456789012345678901234567890123456789_123%i
+     end select
+   end subroutine
+ end module m
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gnat.dg/concat6.adb gcc-16-20250629/gcc/testsuite/gnat.dg/concat6.adb
*** gcc-16-20250622/gcc/testsuite/gnat.dg/concat6.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gnat.dg/concat6.adb	Sun Jun 29 22:33:58 2025
***************
*** 0 ****
--- 1,9 ----
+ -- { dg-do compile }
+ 
+ with Ada.Text_IO; use Ada.Text_IO;
+ 
+ procedure Concat6 is
+   C : constant character := 16#00#; -- { dg-error "expected type|found type" }
+ begin
+   Put_Line ("Test " & C);
+ end;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/gnat.dg/sso20.adb gcc-16-20250629/gcc/testsuite/gnat.dg/sso20.adb
*** gcc-16-20250622/gcc/testsuite/gnat.dg/sso20.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/gnat.dg/sso20.adb	Sun Jun 29 22:33:58 2025
***************
*** 0 ****
--- 1,29 ----
+ --  { dg-do run }
+ --  { dg-options "-O" }
+ 
+ with Ada.Unchecked_Conversion;
+ with Interfaces;  use Interfaces;
+ with System;      use System;
+ 
+ procedure SSO20 is
+ 
+   type Bytes_Ref is array (1 .. 4) of Unsigned_8
+     with Convention => Ada_Pass_By_Reference;
+ 
+   type U32_BE is record
+     Value : Unsigned_32;
+   end record
+     with
+       Pack,
+       Bit_Order            => High_Order_First,
+       Scalar_Storage_Order => High_Order_First;
+ 
+   function Conv is new Ada.Unchecked_Conversion (Bytes_Ref, U32_BE);
+ 
+   function Value (B : Bytes_Ref) return Unsigned_32 is (Conv (B).Value);
+ 
+ begin
+   if Value ((16#11#, 16#22#, 16#33#, 16#44#)) /= 16#11223344# then
+      raise Program_Error;
+   end if;
+ end;
diff -Nrcpad gcc-16-20250622/gcc/testsuite/lib/htmltest.py gcc-16-20250629/gcc/testsuite/lib/htmltest.py
*** gcc-16-20250622/gcc/testsuite/lib/htmltest.py	Sun Jun 22 22:33:22 2025
--- gcc-16-20250629/gcc/testsuite/lib/htmltest.py	Sun Jun 29 22:34:00 2025
*************** def html_tree_from_env():
*** 9,15 ****
      return ET.parse(html_filename)
  
  XHTML = 'http://www.w3.org/1999/xhtml'
! ns = {'xhtml': XHTML}
  
  def make_tag(local_name):
      return f'{{{XHTML}}}' + local_name
--- 9,17 ----
      return ET.parse(html_filename)
  
  XHTML = 'http://www.w3.org/1999/xhtml'
! SVG   = 'http://www.w3.org/2000/svg'
! ns = {'xhtml': XHTML,
!       'svg'  : SVG}
  
  def make_tag(local_name):
      return f'{{{XHTML}}}' + local_name
diff -Nrcpad gcc-16-20250622/gcc/testsuite/lib/sarif.py gcc-16-20250629/gcc/testsuite/lib/sarif.py
*** gcc-16-20250622/gcc/testsuite/lib/sarif.py	Sun Jun 22 22:33:22 2025
--- gcc-16-20250629/gcc/testsuite/lib/sarif.py	Sun Jun 29 22:34:00 2025
***************
*** 1,5 ****
--- 1,6 ----
  import json
  import os
+ import xml.etree.ElementTree as ET
  
  def sarif_from_env():
      # return parsed JSON content a SARIF_PATH file
*************** def get_location_snippet_text(location):
*** 21,23 ****
--- 22,38 ----
  
  def get_location_relationships(location):
      return location['relationships']
+ 
+ def get_result_by_index(sarif, idx):
+     runs = sarif['runs']
+     run = runs[0]
+     results = run['results']
+     return results[idx]
+     
+ def get_xml_state(events, event_idx):
+     xml_src = events[event_idx]['properties']['gcc/diagnostic_event/xml_state']
+     if 0:
+         print(xml_src)
+     xml = ET.fromstring(xml_src)
+     assert xml.tag == 'state-diagram'
+     return xml    
diff -Nrcpad gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-html.py gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-html.py
*** gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-html.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-html.py	Sun Jun 29 22:34:01 2025
***************
*** 0 ****
--- 1,26 ----
+ from htmltest import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def html_tree():
+     return html_tree_from_env()
+ 
+ def test_generated_html(html_tree):
+     root = html_tree.getroot ()
+     assert root.tag == make_tag('html')
+ 
+     head = root.find('xhtml:head', ns)
+     assert head is not None
+ 
+     title = head.find('xhtml:title', ns)
+     assert title.text == '../../src/gcc/testsuite/gcc.dg/analyzer/signal-1.c'
+ 
+     diag = get_diag_by_index(html_tree, 0)
+ 
+     msg = get_message_within_diag(diag)
+     assert msg is not None
+     
+     assert_tag(msg[0], 'strong')
+     assert msg[0].text == 'warning: '
+     assert msg[0].tail == " call to ‘fprintf’ from within signal handler "
diff -Nrcpad gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py
*** gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1-check-sarif-roundtrip.py	Sun Jun 29 22:34:01 2025
***************
*** 0 ****
--- 1,41 ----
+ from sarif import *
+ 
+ import pytest
+ 
+ @pytest.fixture(scope='function', autouse=True)
+ def sarif():
+     return sarif_from_env()
+ 
+ def test_basics(sarif):
+     schema = sarif['$schema']
+     assert schema == "https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json"
+ 
+     version = sarif['version']
+     assert version == "2.1.0"
+ 
+ def test_execution_successful(sarif):
+     runs = sarif['runs']
+     run = runs[0]
+ 
+     invocations = run['invocations']
+     assert len(invocations) == 1
+     invocation = invocations[0]
+ 
+     assert invocation['executionSuccessful'] == True
+ 
+ def test_warning(sarif):
+     result = get_result_by_index(sarif, 0)
+ 
+     assert result['level'] == 'warning'
+ 
+     # TODO: this should be "-Wanalyzer-unsafe-call-within-signal-handler" and have a URL
+     assert result['ruleId'] == 'warning'
+ 
+     # TODO: check code flow
+     events = result["codeFlows"][0]["threadFlows"][0]['locations']
+ 
+     # Event "(1)": "entry to 'main'" (index == 0)
+     assert events[0]['location']['message']['text'] == "entry to ‘main’"
+ 
+     # Final event:
+     assert events[-1]['location']['message']['text'].startswith("call to ‘fprintf’ from within signal handler")
diff -Nrcpad gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif
*** gcc-16-20250622/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif	Sun Jun 29 22:34:01 2025
***************
*** 2,7 ****
--- 2,9 ----
  
     The dg directives were stripped out from the generated .sarif
     to avoid confusing DejaGnu for this test.   */
+ /* { dg-additional-options "-fdiagnostics-add-output=experimental-html:file=signal-1.c.sarif.html,javascript=no" } */
+ /* { dg-additional-options "-fdiagnostics-add-output=sarif:file=signal-1.c.roundtrip.sarif" } */
  
  {"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
   "version": "2.1.0",
*************** In function 'custom_logger':
*** 211,213 ****
--- 213,223 ----
                    |      |   (7) call to ‘fprintf’ from within signal handler
                    |
     { dg-end-multiline-output "" } */
+ 
+ /* Use a Python script to verify various properties about the generated
+    .html file:
+    { dg-final { run-html-pytest signal-1.c.sarif "2.1.0-valid/signal-1-check-html.py" } } */
+ 
+ /* Use a Python script to verify various properties about the *generated*
+    .sarif file:
+    { dg-final { run-sarif-pytest signal-1.c.roundtrip "2.1.0-valid/signal-1-check-sarif-roundtrip.py" } } */
diff -Nrcpad gcc-16-20250622/gcc/timevar.def gcc-16-20250629/gcc/timevar.def
*** gcc-16-20250622/gcc/timevar.def	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/timevar.def	Sun Jun 29 22:34:01 2025
*************** DEFTIMEVAR (TV_WHOPR_LTRANS          , "
*** 101,106 ****
--- 101,107 ----
  DEFTIMEVAR (TV_IPA_REFERENCE         , "ipa reference")
  DEFTIMEVAR (TV_IPA_PROFILE           , "ipa profile")
  DEFTIMEVAR (TV_IPA_AUTOFDO           , "auto profile")
+ DEFTIMEVAR (TV_IPA_AUTOFDO_OFFLINE   , "auto profile offline")
  DEFTIMEVAR (TV_IPA_PURE_CONST        , "ipa pure const")
  DEFTIMEVAR (TV_IPA_ICF		     , "ipa icf")
  DEFTIMEVAR (TV_IPA_PTA               , "ipa points-to")
diff -Nrcpad gcc-16-20250622/gcc/toplev.cc gcc-16-20250629/gcc/toplev.cc
*** gcc-16-20250622/gcc/toplev.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/toplev.cc	Sun Jun 29 22:34:01 2025
*************** internal_error_reentered (diagnostic_con
*** 1029,1035 ****
  static void
  internal_error_function (diagnostic_context *, const char *, va_list *)
  {
!   global_dc->m_internal_error = internal_error_reentered;
    warn_if_plugins ();
    emergency_dump_function ();
  }
--- 1029,1035 ----
  static void
  internal_error_function (diagnostic_context *, const char *, va_list *)
  {
!   global_dc->set_internal_error_callback (internal_error_reentered);
    warn_if_plugins ();
    emergency_dump_function ();
  }
*************** general_init (const char *argv0, bool in
*** 1091,1097 ****
      = global_options_init.x_flag_show_column;
    global_dc->set_show_highlight_colors
      (global_options_init.x_flag_diagnostics_show_highlight_colors);
!   global_dc->m_internal_error = internal_error_function;
    const unsigned lang_mask = lang_hooks.option_lang_mask ();
    global_dc->set_option_manager
      (std::make_unique<compiler_diagnostic_option_manager> (*global_dc,
--- 1091,1097 ----
      = global_options_init.x_flag_show_column;
    global_dc->set_show_highlight_colors
      (global_options_init.x_flag_diagnostics_show_highlight_colors);
!   global_dc->set_internal_error_callback (internal_error_function);
    const unsigned lang_mask = lang_hooks.option_lang_mask ();
    global_dc->set_option_manager
      (std::make_unique<compiler_diagnostic_option_manager> (*global_dc,
*************** process_options ()
*** 1289,1295 ****
  
    /* Avoid any informative notes in the second run of -fcompare-debug.  */
    if (flag_compare_debug)
!     diagnostic_inhibit_notes (global_dc);
  
    if (flag_section_anchors && !target_supports_section_anchors_p ())
      {
--- 1289,1295 ----
  
    /* Avoid any informative notes in the second run of -fcompare-debug.  */
    if (flag_compare_debug)
!     global_dc->inhibit_notes ();
  
    if (flag_section_anchors && !target_supports_section_anchors_p ())
      {
diff -Nrcpad gcc-16-20250622/gcc/tree-call-cdce.cc gcc-16-20250629/gcc/tree-call-cdce.cc
*** gcc-16-20250622/gcc/tree-call-cdce.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-call-cdce.cc	Sun Jun 29 22:34:01 2025
*************** edom_only_function (gcall *call)
*** 353,360 ****
      CASE_FLT_FN_FLOATN_NX (BUILT_IN_ACOS):
      CASE_FLT_FN (BUILT_IN_ASIN):
      CASE_FLT_FN_FLOATN_NX (BUILT_IN_ASIN):
-     CASE_FLT_FN (BUILT_IN_ATAN):
-     CASE_FLT_FN_FLOATN_NX (BUILT_IN_ATAN):
      CASE_FLT_FN (BUILT_IN_COS):
      CASE_FLT_FN_FLOATN_NX (BUILT_IN_COS):
      CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
--- 353,358 ----
diff -Nrcpad gcc-16-20250622/gcc/tree-inline.cc gcc-16-20250629/gcc/tree-inline.cc
*** gcc-16-20250622/gcc/tree-inline.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-inline.cc	Sun Jun 29 22:34:01 2025
*************** expand_call_inline (basic_block bb, gimp
*** 5018,5023 ****
--- 5018,5026 ----
  	loc = LOCATION_LOCUS (DECL_SOURCE_LOCATION (fn));
        if (loc == UNKNOWN_LOCATION)
  	loc = BUILTINS_LOCATION;
+       if (has_discriminator (gimple_location (stmt)))
+ 	loc = location_with_discriminator
+ 		(loc, get_discriminator_from_loc (gimple_location (stmt)));
        id->block = make_node (BLOCK);
        BLOCK_ABSTRACT_ORIGIN (id->block) = DECL_ORIGIN (fn);
        BLOCK_SOURCE_LOCATION (id->block) = loc;
diff -Nrcpad gcc-16-20250622/gcc/tree-pass.h gcc-16-20250629/gcc/tree-pass.h
*** gcc-16-20250622/gcc/tree-pass.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-pass.h	Sun Jun 29 22:34:01 2025
*************** extern simple_ipa_opt_pass *make_pass_ip
*** 520,525 ****
--- 520,527 ----
  extern simple_ipa_opt_pass *make_pass_ipa_strub (gcc::context *ctxt);
  extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
  extern simple_ipa_opt_pass *make_pass_ipa_auto_profile (gcc::context *ctxt);
+ extern simple_ipa_opt_pass *make_pass_ipa_auto_profile_offline
+ 		(gcc::context *ctxt);
  
  extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
  extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
diff -Nrcpad gcc-16-20250622/gcc/tree-ssa-loop-ivopts.cc gcc-16-20250629/gcc/tree-ssa-loop-ivopts.cc
*** gcc-16-20250622/gcc/tree-ssa-loop-ivopts.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-ssa-loop-ivopts.cc	Sun Jun 29 22:34:01 2025
*************** idx_record_use (tree base, tree *idx,
*** 2117,2127 ****
     signedness of TOP and BOT.  */
  
  static bool
! constant_multiple_of (tree top, tree bot, widest_int *mul)
  {
    aff_tree aff_top, aff_bot;
!   tree_to_aff_combination (top, TREE_TYPE (top), &aff_top);
!   tree_to_aff_combination (bot, TREE_TYPE (bot), &aff_bot);
    poly_widest_int poly_mul;
    if (aff_combination_constant_multiple_p (&aff_top, &aff_bot, &poly_mul)
        && poly_mul.is_constant (mul))
--- 2117,2131 ----
     signedness of TOP and BOT.  */
  
  static bool
! constant_multiple_of (tree top, tree bot, widest_int *mul,
! 		      struct ivopts_data *data)
  {
    aff_tree aff_top, aff_bot;
!   tree_to_aff_combination_expand (top, TREE_TYPE (top), &aff_top,
! 				  &data->name_expansion_cache);
!   tree_to_aff_combination_expand (bot, TREE_TYPE (bot), &aff_bot,
! 				  &data->name_expansion_cache);
! 
    poly_widest_int poly_mul;
    if (aff_combination_constant_multiple_p (&aff_top, &aff_bot, &poly_mul)
        && poly_mul.is_constant (mul))
*************** determine_common_wider_type (tree *a, tr
*** 3945,3957 ****
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in LOOP.  The expression is stored in two parts in a
!    decomposed form.  The invariant part is stored in AFF_INV; while variant
!    part in AFF_VAR.  Store ratio of CAND.step over USE.step in PRAT if it's
!    non-null.  Returns false if USE cannot be expressed using CAND.  */
  
  static bool
! get_computation_aff_1 (class loop *loop, gimple *at, struct iv_use *use,
  		       struct iv_cand *cand, class aff_tree *aff_inv,
  		       class aff_tree *aff_var, widest_int *prat = NULL)
  {
--- 3949,3962 ----
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in DATA's current loop.  The expression is stored in
!    two parts in a decomposed form.  The invariant part is stored in AFF_INV;
!    while variant part in AFF_VAR.  Store ratio of CAND.step over USE.step in
!    PRAT if it's non-null.  Returns false if USE cannot be expressed using
!    CAND.  */
  
  static bool
! get_computation_aff_1 (struct ivopts_data *data, gimple *at, struct iv_use *use,
  		       struct iv_cand *cand, class aff_tree *aff_inv,
  		       class aff_tree *aff_var, widest_int *prat = NULL)
  {
*************** get_computation_aff_1 (class loop *loop,
*** 3966,3972 ****
    if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype))
      return false;
  
!   var = var_at_stmt (loop, cand, at);
    uutype = unsigned_type_for (utype);
  
    /* If the conversion is not noop, perform it.  */
--- 3971,3977 ----
    if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype))
      return false;
  
!   var = var_at_stmt (data->current_loop, cand, at);
    uutype = unsigned_type_for (utype);
  
    /* If the conversion is not noop, perform it.  */
*************** get_computation_aff_1 (class loop *loop,
*** 4011,4017 ****
        gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
        rat = 1;
      }
!   else if (!constant_multiple_of (ustep, cstep, &rat))
      return false;
  
    if (prat)
--- 4016,4022 ----
        gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
        rat = 1;
      }
!   else if (!constant_multiple_of (ustep, cstep, &rat, data))
      return false;
  
    if (prat)
*************** get_computation_aff_1 (class loop *loop,
*** 4030,4036 ****
    tree_to_aff_combination (var, uutype, aff_var);
  
    /* We need to shift the value if we are after the increment.  */
!   if (stmt_after_increment (loop, cand, at))
      {
        aff_tree cstep_aff;
  
--- 4035,4041 ----
    tree_to_aff_combination (var, uutype, aff_var);
  
    /* We need to shift the value if we are after the increment.  */
!   if (stmt_after_increment (data->current_loop, cand, at))
      {
        aff_tree cstep_aff;
  
*************** get_computation_aff_1 (class loop *loop,
*** 4053,4068 ****
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in LOOP.  The expression is stored in a decomposed
!    form into AFF.  Returns false if USE cannot be expressed using CAND.  */
  
  static bool
! get_computation_aff (class loop *loop, gimple *at, struct iv_use *use,
  		     struct iv_cand *cand, class aff_tree *aff)
  {
    aff_tree aff_var;
  
!   if (!get_computation_aff_1 (loop, at, use, cand, aff, &aff_var))
      return false;
  
    aff_combination_add (aff, &aff_var);
--- 4058,4074 ----
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in DATA's current loop.  The expression is stored in a
!    decomposed form into AFF.  Returns false if USE cannot be expressed using
!    CAND.  */
  
  static bool
! get_computation_aff (struct ivopts_data *data, gimple *at, struct iv_use *use,
  		     struct iv_cand *cand, class aff_tree *aff)
  {
    aff_tree aff_var;
  
!   if (!get_computation_aff_1 (data, at, use, cand, aff, &aff_var))
      return false;
  
    aff_combination_add (aff, &aff_var);
*************** get_use_type (struct iv_use *use)
*** 4092,4107 ****
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in LOOP.  The computation is unshared.  */
  
  static tree
! get_computation_at (class loop *loop, gimple *at,
  		    struct iv_use *use, struct iv_cand *cand)
  {
    aff_tree aff;
    tree type = get_use_type (use);
  
!   if (!get_computation_aff (loop, at, use, cand, &aff))
      return NULL_TREE;
    unshare_aff_combination (&aff);
    return fold_convert (type, aff_combination_to_tree (&aff));
--- 4098,4114 ----
  }
  
  /* Determines the expression by that USE is expressed from induction variable
!    CAND at statement AT in DATA's current loop.  The computation is
!    unshared.  */
  
  static tree
! get_computation_at (struct ivopts_data *data, gimple *at,
  		    struct iv_use *use, struct iv_cand *cand)
  {
    aff_tree aff;
    tree type = get_use_type (use);
  
!   if (!get_computation_aff (data, at, use, cand, &aff))
      return NULL_TREE;
    unshare_aff_combination (&aff);
    return fold_convert (type, aff_combination_to_tree (&aff));
*************** get_computation_at (class loop *loop, gi
*** 4111,4120 ****
     is more expensive.  Intended for debug stmts.  */
  
  static tree
! get_debug_computation_at (class loop *loop, gimple *at,
  			  struct iv_use *use, struct iv_cand *cand)
  {
!   if (tree ret = get_computation_at (loop, at, use, cand))
      return ret;
  
    tree ubase = use->iv->base, ustep = use->iv->step;
--- 4118,4127 ----
     is more expensive.  Intended for debug stmts.  */
  
  static tree
! get_debug_computation_at (struct ivopts_data *data, gimple *at,
  			  struct iv_use *use, struct iv_cand *cand)
  {
!   if (tree ret = get_computation_at (data, at, use, cand))
      return ret;
  
    tree ubase = use->iv->base, ustep = use->iv->step;
*************** get_debug_computation_at (class loop *lo
*** 4131,4137 ****
       try to express
       use = ubase + (var - cbase) / ratio.  */
    if (!constant_multiple_of (cstep, fold_convert (TREE_TYPE (cstep), ustep),
! 			     &rat))
      return NULL_TREE;
  
    bool neg_p = false;
--- 4138,4144 ----
       try to express
       use = ubase + (var - cbase) / ratio.  */
    if (!constant_multiple_of (cstep, fold_convert (TREE_TYPE (cstep), ustep),
! 			     &rat, data))
      return NULL_TREE;
  
    bool neg_p = false;
*************** get_debug_computation_at (class loop *lo
*** 4160,4166 ****
        && TYPE_PRECISION (utype) + bits > TYPE_PRECISION (ctype))
      return NULL_TREE;
  
!   var = var_at_stmt (loop, cand, at);
  
    if (POINTER_TYPE_P (ctype))
      {
--- 4167,4173 ----
        && TYPE_PRECISION (utype) + bits > TYPE_PRECISION (ctype))
      return NULL_TREE;
  
!   var = var_at_stmt (data->current_loop, cand, at);
  
    if (POINTER_TYPE_P (ctype))
      {
*************** get_debug_computation_at (class loop *lo
*** 4170,4176 ****
        var = fold_convert (ctype, var);
      }
  
!   if (stmt_after_increment (loop, cand, at))
      var = fold_build2 (MINUS_EXPR, TREE_TYPE (var), var,
  		       unshare_expr (cstep));
  
--- 4177,4183 ----
        var = fold_convert (ctype, var);
      }
  
!   if (stmt_after_increment (data->current_loop, cand, at))
      var = fold_build2 (MINUS_EXPR, TREE_TYPE (var), var,
  		       unshare_expr (cstep));
  
*************** get_computation_cost (struct ivopts_data
*** 4873,4880 ****
  	return infinite_cost;
      }
  
!   if (!get_computation_aff_1 (data->current_loop, at, use,
! 			      cand, &aff_inv, &aff_var, &rat)
        || !wi::fits_shwi_p (rat))
      return infinite_cost;
  
--- 4880,4886 ----
  	return infinite_cost;
      }
  
!   if (!get_computation_aff_1 (data, at, use, cand, &aff_inv, &aff_var, &rat)
        || !wi::fits_shwi_p (rat))
      return infinite_cost;
  
*************** determine_group_iv_cost_address (struct
*** 5015,5022 ****
  	sum_cost = infinite_cost;
      }
  
-   /* Uses in a group can share setup code, so only add setup cost once.  */
-   cost -= cost.scratch;
    /* Compute and add costs for rest uses of this group.  */
    for (i = 1; i < group->vuses.length () && !sum_cost.infinite_cost_p (); i++)
      {
--- 5021,5026 ----
*************** determine_group_iv_cost_address (struct
*** 5032,5038 ****
  	    if (!inv_exprs)
  	      inv_exprs = BITMAP_ALLOC (NULL);
  
! 	    bitmap_set_bit (inv_exprs, inv_expr->id);
  	  }
        sum_cost += cost;
      }
--- 5036,5047 ----
  	    if (!inv_exprs)
  	      inv_exprs = BITMAP_ALLOC (NULL);
  
! 	    /* Uses in a group can share setup code,
! 	       so only add setup cost once.  */
! 	    if (bitmap_bit_p (inv_exprs, inv_expr->id))
! 	      cost -= cost.scratch;
! 	    else
! 	      bitmap_set_bit (inv_exprs, inv_expr->id);
  	  }
        sum_cost += cost;
      }
*************** rewrite_use_nonlinear_expr (struct ivopt
*** 7355,7362 ****
      }
  
    aff_tree aff_inv, aff_var;
!   if (!get_computation_aff_1 (data->current_loop, use->stmt,
! 			      use, cand, &aff_inv, &aff_var))
      gcc_unreachable ();
  
    unshare_aff_combination (&aff_inv);
--- 7364,7370 ----
      }
  
    aff_tree aff_inv, aff_var;
!   if (!get_computation_aff_1 (data, use->stmt, use, cand, &aff_inv, &aff_var))
      gcc_unreachable ();
  
    unshare_aff_combination (&aff_inv);
*************** rewrite_use_address (struct ivopts_data
*** 7553,7559 ****
    bool ok;
  
    adjust_iv_update_pos (cand, use);
!   ok = get_computation_aff (data->current_loop, use->stmt, use, cand, &aff);
    gcc_assert (ok);
    unshare_aff_combination (&aff);
  
--- 7561,7567 ----
    bool ok;
  
    adjust_iv_update_pos (cand, use);
!   ok = get_computation_aff (data, use->stmt, use, cand, &aff);
    gcc_assert (ok);
    unshare_aff_combination (&aff);
  
*************** rewrite_use_compare (struct ivopts_data
*** 7656,7662 ****
  
    /* The induction variable elimination failed; just express the original
       giv.  */
!   comp = get_computation_at (data->current_loop, use->stmt, use, cand);
    gcc_assert (comp != NULL_TREE);
    gcc_assert (use->op_p != NULL);
    *use->op_p = force_gimple_operand_gsi (&bsi, comp, true,
--- 7664,7670 ----
  
    /* The induction variable elimination failed; just express the original
       giv.  */
!   comp = get_computation_at (data, use->stmt, use, cand);
    gcc_assert (comp != NULL_TREE);
    gcc_assert (use->op_p != NULL);
    *use->op_p = force_gimple_operand_gsi (&bsi, comp, true,
*************** remove_unused_ivs (struct ivopts_data *d
*** 7787,7793 ****
  		  if (best_cand == NULL || best_pref < cand_pref)
  		    {
  		      tree this_comp
! 			= get_debug_computation_at (data->current_loop,
  						    SSA_NAME_DEF_STMT (def),
  						    &dummy_use, cand);
  		      if (this_comp)
--- 7795,7801 ----
  		  if (best_cand == NULL || best_pref < cand_pref)
  		    {
  		      tree this_comp
! 			= get_debug_computation_at (data,
  						    SSA_NAME_DEF_STMT (def),
  						    &dummy_use, cand);
  		      if (this_comp)
diff -Nrcpad gcc-16-20250622/gcc/tree-ssa-propagate.h gcc-16-20250629/gcc/tree-ssa-propagate.h
*** gcc-16-20250622/gcc/tree-ssa-propagate.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-ssa-propagate.h	Sun Jun 29 22:34:01 2025
*************** class substitute_and_fold_engine : publi
*** 102,111 ****
    substitute_and_fold_engine (bool fold_all_stmts = false)
      : fold_all_stmts (fold_all_stmts) { }
  
!   virtual tree value_of_expr (tree expr, gimple * = NULL) = 0;
    virtual tree value_on_edge (edge, tree expr) override;
    virtual tree value_of_stmt (gimple *, tree name = NULL) override;
!   virtual bool range_of_expr (vrange &r, tree expr, gimple * = NULL);
  
    virtual ~substitute_and_fold_engine (void) { }
    virtual bool fold_stmt (gimple_stmt_iterator *) { return false; }
--- 102,111 ----
    substitute_and_fold_engine (bool fold_all_stmts = false)
      : fold_all_stmts (fold_all_stmts) { }
  
!   virtual tree value_of_expr (tree expr, gimple * = NULL) override = 0;
    virtual tree value_on_edge (edge, tree expr) override;
    virtual tree value_of_stmt (gimple *, tree name = NULL) override;
!   virtual bool range_of_expr (vrange &r, tree expr, gimple * = NULL) override;
  
    virtual ~substitute_and_fold_engine (void) { }
    virtual bool fold_stmt (gimple_stmt_iterator *) { return false; }
diff -Nrcpad gcc-16-20250622/gcc/tree-ssa-sccvn.cc gcc-16-20250629/gcc/tree-ssa-sccvn.cc
*** gcc-16-20250622/gcc/tree-ssa-sccvn.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-ssa-sccvn.cc	Sun Jun 29 22:34:01 2025
*************** fully_constant_vn_reference_p (vn_refere
*** 1615,1620 ****
--- 1615,1622 ----
  	      ++i;
  	      break;
  	    }
+ 	  if (operands[i].reverse)
+ 	    return NULL_TREE;
  	  if (known_eq (operands[i].off, -1))
  	    return NULL_TREE;
  	  off += operands[i].off;
diff -Nrcpad gcc-16-20250622/gcc/tree-tailcall.cc gcc-16-20250629/gcc/tree-tailcall.cc
*** gcc-16-20250622/gcc/tree-tailcall.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-tailcall.cc	Sun Jun 29 22:34:01 2025
*************** empty_eh_cleanup (basic_block bb, int *e
*** 528,533 ****
--- 528,537 ----
  	  *eh_has_tsan_func_exit = 1;
  	  continue;
  	}
+       if (eh_has_tsan_func_exit
+ 	  && sanitize_flags_p (SANITIZE_ADDRESS)
+ 	  && asan_mark_p (g, ASAN_MARK_POISON))
+ 	continue;
        if (is_gimple_resx (g) && stmt_can_throw_external (cfun, g))
  	return true;
        return false;
*************** find_tail_calls (basic_block bb, struct
*** 619,624 ****
--- 623,634 ----
  	    continue;
  	}
  
+       if (cfun->has_musttail
+ 	  && sanitize_flags_p (SANITIZE_ADDRESS)
+ 	  && asan_mark_p (stmt, ASAN_MARK_POISON)
+ 	  && diag_musttail)
+ 	continue;
+ 
        if (!last_stmt)
  	last_stmt = stmt;
        /* Check for a call.  */
*************** find_tail_calls (basic_block bb, struct
*** 995,1000 ****
--- 1005,1016 ----
  	  continue;
  	}
  
+       if (cfun->has_musttail
+ 	  && sanitize_flags_p (SANITIZE_ADDRESS)
+ 	  && asan_mark_p (stmt, ASAN_MARK_POISON)
+ 	  && diag_musttail)
+ 	continue;
+ 
        if (gimple_code (stmt) != GIMPLE_ASSIGN)
  	{
  	  maybe_error_musttail (call, _("unhandled code after call"),
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-data-refs.cc gcc-16-20250629/gcc/tree-vect-data-refs.cc
*** gcc-16-20250622/gcc/tree-vect-data-refs.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-data-refs.cc	Sun Jun 29 22:34:01 2025
*************** vect_peeling_hash_choose_best_peeling (h
*** 2111,2119 ****
     return res;
  }
  
! /* Return true if the new peeling NPEEL is supported.  */
  
! static bool
  vect_peeling_supportable (loop_vec_info loop_vinfo, dr_vec_info *dr0_info,
  			  unsigned npeel)
  {
--- 2111,2120 ----
     return res;
  }
  
! /* Return if vectorization is definitely, possibly, or unlikely to be
!    supportable after loop peeling.  */
  
! static enum peeling_support
  vect_peeling_supportable (loop_vec_info loop_vinfo, dr_vec_info *dr0_info,
  			  unsigned npeel)
  {
*************** vect_peeling_supportable (loop_vec_info
*** 2123,2130 ****
    bool dr0_alignment_known_p
      = known_alignment_for_access_p (dr0_info,
  				    STMT_VINFO_VECTYPE (dr0_info->stmt));
  
!   /* Ensure that all data refs can be vectorized after the peel.  */
    for (data_reference *dr : datarefs)
      {
        if (dr == dr0_info->dr)
--- 2124,2134 ----
    bool dr0_alignment_known_p
      = known_alignment_for_access_p (dr0_info,
  				    STMT_VINFO_VECTYPE (dr0_info->stmt));
+   bool has_unsupported_dr_p = false;
+   unsigned int dr0_step = tree_to_shwi (DR_STEP (dr0_info->dr));
+   int known_unsupported_misalignment = DR_MISALIGNMENT_UNKNOWN;
  
!   /* Check if each data ref can be vectorized after peeling.  */
    for (data_reference *dr : datarefs)
      {
        if (dr == dr0_info->dr)
*************** vect_peeling_supportable (loop_vec_info
*** 2152,2161 ****
  	= vect_supportable_dr_alignment (loop_vinfo, dr_info, vectype,
  					 misalignment);
        if (supportable_dr_alignment == dr_unaligned_unsupported)
! 	return false;
      }
  
!   return true;
  }
  
  /* Compare two data-references DRA and DRB to group them into chunks
--- 2156,2199 ----
  	= vect_supportable_dr_alignment (loop_vinfo, dr_info, vectype,
  					 misalignment);
        if (supportable_dr_alignment == dr_unaligned_unsupported)
! 	{
! 	  has_unsupported_dr_p = true;
! 
! 	  /* If unaligned unsupported DRs exist, we do following checks to see
! 	     if they can be mutually aligned to support vectorization.  If yes,
! 	     we can try peeling and create a runtime (mutual alignment) check
! 	     to guard the peeled loop.  If no, return PEELING_UNSUPPORTED.  */
! 
! 	  /* 1) If unaligned unsupported DRs have different alignment steps, the
! 		probability of DRs being mutually aligned is very low, and it's
! 		quite complex to check mutual alignment at runtime.  We return
! 		PEELING_UNSUPPORTED in this case.  */
! 	  if (tree_to_shwi (DR_STEP (dr)) != dr0_step)
! 	    return peeling_unsupported;
! 
! 	  /* 2) Based on above same alignment step condition, if one known
! 		misaligned DR has zero misalignment, or different misalignment
! 		amount from another known misaligned DR, peeling is unable to
! 		help make all these DRs aligned together.  We won't try peeling
! 		with versioning anymore.  */
! 	  int curr_dr_misalignment = dr_misalignment (dr_info, vectype);
! 	  if (curr_dr_misalignment == 0)
! 	    return peeling_unsupported;
! 	  if (known_unsupported_misalignment != DR_MISALIGNMENT_UNKNOWN)
! 	    {
! 	      if (curr_dr_misalignment != DR_MISALIGNMENT_UNKNOWN
! 		  && curr_dr_misalignment != known_unsupported_misalignment)
! 		return peeling_unsupported;
! 	    }
! 	  else
! 	    known_unsupported_misalignment = curr_dr_misalignment;
! 	}
      }
  
!   /* Vectorization is known to be supportable with peeling alone when there is
!      no unsupported DR.  */
!   return has_unsupported_dr_p ? peeling_maybe_supported
! 			      : peeling_known_supported;
  }
  
  /* Compare two data-references DRA and DRB to group them into chunks
*************** dr_align_group_sort_cmp (const void *dra
*** 2264,2283 ****
       }
  
       -- Possibility 3: combination of loop peeling and versioning:
!      for (i = 0; i < 3; i++){	# (scalar loop, not to be vectorized).
! 	x = q[i];
! 	p[i] = y;
!      }
!      if (p is aligned) {
! 	for (i = 3; i<N; i++){	# loop 3A
  	  x = q[i];			# DR_MISALIGNMENT(q) = 0
  	  p[i] = y;			# DR_MISALIGNMENT(p) = 0
  	}
       }
       else {
! 	for (i = 3; i<N; i++){	# loop 3B
! 	  x = q[i];			# DR_MISALIGNMENT(q) = 0
! 	  p[i] = y;			# DR_MISALIGNMENT(p) = unaligned
  	}
       }
  
--- 2302,2321 ----
       }
  
       -- Possibility 3: combination of loop peeling and versioning:
!      if (p & q are mutually aligned) {
! 	for (i=0; i<3; i++){	# (peeled loop iterations).
! 	  x = q[i];
! 	  p[i] = y;
! 	}
! 	for (i=3; i<N; i++){	# loop 3A
  	  x = q[i];			# DR_MISALIGNMENT(q) = 0
  	  p[i] = y;			# DR_MISALIGNMENT(p) = 0
  	}
       }
       else {
! 	for (i=0; i<N; i++){	# (scalar loop, not to be vectorized).
! 	  x = q[i];			# DR_MISALIGNMENT(q) = 3
! 	  p[i] = y;			# DR_MISALIGNMENT(p) = unknown
  	}
       }
  
*************** vect_enhance_data_refs_alignment (loop_v
*** 2296,2301 ****
--- 2334,2340 ----
    unsigned int i;
    bool do_peeling = false;
    bool do_versioning = false;
+   bool try_peeling_with_versioning = false;
    unsigned int npeel = 0;
    bool one_misalignment_known = false;
    bool one_misalignment_unknown = false;
*************** vect_enhance_data_refs_alignment (loop_v
*** 2361,2390 ****
    /* While cost model enhancements are expected in the future, the high level
       view of the code at this time is as follows:
  
!      A) If there is a misaligned access then see if peeling to align
!         this access can make all data references satisfy
!         vect_supportable_dr_alignment.  If so, update data structures
!         as needed and return true.
  
!      B) If peeling wasn't possible and there is a data reference with an
!         unknown misalignment that does not satisfy vect_supportable_dr_alignment
!         then see if loop versioning checks can be used to make all data
!         references satisfy vect_supportable_dr_alignment.  If so, update
!         data structures as needed and return true.
  
!      C) If neither peeling nor versioning were successful then return false if
!         any data reference does not satisfy vect_supportable_dr_alignment.
  
!      D) Return true (all data references satisfy vect_supportable_dr_alignment).
  
!      Note, Possibility 3 above (which is peeling and versioning together) is not
!      being done at this time.  */
  
    /* (1) Peeling to force alignment.  */
  
!   /* (1.1) Decide whether to perform peeling, and how many iterations to peel:
       Considerations:
!      + How many accesses will become aligned due to the peeling
       - How many accesses will become unaligned due to the peeling,
         and the cost of misaligned accesses.
       - The cost of peeling (the extra runtime checks, the increase
--- 2400,2437 ----
    /* While cost model enhancements are expected in the future, the high level
       view of the code at this time is as follows:
  
!      A) If there is a misaligned access then see if doing peeling alone can
! 	make all data references satisfy vect_supportable_dr_alignment.  If so,
! 	update data structures and return.
  
!      B) If peeling alone wasn't possible and there is a data reference with an
! 	unknown misalignment that does not satisfy vect_supportable_dr_alignment
! 	then we may use either of the following two approaches.
  
! 	B1) Try peeling with versioning: Add a runtime loop versioning check to
! 	    see if all unsupportable data references are mutually aligned, which
! 	    means they will be uniformly aligned after a certain amount of loop
! 	    peeling.  If peeling and versioning can be used together, set
! 	    LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT_P to TRUE and return.
  
! 	B2) Try versioning alone: Add a runtime loop versioning check to see if
! 	    all unsupportable data references are already uniformly aligned
! 	    without loop peeling.  If versioning can be applied alone, set
! 	    LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT_P to FALSE and return.
  
! 	Above B1 is more powerful and more likely to be adopted than B2.  But B2
! 	is still available and useful in some cases, for example, the cost model
! 	does not allow much peeling.
! 
!      C) If none of above was successful then the alignment was not enhanced,
! 	just return.  */
  
    /* (1) Peeling to force alignment.  */
  
!   /* (1.1) Decide whether to perform peeling, how many iterations to peel, and
!      if vectorization may be supported by peeling with versioning.
       Considerations:
!      - How many accesses will become aligned due to the peeling
       - How many accesses will become unaligned due to the peeling,
         and the cost of misaligned accesses.
       - The cost of peeling (the extra runtime checks, the increase
*************** vect_enhance_data_refs_alignment (loop_v
*** 2732,2740 ****
                               "Try peeling by %d\n", npeel);
          }
  
!       /* Ensure that all datarefs can be vectorized after the peel.  */
!       if (!vect_peeling_supportable (loop_vinfo, dr0_info, npeel))
! 	do_peeling = false;
  
        /* Check if all datarefs are supportable and log.  */
        if (do_peeling
--- 2779,2805 ----
                               "Try peeling by %d\n", npeel);
          }
  
!       /* Check how peeling for alignment can support vectorization.  Function
! 	 vect_peeling_supportable returns one of the three possible values:
! 	 - PEELING_KNOWN_SUPPORTED: indicates that we know all unsupported
! 	   datarefs can be aligned after peeling.  We can use peeling alone.
! 	 - PEELING_MAYBE_SUPPORTED: indicates that peeling may be able to make
! 	   these datarefs aligned but we are not sure about it at compile time.
! 	   We will try peeling with versioning to add a runtime check to guard
! 	   the peeled loop.
! 	 - PEELING_UNSUPPORTED: indicates that peeling is almost impossible to
! 	   support vectorization.  We will stop trying peeling.  */
!       switch (vect_peeling_supportable (loop_vinfo, dr0_info, npeel))
! 	{
! 	case peeling_known_supported:
! 	  break;
! 	case peeling_maybe_supported:
! 	  try_peeling_with_versioning = true;
! 	  break;
! 	case peeling_unsupported:
! 	  do_peeling = false;
! 	  break;
! 	}
  
        /* Check if all datarefs are supportable and log.  */
        if (do_peeling
*************** vect_enhance_data_refs_alignment (loop_v
*** 2811,2817 ****
--- 2876,2886 ----
  
  		vect_update_misalignment_for_peel (dr_info, dr0_info, npeel);
  	      }
+ 	}
  
+       if (do_peeling && !try_peeling_with_versioning)
+ 	{
+ 	  /* Update data structures if peeling will be applied alone.  */
            LOOP_VINFO_UNALIGNED_DR (loop_vinfo) = dr0_info;
            if (npeel)
              LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) = npeel;
*************** vect_enhance_data_refs_alignment (loop_v
*** 2939,2944 ****
--- 3008,3018 ----
          LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).truncate (0);
      }
  
+   /* If we are trying peeling with versioning but versioning is disabled for
+      some reason, peeling should be turned off together.  */
+   if (try_peeling_with_versioning && !do_versioning)
+     do_peeling = false;
+ 
    if (do_versioning)
      {
        const vec<stmt_vec_info> &may_misalign_stmts
*************** vect_enhance_data_refs_alignment (loop_v
*** 2958,2969 ****
                               "Alignment of access forced using versioning.\n");
          }
  
!       if (dump_enabled_p ())
!         dump_printf_loc (MSG_NOTE, vect_location,
!                          "Versioning for alignment will be applied.\n");
! 
!       /* Peeling and versioning can't be done together at this time.  */
!       gcc_assert (! (do_peeling && do_versioning));
  
        return opt_result::success ();
      }
--- 3032,3059 ----
                               "Alignment of access forced using versioning.\n");
          }
  
!       if (do_peeling)
! 	{
! 	  /* This point is reached if peeling and versioning are used together
! 	     to ensure alignment.  Update data structures to make sure the loop
! 	     is correctly peeled and a right runtime check is added for loop
! 	     versioning.  */
! 	  gcc_assert (try_peeling_with_versioning);
! 	  LOOP_VINFO_UNALIGNED_DR (loop_vinfo) = dr0_info;
! 	  LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) = -1;
! 	  LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT (loop_vinfo) = true;
! 	  if (dump_enabled_p ())
! 	    dump_printf_loc (MSG_NOTE, vect_location,
! 			     "Both peeling and versioning will be applied.\n");
! 	}
!       else
! 	{
! 	  /* This point is reached if versioning is used alone.  */
! 	  LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT (loop_vinfo) = false;
! 	  if (dump_enabled_p ())
! 	    dump_printf_loc (MSG_NOTE, vect_location,
! 			     "Versioning for alignment will be applied.\n");
! 	}
  
        return opt_result::success ();
      }
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-loop-manip.cc gcc-16-20250629/gcc/tree-vect-loop-manip.cc
*** gcc-16-20250622/gcc/tree-vect-loop-manip.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-loop-manip.cc	Sun Jun 29 22:34:01 2025
*************** vect_gen_vector_loop_niters (loop_vec_in
*** 2794,2800 ****
    tree niters_vector, step_vector, type = TREE_TYPE (niters);
    poly_uint64 vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
    edge pe = loop_preheader_edge (LOOP_VINFO_LOOP (loop_vinfo));
-   tree log_vf = NULL_TREE;
  
    /* If epilogue loop is required because of data accesses with gaps, we
       subtract one iteration from the total number of iterations here for
--- 2794,2799 ----
*************** vect_gen_vector_loop_niters (loop_vec_in
*** 2820,2841 ****
    if (vf.is_constant (&const_vf)
        && !LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
      {
!       /* Create: niters >> log2(vf) */
        /* If it's known that niters == number of latch executions + 1 doesn't
! 	 overflow, we can generate niters >> log2(vf); otherwise we generate
! 	 (niters - vf) >> log2(vf) + 1 by using the fact that we know ratio
  	 will be at least one.  */
!       log_vf = build_int_cst (type, exact_log2 (const_vf));
        if (niters_no_overflow)
! 	niters_vector = fold_build2 (RSHIFT_EXPR, type, ni_minus_gap, log_vf);
        else
  	niters_vector
  	  = fold_build2 (PLUS_EXPR, type,
! 			 fold_build2 (RSHIFT_EXPR, type,
  				      fold_build2 (MINUS_EXPR, type,
  						   ni_minus_gap,
! 						   build_int_cst (type, vf)),
! 				      log_vf),
  			 build_int_cst (type, 1));
        step_vector = build_one_cst (type);
      }
--- 2819,2843 ----
    if (vf.is_constant (&const_vf)
        && !LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo))
      {
!       /* Create: niters / vf, which is equivalent to niters >> log2(vf) when
! 		 vf is a power of two, and when not we approximate using a
! 		 truncating division.  */
        /* If it's known that niters == number of latch executions + 1 doesn't
! 	 overflow, we can generate niters / vf; otherwise we generate
! 	 (niters - vf) / vf + 1 by using the fact that we know ratio
  	 will be at least one.  */
!       tree var_vf = build_int_cst (type, const_vf);
        if (niters_no_overflow)
! 	niters_vector = fold_build2 (TRUNC_DIV_EXPR, type, ni_minus_gap,
! 				     var_vf);
        else
  	niters_vector
  	  = fold_build2 (PLUS_EXPR, type,
! 			 fold_build2 (TRUNC_DIV_EXPR, type,
  				      fold_build2 (MINUS_EXPR, type,
  						   ni_minus_gap,
! 						   var_vf),
! 				      var_vf),
  			 build_int_cst (type, 1));
        step_vector = build_one_cst (type);
      }
*************** vect_gen_vector_loop_niters (loop_vec_in
*** 2854,2869 ****
        /* Peeling algorithm guarantees that vector loop bound is at least ONE,
  	 we set range information to make niters analyzer's life easier.
  	 Note the number of latch iteration value can be TYPE_MAX_VALUE so
! 	 we have to represent the vector niter TYPE_MAX_VALUE + 1 >> log_vf.  */
!       if (stmts != NULL && log_vf)
  	{
  	  if (niters_no_overflow)
  	    {
  	      int_range<1> vr (type,
  			       wi::one (TYPE_PRECISION (type)),
! 			       wi::rshift (wi::max_value (TYPE_PRECISION (type),
! 							  TYPE_SIGN (type)),
! 					   exact_log2 (const_vf),
  					   TYPE_SIGN (type)));
  	      set_range_info (niters_vector, vr);
  	    }
--- 2856,2872 ----
        /* Peeling algorithm guarantees that vector loop bound is at least ONE,
  	 we set range information to make niters analyzer's life easier.
  	 Note the number of latch iteration value can be TYPE_MAX_VALUE so
! 	 we have to represent the vector niter TYPE_MAX_VALUE + 1 / vf.  */
!       if (stmts != NULL && const_vf > 0)
  	{
  	  if (niters_no_overflow)
  	    {
  	      int_range<1> vr (type,
  			       wi::one (TYPE_PRECISION (type)),
! 			       wi::div_trunc (wi::max_value
! 							(TYPE_PRECISION (type),
! 							 TYPE_SIGN (type)),
! 					   const_vf,
  					   TYPE_SIGN (type)));
  	      set_range_info (niters_vector, vr);
  	    }
*************** vect_gen_vector_loop_niters_mult_vf (loo
*** 2901,2913 ****
    /* We should be using a step_vector of VF if VF is variable.  */
    int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo).to_constant ();
    tree type = TREE_TYPE (niters_vector);
-   tree log_vf = build_int_cst (type, exact_log2 (vf));
    tree tree_vf = build_int_cst (type, vf);
    basic_block exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest;
  
    gcc_assert (niters_vector_mult_vf_ptr != NULL);
!   tree niters_vector_mult_vf = fold_build2 (LSHIFT_EXPR, type,
! 					    niters_vector, log_vf);
  
    /* If we've peeled a vector iteration then subtract one full vector
       iteration.  */
--- 2904,2915 ----
    /* We should be using a step_vector of VF if VF is variable.  */
    int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo).to_constant ();
    tree type = TREE_TYPE (niters_vector);
    tree tree_vf = build_int_cst (type, vf);
    basic_block exit_bb = LOOP_VINFO_IV_EXIT (loop_vinfo)->dest;
  
    gcc_assert (niters_vector_mult_vf_ptr != NULL);
!   tree niters_vector_mult_vf = fold_build2 (MULT_EXPR, type,
! 					    niters_vector, tree_vf);
  
    /* If we've peeled a vector iteration then subtract one full vector
       iteration.  */
*************** chain_cond_expr (tree *cond_expr, tree p
*** 3787,3796 ****
  
     Input:
     COND_EXPR  - input conditional expression.  New conditions will be chained
!                 with logical AND operation.
!    LOOP_VINFO - two fields of the loop information are used.
!                 LOOP_VINFO_PTR_MASK is the mask used to check the alignment.
!                 LOOP_VINFO_MAY_MISALIGN_STMTS contains the refs to be checked.
  
     Output:
     COND_EXPR_STMT_LIST - statements needed to construct the conditional
--- 3789,3799 ----
  
     Input:
     COND_EXPR  - input conditional expression.  New conditions will be chained
! 		with logical AND operation.
!    LOOP_VINFO - three fields of the loop information are used.
! 		LOOP_VINFO_PTR_MASK is the mask used to check the alignment.
! 		LOOP_VINFO_MAY_MISALIGN_STMTS contains the refs to be checked.
! 		LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT indicates which check applies.
  
     Output:
     COND_EXPR_STMT_LIST - statements needed to construct the conditional
*************** chain_cond_expr (tree *cond_expr, tree p
*** 3798,3804 ****
     The returned value is the conditional expression to be used in the if
     statement that controls which version of the loop gets executed at runtime.
  
!    The algorithm makes two assumptions:
       1) The number of bytes "n" in a vector is a power of 2.
       2) An address "a" is aligned if a%n is zero and that this
          test can be done as a&(n-1) == 0.  For example, for 16
--- 3801,3820 ----
     The returned value is the conditional expression to be used in the if
     statement that controls which version of the loop gets executed at runtime.
  
!    Based on the boolean value of LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT, we decide
!    which type of check should be applied and create two different expressions
!    accordingly.
!      1) When LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT is false, we see if all data refs
! 	to be checked are already aligned to an alignment boundary.  We create
! 	an expression of "(a_1 | a_2 | a_3 | ... | a_n) & mask", where "a_i" is
! 	the address of i'th data reference.
!      2) When LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT is true, we see if all data refs
! 	can be aligned to a boundary after a certain amount of peeling, in other
! 	words, their addresses have the same bottom bits according to the mask.
! 	We create "((a_1 ^ a_2) | (a_2 ^ a_3) | ... | (a_n-1 ^ a_n)) & mask",
! 	where "a_i" is the address of i'th data reference.
! 
!    Both algorithms make two assumptions:
       1) The number of bytes "n" in a vector is a power of 2.
       2) An address "a" is aligned if a%n is zero and that this
          test can be done as a&(n-1) == 0.  For example, for 16
*************** vect_create_cond_for_align_checks (loop_
*** 3816,3823 ****
    tree mask_cst;
    unsigned int i;
    tree int_ptrsize_type;
!   char tmp_name[20];
    tree or_tmp_name = NULL_TREE;
    tree and_tmp_name;
    gimple *and_stmt;
    tree ptrsize_zero;
--- 3832,3840 ----
    tree mask_cst;
    unsigned int i;
    tree int_ptrsize_type;
!   char tmp_name[30];
    tree or_tmp_name = NULL_TREE;
+   tree prev_addr_tmp_name = NULL_TREE;
    tree and_tmp_name;
    gimple *and_stmt;
    tree ptrsize_zero;
*************** vect_create_cond_for_align_checks (loop_
*** 3829,3844 ****
  
    int_ptrsize_type = signed_type_for (ptr_type_node);
  
!   /* Create expression (mask & (dr_1 || ... || dr_n)) where dr_i is the address
!      of the first vector of the i'th data reference. */
  
    FOR_EACH_VEC_ELT (may_misalign_stmts, i, stmt_info)
      {
        gimple_seq new_stmt_list = NULL;
        tree addr_base;
        tree addr_tmp_name;
        tree new_or_tmp_name;
!       gimple *addr_stmt, *or_stmt;
        tree vectype = STMT_VINFO_VECTYPE (stmt_info);
        bool negative = tree_int_cst_compare
  	(DR_STEP (STMT_VINFO_DATA_REF (stmt_info)), size_zero_node) < 0;
--- 3846,3864 ----
  
    int_ptrsize_type = signed_type_for (ptr_type_node);
  
!   /* If LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT is true, we should have at least two
!      datarefs to check the mutual alignment.  */
!   gcc_assert (may_misalign_stmts.length () > 1
! 	      || !LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT (loop_vinfo));
  
    FOR_EACH_VEC_ELT (may_misalign_stmts, i, stmt_info)
      {
        gimple_seq new_stmt_list = NULL;
        tree addr_base;
        tree addr_tmp_name;
+       tree xor_tmp_name;
        tree new_or_tmp_name;
!       gimple *addr_stmt, *or_stmt, *xor_stmt;
        tree vectype = STMT_VINFO_VECTYPE (stmt_info);
        bool negative = tree_int_cst_compare
  	(DR_STEP (STMT_VINFO_DATA_REF (stmt_info)), size_zero_node) < 0;
*************** vect_create_cond_for_align_checks (loop_
*** 3860,3879 ****
        addr_stmt = gimple_build_assign (addr_tmp_name, NOP_EXPR, addr_base);
        gimple_seq_add_stmt (cond_expr_stmt_list, addr_stmt);
  
!       /* The addresses are OR together.  */
! 
!       if (or_tmp_name != NULL_TREE)
!         {
!           /* create: or_tmp = or_tmp | addr_tmp */
!           sprintf (tmp_name, "orptrs%d", i);
! 	  new_or_tmp_name = make_temp_ssa_name (int_ptrsize_type, NULL, tmp_name);
! 	  or_stmt = gimple_build_assign (new_or_tmp_name, BIT_IOR_EXPR,
! 					 or_tmp_name, addr_tmp_name);
! 	  gimple_seq_add_stmt (cond_expr_stmt_list, or_stmt);
!           or_tmp_name = new_or_tmp_name;
!         }
        else
!         or_tmp_name = addr_tmp_name;
  
      } /* end for i */
  
--- 3880,3935 ----
        addr_stmt = gimple_build_assign (addr_tmp_name, NOP_EXPR, addr_base);
        gimple_seq_add_stmt (cond_expr_stmt_list, addr_stmt);
  
!       if (LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT (loop_vinfo))
! 	{
! 	  /* Create "((a_1 ^ a_2) | (a_2 ^ a_3) | ... | (a_n-1 ^ a_n)) & mask"
! 	     to check mutual alignment.  */
! 	  if (prev_addr_tmp_name != NULL_TREE)
! 	    {
! 	      sprintf (tmp_name, "xorptrs%d_%d", i - 1, i);
! 	      xor_tmp_name = make_temp_ssa_name (int_ptrsize_type, NULL,
! 						 tmp_name);
! 	      xor_stmt = gimple_build_assign (xor_tmp_name, BIT_XOR_EXPR,
! 					      prev_addr_tmp_name,
! 					      addr_tmp_name);
! 	      gimple_seq_add_stmt (cond_expr_stmt_list, xor_stmt);
! 	      if (or_tmp_name == NULL_TREE)
! 		{
! 		  /* Create the 1st XOR when the 2nd data ref is seen.  */
! 		  or_tmp_name = xor_tmp_name;
! 		}
! 	      else
! 		{
! 		  /* Create: or_tmp = or_tmp | new_xor_tmp.  */
! 		  sprintf (tmp_name, "orxors%d", i - 1);
! 		  new_or_tmp_name = make_temp_ssa_name (int_ptrsize_type, NULL,
! 							tmp_name);
! 		  or_stmt = gimple_build_assign (new_or_tmp_name, BIT_IOR_EXPR,
! 						 or_tmp_name, xor_tmp_name);
! 		  gimple_seq_add_stmt (cond_expr_stmt_list, or_stmt);
! 		  or_tmp_name = new_or_tmp_name;
! 		}
! 	    }
! 	  prev_addr_tmp_name = addr_tmp_name;
! 	}
        else
! 	{
! 	  /* Create: "(a_1 | a_2 | a_3 | ... | a_n) & mask" to check if all
! 	     addresses are already aligned.  */
! 	  if (or_tmp_name != NULL_TREE)
! 	    {
! 	      /* Create: or_tmp = or_tmp | addr_tmp.  */
! 	      sprintf (tmp_name, "orptrs%d", i);
! 	      new_or_tmp_name = make_temp_ssa_name (int_ptrsize_type, NULL,
! 						    tmp_name);
! 	      or_stmt = gimple_build_assign (new_or_tmp_name, BIT_IOR_EXPR,
! 					     or_tmp_name, addr_tmp_name);
! 	      gimple_seq_add_stmt (cond_expr_stmt_list, or_stmt);
! 	      or_tmp_name = new_or_tmp_name;
! 	    }
! 	  else
! 	    or_tmp_name = addr_tmp_name;
! 	}
  
      } /* end for i */
  
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-loop.cc gcc-16-20250629/gcc/tree-vect-loop.cc
*** gcc-16-20250622/gcc/tree-vect-loop.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-loop.cc	Sun Jun 29 22:34:01 2025
*************** _loop_vec_info::_loop_vec_info (class lo
*** 1069,1078 ****
--- 1069,1080 ----
      using_decrementing_iv_p (false),
      using_select_vl_p (false),
      epil_using_partial_vectors_p (false),
+     allow_mutual_alignment (false),
      partial_load_store_bias (0),
      peeling_for_gaps (false),
      peeling_for_niter (false),
      early_breaks (false),
+     user_unroll (false),
      no_data_dependencies (false),
      has_mask_store (false),
      scalar_loop_scaling (profile_probability::uninitialized ()),
*************** vect_analyze_loop_1 (class loop *loop, v
*** 3428,3454 ****
  		     res ? "succeeded" : "failed",
  		     GET_MODE_NAME (loop_vinfo->vector_mode));
  
!   if (res && !LOOP_VINFO_EPILOGUE_P (loop_vinfo) && suggested_unroll_factor > 1)
      {
!       if (dump_enabled_p ())
! 	dump_printf_loc (MSG_NOTE, vect_location,
  			 "***** Re-trying analysis for unrolling"
  			 " with unroll factor %d and slp %s.\n",
  			 suggested_unroll_factor,
  			 slp_done_for_suggested_uf ? "on" : "off");
!       loop_vec_info unroll_vinfo
! 	= vect_create_loop_vinfo (loop, shared, loop_form_info, NULL);
!       unroll_vinfo->vector_mode = vector_mode;
!       unroll_vinfo->suggested_unroll_factor = suggested_unroll_factor;
!       opt_result new_res = vect_analyze_loop_2 (unroll_vinfo, fatal, NULL,
! 						slp_done_for_suggested_uf);
!       if (new_res)
! 	{
! 	  delete loop_vinfo;
! 	  loop_vinfo = unroll_vinfo;
! 	}
!       else
! 	delete unroll_vinfo;
      }
  
    /* Remember the autodetected vector mode.  */
--- 3430,3479 ----
  		     res ? "succeeded" : "failed",
  		     GET_MODE_NAME (loop_vinfo->vector_mode));
  
!   auto user_unroll = LOOP_VINFO_LOOP (loop_vinfo)->unroll;
!   if (res && !LOOP_VINFO_EPILOGUE_P (loop_vinfo)
!       /* Check to see if the user wants to unroll or if the target wants to.  */
!       && (suggested_unroll_factor > 1 || user_unroll > 1))
      {
!       if (suggested_unroll_factor == 1)
! 	{
! 	  int assumed_vf = vect_vf_for_cost (loop_vinfo);
! 	  suggested_unroll_factor = user_unroll / assumed_vf;
! 	  if (suggested_unroll_factor > 1)
! 	    {
! 	      if (dump_enabled_p ())
! 		dump_printf_loc (MSG_NOTE, vect_location,
! 			 "setting unroll factor to %d based on user requested "
! 			 "unroll factor %d and suggested vectorization "
! 			 "factor: %d\n",
! 			 suggested_unroll_factor, user_unroll, assumed_vf);
! 	    }
! 	}
! 
! 	if (suggested_unroll_factor > 1)
! 	  {
! 	    if (dump_enabled_p ())
! 	      dump_printf_loc (MSG_NOTE, vect_location,
  			 "***** Re-trying analysis for unrolling"
  			 " with unroll factor %d and slp %s.\n",
  			 suggested_unroll_factor,
  			 slp_done_for_suggested_uf ? "on" : "off");
! 	    loop_vec_info unroll_vinfo
! 		= vect_create_loop_vinfo (loop, shared, loop_form_info, NULL);
! 	    unroll_vinfo->vector_mode = vector_mode;
! 	    unroll_vinfo->suggested_unroll_factor = suggested_unroll_factor;
! 	    opt_result new_res
! 		= vect_analyze_loop_2 (unroll_vinfo, fatal, NULL,
! 				       slp_done_for_suggested_uf);
! 	    if (new_res)
! 	      {
! 		delete loop_vinfo;
! 		loop_vinfo = unroll_vinfo;
! 		LOOP_VINFO_USER_UNROLL (loop_vinfo) = user_unroll > 1;
! 	      }
! 	    else
! 	      delete unroll_vinfo;
! 	  }
      }
  
    /* Remember the autodetected vector mode.  */
*************** vect_analyze_loop_1 (class loop *loop, v
*** 3469,3481 ****
        mode_i += 1;
      }
    if (mode_i + 1 < vector_modes.length ()
!       && VECTOR_MODE_P (autodetected_vector_mode)
!       && (related_vector_mode (vector_modes[mode_i + 1],
! 			       GET_MODE_INNER (autodetected_vector_mode))
! 	  == autodetected_vector_mode)
!       && (related_vector_mode (autodetected_vector_mode,
! 			       GET_MODE_INNER (vector_modes[mode_i + 1]))
! 	  == vector_modes[mode_i + 1]))
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_NOTE, vect_location,
--- 3494,3501 ----
        mode_i += 1;
      }
    if (mode_i + 1 < vector_modes.length ()
!       && vect_chooses_same_modes_p (autodetected_vector_mode,
! 				    vector_modes[mode_i + 1]))
      {
        if (dump_enabled_p ())
  	dump_printf_loc (MSG_NOTE, vect_location,
*************** vect_analyze_loop (class loop *loop, gim
*** 3676,3683 ****
      vector_modes[0] = autodetected_vector_mode;
    mode_i = 0;
  
!   bool supports_partial_vectors =
!     partial_vectors_supported_p () && param_vect_partial_vector_usage != 0;
    poly_uint64 first_vinfo_vf = LOOP_VINFO_VECT_FACTOR (first_loop_vinfo);
  
    loop_vec_info orig_loop_vinfo = first_loop_vinfo;
--- 3696,3710 ----
      vector_modes[0] = autodetected_vector_mode;
    mode_i = 0;
  
!   bool supports_partial_vectors = param_vect_partial_vector_usage != 0;
!   machine_mode mask_mode;
!   if (supports_partial_vectors
!       && !partial_vectors_supported_p ()
!       && !(VECTOR_MODE_P (first_loop_vinfo->vector_mode)
! 	   && targetm.vectorize.get_mask_mode
! 		(first_loop_vinfo->vector_mode).exists (&mask_mode)
! 	   && SCALAR_INT_MODE_P (mask_mode)))
!     supports_partial_vectors = false;
    poly_uint64 first_vinfo_vf = LOOP_VINFO_VECT_FACTOR (first_loop_vinfo);
  
    loop_vec_info orig_loop_vinfo = first_loop_vinfo;
*************** vect_analyze_loop (class loop *loop, gim
*** 3697,3702 ****
--- 3724,3745 ----
  		break;
  	      continue;
  	    }
+ 	  /* We would need an exhaustive search to find all modes we
+ 	     skipped but that would lead to the same result as the
+ 	     analysis it was skipped for and where we'd could check
+ 	     cached_vf_per_mode against.
+ 	     Check for the autodetected mode, which is the common
+ 	     situation on x86 which does not perform cost comparison.  */
+ 	  if (!supports_partial_vectors
+ 	      && maybe_ge (cached_vf_per_mode[0], first_vinfo_vf)
+ 	      && vect_chooses_same_modes_p (autodetected_vector_mode,
+ 					    vector_modes[mode_i]))
+ 	    {
+ 	      mode_i++;
+ 	      if (mode_i == vector_modes.length ())
+ 		break;
+ 	      continue;
+ 	    }
  
  	  if (dump_enabled_p ())
  	    dump_printf_loc (MSG_NOTE, vect_location,
*************** pop:
*** 4101,4106 ****
--- 4144,4153 ----
  	  if (op.ops[2] == op.ops[opi])
  	    neg = ! neg;
  	}
+       /* For an FMA the reduction code is the PLUS if the addition chain
+ 	 is the reduction.  */
+       else if (op.code == IFN_FMA && opi == 2)
+ 	op.code = PLUS_EXPR;
        if (CONVERT_EXPR_CODE_P (op.code)
  	  && tree_nop_conversion_p (op.type, TREE_TYPE (op.ops[0])))
  	;
*************** vectorizable_reduction (loop_vec_info lo
*** 8045,8050 ****
--- 8092,8110 ----
  				 "in-order reduction chain without SLP.\n");
  	      return false;
  	    }
+ 	  /* Code generation doesn't support function calls other
+ 	     than .COND_*.  */
+ 	  if (!op.code.is_tree_code ()
+ 	      && !(op.code.is_internal_fn ()
+ 		   && conditional_internal_fn_code (internal_fn (op.code))
+ 			!= ERROR_MARK))
+ 	    {
+ 	      if (dump_enabled_p ())
+ 		dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ 				 "in-order reduction chain operation not "
+ 				 "supported.\n");
+ 	      return false;
+ 	    }
  	  STMT_VINFO_REDUC_TYPE (reduc_info)
  	    = reduction_type = FOLD_LEFT_REDUCTION;
  	}
*************** vect_transform_loop (loop_vec_info loop_
*** 12041,12046 ****
--- 12101,12113 ----
  	dump_printf_loc (MSG_NOTE, vect_location, "Disabling unrolling due to"
  			 " variable-length vectorization factor\n");
      }
+ 
+   /* When we have unrolled the loop due to a user requested value we should
+      leave it up to the RTL unroll heuristics to determine if it's still worth
+      while to unroll more.  */
+   if (LOOP_VINFO_USER_UNROLL (loop_vinfo))
+     loop->unroll = 0;
+ 
    /* Free SLP instances here because otherwise stmt reference counting
       won't work.  */
    slp_instance instance;
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-slp-patterns.cc gcc-16-20250629/gcc/tree-vect-slp-patterns.cc
*** gcc-16-20250622/gcc/tree-vect-slp-patterns.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-slp-patterns.cc	Sun Jun 29 22:34:01 2025
*************** vect_build_swap_evenodd_node (slp_tree n
*** 299,316 ****
     code CODE.  */
  
  static inline bool
! vect_match_expression_p (slp_tree node, tree_code code)
  {
    if (!node
        || !SLP_TREE_REPRESENTATIVE (node))
      return false;
  
    gimple* expr = STMT_VINFO_STMT (SLP_TREE_REPRESENTATIVE (node));
!   if (!is_gimple_assign (expr)
!       || gimple_assign_rhs_code (expr) != code)
!     return false;
  
!   return true;
  }
  
  /* Check if the given lane permute in PERMUTES matches an alternating sequence
--- 299,321 ----
     code CODE.  */
  
  static inline bool
! vect_match_expression_p (slp_tree node, code_helper code)
  {
    if (!node
        || !SLP_TREE_REPRESENTATIVE (node))
      return false;
  
    gimple* expr = STMT_VINFO_STMT (SLP_TREE_REPRESENTATIVE (node));
!   if (is_gimple_assign (expr)
!       && code.is_tree_code ()
!       && gimple_assign_rhs_code (expr) == (tree_code) code)
!     return true;
!   if (is_a <gcall *> (expr)
!       && !code.is_tree_code ()
!       && gimple_call_combined_fn (expr) == (combined_fn) code)
!     return true;
  
!   return false;
  }
  
  /* Check if the given lane permute in PERMUTES matches an alternating sequence
*************** compatible_complex_nodes_p (slp_compat_n
*** 786,792 ****
    if (is_gimple_call (a_stmt))
      {
  	if (!compatible_calls_p (dyn_cast <gcall *> (a_stmt),
! 				 dyn_cast <gcall *> (b_stmt)))
  	  return false;
      }
    else if (!is_gimple_assign (a_stmt))
--- 791,797 ----
    if (is_gimple_call (a_stmt))
      {
  	if (!compatible_calls_p (dyn_cast <gcall *> (a_stmt),
! 				 dyn_cast <gcall *> (b_stmt), false))
  	  return false;
      }
    else if (!is_gimple_assign (a_stmt))
*************** addsub_pattern::recognize (slp_tree_to_l
*** 1494,1508 ****
    unsigned l1 = SLP_TREE_LANE_PERMUTATION (node)[1].first;
    if (l0 == l1)
      return NULL;
    bool l0add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0],
  					  PLUS_EXPR);
    if (!l0add_p
        && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0], MINUS_EXPR))
!     return NULL;
    bool l1add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1],
  					  PLUS_EXPR);
    if (!l1add_p
        && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1], MINUS_EXPR))
      return NULL;
  
    slp_tree l0node = SLP_TREE_CHILDREN (node)[l0];
--- 1499,1531 ----
    unsigned l1 = SLP_TREE_LANE_PERMUTATION (node)[1].first;
    if (l0 == l1)
      return NULL;
+   bool fma_p = false;
    bool l0add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0],
  					  PLUS_EXPR);
    if (!l0add_p
        && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0], MINUS_EXPR))
!     {
!       l0add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0], CFN_FMA);
!       if (!l0add_p
! 	  && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l0], CFN_FMS))
! 	return NULL;
!       fma_p = true;
!     }
    bool l1add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1],
  					  PLUS_EXPR);
+   if (l1add_p && fma_p)
+     return NULL;
    if (!l1add_p
        && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1], MINUS_EXPR))
+     {
+       if (!fma_p)
+ 	return NULL;
+       l1add_p = vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1], CFN_FMA);
+       if (!l1add_p
+ 	  && !vect_match_expression_p (SLP_TREE_CHILDREN (node)[l1], CFN_FMS))
+ 	return NULL;
+     }
+   else if (!l1add_p && fma_p)
      return NULL;
  
    slp_tree l0node = SLP_TREE_CHILDREN (node)[l0];
*************** addsub_pattern::recognize (slp_tree_to_l
*** 1527,1552 ****
  
    /* Now we have either { -, +, -, + ... } (!l0add_p) or { +, -, +, - ... }
       (l0add_p), see whether we have FMA variants.  We can only form FMAs
!      if allowed via -ffp-contract=fast.  */
!   if (flag_fp_contract_mode != FP_CONTRACT_FAST
        && FLOAT_TYPE_P (SLP_TREE_VECTYPE (l0node)))
      ;
    else if (!l0add_p
! 	   && vect_match_expression_p (SLP_TREE_CHILDREN (l0node)[0], MULT_EXPR))
      {
        /* (c * d) -+ a */
        if (vect_pattern_validate_optab (IFN_VEC_FMADDSUB, node))
  	return new addsub_pattern (node_, IFN_VEC_FMADDSUB);
      }
    else if (l0add_p
! 	   && vect_match_expression_p (SLP_TREE_CHILDREN (l1node)[0], MULT_EXPR))
      {
        /* (c * d) +- a */
        if (vect_pattern_validate_optab (IFN_VEC_FMSUBADD, node))
  	return new addsub_pattern (node_, IFN_VEC_FMSUBADD);
      }
  
!   if (!l0add_p && vect_pattern_validate_optab (IFN_VEC_ADDSUB, node))
      return new addsub_pattern (node_, IFN_VEC_ADDSUB);
  
    return NULL;
--- 1550,1580 ----
  
    /* Now we have either { -, +, -, + ... } (!l0add_p) or { +, -, +, - ... }
       (l0add_p), see whether we have FMA variants.  We can only form FMAs
!      if allowed via -ffp-contract=fast or if they were FMA before.  */
!   if (!fma_p
!       && flag_fp_contract_mode != FP_CONTRACT_FAST
        && FLOAT_TYPE_P (SLP_TREE_VECTYPE (l0node)))
      ;
    else if (!l0add_p
! 	   && (fma_p
! 	       || vect_match_expression_p (SLP_TREE_CHILDREN (l0node)[0],
! 					   MULT_EXPR)))
      {
        /* (c * d) -+ a */
        if (vect_pattern_validate_optab (IFN_VEC_FMADDSUB, node))
  	return new addsub_pattern (node_, IFN_VEC_FMADDSUB);
      }
    else if (l0add_p
! 	   && (fma_p
! 	       || vect_match_expression_p (SLP_TREE_CHILDREN (l1node)[0],
! 					   MULT_EXPR)))
      {
        /* (c * d) +- a */
        if (vect_pattern_validate_optab (IFN_VEC_FMSUBADD, node))
  	return new addsub_pattern (node_, IFN_VEC_FMSUBADD);
      }
  
!   if (!fma_p && !l0add_p && vect_pattern_validate_optab (IFN_VEC_ADDSUB, node))
      return new addsub_pattern (node_, IFN_VEC_ADDSUB);
  
    return NULL;
*************** addsub_pattern::build (vec_info *vinfo)
*** 1610,1634 ****
  	    sub = SLP_TREE_CHILDREN (node)[l1];
  	    add = SLP_TREE_CHILDREN (node)[l0];
  	  }
- 	slp_tree mul = SLP_TREE_CHILDREN (sub)[0];
  	/* Modify the blend node in-place.  */
  	SLP_TREE_CHILDREN (node).safe_grow (3, true);
! 	SLP_TREE_CHILDREN (node)[0] = SLP_TREE_CHILDREN (mul)[0];
! 	SLP_TREE_CHILDREN (node)[1] = SLP_TREE_CHILDREN (mul)[1];
! 	SLP_TREE_CHILDREN (node)[2] = SLP_TREE_CHILDREN (sub)[1];
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[0])++;
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[1])++;
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[2])++;
  
- 	/* Build IFN_VEC_FMADDSUB from the mul/sub representative operands.  */
- 	stmt_vec_info srep = SLP_TREE_REPRESENTATIVE (sub);
- 	stmt_vec_info mrep = SLP_TREE_REPRESENTATIVE (mul);
- 	gcall *call = gimple_build_call_internal (m_ifn, 3,
- 						  gimple_assign_rhs1 (mrep->stmt),
- 						  gimple_assign_rhs2 (mrep->stmt),
- 						  gimple_assign_rhs2 (srep->stmt));
  	gimple_call_set_lhs (call, make_ssa_name
! 			     (TREE_TYPE (gimple_assign_lhs (srep->stmt))));
  	gimple_call_set_nothrow (call, true);
  	gimple_set_bb (call, gimple_bb (srep->stmt));
  	stmt_vec_info new_rep = vinfo->add_pattern_stmt (call, srep);
--- 1638,1679 ----
  	    sub = SLP_TREE_CHILDREN (node)[l1];
  	    add = SLP_TREE_CHILDREN (node)[l0];
  	  }
  	/* Modify the blend node in-place.  */
  	SLP_TREE_CHILDREN (node).safe_grow (3, true);
! 	gcall *call;
! 	stmt_vec_info srep = SLP_TREE_REPRESENTATIVE (sub);
! 	if (vect_match_expression_p (add, CFN_FMA))
! 	  {
! 	    SLP_TREE_CHILDREN (node)[0] = SLP_TREE_CHILDREN (add)[0];
! 	    SLP_TREE_CHILDREN (node)[1] = SLP_TREE_CHILDREN (add)[1];
! 	    SLP_TREE_CHILDREN (node)[2] = SLP_TREE_CHILDREN (add)[2];
! 	    /* Build IFN_VEC_FMADDSUB from the fms representative
! 	       operands.  */
! 	    call = gimple_build_call_internal (m_ifn, 3,
! 					       gimple_call_arg (srep->stmt, 0),
! 					       gimple_call_arg (srep->stmt, 1),
! 					       gimple_call_arg (srep->stmt, 2));
! 	  }
! 	else
! 	  {
! 	    slp_tree mul = SLP_TREE_CHILDREN (sub)[0];
! 	    SLP_TREE_CHILDREN (node)[0] = SLP_TREE_CHILDREN (mul)[0];
! 	    SLP_TREE_CHILDREN (node)[1] = SLP_TREE_CHILDREN (mul)[1];
! 	    SLP_TREE_CHILDREN (node)[2] = SLP_TREE_CHILDREN (sub)[1];
! 	    /* Build IFN_VEC_FMADDSUB from the mul/sub representative
! 	       operands.  */
! 	    stmt_vec_info mrep = SLP_TREE_REPRESENTATIVE (mul);
! 	    call = gimple_build_call_internal (m_ifn, 3,
! 					       gimple_assign_rhs1 (mrep->stmt),
! 					       gimple_assign_rhs2 (mrep->stmt),
! 					       gimple_assign_rhs2 (srep->stmt));
! 	  }
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[0])++;
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[1])++;
  	SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (node)[2])++;
  
  	gimple_call_set_lhs (call, make_ssa_name
! 			     (TREE_TYPE (gimple_get_lhs (srep->stmt))));
  	gimple_call_set_nothrow (call, true);
  	gimple_set_bb (call, gimple_bb (srep->stmt));
  	stmt_vec_info new_rep = vinfo->add_pattern_stmt (call, srep);
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-slp.cc gcc-16-20250629/gcc/tree-vect-slp.cc
*** gcc-16-20250622/gcc/tree-vect-slp.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-slp.cc	Sun Jun 29 22:34:01 2025
*************** vect_def_types_match (enum vect_def_type
*** 507,517 ****
  	      && (dtb == vect_external_def || dtb == vect_constant_def)));
  }
  
- static const int cond_expr_maps[3][5] = {
-   { 4, -1, -2, 1, 2 },
-   { 4, -2, -1, 1, 2 },
-   { 4, -1, -2, 2, 1 }
- };
  static const int no_arg_map[] = { 0 };
  static const int arg0_map[] = { 1, 0 };
  static const int arg1_map[] = { 1, 1 };
--- 507,512 ----
*************** vect_get_and_check_slp_defs (vec_info *v
*** 986,998 ****
     to be combined into the same SLP group.  */
  
  bool
! compatible_calls_p (gcall *call1, gcall *call2)
  {
    unsigned int nargs = gimple_call_num_args (call1);
    if (nargs != gimple_call_num_args (call2))
      return false;
  
!   if (gimple_call_combined_fn (call1) != gimple_call_combined_fn (call2))
      return false;
  
    if (gimple_call_internal_p (call1))
--- 981,998 ----
     to be combined into the same SLP group.  */
  
  bool
! compatible_calls_p (gcall *call1, gcall *call2, bool allow_two_operators)
  {
    unsigned int nargs = gimple_call_num_args (call1);
    if (nargs != gimple_call_num_args (call2))
      return false;
  
!   auto cfn1 = gimple_call_combined_fn (call1);
!   auto cfn2 = gimple_call_combined_fn (call2);
!   if (cfn1 != cfn2
!       && (!allow_two_operators
! 	  || !((cfn1 == CFN_FMA || cfn1 == CFN_FMS)
! 	       && (cfn2 == CFN_FMA || cfn2 == CFN_FMS))))
      return false;
  
    if (gimple_call_internal_p (call1))
*************** vect_build_slp_tree_1 (vec_info *vinfo,
*** 1354,1363 ****
  		   || rhs_code != IMAGPART_EXPR)
  	       /* Handle mismatches in plus/minus by computing both
  		  and merging the results.  */
! 	       && !((first_stmt_code == PLUS_EXPR
! 		     || first_stmt_code == MINUS_EXPR)
! 		    && (alt_stmt_code == PLUS_EXPR
! 			|| alt_stmt_code == MINUS_EXPR)
  		    && rhs_code == alt_stmt_code)
  	       && !(first_stmt_code.is_tree_code ()
  		    && rhs_code.is_tree_code ()
--- 1354,1367 ----
  		   || rhs_code != IMAGPART_EXPR)
  	       /* Handle mismatches in plus/minus by computing both
  		  and merging the results.  */
! 	       && !((((first_stmt_code == PLUS_EXPR
! 		       || first_stmt_code == MINUS_EXPR)
! 		      && (alt_stmt_code == PLUS_EXPR
! 			  || alt_stmt_code == MINUS_EXPR))
! 		     || ((first_stmt_code == CFN_FMA
! 			  || first_stmt_code == CFN_FMS)
! 			 && (alt_stmt_code == CFN_FMA
! 			     || alt_stmt_code == CFN_FMS)))
  		    && rhs_code == alt_stmt_code)
  	       && !(first_stmt_code.is_tree_code ()
  		    && rhs_code.is_tree_code ()
*************** vect_build_slp_tree_1 (vec_info *vinfo,
*** 1406,1412 ****
  	    {
  	      if (!is_a <gcall *> (stmts[0]->stmt)
  		  || !compatible_calls_p (as_a <gcall *> (stmts[0]->stmt),
! 					  call_stmt))
  		{
  		  if (dump_enabled_p ())
  		    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 1410,1416 ----
  	    {
  	      if (!is_a <gcall *> (stmts[0]->stmt)
  		  || !compatible_calls_p (as_a <gcall *> (stmts[0]->stmt),
! 					  call_stmt, true))
  		{
  		  if (dump_enabled_p ())
  		    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** fail:
*** 3055,3078 ****
        SLP_TREE_CODE (node) = VEC_PERM_EXPR;
        SLP_TREE_CHILDREN (node).quick_push (one);
        SLP_TREE_CHILDREN (node).quick_push (two);
!       gassign *stmt = as_a <gassign *> (stmts[0]->stmt);
!       enum tree_code code0 = gimple_assign_rhs_code (stmt);
        enum tree_code ocode = ERROR_MARK;
        stmt_vec_info ostmt_info;
        unsigned j = 0;
        FOR_EACH_VEC_ELT (stmts, i, ostmt_info)
  	{
! 	  gassign *ostmt = as_a <gassign *> (ostmt_info->stmt);
! 	  if (gimple_assign_rhs_code (ostmt) != code0)
  	    {
! 	      SLP_TREE_LANE_PERMUTATION (node).safe_push (std::make_pair (1, i));
! 	      ocode = gimple_assign_rhs_code (ostmt);
! 	      j = i;
  	    }
  	  else
! 	    SLP_TREE_LANE_PERMUTATION (node).safe_push (std::make_pair (0, i));
  	}
- 
        SLP_TREE_CODE (one) = code0;
        SLP_TREE_CODE (two) = ocode;
        SLP_TREE_LANES (one) = stmts.length ();
--- 3059,3093 ----
        SLP_TREE_CODE (node) = VEC_PERM_EXPR;
        SLP_TREE_CHILDREN (node).quick_push (one);
        SLP_TREE_CHILDREN (node).quick_push (two);
!       enum tree_code code0 = ERROR_MARK;
        enum tree_code ocode = ERROR_MARK;
+       if (gassign *stmt = dyn_cast <gassign *> (stmts[0]->stmt))
+ 	code0 = gimple_assign_rhs_code (stmt);
        stmt_vec_info ostmt_info;
        unsigned j = 0;
        FOR_EACH_VEC_ELT (stmts, i, ostmt_info)
  	{
! 	  int op = 0;
! 	  if (gassign *ostmt = dyn_cast <gassign *> (ostmt_info->stmt))
  	    {
! 	      if (gimple_assign_rhs_code (ostmt) != code0)
! 		{
! 		  ocode = gimple_assign_rhs_code (ostmt);
! 		  op = 1;
! 		  j = i;
! 		}
  	    }
  	  else
! 	    {
! 	      if (gimple_call_combined_fn (stmts[0]->stmt)
! 		  != gimple_call_combined_fn (ostmt_info->stmt))
! 		{
! 		  op = 1;
! 		  j = i;
! 		}
! 	    }
! 	  SLP_TREE_LANE_PERMUTATION (node).safe_push (std::make_pair (op, i));
  	}
        SLP_TREE_CODE (one) = code0;
        SLP_TREE_CODE (two) = ocode;
        SLP_TREE_LANES (one) = stmts.length ();
diff -Nrcpad gcc-16-20250622/gcc/tree-vect-stmts.cc gcc-16-20250629/gcc/tree-vect-stmts.cc
*** gcc-16-20250622/gcc/tree-vect-stmts.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vect-stmts.cc	Sun Jun 29 22:34:01 2025
*************** vectorizable_load (vec_info *vinfo,
*** 9836,9842 ****
    tree dataref_ptr = NULL_TREE;
    tree dataref_offset = NULL_TREE;
    gimple *ptr_incr = NULL;
-   int ncopies;
    int i, j;
    unsigned int group_size;
    poly_uint64 group_gap_adj;
--- 9836,9841 ----
*************** vectorizable_load (vec_info *vinfo,
*** 9850,9856 ****
    bool compute_in_loop = false;
    class loop *at_loop;
    int vec_num;
-   bool slp = (slp_node != NULL);
    bool slp_perm = false;
    bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (vinfo);
    poly_uint64 vf;
--- 9849,9854 ----
*************** vectorizable_load (vec_info *vinfo,
*** 9909,9915 ****
  	return false;
  
        mask_index = internal_fn_mask_index (ifn);
!       if (mask_index >= 0 && slp_node)
  	mask_index = vect_slp_child_index_for_operand
  		    (call, mask_index, STMT_VINFO_GATHER_SCATTER_P (stmt_info));
        if (mask_index >= 0
--- 9907,9913 ----
  	return false;
  
        mask_index = internal_fn_mask_index (ifn);
!       if (mask_index >= 0)
  	mask_index = vect_slp_child_index_for_operand
  		    (call, mask_index, STMT_VINFO_GATHER_SCATTER_P (stmt_info));
        if (mask_index >= 0
*************** vectorizable_load (vec_info *vinfo,
*** 9918,9924 ****
  	return false;
  
        els_index = internal_fn_else_index (ifn);
!       if (els_index >= 0 && slp_node)
  	els_index = vect_slp_child_index_for_operand
  	  (call, els_index, STMT_VINFO_GATHER_SCATTER_P (stmt_info));
        if (els_index >= 0
--- 9916,9922 ----
  	return false;
  
        els_index = internal_fn_else_index (ifn);
!       if (els_index >= 0)
  	els_index = vect_slp_child_index_for_operand
  	  (call, els_index, STMT_VINFO_GATHER_SCATTER_P (stmt_info));
        if (els_index >= 0
*************** vectorizable_load (vec_info *vinfo,
*** 9939,9957 ****
    else
      vf = 1;
  
-   /* Multiple types in SLP are handled by creating the appropriate number of
-      vectorized stmts for each SLP node.  Hence, NCOPIES is always 1 in
-      case of SLP.  */
-   if (slp)
-     ncopies = 1;
-   else
-     ncopies = vect_get_num_copies (loop_vinfo, vectype);
- 
-   gcc_assert (ncopies >= 1);
- 
    /* FORNOW. This restriction should be relaxed.  */
    if (nested_in_vect_loop
!       && (ncopies > 1 || (slp && SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1)))
      {
        if (dump_enabled_p ())
          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 9937,9945 ----
    else
      vf = 1;
  
    /* FORNOW. This restriction should be relaxed.  */
    if (nested_in_vect_loop
!       && SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node) > 1)
      {
        if (dump_enabled_p ())
          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vectorizable_load (vec_info *vinfo,
*** 9959,9978 ****
        return false;
      }
  
-   /* Invalidate assumptions made by dependence analysis when vectorization
-      on the unrolled body effectively re-orders stmts.  */
-   if (ncopies > 1
-       && STMT_VINFO_MIN_NEG_DIST (stmt_info) != 0
-       && maybe_gt (LOOP_VINFO_VECT_FACTOR (loop_vinfo),
- 		   STMT_VINFO_MIN_NEG_DIST (stmt_info)))
-     {
-       if (dump_enabled_p ())
- 	dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- 			 "cannot perform implicit CSE when unrolling "
- 			 "with negative dependence distance\n");
-       return false;
-     }
- 
    elem_type = TREE_TYPE (vectype);
    mode = TYPE_MODE (vectype);
  
--- 9947,9952 ----
*************** vectorizable_load (vec_info *vinfo,
*** 9997,10011 ****
        first_stmt_info = DR_GROUP_FIRST_ELEMENT (stmt_info);
        group_size = DR_GROUP_SIZE (first_stmt_info);
  
-       /* Refuse non-SLP vectorization of SLP-only groups.  */
-       if (!slp && STMT_VINFO_SLP_VECT_ONLY (first_stmt_info))
- 	{
- 	  if (dump_enabled_p ())
- 	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- 			     "cannot vectorize load in non-SLP mode.\n");
- 	  return false;
- 	}
- 
        /* Invalidate assumptions made by dependence analysis when vectorization
  	 on the unrolled body effectively re-orders stmts.  */
        if (STMT_VINFO_MIN_NEG_DIST (stmt_info) != 0
--- 9971,9976 ----
*************** vectorizable_load (vec_info *vinfo,
*** 10031,10037 ****
    int maskload_elsval = 0;
    bool need_zeroing = false;
    if (!get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask, VLS_LOAD,
! 			    ncopies, &memory_access_type, &poffset,
  			    &alignment_support_scheme, &misalignment, &gs_info,
  			    &lanes_ifn, &elsvals))
      return false;
--- 9996,10002 ----
    int maskload_elsval = 0;
    bool need_zeroing = false;
    if (!get_load_store_type (vinfo, stmt_info, vectype, slp_node, mask, VLS_LOAD,
! 			    1, &memory_access_type, &poffset,
  			    &alignment_support_scheme, &misalignment, &gs_info,
  			    &lanes_ifn, &elsvals))
      return false;
*************** vectorizable_load (vec_info *vinfo,
*** 10046,10053 ****
  
    /* ???  The following checks should really be part of
       get_group_load_store_type.  */
!   if (slp
!       && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
        && !((memory_access_type == VMAT_ELEMENTWISE
  	    || memory_access_type == VMAT_GATHER_SCATTER)
  	   && SLP_TREE_LANES (slp_node) == 1))
--- 10011,10017 ----
  
    /* ???  The following checks should really be part of
       get_group_load_store_type.  */
!   if (SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()
        && !((memory_access_type == VMAT_ELEMENTWISE
  	    || memory_access_type == VMAT_GATHER_SCATTER)
  	   && SLP_TREE_LANES (slp_node) == 1))
*************** vectorizable_load (vec_info *vinfo,
*** 10090,10097 ****
  	}
      }
  
!   if (slp_node
!       && slp_node->ldst_lanes
        && memory_access_type != VMAT_LOAD_STORE_LANES)
      {
        if (dump_enabled_p ())
--- 10054,10060 ----
  	}
      }
  
!   if (slp_node->ldst_lanes
        && memory_access_type != VMAT_LOAD_STORE_LANES)
      {
        if (dump_enabled_p ())
*************** vectorizable_load (vec_info *vinfo,
*** 10142,10149 ****
  
    if (costing_p) /* transformation not required.  */
      {
!       if (slp_node
! 	  && mask
  	  && !vect_maybe_update_slp_op_vectype (slp_op,
  						mask_vectype))
  	{
--- 10105,10111 ----
  
    if (costing_p) /* transformation not required.  */
      {
!       if (mask
  	  && !vect_maybe_update_slp_op_vectype (slp_op,
  						mask_vectype))
  	{
*************** vectorizable_load (vec_info *vinfo,
*** 10153,10162 ****
  	  return false;
  	}
  
!       if (!slp)
! 	STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) = memory_access_type;
!       else
! 	SLP_TREE_MEMORY_ACCESS_TYPE (slp_node) = memory_access_type;
  
        if (loop_vinfo
  	  && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo))
--- 10115,10121 ----
  	  return false;
  	}
  
!       SLP_TREE_MEMORY_ACCESS_TYPE (slp_node) = memory_access_type;
  
        if (loop_vinfo
  	  && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo))
*************** vectorizable_load (vec_info *vinfo,
*** 10210,10225 ****
    if (elsvals.length ())
      maskload_elsval = *elsvals.begin ();
  
!   if (!slp)
!     gcc_assert (memory_access_type
! 		== STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info));
!   else
!     gcc_assert (memory_access_type
! 		== SLP_TREE_MEMORY_ACCESS_TYPE (slp_node));
  
    if (dump_enabled_p () && !costing_p)
!     dump_printf_loc (MSG_NOTE, vect_location,
!                      "transform load. ncopies = %d\n", ncopies);
  
    /* Transform.  */
  
--- 10169,10178 ----
    if (elsvals.length ())
      maskload_elsval = *elsvals.begin ();
  
!   gcc_assert (memory_access_type == SLP_TREE_MEMORY_ACCESS_TYPE (slp_node));
  
    if (dump_enabled_p () && !costing_p)
!     dump_printf_loc (MSG_NOTE, vect_location, "transform load.\n");
  
    /* Transform.  */
  
*************** vectorizable_load (vec_info *vinfo,
*** 10289,10303 ****
  				       vectype, &gsi2);
  	}
        gimple *new_stmt = SSA_NAME_DEF_STMT (new_temp);
!       if (slp)
! 	for (j = 0; j < (int) SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); ++j)
! 	  slp_node->push_vec_def (new_stmt);
!       else
! 	{
! 	  for (j = 0; j < ncopies; ++j)
! 	    STMT_VINFO_VEC_STMTS (stmt_info).safe_push (new_stmt);
! 	  *vec_stmt = new_stmt;
! 	}
        return true;
      }
  
--- 10242,10249 ----
  				       vectype, &gsi2);
  	}
        gimple *new_stmt = SSA_NAME_DEF_STMT (new_temp);
!       for (j = 0; j < (int) SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); ++j)
! 	slp_node->push_vec_def (new_stmt);
        return true;
      }
  
*************** vectorizable_load (vec_info *vinfo,
*** 10474,10479 ****
--- 10420,10426 ----
        /* For SLP permutation support we need to load the whole group,
  	 not only the number of vector stmts the permutation result
  	 fits in.  */
+       int ncopies;
        if (slp_perm)
  	{
  	  /* We don't yet generate SLP_TREE_LOAD_PERMUTATIONs for
*************** vectorizable_load (vec_info *vinfo,
*** 10615,10626 ****
        return true;
      }
  
!   if (memory_access_type == VMAT_GATHER_SCATTER
!       || (!slp && memory_access_type == VMAT_CONTIGUOUS))
      grouped_load = false;
  
    if (grouped_load
!       || (slp && SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()))
      {
        if (grouped_load)
  	{
--- 10562,10572 ----
        return true;
      }
  
!   if (memory_access_type == VMAT_GATHER_SCATTER)
      grouped_load = false;
  
    if (grouped_load
!       || SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
      {
        if (grouped_load)
  	{
*************** vectorizable_load (vec_info *vinfo,
*** 10634,10640 ****
  	}
        /* For SLP vectorization we directly vectorize a subchain
           without permutation.  */
!       if (slp && ! SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
  	first_stmt_info = SLP_TREE_SCALAR_STMTS (slp_node)[0];
        /* For BB vectorization always use the first stmt to base
  	 the data ref pointer on.  */
--- 10580,10586 ----
  	}
        /* For SLP vectorization we directly vectorize a subchain
           without permutation.  */
!       if (! SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
  	first_stmt_info = SLP_TREE_SCALAR_STMTS (slp_node)[0];
        /* For BB vectorization always use the first stmt to base
  	 the data ref pointer on.  */
*************** vectorizable_load (vec_info *vinfo,
*** 10642,10701 ****
  	first_stmt_info_for_drptr
  	  = vect_find_first_scalar_stmt_in_slp (slp_node);
  
-       /* Check if the chain of loads is already vectorized.  */
-       if (STMT_VINFO_VEC_STMTS (first_stmt_info).exists ()
- 	  /* For SLP we would need to copy over SLP_TREE_VEC_DEFS.
- 	     ???  But we can only do so if there is exactly one
- 	     as we have no way to get at the rest.  Leave the CSE
- 	     opportunity alone.
- 	     ???  With the group load eventually participating
- 	     in multiple different permutations (having multiple
- 	     slp nodes which refer to the same group) the CSE
- 	     is even wrong code.  See PR56270.  */
- 	  && !slp)
- 	{
- 	  *vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
- 	  return true;
- 	}
        first_dr_info = STMT_VINFO_DR_INFO (first_stmt_info);
        group_gap_adj = 0;
  
        /* VEC_NUM is the number of vect stmts to be created for this group.  */
!       if (slp)
  	{
! 	  grouped_load = false;
! 	  /* If an SLP permutation is from N elements to N elements,
! 	     and if one vector holds a whole number of N, we can load
! 	     the inputs to the permutation in the same way as an
! 	     unpermuted sequence.  In other cases we need to load the
! 	     whole group, not only the number of vector stmts the
! 	     permutation result fits in.  */
! 	  unsigned scalar_lanes = SLP_TREE_LANES (slp_node);
! 	  if (nested_in_vect_loop)
! 	    /* We do not support grouped accesses in a nested loop,
! 	       instead the access is contiguous but it might be
! 	       permuted.  No gap adjustment is needed though.  */
! 	    vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
! 	  else if (slp_perm
! 		   && (group_size != scalar_lanes
! 		       || !multiple_p (nunits, group_size)))
! 	    {
! 	      /* We don't yet generate such SLP_TREE_LOAD_PERMUTATIONs for
! 		 variable VF; see vect_transform_slp_perm_load.  */
! 	      unsigned int const_vf = vf.to_constant ();
! 	      unsigned int const_nunits = nunits.to_constant ();
! 	      vec_num = CEIL (group_size * const_vf, const_nunits);
! 	      group_gap_adj = vf * group_size - nunits * vec_num;
! 	    }
! 	  else
! 	    {
! 	      vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
! 	      group_gap_adj
! 		= group_size - scalar_lanes;
! 	    }
!     	}
        else
! 	vec_num = group_size;
  
        ref_type = get_group_alias_ptr_type (first_stmt_info);
      }
--- 10588,10626 ----
  	first_stmt_info_for_drptr
  	  = vect_find_first_scalar_stmt_in_slp (slp_node);
  
        first_dr_info = STMT_VINFO_DR_INFO (first_stmt_info);
        group_gap_adj = 0;
  
        /* VEC_NUM is the number of vect stmts to be created for this group.  */
!       grouped_load = false;
!       /* If an SLP permutation is from N elements to N elements,
! 	 and if one vector holds a whole number of N, we can load
! 	 the inputs to the permutation in the same way as an
! 	 unpermuted sequence.  In other cases we need to load the
! 	 whole group, not only the number of vector stmts the
! 	 permutation result fits in.  */
!       unsigned scalar_lanes = SLP_TREE_LANES (slp_node);
!       if (nested_in_vect_loop)
! 	/* We do not support grouped accesses in a nested loop,
! 	   instead the access is contiguous but it might be
! 	   permuted.  No gap adjustment is needed though.  */
! 	vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
!       else if (slp_perm
! 	       && (group_size != scalar_lanes
! 		   || !multiple_p (nunits, group_size)))
  	{
! 	  /* We don't yet generate such SLP_TREE_LOAD_PERMUTATIONs for
! 	     variable VF; see vect_transform_slp_perm_load.  */
! 	  unsigned int const_vf = vf.to_constant ();
! 	  unsigned int const_nunits = nunits.to_constant ();
! 	  vec_num = CEIL (group_size * const_vf, const_nunits);
! 	  group_gap_adj = vf * group_size - nunits * vec_num;
! 	}
        else
! 	{
! 	  vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
! 	  group_gap_adj = group_size - scalar_lanes;
! 	}
  
        ref_type = get_group_alias_ptr_type (first_stmt_info);
      }
*************** vectorizable_load (vec_info *vinfo,
*** 10706,10713 ****
        group_size = vec_num = 1;
        group_gap_adj = 0;
        ref_type = reference_alias_ptr_type (DR_REF (first_dr_info->dr));
!       if (slp)
! 	vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
      }
  
    gcc_assert (alignment_support_scheme);
--- 10631,10637 ----
        group_size = vec_num = 1;
        group_gap_adj = 0;
        ref_type = reference_alias_ptr_type (DR_REF (first_dr_info->dr));
!       vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
      }
  
    gcc_assert (alignment_support_scheme);
*************** vectorizable_load (vec_info *vinfo,
*** 10909,10922 ****
    auto_vec<tree> vec_offsets;
    auto_vec<tree> vec_masks;
    if (mask && !costing_p)
!     {
!       if (slp_node)
! 	vect_get_slp_defs (SLP_TREE_CHILDREN (slp_node)[mask_index],
! 			   &vec_masks);
!       else
! 	vect_get_vec_defs_for_operand (vinfo, stmt_info, ncopies, mask,
! 				       &vec_masks, mask_vectype);
!     }
  
    tree vec_mask = NULL_TREE;
    tree vec_els = NULL_TREE;
--- 10833,10840 ----
    auto_vec<tree> vec_offsets;
    auto_vec<tree> vec_masks;
    if (mask && !costing_p)
!     vect_get_slp_defs (SLP_TREE_CHILDREN (slp_node)[mask_index],
! 		       &vec_masks);
  
    tree vec_mask = NULL_TREE;
    tree vec_els = NULL_TREE;
*************** vectorizable_load (vec_info *vinfo,
*** 10929,10936 ****
        /* For costing some adjacent vector loads, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_loads = 0;
!       if (slp_node)
! 	ncopies = slp_node->vec_stmts_size / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (costing_p)
--- 10847,10853 ----
        /* For costing some adjacent vector loads, we'd like to cost with
  	 the total number of them once instead of cost each one by one. */
        unsigned int n_adjacent_loads = 0;
!       int ncopies = slp_node->vec_stmts_size / group_size;
        for (j = 0; j < ncopies; j++)
  	{
  	  if (costing_p)
*************** vectorizable_load (vec_info *vinfo,
*** 11053,11084 ****
  	  gimple_call_set_nothrow (call, true);
  	  vect_finish_stmt_generation (vinfo, stmt_info, call, gsi);
  
- 	  if (!slp)
- 	    dr_chain.create (group_size);
  	  /* Extract each vector into an SSA_NAME.  */
  	  for (unsigned i = 0; i < group_size; i++)
  	    {
  	      new_temp = read_vector_array (vinfo, stmt_info, gsi, scalar_dest,
  					    vec_array, i, need_zeroing,
  					    final_mask);
! 	      if (slp)
! 		slp_node->push_vec_def (new_temp);
! 	      else
! 		dr_chain.quick_push (new_temp);
  	    }
  
- 	  if (!slp)
- 	    /* Record the mapping between SSA_NAMEs and statements.  */
- 	    vect_record_grouped_load_vectors (vinfo, stmt_info, dr_chain);
- 
  	  /* Record that VEC_ARRAY is now dead.  */
  	  vect_clobber_variable (vinfo, stmt_info, gsi, vec_array);
- 
- 	  if (!slp)
- 	    dr_chain.release ();
- 
- 	  if (!slp_node)
- 	    *vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
  	}
  
        if (costing_p)
--- 10970,10986 ----
  	  gimple_call_set_nothrow (call, true);
  	  vect_finish_stmt_generation (vinfo, stmt_info, call, gsi);
  
  	  /* Extract each vector into an SSA_NAME.  */
  	  for (unsigned i = 0; i < group_size; i++)
  	    {
  	      new_temp = read_vector_array (vinfo, stmt_info, gsi, scalar_dest,
  					    vec_array, i, need_zeroing,
  					    final_mask);
! 	      slp_node->push_vec_def (new_temp);
  	    }
  
  	  /* Record that VEC_ARRAY is now dead.  */
  	  vect_clobber_variable (vinfo, stmt_info, gsi, vec_array);
  	}
  
        if (costing_p)
*************** vectorizable_load (vec_info *vinfo,
*** 11105,11469 ****
        gcc_assert (!grouped_load && !slp_perm);
  
        unsigned int inside_cost = 0, prologue_cost = 0;
!       for (j = 0; j < ncopies; j++)
  	{
! 	  /* 1. Create the vector or array pointer update chain.  */
! 	  if (j == 0 && !costing_p)
! 	    {
! 	      if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
! 		vect_get_gather_scatter_ops (loop_vinfo, loop, stmt_info,
! 					     slp_node, &gs_info, &dataref_ptr,
! 					     &vec_offsets);
! 	      else
! 		dataref_ptr
! 		  = vect_create_data_ref_ptr (vinfo, first_stmt_info, aggr_type,
! 					      at_loop, offset, &dummy, gsi,
! 					      &ptr_incr, false, bump);
! 	    }
! 	  else if (!costing_p)
  	    {
! 	      gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo));
! 	      if (!STMT_VINFO_GATHER_SCATTER_P (stmt_info))
  		dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
  					       gsi, stmt_info, bump);
  	    }
  
! 	  gimple *new_stmt = NULL;
! 	  for (i = 0; i < vec_num; i++)
  	    {
! 	      tree final_mask = NULL_TREE;
! 	      tree final_len = NULL_TREE;
! 	      tree bias = NULL_TREE;
! 	      if (!costing_p)
  		{
! 		  if (mask)
! 		    vec_mask = vec_masks[vec_num * j + i];
! 		  if (loop_masks)
! 		    final_mask
! 		      = vect_get_loop_mask (loop_vinfo, gsi, loop_masks,
! 					    vec_num * ncopies, vectype,
! 					    vec_num * j + i);
! 		  if (vec_mask)
! 		    final_mask = prepare_vec_mask (loop_vinfo, mask_vectype,
! 						   final_mask, vec_mask, gsi);
! 
! 		  if (i > 0 && !STMT_VINFO_GATHER_SCATTER_P (stmt_info))
! 		    dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
! 						   gsi, stmt_info, bump);
  		}
  
! 	      /* 2. Create the vector-load in the loop.  */
! 	      unsigned HOST_WIDE_INT align;
! 	      if (gs_info.ifn != IFN_LAST)
  		{
! 		  if (costing_p)
! 		    {
! 		      unsigned int cnunits = vect_nunits_for_cost (vectype);
! 		      inside_cost
! 			= record_stmt_cost (cost_vec, cnunits, scalar_load,
! 					    slp_node, 0, vect_body);
! 		      continue;
! 		    }
! 		  if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
! 		    vec_offset = vec_offsets[vec_num * j + i];
! 		  tree zero = build_zero_cst (vectype);
! 		  tree scale = size_int (gs_info.scale);
! 
! 		  if (gs_info.ifn == IFN_MASK_LEN_GATHER_LOAD)
  		    {
! 		      if (loop_lens)
! 			final_len
! 			  = vect_get_loop_len (loop_vinfo, gsi, loop_lens,
! 					       vec_num * ncopies, vectype,
! 					       vec_num * j + i, 1);
! 		      else
! 			final_len
! 			  = build_int_cst (sizetype,
! 					   TYPE_VECTOR_SUBPARTS (vectype));
! 		      signed char biasval
! 			= LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo);
! 		      bias = build_int_cst (intQI_type_node, biasval);
! 		      if (!final_mask)
! 			{
! 			  mask_vectype = truth_type_for (vectype);
! 			  final_mask = build_minus_one_cst (mask_vectype);
! 			}
  		    }
  
! 		  if (final_mask)
! 		    {
! 		      vec_els = vect_get_mask_load_else
! 			(maskload_elsval, vectype);
! 		      if (type_mode_padding_p
! 			  && maskload_elsval != MASK_LOAD_ELSE_ZERO)
! 			need_zeroing = true;
! 		    }
  
! 		  gcall *call;
! 		  if (final_len && final_mask)
! 		    {
! 		      if (VECTOR_TYPE_P (TREE_TYPE (vec_offset)))
! 			call = gimple_build_call_internal (
! 			  IFN_MASK_LEN_GATHER_LOAD, 8, dataref_ptr, vec_offset,
! 			  scale, zero, final_mask, vec_els, final_len, bias);
! 		      else
! 			/* Non-vector offset indicates that prefer to take
! 			   MASK_LEN_STRIDED_LOAD instead of the
! 			   MASK_LEN_GATHER_LOAD with direct stride arg.  */
! 			call = gimple_build_call_internal (
! 			  IFN_MASK_LEN_STRIDED_LOAD, 7, dataref_ptr, vec_offset,
! 			  zero, final_mask, vec_els, final_len, bias);
! 		    }
! 		  else if (final_mask)
! 		    call = gimple_build_call_internal (IFN_MASK_GATHER_LOAD,
! 						       6, dataref_ptr,
! 						       vec_offset, scale,
! 						       zero, final_mask,
! 						       vec_els);
  		  else
! 		    call = gimple_build_call_internal (IFN_GATHER_LOAD, 4,
! 						       dataref_ptr, vec_offset,
! 						       scale, zero);
! 		  gimple_call_set_nothrow (call, true);
! 		  new_stmt = call;
  		  data_ref = NULL_TREE;
  		}
! 	      else if (gs_info.decl)
  		{
! 		  /* The builtin decls path for gather is legacy, x86 only.  */
! 		  gcc_assert (!final_len && nunits.is_constant ());
! 		  if (costing_p)
! 		    {
! 		      unsigned int cnunits = vect_nunits_for_cost (vectype);
! 		      inside_cost
! 			= record_stmt_cost (cost_vec, cnunits, scalar_load,
! 					    slp_node, 0, vect_body);
! 		      continue;
! 		    }
! 		  poly_uint64 offset_nunits
! 		    = TYPE_VECTOR_SUBPARTS (gs_info.offset_vectype);
! 		  if (known_eq (nunits, offset_nunits))
  		    {
! 		      new_stmt = vect_build_one_gather_load_call
! 				   (vinfo, stmt_info, gsi, &gs_info,
! 				    dataref_ptr, vec_offsets[vec_num * j + i],
! 				    final_mask);
! 		      data_ref = NULL_TREE;
  		    }
! 		  else if (known_eq (nunits, offset_nunits * 2))
  		    {
! 		      /* We have a offset vector with half the number of
! 			 lanes but the builtins will produce full vectype
! 			 data with just the lower lanes filled.  */
! 		      new_stmt = vect_build_one_gather_load_call
! 			  (vinfo, stmt_info, gsi, &gs_info,
! 			   dataref_ptr, vec_offsets[2 * vec_num * j + 2 * i],
! 			   final_mask);
! 		      tree low = make_ssa_name (vectype);
! 		      gimple_set_lhs (new_stmt, low);
  		      vect_finish_stmt_generation (vinfo, stmt_info,
  						   new_stmt, gsi);
  
! 		      /* now put upper half of final_mask in final_mask low. */
! 		      if (final_mask
! 			  && !SCALAR_INT_MODE_P
! 				(TYPE_MODE (TREE_TYPE (final_mask))))
! 			{
! 			  int count = nunits.to_constant ();
! 			  vec_perm_builder sel (count, count, 1);
! 			  sel.quick_grow (count);
! 			  for (int i = 0; i < count; ++i)
! 			    sel[i] = i | (count / 2);
! 			  vec_perm_indices indices (sel, 2, count);
! 			  tree perm_mask = vect_gen_perm_mask_checked
! 					     (TREE_TYPE (final_mask), indices);
! 			  new_stmt = gimple_build_assign (NULL_TREE,
! 							  VEC_PERM_EXPR,
! 							  final_mask,
! 							  final_mask,
! 							  perm_mask);
! 			  final_mask = make_ssa_name (TREE_TYPE (final_mask));
! 			  gimple_set_lhs (new_stmt, final_mask);
! 			  vect_finish_stmt_generation (vinfo, stmt_info,
! 						       new_stmt, gsi);
! 			}
! 		      else if (final_mask)
! 			{
! 			  new_stmt = gimple_build_assign (NULL_TREE,
! 							  VEC_UNPACK_HI_EXPR,
! 							  final_mask);
! 			  final_mask = make_ssa_name
! 			    (truth_type_for (gs_info.offset_vectype));
! 			  gimple_set_lhs (new_stmt, final_mask);
! 			  vect_finish_stmt_generation (vinfo, stmt_info,
! 						       new_stmt, gsi);
! 			}
! 
! 		      new_stmt = vect_build_one_gather_load_call
! 				   (vinfo, stmt_info, gsi, &gs_info,
! 				    dataref_ptr,
! 				    vec_offsets[2 * vec_num * j + 2 * i + 1],
! 				    final_mask);
! 		      tree high = make_ssa_name (vectype);
! 		      gimple_set_lhs (new_stmt, high);
! 		      vect_finish_stmt_generation (vinfo, stmt_info,
! 						   new_stmt, gsi);
  
! 		      /* compose low + high.  */
! 		      int count = nunits.to_constant ();
  		      vec_perm_builder sel (count, count, 1);
  		      sel.quick_grow (count);
  		      for (int i = 0; i < count; ++i)
! 			sel[i] = i < count / 2 ? i : i + count / 2;
  		      vec_perm_indices indices (sel, 2, count);
! 		      tree perm_mask
! 			= vect_gen_perm_mask_checked (vectype, indices);
! 		      new_stmt = gimple_build_assign (NULL_TREE,
! 						      VEC_PERM_EXPR,
! 						      low, high, perm_mask);
! 		      data_ref = NULL_TREE;
! 		    }
! 		  else if (known_eq (nunits * 2, offset_nunits))
! 		    {
! 		      /* We have a offset vector with double the number of
! 			 lanes.  Select the low/high part accordingly.  */
! 		      vec_offset = vec_offsets[(vec_num * j + i) / 2];
! 		      if ((vec_num * j + i) & 1)
! 			{
! 			  int count = offset_nunits.to_constant ();
! 			  vec_perm_builder sel (count, count, 1);
! 			  sel.quick_grow (count);
! 			  for (int i = 0; i < count; ++i)
! 			    sel[i] = i | (count / 2);
! 			  vec_perm_indices indices (sel, 2, count);
! 			  tree perm_mask = vect_gen_perm_mask_checked
! 					     (TREE_TYPE (vec_offset), indices);
! 			  new_stmt = gimple_build_assign (NULL_TREE,
! 							  VEC_PERM_EXPR,
! 							  vec_offset,
! 							  vec_offset,
! 							  perm_mask);
! 			  vec_offset = make_ssa_name (TREE_TYPE (vec_offset));
! 			  gimple_set_lhs (new_stmt, vec_offset);
! 			  vect_finish_stmt_generation (vinfo, stmt_info,
! 						       new_stmt, gsi);
! 			}
! 		      new_stmt = vect_build_one_gather_load_call
! 				   (vinfo, stmt_info, gsi, &gs_info,
! 				    dataref_ptr, vec_offset, final_mask);
! 		      data_ref = NULL_TREE;
  		    }
! 		  else
! 		    gcc_unreachable ();
  		}
  	      else
  		{
! 		  /* Emulated gather-scatter.  */
! 		  gcc_assert (!final_mask);
! 		  unsigned HOST_WIDE_INT const_nunits = nunits.to_constant ();
! 		  if (costing_p)
! 		    {
! 		      /* For emulated gathers N offset vector element
! 			 offset add is consumed by the load).  */
! 		      inside_cost = record_stmt_cost (cost_vec, const_nunits,
! 						      vec_to_scalar,
! 						      slp_node, 0, vect_body);
! 		      /* N scalar loads plus gathering them into a
! 			 vector.  */
! 		      inside_cost
! 			= record_stmt_cost (cost_vec, const_nunits, scalar_load,
! 					    slp_node, 0, vect_body);
! 		      inside_cost
! 			= record_stmt_cost (cost_vec, 1, vec_construct,
! 					    slp_node, 0, vect_body);
! 		      continue;
! 		    }
! 		  unsigned HOST_WIDE_INT const_offset_nunits
! 		    = TYPE_VECTOR_SUBPARTS (gs_info.offset_vectype)
! 			.to_constant ();
! 		  vec<constructor_elt, va_gc> *ctor_elts;
! 		  vec_alloc (ctor_elts, const_nunits);
! 		  gimple_seq stmts = NULL;
! 		  /* We support offset vectors with more elements
! 		     than the data vector for now.  */
! 		  unsigned HOST_WIDE_INT factor
! 		    = const_offset_nunits / const_nunits;
! 		  vec_offset = vec_offsets[(vec_num * j + i) / factor];
! 		  unsigned elt_offset
! 		    = ((vec_num * j + i) % factor) * const_nunits;
! 		  tree idx_type = TREE_TYPE (TREE_TYPE (vec_offset));
! 		  tree scale = size_int (gs_info.scale);
! 		  align = get_object_alignment (DR_REF (first_dr_info->dr));
! 		  tree ltype = build_aligned_type (TREE_TYPE (vectype), align);
! 		  for (unsigned k = 0; k < const_nunits; ++k)
! 		    {
! 		      tree boff = size_binop (MULT_EXPR, TYPE_SIZE (idx_type),
! 					      bitsize_int (k + elt_offset));
! 		      tree idx
! 			= gimple_build (&stmts, BIT_FIELD_REF, idx_type,
! 					vec_offset, TYPE_SIZE (idx_type), boff);
! 		      idx = gimple_convert (&stmts, sizetype, idx);
! 		      idx = gimple_build (&stmts, MULT_EXPR, sizetype, idx,
! 					  scale);
! 		      tree ptr = gimple_build (&stmts, PLUS_EXPR,
! 					       TREE_TYPE (dataref_ptr),
! 					       dataref_ptr, idx);
! 		      ptr = gimple_convert (&stmts, ptr_type_node, ptr);
! 		      tree elt = make_ssa_name (TREE_TYPE (vectype));
! 		      tree ref = build2 (MEM_REF, ltype, ptr,
! 					 build_int_cst (ref_type, 0));
! 		      new_stmt = gimple_build_assign (elt, ref);
! 		      gimple_set_vuse (new_stmt, gimple_vuse (gsi_stmt (*gsi)));
! 		      gimple_seq_add_stmt (&stmts, new_stmt);
! 		      CONSTRUCTOR_APPEND_ELT (ctor_elts, NULL_TREE, elt);
! 		    }
! 		  gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
! 		  new_stmt = gimple_build_assign (
! 		    NULL_TREE, build_constructor (vectype, ctor_elts));
! 		  data_ref = NULL_TREE;
  		}
! 
! 	      vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	      /* DATA_REF is null if we've already built the statement.  */
! 	      if (data_ref)
  		{
! 		  vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 		  new_stmt = gimple_build_assign (vec_dest, data_ref);
  		}
! 	      new_temp = need_zeroing
! 		? make_ssa_name (vectype)
! 		: make_ssa_name (vec_dest, new_stmt);
! 	      gimple_set_lhs (new_stmt, new_temp);
! 	      vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	      /* If we need to explicitly zero inactive elements emit a
! 		 VEC_COND_EXPR that does so.  */
! 	      if (need_zeroing)
! 		{
! 		  vec_els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
! 						     vectype);
  
! 		  tree new_temp2 = make_ssa_name (vec_dest, new_stmt);
! 		  new_stmt
! 		    = gimple_build_assign (new_temp2, VEC_COND_EXPR,
! 					   final_mask, new_temp, vec_els);
! 		  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt,
! 					       gsi);
! 		  new_temp = new_temp2;
! 		}
  
! 	      /* Store vector loads in the corresponding SLP_NODE.  */
! 	      if (slp)
! 		slp_node->push_vec_def (new_stmt);
  	    }
  
! 	  if (!slp && !costing_p)
! 	    STMT_VINFO_VEC_STMTS (stmt_info).safe_push (new_stmt);
  	}
  
-       if (!slp && !costing_p)
- 	*vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
- 
        if (costing_p && dump_enabled_p ())
  	dump_printf_loc (MSG_NOTE, vect_location,
  			 "vect_model_load_cost: inside_cost = %u, "
--- 11007,11335 ----
        gcc_assert (!grouped_load && !slp_perm);
  
        unsigned int inside_cost = 0, prologue_cost = 0;
! 
!       /* 1. Create the vector or array pointer update chain.  */
!       if (!costing_p)
  	{
! 	  if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
! 	    vect_get_gather_scatter_ops (loop_vinfo, loop, stmt_info,
! 					 slp_node, &gs_info, &dataref_ptr,
! 					 &vec_offsets);
! 	  else
! 	    dataref_ptr
! 	      = vect_create_data_ref_ptr (vinfo, first_stmt_info, aggr_type,
! 					  at_loop, offset, &dummy, gsi,
! 					  &ptr_incr, false, bump);
! 	}
! 
!       gimple *new_stmt = NULL;
!       for (i = 0; i < vec_num; i++)
! 	{
! 	  tree final_mask = NULL_TREE;
! 	  tree final_len = NULL_TREE;
! 	  tree bias = NULL_TREE;
! 	  if (!costing_p)
  	    {
! 	      if (mask)
! 		vec_mask = vec_masks[i];
! 	      if (loop_masks)
! 		final_mask = vect_get_loop_mask (loop_vinfo, gsi, loop_masks,
! 						 vec_num, vectype, i);
! 	      if (vec_mask)
! 		final_mask = prepare_vec_mask (loop_vinfo, mask_vectype,
! 					       final_mask, vec_mask, gsi);
! 
! 	      if (i > 0 && !STMT_VINFO_GATHER_SCATTER_P (stmt_info))
  		dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
  					       gsi, stmt_info, bump);
  	    }
  
! 	  /* 2. Create the vector-load in the loop.  */
! 	  unsigned HOST_WIDE_INT align;
! 	  if (gs_info.ifn != IFN_LAST)
  	    {
! 	      if (costing_p)
  		{
! 		  unsigned int cnunits = vect_nunits_for_cost (vectype);
! 		  inside_cost
! 		    = record_stmt_cost (cost_vec, cnunits, scalar_load,
! 					slp_node, 0, vect_body);
! 		  continue;
  		}
+ 	      if (STMT_VINFO_GATHER_SCATTER_P (stmt_info))
+ 		vec_offset = vec_offsets[i];
+ 	      tree zero = build_zero_cst (vectype);
+ 	      tree scale = size_int (gs_info.scale);
  
! 	      if (gs_info.ifn == IFN_MASK_LEN_GATHER_LOAD)
  		{
! 		  if (loop_lens)
! 		    final_len = vect_get_loop_len (loop_vinfo, gsi, loop_lens,
! 						   vec_num, vectype, i, 1);
! 		  else
! 		    final_len = build_int_cst (sizetype,
! 					       TYPE_VECTOR_SUBPARTS (vectype));
! 		  signed char biasval
! 		    = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo);
! 		  bias = build_int_cst (intQI_type_node, biasval);
! 		  if (!final_mask)
  		    {
! 		      mask_vectype = truth_type_for (vectype);
! 		      final_mask = build_minus_one_cst (mask_vectype);
  		    }
+ 		}
  
! 	      if (final_mask)
! 		{
! 		  vec_els = vect_get_mask_load_else (maskload_elsval, vectype);
! 		  if (type_mode_padding_p
! 		      && maskload_elsval != MASK_LOAD_ELSE_ZERO)
! 		    need_zeroing = true;
! 		}
  
! 	      gcall *call;
! 	      if (final_len && final_mask)
! 		{
! 		  if (VECTOR_TYPE_P (TREE_TYPE (vec_offset)))
! 		    call = gimple_build_call_internal (IFN_MASK_LEN_GATHER_LOAD,
! 						       8, dataref_ptr,
! 						       vec_offset, scale, zero,
! 						       final_mask, vec_els,
! 						       final_len, bias);
  		  else
! 		    /* Non-vector offset indicates that prefer to take
! 		       MASK_LEN_STRIDED_LOAD instead of the
! 		       MASK_LEN_GATHER_LOAD with direct stride arg.  */
! 		    call = gimple_build_call_internal
! 			     (IFN_MASK_LEN_STRIDED_LOAD, 7, dataref_ptr,
! 			      vec_offset, zero, final_mask, vec_els, final_len,
! 			      bias);
! 		}
! 	      else if (final_mask)
! 		call = gimple_build_call_internal (IFN_MASK_GATHER_LOAD,
! 						   6, dataref_ptr,
! 						   vec_offset, scale,
! 						   zero, final_mask, vec_els);
! 	      else
! 		call = gimple_build_call_internal (IFN_GATHER_LOAD, 4,
! 						   dataref_ptr, vec_offset,
! 						   scale, zero);
! 	      gimple_call_set_nothrow (call, true);
! 	      new_stmt = call;
! 	      data_ref = NULL_TREE;
! 	    }
! 	  else if (gs_info.decl)
! 	    {
! 	      /* The builtin decls path for gather is legacy, x86 only.  */
! 	      gcc_assert (!final_len && nunits.is_constant ());
! 	      if (costing_p)
! 		{
! 		  unsigned int cnunits = vect_nunits_for_cost (vectype);
! 		  inside_cost
! 		    = record_stmt_cost (cost_vec, cnunits, scalar_load,
! 					slp_node, 0, vect_body);
! 		  continue;
! 		}
! 	      poly_uint64 offset_nunits
! 		  = TYPE_VECTOR_SUBPARTS (gs_info.offset_vectype);
! 	      if (known_eq (nunits, offset_nunits))
! 		{
! 		  new_stmt = vect_build_one_gather_load_call
! 			       (vinfo, stmt_info, gsi, &gs_info,
! 				dataref_ptr, vec_offsets[i], final_mask);
  		  data_ref = NULL_TREE;
  		}
! 	      else if (known_eq (nunits, offset_nunits * 2))
  		{
! 		  /* We have a offset vector with half the number of
! 		     lanes but the builtins will produce full vectype
! 		     data with just the lower lanes filled.  */
! 		  new_stmt = vect_build_one_gather_load_call
! 			       (vinfo, stmt_info, gsi, &gs_info,
! 				dataref_ptr, vec_offsets[2 * i], final_mask);
! 		  tree low = make_ssa_name (vectype);
! 		  gimple_set_lhs (new_stmt, low);
! 		  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 
! 		  /* now put upper half of final_mask in final_mask low. */
! 		  if (final_mask
! 		      && !SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (final_mask))))
  		    {
! 		      int count = nunits.to_constant ();
! 		      vec_perm_builder sel (count, count, 1);
! 		      sel.quick_grow (count);
! 		      for (int i = 0; i < count; ++i)
! 			sel[i] = i | (count / 2);
! 		      vec_perm_indices indices (sel, 2, count);
! 		      tree perm_mask = vect_gen_perm_mask_checked
! 					 (TREE_TYPE (final_mask), indices);
! 		      new_stmt = gimple_build_assign (NULL_TREE, VEC_PERM_EXPR,
! 						      final_mask, final_mask,
! 						      perm_mask);
! 		      final_mask = make_ssa_name (TREE_TYPE (final_mask));
! 		      gimple_set_lhs (new_stmt, final_mask);
! 		      vect_finish_stmt_generation (vinfo, stmt_info,
! 						   new_stmt, gsi);
  		    }
! 		  else if (final_mask)
  		    {
! 		      new_stmt = gimple_build_assign (NULL_TREE,
! 						      VEC_UNPACK_HI_EXPR,
! 						      final_mask);
! 		      final_mask = make_ssa_name
! 				    (truth_type_for (gs_info.offset_vectype));
! 		      gimple_set_lhs (new_stmt, final_mask);
  		      vect_finish_stmt_generation (vinfo, stmt_info,
  						   new_stmt, gsi);
+ 		    }
  
! 		  new_stmt = vect_build_one_gather_load_call
! 			       (vinfo, stmt_info, gsi, &gs_info, dataref_ptr,
! 				vec_offsets[2 * i + 1], final_mask);
! 		  tree high = make_ssa_name (vectype);
! 		  gimple_set_lhs (new_stmt, high);
! 		  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 		  /* compose low + high.  */
! 		  int count = nunits.to_constant ();
! 		  vec_perm_builder sel (count, count, 1);
! 		  sel.quick_grow (count);
! 		  for (int i = 0; i < count; ++i)
! 		    sel[i] = i < count / 2 ? i : i + count / 2;
! 		  vec_perm_indices indices (sel, 2, count);
! 		  tree perm_mask
! 		    = vect_gen_perm_mask_checked (vectype, indices);
! 		  new_stmt = gimple_build_assign (NULL_TREE, VEC_PERM_EXPR,
! 						  low, high, perm_mask);
! 		  data_ref = NULL_TREE;
! 		}
! 	      else if (known_eq (nunits * 2, offset_nunits))
! 		{
! 		  /* We have a offset vector with double the number of
! 		     lanes.  Select the low/high part accordingly.  */
! 		  vec_offset = vec_offsets[i / 2];
! 		  if (i & 1)
! 		    {
! 		      int count = offset_nunits.to_constant ();
  		      vec_perm_builder sel (count, count, 1);
  		      sel.quick_grow (count);
  		      for (int i = 0; i < count; ++i)
! 			sel[i] = i | (count / 2);
  		      vec_perm_indices indices (sel, 2, count);
! 		      tree perm_mask = vect_gen_perm_mask_checked
! 					 (TREE_TYPE (vec_offset), indices);
! 		      new_stmt = gimple_build_assign (NULL_TREE, VEC_PERM_EXPR,
! 						      vec_offset, vec_offset,
! 						      perm_mask);
! 		      vec_offset = make_ssa_name (TREE_TYPE (vec_offset));
! 		      gimple_set_lhs (new_stmt, vec_offset);
! 		      vect_finish_stmt_generation (vinfo, stmt_info,
! 						   new_stmt, gsi);
  		    }
! 		  new_stmt = vect_build_one_gather_load_call
! 			       (vinfo, stmt_info, gsi, &gs_info,
! 				dataref_ptr, vec_offset, final_mask);
! 		  data_ref = NULL_TREE;
  		}
  	      else
+ 		gcc_unreachable ();
+ 	    }
+ 	  else
+ 	    {
+ 	      /* Emulated gather-scatter.  */
+ 	      gcc_assert (!final_mask);
+ 	      unsigned HOST_WIDE_INT const_nunits = nunits.to_constant ();
+ 	      if (costing_p)
  		{
! 		  /* For emulated gathers N offset vector element
! 		     offset add is consumed by the load).  */
! 		  inside_cost = record_stmt_cost (cost_vec, const_nunits,
! 						  vec_to_scalar,
! 						  slp_node, 0, vect_body);
! 		  /* N scalar loads plus gathering them into a
! 		     vector.  */
! 		  inside_cost
! 		    = record_stmt_cost (cost_vec, const_nunits, scalar_load,
! 					slp_node, 0, vect_body);
! 		  inside_cost
! 		    = record_stmt_cost (cost_vec, 1, vec_construct,
! 					slp_node, 0, vect_body);
! 		  continue;
  		}
! 	      unsigned HOST_WIDE_INT const_offset_nunits
! 		= TYPE_VECTOR_SUBPARTS (gs_info.offset_vectype) .to_constant ();
! 	      vec<constructor_elt, va_gc> *ctor_elts;
! 	      vec_alloc (ctor_elts, const_nunits);
! 	      gimple_seq stmts = NULL;
! 	      /* We support offset vectors with more elements
! 		 than the data vector for now.  */
! 	      unsigned HOST_WIDE_INT factor
! 		= const_offset_nunits / const_nunits;
! 	      vec_offset = vec_offsets[i / factor];
! 	      unsigned elt_offset = (i % factor) * const_nunits;
! 	      tree idx_type = TREE_TYPE (TREE_TYPE (vec_offset));
! 	      tree scale = size_int (gs_info.scale);
! 	      align = get_object_alignment (DR_REF (first_dr_info->dr));
! 	      tree ltype = build_aligned_type (TREE_TYPE (vectype), align);
! 	      for (unsigned k = 0; k < const_nunits; ++k)
  		{
! 		  tree boff = size_binop (MULT_EXPR, TYPE_SIZE (idx_type),
! 					  bitsize_int (k + elt_offset));
! 		  tree idx = gimple_build (&stmts, BIT_FIELD_REF, idx_type,
! 					   vec_offset, TYPE_SIZE (idx_type),
! 					   boff);
! 		  idx = gimple_convert (&stmts, sizetype, idx);
! 		  idx = gimple_build (&stmts, MULT_EXPR, sizetype, idx, scale);
! 		  tree ptr = gimple_build (&stmts, PLUS_EXPR,
! 					   TREE_TYPE (dataref_ptr),
! 					   dataref_ptr, idx);
! 		  ptr = gimple_convert (&stmts, ptr_type_node, ptr);
! 		  tree elt = make_ssa_name (TREE_TYPE (vectype));
! 		  tree ref = build2 (MEM_REF, ltype, ptr,
! 				     build_int_cst (ref_type, 0));
! 		  new_stmt = gimple_build_assign (elt, ref);
! 		  gimple_set_vuse (new_stmt, gimple_vuse (gsi_stmt (*gsi)));
! 		  gimple_seq_add_stmt (&stmts, new_stmt);
! 		  CONSTRUCTOR_APPEND_ELT (ctor_elts, NULL_TREE, elt);
  		}
! 	      gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
! 	      new_stmt = gimple_build_assign (NULL_TREE,
! 					      build_constructor (vectype,
! 								 ctor_elts));
! 	      data_ref = NULL_TREE;
! 	    }
  
! 	  vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	  /* DATA_REF is null if we've already built the statement.  */
! 	  if (data_ref)
! 	    {
! 	      vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 	      new_stmt = gimple_build_assign (vec_dest, data_ref);
! 	    }
! 	  new_temp = (need_zeroing
! 		      ? make_ssa_name (vectype)
! 		      : make_ssa_name (vec_dest, new_stmt));
! 	  gimple_set_lhs (new_stmt, new_temp);
! 	  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	  /* If we need to explicitly zero inactive elements emit a
! 	     VEC_COND_EXPR that does so.  */
! 	  if (need_zeroing)
! 	    {
! 	      vec_els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
! 						 vectype);
  
! 	      tree new_temp2 = make_ssa_name (vec_dest, new_stmt);
! 	      new_stmt = gimple_build_assign (new_temp2, VEC_COND_EXPR,
! 					      final_mask, new_temp, vec_els);
! 	      vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 	      new_temp = new_temp2;
  	    }
  
! 	  /* Store vector loads in the corresponding SLP_NODE.  */
! 	  slp_node->push_vec_def (new_stmt);
  	}
  
        if (costing_p && dump_enabled_p ())
  	dump_printf_loc (MSG_NOTE, vect_location,
  			 "vect_model_load_cost: inside_cost = %u, "
*************** vectorizable_load (vec_info *vinfo,
*** 11477,11749 ****
    /* For costing some adjacent vector loads, we'd like to cost with
       the total number of them once instead of cost each one by one. */
    unsigned int n_adjacent_loads = 0;
!   for (j = 0; j < ncopies; j++)
      {
!       /* 1. Create the vector or array pointer update chain.  */
!       if (j == 0 && !costing_p)
  	{
! 	  bool simd_lane_access_p
! 	    = STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info) != 0;
! 	  if (simd_lane_access_p
! 	      && TREE_CODE (DR_BASE_ADDRESS (first_dr_info->dr)) == ADDR_EXPR
! 	      && VAR_P (TREE_OPERAND (DR_BASE_ADDRESS (first_dr_info->dr), 0))
! 	      && integer_zerop (get_dr_vinfo_offset (vinfo, first_dr_info))
! 	      && integer_zerop (DR_INIT (first_dr_info->dr))
! 	      && alias_sets_conflict_p (get_alias_set (aggr_type),
! 					get_alias_set (TREE_TYPE (ref_type)))
! 	      && (alignment_support_scheme == dr_aligned
! 		  || alignment_support_scheme == dr_unaligned_supported))
! 	    {
! 	      dataref_ptr = unshare_expr (DR_BASE_ADDRESS (first_dr_info->dr));
! 	      dataref_offset = build_int_cst (ref_type, 0);
! 	    }
! 	  else if (diff_first_stmt_info)
! 	    {
! 	      dataref_ptr
! 		= vect_create_data_ref_ptr (vinfo, first_stmt_info_for_drptr,
! 					    aggr_type, at_loop, offset, &dummy,
! 					    gsi, &ptr_incr, simd_lane_access_p,
! 					    bump);
! 	      /* Adjust the pointer by the difference to first_stmt.  */
! 	      data_reference_p ptrdr
! 		= STMT_VINFO_DATA_REF (first_stmt_info_for_drptr);
! 	      tree diff
! 		= fold_convert (sizetype,
! 				size_binop (MINUS_EXPR,
! 					    DR_INIT (first_dr_info->dr),
! 					    DR_INIT (ptrdr)));
! 	      dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
! 					     stmt_info, diff);
! 	      if (alignment_support_scheme == dr_explicit_realign)
! 		{
! 		  msq = vect_setup_realignment (vinfo,
! 						first_stmt_info_for_drptr, gsi,
! 						&realignment_token,
! 						alignment_support_scheme,
! 						dataref_ptr, &at_loop);
! 		  gcc_assert (!compute_in_loop);
! 		}
! 	    }
! 	  else
! 	    dataref_ptr
! 	      = vect_create_data_ref_ptr (vinfo, first_stmt_info, aggr_type,
! 					  at_loop,
! 					  offset, &dummy, gsi, &ptr_incr,
! 					  simd_lane_access_p, bump);
  	}
!       else if (!costing_p)
  	{
! 	  gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo));
! 	  if (dataref_offset)
! 	    dataref_offset = int_const_binop (PLUS_EXPR, dataref_offset,
! 					      bump);
! 	  else
! 	    dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
! 					   stmt_info, bump);
  	}
  
!       if (grouped_load || slp_perm)
! 	dr_chain.create (vec_num);
  
!       gimple *new_stmt = NULL;
!       for (i = 0; i < vec_num; i++)
  	{
! 	  tree final_mask = NULL_TREE;
! 	  tree final_len = NULL_TREE;
! 	  tree bias = NULL_TREE;
  
! 	  if (!costing_p)
! 	    {
! 	      if (mask)
! 		vec_mask = vec_masks[vec_num * j + i];
! 	      if (loop_masks)
! 		final_mask = vect_get_loop_mask (loop_vinfo, gsi, loop_masks,
! 						 vec_num * ncopies, vectype,
! 						 vec_num * j + i);
! 	      if (vec_mask)
! 		final_mask = prepare_vec_mask (loop_vinfo, mask_vectype,
! 					       final_mask, vec_mask, gsi);
  
! 	      if (i > 0)
! 		dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
! 					       gsi, stmt_info, bump);
! 	    }
  
! 	  /* 2. Create the vector-load in the loop.  */
! 	  switch (alignment_support_scheme)
! 	    {
! 	    case dr_aligned:
! 	    case dr_unaligned_supported:
  	      {
! 		if (costing_p)
! 		  break;
! 
! 		unsigned int misalign;
! 		unsigned HOST_WIDE_INT align;
! 		align = known_alignment (DR_TARGET_ALIGNMENT (first_dr_info));
! 		if (alignment_support_scheme == dr_aligned)
! 		  misalign = 0;
! 		else if (misalignment == DR_MISALIGNMENT_UNKNOWN)
! 		  {
! 		    align
! 		      = dr_alignment (vect_dr_behavior (vinfo, first_dr_info));
! 		    misalign = 0;
! 		  }
! 		else
! 		  misalign = misalignment;
! 		if (dataref_offset == NULL_TREE
! 		    && TREE_CODE (dataref_ptr) == SSA_NAME)
! 		  set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
! 					  misalign);
! 		align = least_bit_hwi (misalign | align);
  
! 		/* Compute IFN when LOOP_LENS or final_mask valid.  */
! 		machine_mode vmode = TYPE_MODE (vectype);
! 		machine_mode new_vmode = vmode;
! 		internal_fn partial_ifn = IFN_LAST;
! 		if (loop_lens)
! 		  {
! 		    opt_machine_mode new_ovmode
! 		      = get_len_load_store_mode (vmode, true, &partial_ifn);
! 		    new_vmode = new_ovmode.require ();
! 		    unsigned factor
! 		      = (new_ovmode == vmode) ? 1 : GET_MODE_UNIT_SIZE (vmode);
! 		    final_len = vect_get_loop_len (loop_vinfo, gsi, loop_lens,
! 						   vec_num * ncopies, vectype,
! 						   vec_num * j + i, factor);
! 		  }
! 		else if (final_mask)
! 		  {
! 		    if (!can_vec_mask_load_store_p (
! 			  vmode, TYPE_MODE (TREE_TYPE (final_mask)), true,
! 			  &partial_ifn))
! 		      gcc_unreachable ();
! 		  }
  
! 		if (partial_ifn == IFN_MASK_LEN_LOAD)
  		  {
! 		    if (!final_len)
! 		      {
! 			/* Pass VF value to 'len' argument of
! 			   MASK_LEN_LOAD if LOOP_LENS is invalid.  */
! 			final_len = size_int (TYPE_VECTOR_SUBPARTS (vectype));
! 		      }
! 		    if (!final_mask)
! 		      {
! 			/* Pass all ones value to 'mask' argument of
! 			   MASK_LEN_LOAD if final_mask is invalid.  */
! 			mask_vectype = truth_type_for (vectype);
! 			final_mask = build_minus_one_cst (mask_vectype);
! 		      }
  		  }
! 		if (final_len)
  		  {
! 		    signed char biasval
! 		      = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo);
! 
! 		    bias = build_int_cst (intQI_type_node, biasval);
  		  }
  
! 		tree vec_els;
! 
! 		if (final_len)
! 		  {
! 		    tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
! 		    gcall *call;
! 		    if (partial_ifn == IFN_MASK_LEN_LOAD)
! 		      {
! 			vec_els = vect_get_mask_load_else
! 			  (maskload_elsval, vectype);
! 			if (type_mode_padding_p
! 			    && maskload_elsval != MASK_LOAD_ELSE_ZERO)
! 			  need_zeroing = true;
! 			call = gimple_build_call_internal (IFN_MASK_LEN_LOAD,
! 							   6, dataref_ptr, ptr,
! 							   final_mask, vec_els,
! 							   final_len, bias);
! 		      }
! 		    else
! 		      call = gimple_build_call_internal (IFN_LEN_LOAD, 4,
! 							 dataref_ptr, ptr,
! 							 final_len, bias);
! 		    gimple_call_set_nothrow (call, true);
! 		    new_stmt = call;
! 		    data_ref = NULL_TREE;
  
! 		    /* Need conversion if it's wrapped with VnQI.  */
! 		    if (vmode != new_vmode)
! 		      {
! 			tree new_vtype = build_vector_type_for_mode (
! 			  unsigned_intQI_type_node, new_vmode);
! 			tree var
! 			  = vect_get_new_ssa_name (new_vtype, vect_simple_var);
! 			gimple_set_lhs (call, var);
! 			vect_finish_stmt_generation (vinfo, stmt_info, call,
! 						     gsi);
! 			tree op = build1 (VIEW_CONVERT_EXPR, vectype, var);
! 			new_stmt = gimple_build_assign (vec_dest,
! 							VIEW_CONVERT_EXPR, op);
! 		      }
! 		  }
! 		else if (final_mask)
  		  {
! 		    tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
! 		    vec_els = vect_get_mask_load_else
! 		      (maskload_elsval, vectype);
  		    if (type_mode_padding_p
  			&& maskload_elsval != MASK_LOAD_ELSE_ZERO)
  		      need_zeroing = true;
! 		    gcall *call = gimple_build_call_internal (IFN_MASK_LOAD, 4,
! 							      dataref_ptr, ptr,
! 							      final_mask,
! 							      vec_els);
! 		    gimple_call_set_nothrow (call, true);
! 		    new_stmt = call;
! 		    data_ref = NULL_TREE;
  		  }
  		else
  		  {
! 		    tree ltype = vectype;
! 		    tree new_vtype = NULL_TREE;
! 		    unsigned HOST_WIDE_INT gap = DR_GROUP_GAP (first_stmt_info);
! 		    unsigned HOST_WIDE_INT dr_size
! 		      = vect_get_scalar_dr_size (first_dr_info);
! 		    poly_int64 off = 0;
! 		    if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
! 		      off = (TYPE_VECTOR_SUBPARTS (vectype) - 1) * -dr_size;
! 		    unsigned int vect_align
! 		      = vect_known_alignment_in_bytes (first_dr_info, vectype,
! 						       off);
! 		    /* Try to use a single smaller load when we are about
! 		       to load excess elements compared to the unrolled
! 		       scalar loop.  */
! 		    if (known_gt ((vec_num * j + i + 1) * nunits,
! 				       (group_size * vf - gap)))
  		      {
! 			poly_uint64 remain = ((group_size * vf - gap)
! 					      - (vec_num * j + i) * nunits);
! 			if (known_ge ((vec_num * j + i + 1) * nunits
! 				      - (group_size * vf - gap), nunits))
! 			  /* DR will be unused.  */
! 			  ltype = NULL_TREE;
! 			else if (known_ge (vect_align,
! 					   tree_to_poly_uint64
! 					     (TYPE_SIZE_UNIT (vectype))))
! 			  /* Aligned access to excess elements is OK if
! 			     at least one element is accessed in the
! 			     scalar loop.  */
! 			  ;
! 			else if (known_gt (vect_align,
! 					   ((nunits - remain) * dr_size)))
! 			  /* Aligned access to the gap area when there's
! 			     at least one element in it is OK.  */
! 			  ;
! 			else
  			  {
! 			    /* remain should now be > 0 and < nunits.  */
! 			    unsigned num;
! 			    if (known_ne (remain, 0u)
! 				&& constant_multiple_p (nunits, remain, &num))
  			      {
  				tree ptype;
  				new_vtype
--- 11343,11635 ----
    /* For costing some adjacent vector loads, we'd like to cost with
       the total number of them once instead of cost each one by one. */
    unsigned int n_adjacent_loads = 0;
! 
!   /* 1. Create the vector or array pointer update chain.  */
!   if (!costing_p)
      {
!       bool simd_lane_access_p
! 	  = STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info) != 0;
!       if (simd_lane_access_p
! 	  && TREE_CODE (DR_BASE_ADDRESS (first_dr_info->dr)) == ADDR_EXPR
! 	  && VAR_P (TREE_OPERAND (DR_BASE_ADDRESS (first_dr_info->dr), 0))
! 	  && integer_zerop (get_dr_vinfo_offset (vinfo, first_dr_info))
! 	  && integer_zerop (DR_INIT (first_dr_info->dr))
! 	  && alias_sets_conflict_p (get_alias_set (aggr_type),
! 				    get_alias_set (TREE_TYPE (ref_type)))
! 	  && (alignment_support_scheme == dr_aligned
! 	      || alignment_support_scheme == dr_unaligned_supported))
  	{
! 	  dataref_ptr = unshare_expr (DR_BASE_ADDRESS (first_dr_info->dr));
! 	  dataref_offset = build_int_cst (ref_type, 0);
  	}
!       else if (diff_first_stmt_info)
  	{
! 	  dataref_ptr
! 	    = vect_create_data_ref_ptr (vinfo, first_stmt_info_for_drptr,
! 					aggr_type, at_loop, offset, &dummy,
! 					gsi, &ptr_incr, simd_lane_access_p,
! 					bump);
! 	  /* Adjust the pointer by the difference to first_stmt.  */
! 	  data_reference_p ptrdr
! 	    = STMT_VINFO_DATA_REF (first_stmt_info_for_drptr);
! 	  tree diff = fold_convert (sizetype,
! 				    size_binop (MINUS_EXPR,
! 						DR_INIT (first_dr_info->dr),
! 						DR_INIT (ptrdr)));
! 	  dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
! 					 stmt_info, diff);
! 	  if (alignment_support_scheme == dr_explicit_realign)
! 	    {
! 	      msq = vect_setup_realignment (vinfo,
! 					    first_stmt_info_for_drptr, gsi,
! 					    &realignment_token,
! 					    alignment_support_scheme,
! 					    dataref_ptr, &at_loop);
! 	      gcc_assert (!compute_in_loop);
! 	    }
  	}
+       else
+ 	dataref_ptr
+ 	  = vect_create_data_ref_ptr (vinfo, first_stmt_info, aggr_type,
+ 				      at_loop,
+ 				      offset, &dummy, gsi, &ptr_incr,
+ 				      simd_lane_access_p, bump);
+     }
+   else if (!costing_p)
+     {
+       gcc_assert (!LOOP_VINFO_USING_SELECT_VL_P (loop_vinfo));
+       if (dataref_offset)
+ 	dataref_offset = int_const_binop (PLUS_EXPR, dataref_offset, bump);
+       else
+ 	dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
+ 				       stmt_info, bump);
+     }
  
!   if (grouped_load || slp_perm)
!     dr_chain.create (vec_num);
  
!   gimple *new_stmt = NULL;
!   for (i = 0; i < vec_num; i++)
!     {
!       tree final_mask = NULL_TREE;
!       tree final_len = NULL_TREE;
!       tree bias = NULL_TREE;
! 
!       if (!costing_p)
  	{
! 	  if (mask)
! 	    vec_mask = vec_masks[i];
! 	  if (loop_masks)
! 	    final_mask = vect_get_loop_mask (loop_vinfo, gsi, loop_masks,
! 					     vec_num, vectype, i);
! 	  if (vec_mask)
! 	    final_mask = prepare_vec_mask (loop_vinfo, mask_vectype,
! 					   final_mask, vec_mask, gsi);
  
! 	  if (i > 0)
! 	    dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr,
! 					   gsi, stmt_info, bump);
! 	}
  
!       /* 2. Create the vector-load in the loop.  */
!       switch (alignment_support_scheme)
! 	{
! 	case dr_aligned:
! 	case dr_unaligned_supported:
! 	  {
! 	    if (costing_p)
! 	      break;
  
! 	    unsigned int misalign;
! 	    unsigned HOST_WIDE_INT align;
! 	    align = known_alignment (DR_TARGET_ALIGNMENT (first_dr_info));
! 	    if (alignment_support_scheme == dr_aligned)
! 	      misalign = 0;
! 	    else if (misalignment == DR_MISALIGNMENT_UNKNOWN)
  	      {
! 		align = dr_alignment (vect_dr_behavior (vinfo, first_dr_info));
! 		misalign = 0;
! 	      }
! 	    else
! 	      misalign = misalignment;
! 	    if (dataref_offset == NULL_TREE
! 		&& TREE_CODE (dataref_ptr) == SSA_NAME)
! 	      set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
! 				      misalign);
! 	    align = least_bit_hwi (misalign | align);
  
! 	    /* Compute IFN when LOOP_LENS or final_mask valid.  */
! 	    machine_mode vmode = TYPE_MODE (vectype);
! 	    machine_mode new_vmode = vmode;
! 	    internal_fn partial_ifn = IFN_LAST;
! 	    if (loop_lens)
! 	      {
! 		opt_machine_mode new_ovmode
! 		  = get_len_load_store_mode (vmode, true, &partial_ifn);
! 		new_vmode = new_ovmode.require ();
! 		unsigned factor
! 		  = (new_ovmode == vmode) ? 1 : GET_MODE_UNIT_SIZE (vmode);
! 		final_len = vect_get_loop_len (loop_vinfo, gsi, loop_lens,
! 					       vec_num, vectype, i, factor);
! 	      }
! 	    else if (final_mask)
! 	      {
! 		if (!can_vec_mask_load_store_p (vmode,
! 						TYPE_MODE
! 						  (TREE_TYPE (final_mask)),
! 						true, &partial_ifn))
! 		  gcc_unreachable ();
! 	      }
  
! 	    if (partial_ifn == IFN_MASK_LEN_LOAD)
! 	      {
! 		if (!final_len)
  		  {
! 		    /* Pass VF value to 'len' argument of
! 		       MASK_LEN_LOAD if LOOP_LENS is invalid.  */
! 		    final_len = size_int (TYPE_VECTOR_SUBPARTS (vectype));
  		  }
! 		if (!final_mask)
  		  {
! 		    /* Pass all ones value to 'mask' argument of
! 		       MASK_LEN_LOAD if final_mask is invalid.  */
! 		    mask_vectype = truth_type_for (vectype);
! 		    final_mask = build_minus_one_cst (mask_vectype);
  		  }
+ 	      }
+ 	    if (final_len)
+ 	      {
+ 		signed char biasval
+ 		  = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo);
+ 		bias = build_int_cst (intQI_type_node, biasval);
+ 	      }
  
! 	    tree vec_els;
  
! 	    if (final_len)
! 	      {
! 		tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
! 		gcall *call;
! 		if (partial_ifn == IFN_MASK_LEN_LOAD)
  		  {
! 		    vec_els = vect_get_mask_load_else (maskload_elsval,
! 						       vectype);
  		    if (type_mode_padding_p
  			&& maskload_elsval != MASK_LOAD_ELSE_ZERO)
  		      need_zeroing = true;
! 		    call = gimple_build_call_internal (IFN_MASK_LEN_LOAD,
! 						       6, dataref_ptr, ptr,
! 						       final_mask, vec_els,
! 						       final_len, bias);
  		  }
  		else
+ 		  call = gimple_build_call_internal (IFN_LEN_LOAD, 4,
+ 						     dataref_ptr, ptr,
+ 						     final_len, bias);
+ 		gimple_call_set_nothrow (call, true);
+ 		new_stmt = call;
+ 		data_ref = NULL_TREE;
+ 
+ 		/* Need conversion if it's wrapped with VnQI.  */
+ 		if (vmode != new_vmode)
  		  {
! 		    tree new_vtype
! 		      = build_vector_type_for_mode (unsigned_intQI_type_node,
! 						    new_vmode);
! 		    tree var = vect_get_new_ssa_name (new_vtype,
! 						      vect_simple_var);
! 		    gimple_set_lhs (call, var);
! 		    vect_finish_stmt_generation (vinfo, stmt_info, call,
! 						 gsi);
! 		    tree op = build1 (VIEW_CONVERT_EXPR, vectype, var);
! 		    new_stmt = gimple_build_assign (vec_dest,
! 						    VIEW_CONVERT_EXPR, op);
! 		  }
! 	      }
! 	    else if (final_mask)
! 	      {
! 		tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
! 		vec_els = vect_get_mask_load_else (maskload_elsval, vectype);
! 		if (type_mode_padding_p
! 		    && maskload_elsval != MASK_LOAD_ELSE_ZERO)
! 		  need_zeroing = true;
! 		gcall *call = gimple_build_call_internal (IFN_MASK_LOAD, 4,
! 							  dataref_ptr, ptr,
! 							  final_mask,
! 							  vec_els);
! 		gimple_call_set_nothrow (call, true);
! 		new_stmt = call;
! 		data_ref = NULL_TREE;
! 	      }
! 	    else
! 	      {
! 		tree ltype = vectype;
! 		tree new_vtype = NULL_TREE;
! 		unsigned HOST_WIDE_INT gap = DR_GROUP_GAP (first_stmt_info);
! 		unsigned HOST_WIDE_INT dr_size
! 		  = vect_get_scalar_dr_size (first_dr_info);
! 		poly_int64 off = 0;
! 		if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
! 		  off = (TYPE_VECTOR_SUBPARTS (vectype) - 1) * -dr_size;
! 		unsigned int vect_align
! 		  = vect_known_alignment_in_bytes (first_dr_info, vectype,
! 						   off);
! 		/* Try to use a single smaller load when we are about
! 		   to load excess elements compared to the unrolled
! 		   scalar loop.  */
! 		if (known_gt ((i + 1) * nunits,
! 			      (group_size * vf - gap)))
! 		  {
! 		    poly_uint64 remain = ((group_size * vf - gap) - i * nunits);
! 		    if (known_ge ((i + 1) * nunits - (group_size * vf - gap),
! 				  nunits))
! 		      /* DR will be unused.  */
! 		      ltype = NULL_TREE;
! 		    else if (known_ge (vect_align,
! 				       tree_to_poly_uint64
! 					 (TYPE_SIZE_UNIT (vectype))))
! 		      /* Aligned access to excess elements is OK if
! 			 at least one element is accessed in the
! 			 scalar loop.  */
! 		      ;
! 		    else if (known_gt (vect_align,
! 				       ((nunits - remain) * dr_size)))
! 		      /* Aligned access to the gap area when there's
! 			 at least one element in it is OK.  */
! 		      ;
! 		    else
  		      {
! 			/* remain should now be > 0 and < nunits.  */
! 			unsigned num;
! 			if (known_ne (remain, 0u)
! 			    && constant_multiple_p (nunits, remain, &num))
  			  {
! 			    tree ptype;
! 			    new_vtype
! 			      = vector_vector_composition_type (vectype, num,
! 								&ptype);
! 			    if (new_vtype)
! 			      ltype = ptype;
! 			  }
! 			/* Else use multiple loads or a masked load?  */
! 			/* For loop vectorization we now should have
! 			   an alternate type or LOOP_VINFO_PEELING_FOR_GAPS
! 			   set.  */
! 			if (loop_vinfo)
! 			  gcc_assert (new_vtype
! 				      || LOOP_VINFO_PEELING_FOR_GAPS
! 					   (loop_vinfo));
! 			/* But still reduce the access size to the next
! 			   required power-of-two so peeling a single
! 			   scalar iteration is sufficient.  */
! 			unsigned HOST_WIDE_INT cremain;
! 			if (remain.is_constant (&cremain))
! 			  {
! 			    unsigned HOST_WIDE_INT cpart_size
! 			      = 1 << ceil_log2 (cremain);
! 			    if (known_gt (nunits, cpart_size)
! 				&& constant_multiple_p (nunits, cpart_size,
! 							&num))
  			      {
  				tree ptype;
  				new_vtype
*************** vectorizable_load (vec_info *vinfo,
*** 11753,12085 ****
  				if (new_vtype)
  				  ltype = ptype;
  			      }
- 			    /* Else use multiple loads or a masked load?  */
- 			    /* For loop vectorization we now should have
- 			       an alternate type or LOOP_VINFO_PEELING_FOR_GAPS
- 			       set.  */
- 			    if (loop_vinfo)
- 			      gcc_assert (new_vtype
- 					  || LOOP_VINFO_PEELING_FOR_GAPS
- 					       (loop_vinfo));
- 			    /* But still reduce the access size to the next
- 			       required power-of-two so peeling a single
- 			       scalar iteration is sufficient.  */
- 			    unsigned HOST_WIDE_INT cremain;
- 			    if (remain.is_constant (&cremain))
- 			      {
- 				unsigned HOST_WIDE_INT cpart_size
- 				  = 1 << ceil_log2 (cremain);
- 				if (known_gt (nunits, cpart_size)
- 				    && constant_multiple_p (nunits, cpart_size,
- 							    &num))
- 				  {
- 				    tree ptype;
- 				    new_vtype
- 				      = vector_vector_composition_type (vectype,
- 									num,
- 									&ptype);
- 				    if (new_vtype)
- 				      ltype = ptype;
- 				  }
- 			      }
  			  }
  		      }
! 		    tree offset
! 		      = (dataref_offset ? dataref_offset
! 					: build_int_cst (ref_type, 0));
! 		    if (!ltype)
  		      ;
! 		    else if (ltype != vectype
! 			     && memory_access_type == VMAT_CONTIGUOUS_REVERSE)
  		      {
! 			poly_uint64 gap_offset
! 			  = (tree_to_poly_uint64 (TYPE_SIZE_UNIT (vectype))
! 			     - tree_to_poly_uint64 (TYPE_SIZE_UNIT (ltype)));
! 			tree gapcst = build_int_cstu (ref_type, gap_offset);
! 			offset = size_binop (PLUS_EXPR, offset, gapcst);
  		      }
! 		    if (ltype)
  		      {
! 			data_ref
! 			  = fold_build2 (MEM_REF, ltype, dataref_ptr, offset);
! 			if (alignment_support_scheme == dr_aligned)
! 			  ;
! 			else
! 			  TREE_TYPE (data_ref)
! 			    = build_aligned_type (TREE_TYPE (data_ref),
! 						  align * BITS_PER_UNIT);
  		      }
! 		    if (!ltype)
! 		      data_ref = build_constructor (vectype, NULL);
! 		    else if (ltype != vectype)
  		      {
! 			vect_copy_ref_info (data_ref,
! 					    DR_REF (first_dr_info->dr));
! 			tree tem = make_ssa_name (ltype);
! 			new_stmt = gimple_build_assign (tem, data_ref);
! 			vect_finish_stmt_generation (vinfo, stmt_info, new_stmt,
! 						     gsi);
! 			data_ref = NULL;
! 			vec<constructor_elt, va_gc> *v;
! 			/* We've computed 'num' above to statically two
! 			   or via constant_multiple_p.  */
! 			unsigned num
! 			  = (exact_div (tree_to_poly_uint64
! 					  (TYPE_SIZE_UNIT (vectype)),
! 					tree_to_poly_uint64
! 					  (TYPE_SIZE_UNIT (ltype)))
! 			     .to_constant ());
! 			vec_alloc (v, num);
! 			if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
! 			  {
! 			    while (--num)
! 			      CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
! 						      build_zero_cst (ltype));
! 			    CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tem);
! 			  }
! 			else
! 			  {
! 			    CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tem);
! 			    while (--num)
! 			      CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
! 						      build_zero_cst (ltype));
! 			  }
! 			gcc_assert (new_vtype != NULL_TREE);
! 			if (new_vtype == vectype)
! 			  new_stmt = gimple_build_assign (
! 			    vec_dest, build_constructor (vectype, v));
! 			else
! 			  {
! 			    tree new_vname = make_ssa_name (new_vtype);
! 			    new_stmt = gimple_build_assign (
! 			      new_vname, build_constructor (new_vtype, v));
! 			    vect_finish_stmt_generation (vinfo, stmt_info,
! 							 new_stmt, gsi);
! 			    new_stmt = gimple_build_assign (
! 			      vec_dest,
! 			      build1 (VIEW_CONVERT_EXPR, vectype, new_vname));
! 			  }
  		      }
  		  }
- 		break;
  	      }
! 	    case dr_explicit_realign:
! 	      {
! 		if (costing_p)
! 		  break;
! 		tree ptr, bump;
  
! 		tree vs = size_int (TYPE_VECTOR_SUBPARTS (vectype));
  
! 		if (compute_in_loop)
! 		  msq = vect_setup_realignment (vinfo, first_stmt_info, gsi,
! 						&realignment_token,
! 						dr_explicit_realign,
! 						dataref_ptr, NULL);
  
! 		if (TREE_CODE (dataref_ptr) == SSA_NAME)
! 		  ptr = copy_ssa_name (dataref_ptr);
! 		else
! 		  ptr = make_ssa_name (TREE_TYPE (dataref_ptr));
! 		// For explicit realign the target alignment should be
! 		// known at compile time.
! 		unsigned HOST_WIDE_INT align
! 		  = DR_TARGET_ALIGNMENT (first_dr_info).to_constant ();
! 		new_stmt = gimple_build_assign (
! 		  ptr, BIT_AND_EXPR, dataref_ptr,
! 		  build_int_cst (TREE_TYPE (dataref_ptr),
! 				 -(HOST_WIDE_INT) align));
! 		vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 		data_ref
! 		  = build2 (MEM_REF, vectype, ptr, build_int_cst (ref_type, 0));
! 		vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 		vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 		new_stmt = gimple_build_assign (vec_dest, data_ref);
! 		new_temp = make_ssa_name (vec_dest, new_stmt);
! 		gimple_assign_set_lhs (new_stmt, new_temp);
! 		gimple_move_vops (new_stmt, stmt_info->stmt);
! 		vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 		msq = new_temp;
  
! 		bump = size_binop (MULT_EXPR, vs, TYPE_SIZE_UNIT (elem_type));
! 		bump = size_binop (MINUS_EXPR, bump, size_one_node);
! 		ptr = bump_vector_ptr (vinfo, dataref_ptr, NULL, gsi, stmt_info,
! 				       bump);
! 		new_stmt = gimple_build_assign (
! 		  NULL_TREE, BIT_AND_EXPR, ptr,
! 		  build_int_cst (TREE_TYPE (ptr), -(HOST_WIDE_INT) align));
! 		if (TREE_CODE (ptr) == SSA_NAME)
! 		  ptr = copy_ssa_name (ptr, new_stmt);
! 		else
! 		  ptr = make_ssa_name (TREE_TYPE (ptr), new_stmt);
! 		gimple_assign_set_lhs (new_stmt, ptr);
! 		vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 		data_ref
! 		  = build2 (MEM_REF, vectype, ptr, build_int_cst (ref_type, 0));
! 		break;
! 	      }
! 	    case dr_explicit_realign_optimized:
! 	      {
! 		if (costing_p)
! 		  break;
! 		if (TREE_CODE (dataref_ptr) == SSA_NAME)
! 		  new_temp = copy_ssa_name (dataref_ptr);
! 		else
! 		  new_temp = make_ssa_name (TREE_TYPE (dataref_ptr));
! 		// We should only be doing this if we know the target
! 		// alignment at compile time.
! 		unsigned HOST_WIDE_INT align
! 		  = DR_TARGET_ALIGNMENT (first_dr_info).to_constant ();
! 		new_stmt = gimple_build_assign (
! 		  new_temp, BIT_AND_EXPR, dataref_ptr,
! 		  build_int_cst (TREE_TYPE (dataref_ptr),
! 				 -(HOST_WIDE_INT) align));
! 		vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 		data_ref = build2 (MEM_REF, vectype, new_temp,
! 				   build_int_cst (ref_type, 0));
! 		break;
! 	      }
! 	    default:
! 	      gcc_unreachable ();
! 	    }
  
! 	  /* One common place to cost the above vect load for different
! 	     alignment support schemes.  */
! 	  if (costing_p)
  	    {
! 	      /* For VMAT_CONTIGUOUS_PERMUTE if it's grouped load, we
! 		 only need to take care of the first stmt, whose
! 		 stmt_info is first_stmt_info, vec_num iterating on it
! 		 will cover the cost for the remaining, it's consistent
! 		 with transforming.  For the prologue cost for realign,
! 		 we only need to count it once for the whole group.  */
! 	      bool first_stmt_info_p = first_stmt_info == stmt_info;
! 	      bool add_realign_cost = first_stmt_info_p && i == 0;
! 	      if (memory_access_type == VMAT_CONTIGUOUS
! 		  || memory_access_type == VMAT_CONTIGUOUS_REVERSE
! 		  || (memory_access_type == VMAT_CONTIGUOUS_PERMUTE
! 		      && (!grouped_load || first_stmt_info_p)))
! 		{
! 		  /* Leave realign cases alone to keep them simple.  */
! 		  if (alignment_support_scheme == dr_explicit_realign_optimized
! 		      || alignment_support_scheme == dr_explicit_realign)
! 		    vect_get_load_cost (vinfo, stmt_info, slp_node, 1,
! 					alignment_support_scheme, misalignment,
! 					add_realign_cost, &inside_cost,
! 					&prologue_cost, cost_vec, cost_vec,
! 					true);
! 		  else
! 		    n_adjacent_loads++;
! 		}
  	    }
! 	  else
  	    {
! 	      vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	      /* DATA_REF is null if we've already built the statement.  */
! 	      if (data_ref)
! 		{
! 		  vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 		  new_stmt = gimple_build_assign (vec_dest, data_ref);
! 		}
  
! 	      new_temp = need_zeroing
! 		? make_ssa_name (vectype)
! 		: make_ssa_name (vec_dest, new_stmt);
! 	      gimple_set_lhs (new_stmt, new_temp);
! 	      vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	      /* If we need to explicitly zero inactive elements emit a
! 		 VEC_COND_EXPR that does so.  */
! 	      if (need_zeroing)
! 		{
! 		  vec_els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
! 						     vectype);
  
! 		  tree new_temp2 = make_ssa_name (vec_dest, new_stmt);
! 		  new_stmt
! 		    = gimple_build_assign (new_temp2, VEC_COND_EXPR,
! 					   final_mask, new_temp, vec_els);
! 		  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt,
! 					       gsi);
! 		  new_temp = new_temp2;
! 		}
  	    }
  
! 	  /* 3. Handle explicit realignment if necessary/supported.
! 	     Create in loop:
! 	       vec_dest = realign_load (msq, lsq, realignment_token)  */
! 	  if (!costing_p
! 	      && (alignment_support_scheme == dr_explicit_realign_optimized
! 		  || alignment_support_scheme == dr_explicit_realign))
! 	    {
! 	      lsq = gimple_assign_lhs (new_stmt);
! 	      if (!realignment_token)
! 		realignment_token = dataref_ptr;
! 	      vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	      new_stmt = gimple_build_assign (vec_dest, REALIGN_LOAD_EXPR, msq,
! 					      lsq, realignment_token);
! 	      new_temp = make_ssa_name (vec_dest, new_stmt);
! 	      gimple_assign_set_lhs (new_stmt, new_temp);
! 	      vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	      if (alignment_support_scheme == dr_explicit_realign_optimized)
! 		{
! 		  gcc_assert (phi);
! 		  if (i == vec_num - 1 && j == ncopies - 1)
! 		    add_phi_arg (phi, lsq, loop_latch_edge (containing_loop),
! 				 UNKNOWN_LOCATION);
! 		  msq = lsq;
! 		}
  	    }
  
! 	  if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
  	    {
! 	      if (costing_p)
! 		inside_cost = record_stmt_cost (cost_vec, 1, vec_perm,
! 						slp_node, 0, vect_body);
! 	      else
! 		{
! 		  tree perm_mask = perm_mask_for_reverse (vectype);
! 		  new_temp = permute_vec_elements (vinfo, new_temp, new_temp,
! 						   perm_mask, stmt_info, gsi);
! 		  new_stmt = SSA_NAME_DEF_STMT (new_temp);
! 		}
  	    }
  
! 	  /* Collect vector loads and later create their permutation in
! 	     vect_transform_grouped_load ().  */
! 	  if (!costing_p && (grouped_load || slp_perm))
! 	    dr_chain.quick_push (new_temp);
  
! 	  /* Store vector loads in the corresponding SLP_NODE.  */
! 	  if (!costing_p && slp && !slp_perm)
! 	    slp_node->push_vec_def (new_stmt);
  
! 	  /* With SLP permutation we load the gaps as well, without
! 	     we need to skip the gaps after we manage to fully load
! 	     all elements.  group_gap_adj is DR_GROUP_SIZE here.  */
! 	  group_elt += nunits;
! 	  if (!costing_p
! 	      && maybe_ne (group_gap_adj, 0U)
! 	      && !slp_perm
! 	      && known_eq (group_elt, group_size - group_gap_adj))
! 	    {
! 	      poly_wide_int bump_val
! 		= (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj);
! 	      if (tree_int_cst_sgn (vect_dr_behavior (vinfo, dr_info)->step)
! 		  == -1)
! 		bump_val = -bump_val;
! 	      tree bump = wide_int_to_tree (sizetype, bump_val);
! 	      dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
! 					     stmt_info, bump);
! 	      group_elt = 0;
! 	    }
! 	}
!       /* Bump the vector pointer to account for a gap or for excess
! 	 elements loaded for a permuted SLP load.  */
        if (!costing_p
  	  && maybe_ne (group_gap_adj, 0U)
! 	  && slp_perm)
  	{
  	  poly_wide_int bump_val
  	    = (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj);
--- 11639,11927 ----
  				if (new_vtype)
  				  ltype = ptype;
  			      }
  			  }
  		      }
! 		  }
! 		tree offset = (dataref_offset ? dataref_offset
! 			       : build_int_cst (ref_type, 0));
! 		if (!ltype)
! 		  ;
! 		else if (ltype != vectype
! 			 && memory_access_type == VMAT_CONTIGUOUS_REVERSE)
! 		  {
! 		    poly_uint64 gap_offset
! 		      = (tree_to_poly_uint64 (TYPE_SIZE_UNIT (vectype))
! 			 - tree_to_poly_uint64 (TYPE_SIZE_UNIT (ltype)));
! 		    tree gapcst = build_int_cstu (ref_type, gap_offset);
! 		    offset = size_binop (PLUS_EXPR, offset, gapcst);
! 		  }
! 		if (ltype)
! 		  {
! 		    data_ref = fold_build2 (MEM_REF, ltype,
! 					    dataref_ptr, offset);
! 		    if (alignment_support_scheme == dr_aligned)
  		      ;
! 		    else
! 		      TREE_TYPE (data_ref)
! 			= build_aligned_type (TREE_TYPE (data_ref),
! 					      align * BITS_PER_UNIT);
! 		  }
! 		if (!ltype)
! 		  data_ref = build_constructor (vectype, NULL);
! 		else if (ltype != vectype)
! 		  {
! 		    vect_copy_ref_info (data_ref,
! 					DR_REF (first_dr_info->dr));
! 		    tree tem = make_ssa_name (ltype);
! 		    new_stmt = gimple_build_assign (tem, data_ref);
! 		    vect_finish_stmt_generation (vinfo, stmt_info, new_stmt,
! 						 gsi);
! 		    data_ref = NULL;
! 		    vec<constructor_elt, va_gc> *v;
! 		    /* We've computed 'num' above to statically two
! 		       or via constant_multiple_p.  */
! 		    unsigned num
! 		      = (exact_div (tree_to_poly_uint64
! 				      (TYPE_SIZE_UNIT (vectype)),
! 				    tree_to_poly_uint64
! 				      (TYPE_SIZE_UNIT (ltype)))
! 			 .to_constant ());
! 		    vec_alloc (v, num);
! 		    if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
  		      {
! 			while (--num)
! 			  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
! 						  build_zero_cst (ltype));
! 			CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tem);
  		      }
! 		    else
  		      {
! 			CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tem);
! 			while (--num)
! 			  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
! 						  build_zero_cst (ltype));
  		      }
! 		    gcc_assert (new_vtype != NULL_TREE);
! 		    if (new_vtype == vectype)
! 		      new_stmt
! 			= gimple_build_assign (vec_dest,
! 					       build_constructor (vectype, v));
! 		    else
  		      {
! 			tree new_vname = make_ssa_name (new_vtype);
! 			new_stmt
! 			  = gimple_build_assign (new_vname,
! 						 build_constructor (new_vtype,
! 								    v));
! 			vect_finish_stmt_generation (vinfo, stmt_info,
! 						     new_stmt, gsi);
! 			new_stmt
! 			  = gimple_build_assign (vec_dest,
! 						 build1 (VIEW_CONVERT_EXPR,
! 							 vectype, new_vname));
  		      }
  		  }
  	      }
! 	    break;
! 	  }
! 	case dr_explicit_realign:
! 	  {
! 	    if (costing_p)
! 	      break;
! 	    tree ptr, bump;
  
! 	    tree vs = size_int (TYPE_VECTOR_SUBPARTS (vectype));
  
! 	    if (compute_in_loop)
! 	      msq = vect_setup_realignment (vinfo, first_stmt_info, gsi,
! 					    &realignment_token,
! 					    dr_explicit_realign,
! 					    dataref_ptr, NULL);
  
! 	    if (TREE_CODE (dataref_ptr) == SSA_NAME)
! 	      ptr = copy_ssa_name (dataref_ptr);
! 	    else
! 	      ptr = make_ssa_name (TREE_TYPE (dataref_ptr));
! 	    // For explicit realign the target alignment should be
! 	    // known at compile time.
! 	    unsigned HOST_WIDE_INT align
! 	      = DR_TARGET_ALIGNMENT (first_dr_info).to_constant ();
! 	    new_stmt = gimple_build_assign (ptr, BIT_AND_EXPR, dataref_ptr,
! 					    build_int_cst
! 					      (TREE_TYPE (dataref_ptr),
! 					       -(HOST_WIDE_INT) align));
! 	    vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 	    data_ref = build2 (MEM_REF, vectype,
! 			       ptr, build_int_cst (ref_type, 0));
! 	    vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 	    vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	    new_stmt = gimple_build_assign (vec_dest, data_ref);
! 	    new_temp = make_ssa_name (vec_dest, new_stmt);
! 	    gimple_assign_set_lhs (new_stmt, new_temp);
! 	    gimple_move_vops (new_stmt, stmt_info->stmt);
! 	    vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 	    msq = new_temp;
  
! 	    bump = size_binop (MULT_EXPR, vs, TYPE_SIZE_UNIT (elem_type));
! 	    bump = size_binop (MINUS_EXPR, bump, size_one_node);
! 	    ptr = bump_vector_ptr (vinfo, dataref_ptr, NULL, gsi, stmt_info,
! 				   bump);
! 	    new_stmt = gimple_build_assign (NULL_TREE, BIT_AND_EXPR, ptr,
! 					    build_int_cst (TREE_TYPE (ptr),
! 							   -(HOST_WIDE_INT) align));
! 	    if (TREE_CODE (ptr) == SSA_NAME)
! 	      ptr = copy_ssa_name (ptr, new_stmt);
! 	    else
! 	      ptr = make_ssa_name (TREE_TYPE (ptr), new_stmt);
! 	    gimple_assign_set_lhs (new_stmt, ptr);
! 	    vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 	    data_ref = build2 (MEM_REF, vectype,
! 			       ptr, build_int_cst (ref_type, 0));
! 	    break;
! 	  }
! 	case dr_explicit_realign_optimized:
! 	  {
! 	    if (costing_p)
! 	      break;
! 	    if (TREE_CODE (dataref_ptr) == SSA_NAME)
! 	      new_temp = copy_ssa_name (dataref_ptr);
! 	    else
! 	      new_temp = make_ssa_name (TREE_TYPE (dataref_ptr));
! 	    // We should only be doing this if we know the target
! 	    // alignment at compile time.
! 	    unsigned HOST_WIDE_INT align
! 	      = DR_TARGET_ALIGNMENT (first_dr_info).to_constant ();
! 	    new_stmt = gimple_build_assign (new_temp, BIT_AND_EXPR, dataref_ptr,
! 					    build_int_cst (TREE_TYPE (dataref_ptr),
! 							   -(HOST_WIDE_INT) align));
! 	    vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
! 	    data_ref = build2 (MEM_REF, vectype, new_temp,
! 			       build_int_cst (ref_type, 0));
! 	    break;
! 	  }
! 	default:
! 	gcc_unreachable ();
! 	}
  
!       /* One common place to cost the above vect load for different
! 	 alignment support schemes.  */
!       if (costing_p)
! 	{
! 	  /* For VMAT_CONTIGUOUS_PERMUTE if it's grouped load, we
! 	     only need to take care of the first stmt, whose
! 	     stmt_info is first_stmt_info, vec_num iterating on it
! 	     will cover the cost for the remaining, it's consistent
! 	     with transforming.  For the prologue cost for realign,
! 	     we only need to count it once for the whole group.  */
! 	  bool first_stmt_info_p = first_stmt_info == stmt_info;
! 	  bool add_realign_cost = first_stmt_info_p && i == 0;
! 	  if (memory_access_type == VMAT_CONTIGUOUS
! 	      || memory_access_type == VMAT_CONTIGUOUS_REVERSE
! 	      || (memory_access_type == VMAT_CONTIGUOUS_PERMUTE
! 		  && (!grouped_load || first_stmt_info_p)))
  	    {
! 	      /* Leave realign cases alone to keep them simple.  */
! 	      if (alignment_support_scheme == dr_explicit_realign_optimized
! 		  || alignment_support_scheme == dr_explicit_realign)
! 		vect_get_load_cost (vinfo, stmt_info, slp_node, 1,
! 				    alignment_support_scheme, misalignment,
! 				    add_realign_cost, &inside_cost,
! 				    &prologue_cost, cost_vec, cost_vec,
! 				    true);
! 	      else
! 		n_adjacent_loads++;
  	    }
! 	}
!       else
! 	{
! 	  vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	  /* DATA_REF is null if we've already built the statement.  */
! 	  if (data_ref)
  	    {
! 	      vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
! 	      new_stmt = gimple_build_assign (vec_dest, data_ref);
! 	    }
  
! 	  new_temp = (need_zeroing
! 		      ? make_ssa_name (vectype)
! 		      : make_ssa_name (vec_dest, new_stmt));
! 	  gimple_set_lhs (new_stmt, new_temp);
! 	  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	  /* If we need to explicitly zero inactive elements emit a
! 	     VEC_COND_EXPR that does so.  */
! 	  if (need_zeroing)
! 	    {
! 	      vec_els = vect_get_mask_load_else (MASK_LOAD_ELSE_ZERO,
! 						 vectype);
  
! 	      tree new_temp2 = make_ssa_name (vec_dest, new_stmt);
! 	      new_stmt = gimple_build_assign (new_temp2, VEC_COND_EXPR,
! 					      final_mask, new_temp, vec_els);
! 	      vect_finish_stmt_generation (vinfo, stmt_info, new_stmt,
! 					   gsi);
! 	      new_temp = new_temp2;
  	    }
+ 	}
  
!       /* 3. Handle explicit realignment if necessary/supported.
! 	 Create in loop:
! 	 vec_dest = realign_load (msq, lsq, realignment_token)  */
!       if (!costing_p
! 	  && (alignment_support_scheme == dr_explicit_realign_optimized
! 	      || alignment_support_scheme == dr_explicit_realign))
! 	{
! 	  lsq = gimple_assign_lhs (new_stmt);
! 	  if (!realignment_token)
! 	    realignment_token = dataref_ptr;
! 	  vec_dest = vect_create_destination_var (scalar_dest, vectype);
! 	  new_stmt = gimple_build_assign (vec_dest, REALIGN_LOAD_EXPR, msq,
! 					  lsq, realignment_token);
! 	  new_temp = make_ssa_name (vec_dest, new_stmt);
! 	  gimple_assign_set_lhs (new_stmt, new_temp);
! 	  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
  
! 	  if (alignment_support_scheme == dr_explicit_realign_optimized)
! 	    {
! 	      gcc_assert (phi);
! 	      if (i == vec_num - 1)
! 		add_phi_arg (phi, lsq, loop_latch_edge (containing_loop),
! 			     UNKNOWN_LOCATION);
! 	      msq = lsq;
  	    }
+ 	}
  
!       if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
! 	{
! 	  if (costing_p)
! 	    inside_cost = record_stmt_cost (cost_vec, 1, vec_perm,
! 					    slp_node, 0, vect_body);
! 	  else
  	    {
! 	      tree perm_mask = perm_mask_for_reverse (vectype);
! 	      new_temp = permute_vec_elements (vinfo, new_temp, new_temp,
! 					       perm_mask, stmt_info, gsi);
! 	      new_stmt = SSA_NAME_DEF_STMT (new_temp);
  	    }
+ 	}
  
!       /* Collect vector loads and later create their permutation in
! 	 vect_transform_grouped_load ().  */
!       if (!costing_p && (grouped_load || slp_perm))
! 	dr_chain.quick_push (new_temp);
  
!       /* Store vector loads in the corresponding SLP_NODE.  */
!       if (!costing_p && !slp_perm)
! 	slp_node->push_vec_def (new_stmt);
  
!       /* With SLP permutation we load the gaps as well, without
! 	 we need to skip the gaps after we manage to fully load
! 	 all elements.  group_gap_adj is DR_GROUP_SIZE here.  */
!       group_elt += nunits;
        if (!costing_p
  	  && maybe_ne (group_gap_adj, 0U)
! 	  && !slp_perm
! 	  && known_eq (group_elt, group_size - group_gap_adj))
  	{
  	  poly_wide_int bump_val
  	    = (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj);
*************** vectorizable_load (vec_info *vinfo,
*** 12088,12159 ****
  	  tree bump = wide_int_to_tree (sizetype, bump_val);
  	  dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
  					 stmt_info, bump);
  	}
  
!       if (slp && !slp_perm)
! 	continue;
! 
!       if (slp_perm)
  	{
! 	  unsigned n_perms;
! 	  /* For SLP we know we've seen all possible uses of dr_chain so
! 	     direct vect_transform_slp_perm_load to DCE the unused parts.
! 	     ???  This is a hack to prevent compile-time issues as seen
! 	     in PR101120 and friends.  */
! 	  if (costing_p)
! 	    {
! 	      vect_transform_slp_perm_load (vinfo, slp_node, vNULL, nullptr, vf,
! 					    true, &n_perms, nullptr);
! 	      inside_cost = record_stmt_cost (cost_vec, n_perms, vec_perm,
! 					      slp_node, 0, vect_body);
! 	    }
! 	  else
! 	    {
! 	      bool ok = vect_transform_slp_perm_load (vinfo, slp_node, dr_chain,
! 						      gsi, vf, false, &n_perms,
! 						      nullptr, true);
! 	      gcc_assert (ok);
! 	    }
  	}
        else
  	{
! 	  if (grouped_load)
! 	    {
! 	      gcc_assert (memory_access_type == VMAT_CONTIGUOUS_PERMUTE);
! 	      /* We assume that the cost of a single load-lanes instruction
! 		 is equivalent to the cost of DR_GROUP_SIZE separate loads.
! 		 If a grouped access is instead being provided by a
! 		 load-and-permute operation, include the cost of the
! 		 permutes.  */
! 	      if (costing_p && first_stmt_info == stmt_info)
! 		{
! 		  /* Uses an even and odd extract operations or shuffle
! 		     operations for each needed permute.  */
! 		  int group_size = DR_GROUP_SIZE (first_stmt_info);
! 		  int nstmts = ceil_log2 (group_size) * group_size;
! 		  inside_cost += record_stmt_cost (cost_vec, nstmts, vec_perm,
! 						   slp_node, 0, vect_body);
! 
! 		  if (dump_enabled_p ())
! 		    dump_printf_loc (MSG_NOTE, vect_location,
! 				     "vect_model_load_cost: "
! 				     "strided group_size = %d .\n",
! 				     group_size);
! 		}
! 	      else if (!costing_p)
! 		{
! 		  vect_transform_grouped_load (vinfo, stmt_info, dr_chain,
! 					       group_size, gsi);
! 		  *vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
! 		}
! 	    }
! 	  else if (!costing_p)
! 	    STMT_VINFO_VEC_STMTS (stmt_info).safe_push (new_stmt);
  	}
        dr_chain.release ();
      }
-   if (!slp && !costing_p)
-     *vec_stmt = STMT_VINFO_VEC_STMTS (stmt_info)[0];
  
    if (costing_p)
      {
--- 11930,11976 ----
  	  tree bump = wide_int_to_tree (sizetype, bump_val);
  	  dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
  					 stmt_info, bump);
+ 	  group_elt = 0;
  	}
+     }
+   /* Bump the vector pointer to account for a gap or for excess
+      elements loaded for a permuted SLP load.  */
+   if (!costing_p
+       && maybe_ne (group_gap_adj, 0U)
+       && slp_perm)
+     {
+       poly_wide_int bump_val
+ 	= (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj);
+       if (tree_int_cst_sgn (vect_dr_behavior (vinfo, dr_info)->step) == -1)
+ 	bump_val = -bump_val;
+       tree bump = wide_int_to_tree (sizetype, bump_val);
+       dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi,
+ 				     stmt_info, bump);
+     }
  
!   if (slp_perm)
!     {
!       unsigned n_perms;
!       /* For SLP we know we've seen all possible uses of dr_chain so
! 	 direct vect_transform_slp_perm_load to DCE the unused parts.
! 	 ???  This is a hack to prevent compile-time issues as seen
! 	 in PR101120 and friends.  */
!       if (costing_p)
  	{
! 	  vect_transform_slp_perm_load (vinfo, slp_node, vNULL, nullptr, vf,
! 					true, &n_perms, nullptr);
! 	  inside_cost = record_stmt_cost (cost_vec, n_perms, vec_perm,
! 					  slp_node, 0, vect_body);
  	}
        else
  	{
! 	  bool ok = vect_transform_slp_perm_load (vinfo, slp_node, dr_chain,
! 						  gsi, vf, false, &n_perms,
! 						  nullptr, true);
! 	  gcc_assert (ok);
  	}
        dr_chain.release ();
      }
  
    if (costing_p)
      {
*************** vect_chooses_same_modes_p (vec_info *vin
*** 14130,14135 ****
--- 13947,13969 ----
    return true;
  }
  
+ /* Return true if replacing VECTOR_MODE with ALT_VECTOR_MODE would not
+    change the chosen vector modes for analysis of a loop.  */
+ 
+ bool
+ vect_chooses_same_modes_p (machine_mode vector_mode,
+ 			   machine_mode alt_vector_mode)
+ {
+   return (VECTOR_MODE_P (vector_mode)
+ 	  && VECTOR_MODE_P (alt_vector_mode)
+ 	  && (related_vector_mode (vector_mode,
+ 				   GET_MODE_INNER (alt_vector_mode))
+ 	      == alt_vector_mode)
+ 	  && (related_vector_mode (alt_vector_mode,
+ 				   GET_MODE_INNER (vector_mode))
+ 	      == vector_mode));
+ }
+ 
  /* Function vect_is_simple_use.
  
     Input:
*************** supportable_indirect_convert_operation (
*** 14927,14933 ****
    bool found_mode = false;
    scalar_mode lhs_mode = GET_MODE_INNER (TYPE_MODE (vectype_out));
    scalar_mode rhs_mode = GET_MODE_INNER (TYPE_MODE (vectype_in));
-   opt_scalar_mode mode_iter;
    tree_code tc1, tc2, code1, code2;
  
    tree cvt_type = NULL_TREE;
--- 14761,14766 ----
diff -Nrcpad gcc-16-20250622/gcc/tree-vectorizer.h gcc-16-20250629/gcc/tree-vectorizer.h
*** gcc-16-20250622/gcc/tree-vectorizer.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree-vectorizer.h	Sun Jun 29 22:34:01 2025
*************** enum dr_alignment_support {
*** 56,61 ****
--- 56,69 ----
    dr_aligned
  };
  
+ /* Define type of peeling support to indicate how peeling for alignment can help
+    make vectorization supported.  */
+ enum peeling_support {
+   peeling_known_supported,
+   peeling_maybe_supported,
+   peeling_unsupported
+ };
+ 
  /* Define type of def-use cross-iteration cycle.  */
  enum vect_def_type {
    vect_uninitialized_def = 0,
*************** public:
*** 946,951 ****
--- 954,966 ----
       epilogue of loop.  */
    bool epil_using_partial_vectors_p;
  
+   /* True if we've decided to use peeling with versioning together, which allows
+      unaligned unsupported data refs to be uniformly aligned after a certain
+      amount of peeling (mutual alignment).  Otherwise, we use versioning alone
+      so these data refs must be already aligned to a power-of-two boundary
+      without peeling.  */
+   bool allow_mutual_alignment;
+ 
    /* The bias for len_load and len_store.  For now, only 0 and -1 are
       supported.  -1 must be used when a backend does not support
       len_load/len_store with a length of zero.  */
*************** public:
*** 970,975 ****
--- 985,994 ----
    /* Main loop IV cond.  */
    gcond* loop_iv_cond;
  
+   /* True if we have an unroll factor requested by the user through pragma GCC
+      unroll.  */
+   bool user_unroll;
+ 
    /* True if there are no loop carried data dependencies in the loop.
       If loop->safelen <= 1, then this is always true, either the loop
       didn't have any loop carried data dependencies, or the loop is being
*************** public:
*** 1070,1075 ****
--- 1089,1095 ----
  #define LOOP_VINFO_USING_SELECT_VL_P(L) (L)->using_select_vl_p
  #define LOOP_VINFO_EPIL_USING_PARTIAL_VECTORS_P(L)                             \
    (L)->epil_using_partial_vectors_p
+ #define LOOP_VINFO_ALLOW_MUTUAL_ALIGNMENT(L) (L)->allow_mutual_alignment
  #define LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS(L) (L)->partial_load_store_bias
  #define LOOP_VINFO_VECT_FACTOR(L)          (L)->vectorization_factor
  #define LOOP_VINFO_MAX_VECT_FACTOR(L)      (L)->max_vectorization_factor
*************** public:
*** 1094,1099 ****
--- 1114,1120 ----
  #define LOOP_VINFO_CHECK_UNEQUAL_ADDRS(L)  (L)->check_unequal_addrs
  #define LOOP_VINFO_CHECK_NONZERO(L)        (L)->check_nonzero
  #define LOOP_VINFO_LOWER_BOUNDS(L)         (L)->lower_bounds
+ #define LOOP_VINFO_USER_UNROLL(L)          (L)->user_unroll
  #define LOOP_VINFO_GROUPED_STORES(L)       (L)->grouped_stores
  #define LOOP_VINFO_SLP_INSTANCES(L)        (L)->slp_instances
  #define LOOP_VINFO_SLP_UNROLLING_FACTOR(L) (L)->slp_unrolling_factor
*************** extern tree get_mask_type_for_scalar_typ
*** 2390,2395 ****
--- 2411,2417 ----
  extern tree get_mask_type_for_scalar_type (vec_info *, tree, slp_tree);
  extern tree get_same_sized_vectype (tree, tree);
  extern bool vect_chooses_same_modes_p (vec_info *, machine_mode);
+ extern bool vect_chooses_same_modes_p (machine_mode, machine_mode);
  extern bool vect_get_loop_mask_type (loop_vec_info);
  extern bool vect_is_simple_use (tree, vec_info *, enum vect_def_type *,
  				stmt_vec_info * = NULL, gimple ** = NULL);
*************** extern void duplicate_and_interleave (ve
*** 2680,2686 ****
  extern int vect_get_place_in_interleaving_chain (stmt_vec_info, stmt_vec_info);
  extern slp_tree vect_create_new_slp_node (unsigned, tree_code);
  extern void vect_free_slp_tree (slp_tree);
! extern bool compatible_calls_p (gcall *, gcall *);
  extern int vect_slp_child_index_for_operand (const gimple *, int op, bool);
  
  extern tree prepare_vec_mask (loop_vec_info, tree, tree, tree,
--- 2702,2708 ----
  extern int vect_get_place_in_interleaving_chain (stmt_vec_info, stmt_vec_info);
  extern slp_tree vect_create_new_slp_node (unsigned, tree_code);
  extern void vect_free_slp_tree (slp_tree);
! extern bool compatible_calls_p (gcall *, gcall *, bool);
  extern int vect_slp_child_index_for_operand (const gimple *, int op, bool);
  
  extern tree prepare_vec_mask (loop_vec_info, tree, tree, tree,
diff -Nrcpad gcc-16-20250622/gcc/tree.cc gcc-16-20250629/gcc/tree.cc
*** gcc-16-20250622/gcc/tree.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree.cc	Sun Jun 29 22:34:01 2025
*************** init_ttree (void)
*** 788,793 ****
--- 788,844 ----
  }
  
  
+ /* Mapping from prefix to label number.  */
+ 
+ struct identifier_hash : ggc_ptr_hash <tree_node>
+ {
+   static inline hashval_t hash (tree t)
+   {
+     return IDENTIFIER_HASH_VALUE (t);
+   }
+ };
+ struct identifier_count_traits
+   : simple_hashmap_traits<identifier_hash, long> {};
+ typedef hash_map<tree, long, identifier_count_traits> internal_label_map;
+ static GTY(()) internal_label_map *internal_label_nums;
+ 
+ /* Generates an identifier intended to be used internally with the
+    given PREFIX.  This is intended to be used by the frontend so that
+    C++ modules can regenerate appropriate (non-clashing) identifiers on
+    stream-in.  */
+ 
+ tree
+ generate_internal_label (const char *prefix)
+ {
+   tree prefix_id = get_identifier (prefix);
+   if (!internal_label_nums)
+     internal_label_nums = internal_label_map::create_ggc();
+   long &num = internal_label_nums->get_or_insert (prefix_id);
+ 
+   char tmp[32];
+   ASM_GENERATE_INTERNAL_LABEL (tmp, prefix, num++);
+ 
+   tree id = get_identifier (tmp);
+   IDENTIFIER_INTERNAL_P (id) = true;
+ 
+   /* Cache the prefix on the identifier so we can retrieve it later.  */
+   TREE_CHAIN (id) = prefix_id;
+ 
+   return id;
+ }
+ 
+ /* Get the PREFIX we created the internal identifier LABEL with.  */
+ 
+ const char *
+ prefix_for_internal_label (tree label)
+ {
+   gcc_assert (IDENTIFIER_INTERNAL_P (label)
+ 	      && !IDENTIFIER_TRANSPARENT_ALIAS (label)
+ 	      && TREE_CHAIN (label)
+ 	      && TREE_CODE (TREE_CHAIN (label)) == IDENTIFIER_NODE);
+   return IDENTIFIER_POINTER (TREE_CHAIN (label));
+ }
+ 
  /* The name of the object as the assembler will see it (but before any
     translations made by ASM_OUTPUT_LABELREF).  Often this is the same
     as DECL_NAME.  It is an IDENTIFIER_NODE.  */
diff -Nrcpad gcc-16-20250622/gcc/tree.h gcc-16-20250629/gcc/tree.h
*** gcc-16-20250622/gcc/tree.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/tree.h	Sun Jun 29 22:34:01 2025
*************** extern void omp_clause_range_check_faile
*** 1078,1083 ****
--- 1078,1088 ----
  #define IDENTIFIER_ANON_P(NODE) \
    (IDENTIFIER_NODE_CHECK (NODE)->base.private_flag)
  
+ /* Nonzero indicates an IDENTIFIER_NODE that names an internal label.
+    The prefix used to generate the label can be found on the TREE_CHAIN.  */
+ #define IDENTIFIER_INTERNAL_P(NODE) \
+   (IDENTIFIER_NODE_CHECK (NODE)->base.volatile_flag)
+ 
  /* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose
     uses are to be substituted for uses of the TREE_CHAINed identifier.  */
  #define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \
*************** vector_cst_encoded_nelts (const_tree t)
*** 4744,4749 ****
--- 4749,4756 ----
    return VECTOR_CST_NPATTERNS (t) * VECTOR_CST_NELTS_PER_PATTERN (t);
  }
  
+ extern tree generate_internal_label (const char *);
+ extern const char *prefix_for_internal_label (tree label);
  extern tree decl_assembler_name (tree);
  extern void overwrite_decl_assembler_name (tree decl, tree name);
  extern tree decl_comdat_group (const_tree);
diff -Nrcpad gcc-16-20250622/gcc/ubsan.cc gcc-16-20250629/gcc/ubsan.cc
*** gcc-16-20250622/gcc/ubsan.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/ubsan.cc	Sun Jun 29 22:34:01 2025
*************** get_ubsan_type_info_for_type (tree type)
*** 358,367 ****
      return 0;
  }
  
- /* Counters for internal labels.  ubsan_ids[0] for Lubsan_type,
-    ubsan_ids[1] for Lubsan_data labels.  */
- static GTY(()) unsigned int ubsan_ids[2];
- 
  /* Helper routine that returns ADDR_EXPR of a VAR_DECL of a type
     descriptor.  It first looks into the hash table; if not found,
     create the VAR_DECL, put it into the hash table and return the
--- 358,363 ----
*************** ubsan_type_descriptor (tree type, enum u
*** 552,561 ****
    TREE_READONLY (str) = 1;
    TREE_STATIC (str) = 1;
  
!   char tmp_name[32];
!   ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_type", ubsan_ids[0]++);
!   decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (tmp_name),
! 		     dtype);
    TREE_STATIC (decl) = 1;
    TREE_PUBLIC (decl) = 0;
    DECL_ARTIFICIAL (decl) = 1;
--- 548,555 ----
    TREE_READONLY (str) = 1;
    TREE_STATIC (str) = 1;
  
!   decl = build_decl (UNKNOWN_LOCATION, VAR_DECL,
! 		     generate_internal_label ("Lubsan_type"), dtype);
    TREE_STATIC (decl) = 1;
    TREE_PUBLIC (decl) = 0;
    DECL_ARTIFICIAL (decl) = 1;
*************** ubsan_create_data (const char *name, int
*** 659,668 ****
    layout_type (ret);
  
    /* Now, fill in the type.  */
!   char tmp_name[32];
!   ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_data", ubsan_ids[1]++);
!   tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (tmp_name),
! 			 ret);
    TREE_STATIC (var) = 1;
    TREE_PUBLIC (var) = 0;
    DECL_ARTIFICIAL (var) = 1;
--- 653,660 ----
    layout_type (ret);
  
    /* Now, fill in the type.  */
!   tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL,
! 			 generate_internal_label ("Lubsan_data"), ret);
    TREE_STATIC (var) = 1;
    TREE_PUBLIC (var) = 0;
    DECL_ARTIFICIAL (var) = 1;
diff -Nrcpad gcc-16-20250622/gcc/value-range.cc gcc-16-20250629/gcc/value-range.cc
*** gcc-16-20250622/gcc/value-range.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/value-range.cc	Sun Jun 29 22:34:01 2025
*************** frange::supports_type_p (const_tree type
*** 1205,1211 ****
  }
  
  void
! frange::verify_range ()
  {
    if (!undefined_p ())
      gcc_checking_assert (HONOR_NANS (m_type) || !maybe_isnan ());
--- 1205,1211 ----
  }
  
  void
! frange::verify_range () const
  {
    if (!undefined_p ())
      gcc_checking_assert (HONOR_NANS (m_type) || !maybe_isnan ());
*************** irange::set (tree min, tree max, value_r
*** 1515,1521 ****
  // Check the validity of the range.
  
  void
! irange::verify_range ()
  {
    gcc_checking_assert (m_discriminator == VR_IRANGE);
    if (m_kind == VR_UNDEFINED)
--- 1515,1521 ----
  // Check the validity of the range.
  
  void
! irange::verify_range () const
  {
    gcc_checking_assert (m_discriminator == VR_IRANGE);
    if (m_kind == VR_UNDEFINED)
*************** irange::get_bitmask () const
*** 2513,2519 ****
    // See also the note in irange_bitmask::intersect.
    irange_bitmask bm (type (), lower_bound (), upper_bound ());
    if (!m_bitmask.unknown_p ())
!     bm.intersect (m_bitmask);
    return bm;
  }
  
--- 2513,2525 ----
    // See also the note in irange_bitmask::intersect.
    irange_bitmask bm (type (), lower_bound (), upper_bound ());
    if (!m_bitmask.unknown_p ())
!     {
!       bm.intersect (m_bitmask);
!       // If the new intersection is unknown, it means there are inconstent
!       // bits, so simply return the original bitmask.
!       if (bm.unknown_p ())
! 	return m_bitmask;
!     }
    return bm;
  }
  
*************** range_tests_strict_enum ()
*** 2879,2884 ****
--- 2885,2996 ----
    ASSERT_FALSE (ir1.varying_p ());
  }
  
+ // Test that range bounds are "snapped" to where they are expected to be.
+ 
+ static void
+ assert_snap_result (int lb_val, int ub_val,
+ 		    int expected_lb, int expected_ub,
+ 		    unsigned mask_val, unsigned value_val,
+ 		    tree type)
+ {
+   wide_int lb = wi::shwi (lb_val, TYPE_PRECISION (type));
+   wide_int ub = wi::shwi (ub_val, TYPE_PRECISION (type));
+   wide_int new_lb, new_ub;
+ 
+   irange_bitmask bm (wi::uhwi (value_val, TYPE_PRECISION (type)),
+ 		     wi::uhwi (mask_val, TYPE_PRECISION (type)));
+ 
+   int_range_max r (type);
+   r.set (type, lb, ub);
+   r.update_bitmask (bm);
+ 
+   if (TYPE_SIGN (type) == SIGNED && expected_ub < expected_lb)
+     gcc_checking_assert (r.undefined_p ());
+   else if (TYPE_SIGN (type) == UNSIGNED
+ 	   && ((unsigned)expected_ub < (unsigned)expected_lb))
+     gcc_checking_assert (r.undefined_p ());
+   else
+     {
+       gcc_checking_assert (wi::eq_p (r.lower_bound (),
+ 				     wi::shwi (expected_lb,
+ 					       TYPE_PRECISION (type))));
+       gcc_checking_assert (wi::eq_p (r.upper_bound (),
+ 				     wi::shwi (expected_ub,
+ 					       TYPE_PRECISION (type))));
+     }
+ }
+ 
+ 
+ // Run a selection of tests that confirm, bounds are snapped as expected.
+ // We only test individual pairs, multiple pairs use the same snapping
+ // routine as single pairs.
+ 
+ static void
+ test_irange_snap_bounds ()
+ {
+   tree u32 = unsigned_type_node;
+   tree s32 = integer_type_node;
+   tree s8 = build_nonstandard_integer_type (8, /*unsigned=*/ 0);
+   tree s1 = build_nonstandard_integer_type (1, /*unsigned=*/ 0);
+   tree u1 = build_nonstandard_integer_type (1, /*unsigned=*/ 1);
+ 
+   // Basic aligned range: even-only
+   assert_snap_result (5, 15, 6, 14, 0xFFFFFFFE, 0x0, u32);
+   // Singleton that doesn't match mask: undefined.
+   assert_snap_result (7, 7, 1, 0, 0xFFFFFFFE, 0x0, u32);
+   // 8-bit signed char, mask 0xF0 (i.e. step of 16).
+   assert_snap_result (-100, 100, -96, 96, 0xF0, 0x00, s8);
+   // Already aligned range: no change.
+   assert_snap_result (0, 240, 0, 240, 0xF0, 0x00, u32);
+   // Negative range, step 16 alignment (s32).
+   assert_snap_result (-123, -17, -112, -32, 0xFFFFFFF0, 0x00, s32);
+   // Negative range, step 16 alignment (trailing-zero aligned mask).
+   assert_snap_result (-123, -17, -112, -32, 0xFFFFFFF0, 0x00, s32);
+   // s8, 16-alignment mask, value = 0 (valid).
+   assert_snap_result (-50, 10, -48, 0, 0xF0, 0x00, s8);
+   // No values in range [-3,2] match alignment except 0.
+   assert_snap_result (-3, 2, 0, 0, 0xF8, 0x00, s8);
+   // No values in range [-3,2] match alignment — undefined.
+   assert_snap_result (-3, 2, 1, 0, 0xF8, 0x04, s8);
+   // Already aligned range: no change.
+   assert_snap_result (0, 240, 0, 240, 0xF0, 0x00, s32);
+   // 1-bit signed: only -1 allowed (0b1).
+   assert_snap_result (-1, 0, -1, -1, 0x00, 0x01, s1);
+   // 1-bit signed: only 0 allowed (0b0).
+   assert_snap_result (-1, 0, 0, 0, 0x00, 0x00, s1);
+   // 1-bit signed: no match (invalid case).
+   assert_snap_result (-1, -1, 1, 0, 0x00, 0x00, s1);
+   // 1-bit signed: no match (invalid case).
+   assert_snap_result (0, 0, 1, 0, 0x00, 0x01, s1);
+   // 1-bit unsigned: only 1 allowed.
+   assert_snap_result (0, 1, 1, 1, 0x00, 0x01, u1);
+   // 1-bit unsigned: only 0 allowed.
+   assert_snap_result (0, 1, 0, 0, 0x00, 0x00, u1);
+   // 1-bit unsigned: no match (invalid case).
+   assert_snap_result (1, 1, 1, 0, 0x00, 0x00, u1);
+   // 1-bit unsigned: no match (invalid case).
+   assert_snap_result (0, 0, 1, 0, 0x00, 0x01, u1);
+   // Unsigned: Near overflow, even alignment.
+   assert_snap_result (UINT_MAX - 6, UINT_MAX, UINT_MAX - 5, UINT_MAX - 1,
+ 		      0xFFFFFFFE, 0x00, u32);
+   // Unsigned: Wraparound-like range — no valid snapped values.
+   assert_snap_result (UINT_MAX - 5, UINT_MAX, 1, 0, 0xFFFFFFF0, 0x00, u32);
+   // Signed: Near INT_MAX, 8-aligned.
+   assert_snap_result (INT_MAX - 18, INT_MAX, INT_MAX - 15, INT_MAX - 7,
+ 		      0xFFFFFFF8, 0x00, s32);
+   // Signed: Near INT_MIN, 16-aligned.
+   assert_snap_result (INT_MIN, INT_MIN + 30, INT_MIN, INT_MIN + 16,
+ 		      0xFFFFFFF0, 0x00, s32);
+   // Signed: Full domain, 4-aligned.
+   assert_snap_result (-128, 127, -128, 124, 0xFC, 0x00, s8);
+   // Singleton at INT_MIN that doesn’t match alignment — undefined
+   assert_snap_result (INT_MIN, INT_MIN, 1, 0, 0xFFFFFFFE, 0x01, s32);
+   // Range at INT_MIN that doesn’t match alignment — undefined.
+   assert_snap_result (INT_MIN, INT_MIN + 10, 1, 0, 0xFFFFFFF0, 0x0F, s32);
+   // Unsigned: Full domain, 256-aligned.
+   assert_snap_result (0, UINT_MAX, 0, UINT_MAX & ~255, 0xFFFFFF00, 0x00, u32);
+ }
+ 
  static void
  range_tests_misc ()
  {
*************** range_tests_nonzero_bits ()
*** 3150,3155 ****
--- 3262,3270 ----
    r0.set_zero (integer_type_node);
    r0.set_nonzero_bits (INT (1));
    ASSERT_TRUE (r0.zero_p ());
+ 
+   // Now test that range bounds are snapped to match bitmask alignments.
+   test_irange_snap_bounds ();
  }
  
  // Build an frange from string endpoints.
diff -Nrcpad gcc-16-20250622/gcc/value-range.h gcc-16-20250629/gcc/value-range.h
*** gcc-16-20250622/gcc/value-range.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/value-range.h	Sun Jun 29 22:34:01 2025
*************** public:
*** 111,116 ****
--- 111,117 ----
    bool operator== (const vrange &) const;
    bool operator!= (const vrange &r) const { return !(*this == r); }
    void dump (FILE *) const;
+   virtual void verify_range () const { }
  protected:
    vrange (enum value_range_discriminator d) : m_discriminator (d) { }
    ENUM_BITFIELD(value_range_kind) m_kind : 8;
*************** public:
*** 323,328 ****
--- 324,330 ----
    virtual void update_bitmask (const class irange_bitmask &) override;
    virtual irange_bitmask get_bitmask () const override;
  
+   virtual void verify_range () const;
  protected:
    void maybe_resize (int needed);
    virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
*************** protected:
*** 335,341 ****
  
    void normalize_kind ();
  
-   void verify_range ();
  
    // Hard limit on max ranges allowed.
    static const int HARD_MAX_RANGES = 255;
--- 337,342 ----
*************** public:
*** 421,427 ****
    bool contains_p (const wide_int &) const;
    wide_int lower_bound () const;
    wide_int upper_bound () const;
!   void verify_range () const;
    irange_bitmask get_bitmask () const final override;
    void update_bitmask (const irange_bitmask &) final override;
  protected:
--- 422,428 ----
    bool contains_p (const wide_int &) const;
    wide_int lower_bound () const;
    wide_int upper_bound () const;
!   virtual void verify_range () const;
    irange_bitmask get_bitmask () const final override;
    void update_bitmask (const irange_bitmask &) final override;
  protected:
*************** public:
*** 593,606 ****
    bool nan_signbit_p (bool &signbit) const;
    bool known_isnormal () const;
    bool known_isdenormal_or_zero () const;
! 
  protected:
    virtual bool contains_p (tree cst) const override;
    virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
  
  private:
    bool internal_singleton_p (REAL_VALUE_TYPE * = NULL) const;
-   void verify_range ();
    bool normalize_kind ();
    bool union_nans (const frange &);
    bool intersect_nans (const frange &);
--- 594,606 ----
    bool nan_signbit_p (bool &signbit) const;
    bool known_isnormal () const;
    bool known_isdenormal_or_zero () const;
!   virtual void verify_range () const;
  protected:
    virtual bool contains_p (tree cst) const override;
    virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
  
  private:
    bool internal_singleton_p (REAL_VALUE_TYPE * = NULL) const;
    bool normalize_kind ();
    bool union_nans (const frange &);
    bool intersect_nans (const frange &);
*************** public:
*** 798,803 ****
--- 798,804 ----
    void update_bitmask (const class irange_bitmask &bm)
    { return m_vrange->update_bitmask (bm); }
    void accept (const vrange_visitor &v) const { m_vrange->accept (v); }
+   void verify_range () const { m_vrange->verify_range (); }
  private:
    void init (tree type);
    void init (const vrange &);
diff -Nrcpad gcc-16-20250622/gcc/value-relation.cc gcc-16-20250629/gcc/value-relation.cc
*** gcc-16-20250622/gcc/value-relation.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/value-relation.cc	Sun Jun 29 22:34:01 2025
*************** adjust_equivalence_range (vrange &range)
*** 202,213 ****
      }
   }
  
- // This vector maps a relation to the equivalent tree code.
- 
- static const tree_code relation_to_code [VREL_LAST] = {
-   ERROR_MARK, ERROR_MARK, LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EQ_EXPR,
-   NE_EXPR };
- 
  // Given an equivalence set EQUIV, set all the bits in B that are still valid
  // members of EQUIV in basic block BB.
  
--- 202,207 ----
diff -Nrcpad gcc-16-20250622/gcc/value-relation.h gcc-16-20250629/gcc/value-relation.h
*** gcc-16-20250622/gcc/value-relation.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/value-relation.h	Sun Jun 29 22:34:01 2025
*************** public:
*** 235,241 ****
    void dump (FILE *f) const final override;
  protected:
    virtual relation_chain *next_relation (basic_block, relation_chain *,
! 					 tree) const;
    bool m_do_trans_p;
    bitmap m_tmp, m_tmp2;
    bitmap m_relation_set;  // Index by ssa-name. True if a relation exists
--- 235,241 ----
    void dump (FILE *f) const final override;
  protected:
    virtual relation_chain *next_relation (basic_block, relation_chain *,
! 					 tree) const override;
    bool m_do_trans_p;
    bitmap m_tmp, m_tmp2;
    bitmap m_relation_set;  // Index by ssa-name. True if a relation exists
diff -Nrcpad gcc-16-20250622/gcc/xml.cc gcc-16-20250629/gcc/xml.cc
*** gcc-16-20250622/gcc/xml.cc	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/xml.cc	Sun Jun 29 22:34:01 2025
*************** node_with_children::add_text_from_pp (pr
*** 128,133 ****
--- 128,149 ----
    add_text (pp_formatted_text (&pp));
  }
  
+ void
+ node_with_children::add_comment (std::string str)
+ {
+   add_child (std::make_unique <comment> (std::move (str)));
+ }
+ 
+ element *
+ node_with_children::find_child_element (std::string kind) const
+ {
+   for (auto &iter : m_children)
+     if (element *e = iter->dyn_cast_element ())
+       if (e->m_kind == kind)
+ 	return e;
+   return nullptr;
+ }
+ 
  /* struct document : public node_with_children.  */
  
  void
*************** element::set_attr (const char *name, std
*** 193,198 ****
--- 209,241 ----
    m_attributes[name] = std::move (value);
  }
  
+ const char *
+ element::get_attr (const char *name) const
+ {
+   auto iter = m_attributes.find (name);
+   if (iter == m_attributes.end ())
+     return nullptr;
+   return iter->second.c_str ();
+ }
+ 
+ // struct comment : public node
+ 
+ void
+ comment::write_as_xml (pretty_printer *pp,
+ 		       int depth, bool indent) const
+ {
+   if (indent)
+     {
+       for (int i = 0; i < depth; ++i)
+ 	pp_string (pp, "  ");
+     }
+   pp_string (pp, "<!-- ");
+   write_escaped_text (pp, m_text.c_str ());
+   pp_string (pp, " -->");
+   if (indent)
+     pp_newline (pp);
+ }
+ 
  // struct raw : public node
  
  void
*************** printer::add_raw (std::string text)
*** 274,279 ****
--- 317,323 ----
  void
  printer::push_element (std::unique_ptr<element> new_element)
  {
+   gcc_assert (new_element.get ());
    element *parent = m_open_tags.back ();
    m_open_tags.push_back (new_element.get ());
    parent->add_child (std::move (new_element));
*************** printer::push_element (std::unique_ptr<e
*** 282,287 ****
--- 326,332 ----
  void
  printer::append (std::unique_ptr<node> new_node)
  {
+   gcc_assert (new_node.get ());
    element *parent = m_open_tags.back ();
    parent->add_child (std::move (new_node));
  }
*************** test_printer ()
*** 363,368 ****
--- 408,422 ----
       "    </bar>\n"
       "  </foo>\n"
       "</top>\n");
+ 
+   xml::element *foo = top.find_child_element ("foo");
+   ASSERT_TRUE (foo);
+   ASSERT_EQ (top.find_child_element ("not-foo"), nullptr);
+   xml::element *bar = foo->find_child_element ("bar");
+   ASSERT_TRUE (bar);
+   ASSERT_STREQ (bar->get_attr ("size"), "3");
+   ASSERT_STREQ (bar->get_attr ("color"), "red");
+   ASSERT_EQ (bar->get_attr ("airspeed-velocity"), nullptr);
  }
  
  // Verify that element attributes preserve insertion order.
*************** test_attribute_ordering ()
*** 393,398 ****
--- 447,465 ----
       "</top>\n");
  }
  
+ static void
+ test_comment ()
+ {
+   xml::document doc;
+   doc.add_comment ("hello");
+   doc.add_comment ("world");
+   ASSERT_XML_PRINT_EQ
+     (doc,
+      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+      "<!-- hello -->\n"
+      "<!-- world -->\n");
+ 
+ }
  /* Run all of the selftests within this file.  */
  
  void
*************** xml_cc_tests ()
*** 401,406 ****
--- 468,474 ----
    test_no_dtd ();
    test_printer ();
    test_attribute_ordering ();
+   test_comment ();
  }
  
  } // namespace selftest
diff -Nrcpad gcc-16-20250622/gcc/xml.h gcc-16-20250629/gcc/xml.h
*** gcc-16-20250622/gcc/xml.h	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gcc/xml.h	Sun Jun 29 22:34:01 2025
*************** struct node;
*** 30,35 ****
--- 30,37 ----
      struct document;
      struct element;
    struct doctypedecl;
+   struct comment;
+   struct raw;
  
  struct node
  {
*************** struct node
*** 38,44 ****
  			     int depth, bool indent) const = 0;
    virtual text *dyn_cast_text ()
    {
!     return 0;
    }
    void dump (FILE *out) const;
    void DEBUG_FUNCTION dump () const { dump (stderr); }
--- 40,50 ----
  			     int depth, bool indent) const = 0;
    virtual text *dyn_cast_text ()
    {
!     return nullptr;
!   }
!   virtual element *dyn_cast_element ()
!   {
!     return nullptr;
    }
    void dump (FILE *out) const;
    void DEBUG_FUNCTION dump () const { dump (stderr); }
*************** struct node_with_children : public node
*** 66,71 ****
--- 72,80 ----
    void add_child (std::unique_ptr<node> node);
    void add_text (std::string str);
    void add_text_from_pp (pretty_printer &pp);
+   void add_comment (std::string str);
+ 
+   element *find_child_element (std::string kind) const;
  
    std::vector<std::unique_ptr<node>> m_children;
  };
*************** struct element : public node_with_childr
*** 90,99 ****
--- 99,114 ----
      m_preserve_whitespace (preserve_whitespace)
    {}
  
+   element *dyn_cast_element () final override
+   {
+     return this;
+   }
+ 
    void write_as_xml (pretty_printer *pp,
  		     int depth, bool indent) const final override;
  
    void set_attr (const char *name, std::string value);
+   const char *get_attr (const char *name) const;
  
    std::string m_kind;
    bool m_preserve_whitespace;
*************** struct element : public node_with_childr
*** 101,106 ****
--- 116,136 ----
    std::vector<std::string> m_key_insertion_order;
  };
  
+ /* An XML comment.  */
+ 
+ struct comment : public node
+ {
+   comment (std::string text)
+   : m_text (std::move (text))
+   {
+   }
+ 
+   void write_as_xml (pretty_printer *pp,
+ 		     int depth, bool indent) const final override;
+ 
+   std::string m_text;
+ };
+ 
  /* A fragment of raw XML source, to be spliced in directly.
     Use sparingly.  */
  
diff -Nrcpad gcc-16-20250622/gnattools/ChangeLog gcc-16-20250629/gnattools/ChangeLog
*** gcc-16-20250622/gnattools/ChangeLog	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gnattools/ChangeLog	Sun Jun 29 22:34:01 2025
***************
*** 1,3 ****
--- 1,13 ----
+ 2025-06-22  Nicolas Boulenguez  <nicolas@debian.org>
+ 
+ 	PR ada/120106
+ 	* configure.ac: Remove ACX_NONCANONICAL_HOST and add ACX_PROG_GNAT.
+ 	* configure: Regenerate.
+ 	* Makefile.in: Do not substitute host_noncanonical but substitute
+ 	GNATMAKE and GNATBIND.
+ 	Set GNAT{MAKE,BIND,LINK_LS}_FOR_HOST from GNAT{MAKE,BIND} instead
+ 	of using hardcoded commands.
+ 
  2025-04-01  Eric Botcazou  <ebotcazou@adacore.com>
  
  	PR ada/119440
diff -Nrcpad gcc-16-20250622/gnattools/Makefile.in gcc-16-20250629/gnattools/Makefile.in
*** gcc-16-20250622/gnattools/Makefile.in	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gnattools/Makefile.in	Sun Jun 29 22:34:01 2025
*************** INSTALL_PROGRAM = @INSTALL_PROGRAM@
*** 33,39 ****
  # Nonstandard autoconf-set variables.
  LN_S=@LN_S@
  target_noncanonical=@target_noncanonical@
! host_noncanonical=@host_noncanonical@
  
  # Variables for the user (or the top level) to override.
  exeext = @EXEEXT@
--- 33,40 ----
  # Nonstandard autoconf-set variables.
  LN_S=@LN_S@
  target_noncanonical=@target_noncanonical@
! GNATMAKE=@GNATMAKE@
! GNATBIND=@GNATBIND@
  
  # Variables for the user (or the top level) to override.
  exeext = @EXEEXT@
*************** TOOLS_FLAGS_TO_PASS_RE= \
*** 115,131 ****
  	"TOOLSCASE=cross"
  
  # Variables for gnattools, cross
! ifeq ($(build), $(host))
!   GNATMAKE_FOR_HOST=gnatmake
!   GNATLINK_FOR_HOST=gnatlink
!   GNATBIND_FOR_HOST=gnatbind
!   GNATLS_FOR_HOST=gnatls
! else
!   GNATMAKE_FOR_HOST=$(host_noncanonical)-gnatmake
!   GNATLINK_FOR_HOST=$(host_noncanonical)-gnatlink
!   GNATBIND_FOR_HOST=$(host_noncanonical)-gnatbind
!   GNATLS_FOR_HOST=$(host_noncanonical)-gnatls
! endif
  
  # Put the host RTS dir first in the PATH to hide the default runtime
  # files that are among the sources
--- 116,126 ----
  	"TOOLSCASE=cross"
  
  # Variables for gnattools, cross
! # See configure.ac for what "cross" means here.
! GNATMAKE_FOR_HOST = $(GNATMAKE)
! GNATBIND_FOR_HOST = $(GNATBIND)
! GNATLINK_FOR_HOST = $(subst gnatmake,gnatlink,$(GNATMAKE))
! GNATLS_FOR_HOST   = $(subst gnatmake,gnatls,$(GNATMAKE))
  
  # Put the host RTS dir first in the PATH to hide the default runtime
  # files that are among the sources
diff -Nrcpad gcc-16-20250622/gnattools/configure gcc-16-20250629/gnattools/configure
*** gcc-16-20250622/gnattools/configure	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gnattools/configure	Sun Jun 29 22:34:01 2025
*************** default_gnattools_target
*** 588,593 ****
--- 588,600 ----
  LD_PICFLAG
  PICFLAG
  warn_cflags
+ ADA_CFLAGS
+ EXTRA_GNATTOOLS
+ TOOLS_TARGET_PAIRS
+ LN_S
+ target_noncanonical
+ GNATMAKE
+ GNATBIND
  OBJEXT
  EXEEXT
  ac_ct_CC
*************** CPPFLAGS
*** 595,606 ****
  LDFLAGS
  CFLAGS
  CC
- ADA_CFLAGS
- EXTRA_GNATTOOLS
- TOOLS_TARGET_PAIRS
- LN_S
- target_noncanonical
- host_noncanonical
  target_os
  target_vendor
  target_cpu
--- 602,607 ----
*************** test -n "$target_alias" &&
*** 2023,2100 ****
      NONENONEs,x,x, &&
    program_prefix=${target_alias}-
  
-  case ${build_alias} in
-   "") build_noncanonical=${build} ;;
-   *) build_noncanonical=${build_alias} ;;
- esac
- 
-  case ${host_alias} in
-   "") host_noncanonical=${build_noncanonical} ;;
-   *) host_noncanonical=${host_alias} ;;
- esac
- 
- 
- 
-  case ${target_alias} in
-   "") target_noncanonical=${host_noncanonical} ;;
-   *) target_noncanonical=${target_alias} ;;
- esac
- 
- 
- 
- 
- # Need to pass this down for now :-P
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
- $as_echo_n "checking whether ln -s works... " >&6; }
- LN_S=$as_ln_s
- if test "$LN_S" = "ln -s"; then
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
- $as_echo "yes" >&6; }
- else
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
- $as_echo "no, using $LN_S" >&6; }
- fi
  
- 
- # Target-specific stuff (defaults)
- TOOLS_TARGET_PAIRS=
- EXTRA_GNATTOOLS=
- 
- # Per-target case statement
- # -------------------------
- case "${target}" in
-   *-*-aix*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-aix.adb"
-     ;;
-   *-*-darwin*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-darwin.adb"
-     ;;
-   *-*-dragonfly*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
-     ;;
-   *-*-freebsd*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
-     ;;
-   *-*-linux*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
-     ;;
-   *-*-vxworks*)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
-     ;;
-   *-*-cygwin32* | *-*-mingw32* | *-*-pe)
-     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
-     EXTRA_GNATTOOLS='../../gnatdll$(exeext)'
-     ;;
- esac
- 
- 
- 
- 
- # From user or toplevel makefile.
- 
- 
- # This is testing the CC passed from the toplevel Makefile, not the
- # one we will select below.
  ac_ext=c
  ac_cpp='$CPP $CPPFLAGS'
  ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
--- 2024,2030 ----
*************** ac_objext=$OBJEXT
*** 2676,2681 ****
--- 2606,3442 ----
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
  $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
  if ${ac_cv_c_compiler_gnu+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+ #ifndef __GNUC__
+        choke me
+ #endif
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   ac_compiler_gnu=yes
+ else
+   ac_compiler_gnu=no
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_c_compiler_gnu=$ac_compiler_gnu
+ 
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+ $as_echo "$ac_cv_c_compiler_gnu" >&6; }
+ if test $ac_compiler_gnu = yes; then
+   GCC=yes
+ else
+   GCC=
+ fi
+ ac_test_CFLAGS=${CFLAGS+set}
+ ac_save_CFLAGS=$CFLAGS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+ $as_echo_n "checking whether $CC accepts -g... " >&6; }
+ if ${ac_cv_prog_cc_g+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   ac_save_c_werror_flag=$ac_c_werror_flag
+    ac_c_werror_flag=yes
+    ac_cv_prog_cc_g=no
+    CFLAGS="-g"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   ac_cv_prog_cc_g=yes
+ else
+   CFLAGS=""
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ 
+ else
+   ac_c_werror_flag=$ac_save_c_werror_flag
+ 	 CFLAGS="-g"
+ 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+ 
+   ;
+   return 0;
+ }
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+   ac_cv_prog_cc_g=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
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    ac_c_werror_flag=$ac_save_c_werror_flag
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+ $as_echo "$ac_cv_prog_cc_g" >&6; }
+ if test "$ac_test_CFLAGS" = set; then
+   CFLAGS=$ac_save_CFLAGS
+ elif test $ac_cv_prog_cc_g = yes; then
+   if test "$GCC" = yes; then
+     CFLAGS="-g -O2"
+   else
+     CFLAGS="-g"
+   fi
+ else
+   if test "$GCC" = yes; then
+     CFLAGS="-O2"
+   else
+     CFLAGS=
+   fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+ $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+ if ${ac_cv_prog_cc_c89+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   ac_cv_prog_cc_c89=no
+ ac_save_CC=$CC
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <stdarg.h>
+ #include <stdio.h>
+ struct stat;
+ /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+ struct buf { int x; };
+ FILE * (*rcsopen) (struct buf *, struct stat *, int);
+ static char *e (p, i)
+      char **p;
+      int i;
+ {
+   return p[i];
+ }
+ static char *f (char * (*g) (char **, int), char **p, ...)
+ {
+   char *s;
+   va_list v;
+   va_start (v,p);
+   s = g (p, va_arg (v,int));
+   va_end (v);
+   return s;
+ }
+ 
+ /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+    function prototypes and stuff, but not '\xHH' hex character constants.
+    These don't provoke an error unfortunately, instead are silently treated
+    as 'x'.  The following induces an error, until -std is added to get
+    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+    array size at least.  It's necessary to write '\x00'==0 to get something
+    that's true only with -std.  */
+ int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+ 
+ /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+    inside strings and character constants.  */
+ #define FOO(x) 'x'
+ int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+ 
+ int test (int i, double x);
+ struct s1 {int (*f) (int a);};
+ struct s2 {int (*f) (double a);};
+ int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+ int argc;
+ char **argv;
+ int
+ main ()
+ {
+ return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+   ;
+   return 0;
+ }
+ _ACEOF
+ for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ 	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+ do
+   CC="$ac_save_CC $ac_arg"
+   if ac_fn_c_try_compile "$LINENO"; then :
+   ac_cv_prog_cc_c89=$ac_arg
+ fi
+ rm -f core conftest.err conftest.$ac_objext
+   test "x$ac_cv_prog_cc_c89" != "xno" && break
+ done
+ rm -f conftest.$ac_ext
+ CC=$ac_save_CC
+ 
+ fi
+ # AC_CACHE_VAL
+ case "x$ac_cv_prog_cc_c89" in
+   x)
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+ $as_echo "none needed" >&6; } ;;
+   xno)
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+ $as_echo "unsupported" >&6; } ;;
+   *)
+     CC="$CC $ac_cv_prog_cc_c89"
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+ $as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+ esac
+ if test "x$ac_cv_prog_cc_c89" != xno; then :
+ 
+ fi
+ 
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ 
+ 
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}gnatbind", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}gnatbind; 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_GNATBIND+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$GNATBIND"; then
+   ac_cv_prog_GNATBIND="$GNATBIND" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_GNATBIND="${ac_tool_prefix}gnatbind"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ GNATBIND=$ac_cv_prog_GNATBIND
+ if test -n "$GNATBIND"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNATBIND" >&5
+ $as_echo "$GNATBIND" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+ fi
+ if test -z "$ac_cv_prog_GNATBIND"; then
+   ac_ct_GNATBIND=$GNATBIND
+   # Extract the first word of "gnatbind", so it can be a program name with args.
+ set dummy gnatbind; 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_GNATBIND+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$ac_ct_GNATBIND"; then
+   ac_cv_prog_ac_ct_GNATBIND="$ac_ct_GNATBIND" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_GNATBIND="gnatbind"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ ac_ct_GNATBIND=$ac_cv_prog_ac_ct_GNATBIND
+ if test -n "$ac_ct_GNATBIND"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GNATBIND" >&5
+ $as_echo "$ac_ct_GNATBIND" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+   if test "x$ac_ct_GNATBIND" = x; then
+     GNATBIND="no"
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+ $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     GNATBIND=$ac_ct_GNATBIND
+   fi
+ else
+   GNATBIND="$ac_cv_prog_GNATBIND"
+ fi
+ 
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}gnatmake", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}gnatmake; 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_GNATMAKE+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$GNATMAKE"; then
+   ac_cv_prog_GNATMAKE="$GNATMAKE" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_GNATMAKE="${ac_tool_prefix}gnatmake"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ GNATMAKE=$ac_cv_prog_GNATMAKE
+ if test -n "$GNATMAKE"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNATMAKE" >&5
+ $as_echo "$GNATMAKE" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+ fi
+ if test -z "$ac_cv_prog_GNATMAKE"; then
+   ac_ct_GNATMAKE=$GNATMAKE
+   # Extract the first word of "gnatmake", so it can be a program name with args.
+ set dummy gnatmake; 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_GNATMAKE+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$ac_ct_GNATMAKE"; then
+   ac_cv_prog_ac_ct_GNATMAKE="$ac_ct_GNATMAKE" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_GNATMAKE="gnatmake"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ ac_ct_GNATMAKE=$ac_cv_prog_ac_ct_GNATMAKE
+ if test -n "$ac_ct_GNATMAKE"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GNATMAKE" >&5
+ $as_echo "$ac_ct_GNATMAKE" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+   if test "x$ac_ct_GNATMAKE" = x; then
+     GNATMAKE="no"
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+ $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     GNATMAKE=$ac_ct_GNATMAKE
+   fi
+ else
+   GNATMAKE="$ac_cv_prog_GNATMAKE"
+ fi
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler driver understands Ada and is recent enough" >&5
+ $as_echo_n "checking whether compiler driver understands Ada and is recent enough... " >&6; }
+ if ${acx_cv_cc_gcc_supports_ada+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   cat >conftest.adb <<EOF
+ pragma Warnings (Off);
+ with System.CRTL;
+ pragma Warnings (On);
+ use type System.CRTL.int64;
+ procedure conftest is begin null; end conftest;
+ EOF
+ acx_cv_cc_gcc_supports_ada=no
+ # There is a bug in old released versions of GCC which causes the
+ # driver to exit successfully when the appropriate language module
+ # has not been installed.  This is fixed in 2.95.4, 3.0.2, and 3.1.
+ # Therefore we must check for the error message as well as an
+ # unsuccessful exit.
+ # Other compilers, like HP Tru64 UNIX cc, exit successfully when
+ # given a .adb file, but produce no object file.  So we must check
+ # if an object file was really produced to guard against this.
+ errors=`(${CC} -c conftest.adb) 2>&1 || echo failure`
+ if test x"$errors" = x && test -f conftest.$ac_objext; then
+   acx_cv_cc_gcc_supports_ada=yes
+ fi
+ rm -f conftest.*
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cc_gcc_supports_ada" >&5
+ $as_echo "$acx_cv_cc_gcc_supports_ada" >&6; }
+ 
+ if test "x$GNATBIND" != xno && test "x$GNATMAKE" != xno && test x$acx_cv_cc_gcc_supports_ada != xno; then
+   have_gnat=yes
+ else
+   have_gnat=no
+ fi
+ 
+  case ${build_alias} in
+   "") build_noncanonical=${build} ;;
+   *) build_noncanonical=${build_alias} ;;
+ esac
+ 
+  case ${host_alias} in
+   "") host_noncanonical=${build_noncanonical} ;;
+   *) host_noncanonical=${host_alias} ;;
+ esac
+ 
+  case ${target_alias} in
+   "") target_noncanonical=${host_noncanonical} ;;
+   *) target_noncanonical=${target_alias} ;;
+ esac
+ 
+ 
+ 
+ 
+ # Need to pass this down for now :-P
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+ $as_echo_n "checking whether ln -s works... " >&6; }
+ LN_S=$as_ln_s
+ if test "$LN_S" = "ln -s"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ $as_echo "yes" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+ $as_echo "no, using $LN_S" >&6; }
+ fi
+ 
+ 
+ # Target-specific stuff (defaults)
+ TOOLS_TARGET_PAIRS=
+ EXTRA_GNATTOOLS=
+ 
+ # Per-target case statement
+ # -------------------------
+ case "${target}" in
+   *-*-aix*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-aix.adb"
+     ;;
+   *-*-darwin*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-darwin.adb"
+     ;;
+   *-*-dragonfly*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
+     ;;
+   *-*-freebsd*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
+     ;;
+   *-*-linux*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
+     ;;
+   *-*-vxworks*)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
+     ;;
+   *-*-cygwin32* | *-*-mingw32* | *-*-pe)
+     TOOLS_TARGET_PAIRS="indepsw.adb<indepsw-gnu.adb"
+     EXTRA_GNATTOOLS='../../gnatdll$(exeext)'
+     ;;
+ esac
+ 
+ 
+ 
+ 
+ # From user or toplevel makefile.
+ 
+ 
+ # This is testing the CC passed from the toplevel Makefile, not the
+ # one we will select below.
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}gcc; 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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_CC="${ac_tool_prefix}gcc"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+ $as_echo "$CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+ fi
+ if test -z "$ac_cv_prog_CC"; then
+   ac_ct_CC=$CC
+   # Extract the first word of "gcc", so it can be a program name with args.
+ set dummy gcc; 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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$ac_ct_CC"; then
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_CC="gcc"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ ac_ct_CC=$ac_cv_prog_ac_ct_CC
+ if test -n "$ac_ct_CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+ $as_echo "$ac_ct_CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+   if test "x$ac_ct_CC" = x; then
+     CC=""
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+ $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     CC=$ac_ct_CC
+   fi
+ else
+   CC="$ac_cv_prog_CC"
+ fi
+ 
+ if test -z "$CC"; then
+           if test -n "$ac_tool_prefix"; then
+     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+ set dummy ${ac_tool_prefix}cc; 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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_CC="${ac_tool_prefix}cc"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+ $as_echo "$CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+   fi
+ fi
+ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
+ set dummy cc; 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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+   ac_prog_rejected=no
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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
+     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+        continue
+      fi
+     ac_cv_prog_CC="cc"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ if test $ac_prog_rejected = yes; then
+   # We found a bogon in the path, so make sure we never use it.
+   set dummy $ac_cv_prog_CC
+   shift
+   if test $# != 0; then
+     # We chose a different compiler from the bogus one.
+     # However, it has the same basename, so the bogon will be chosen
+     # first if we set CC to just the basename; use the full file name.
+     shift
+     ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+   fi
+ fi
+ fi
+ fi
+ CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+ $as_echo "$CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+ fi
+ if test -z "$CC"; then
+   if test -n "$ac_tool_prefix"; then
+   for ac_prog in cl.exe
+   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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_CC="$ac_tool_prefix$ac_prog"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ CC=$ac_cv_prog_CC
+ if test -n "$CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+ $as_echo "$CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+     test -n "$CC" && break
+   done
+ fi
+ if test -z "$CC"; then
+   ac_ct_CC=$CC
+   for ac_prog in cl.exe
+ 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_CC+:} false; then :
+   $as_echo_n "(cached) " >&6
+ else
+   if test -n "$ac_ct_CC"; then
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   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_CC="$ac_prog"
+     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+     break 2
+   fi
+ done
+   done
+ IFS=$as_save_IFS
+ 
+ fi
+ fi
+ ac_ct_CC=$ac_cv_prog_ac_ct_CC
+ if test -n "$ac_ct_CC"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+ $as_echo "$ac_ct_CC" >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ fi
+ 
+ 
+   test -n "$ac_ct_CC" && break
+ done
+ 
+   if test "x$ac_ct_CC" = x; then
+     CC=""
+   else
+     case $cross_compiling:$ac_tool_warned in
+ yes:)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+ $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ ac_tool_warned=yes ;;
+ esac
+     CC=$ac_ct_CC
+   fi
+ fi
+ 
+ fi
+ 
+ 
+ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ as_fn_error $? "no acceptable C compiler found in \$PATH
+ See \`config.log' for more details" "$LINENO" 5; }
+ 
+ # Provide some information about the compiler.
+ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+ set X $ac_compile
+ ac_compiler=$2
+ for ac_option in --version -v -V -qversion; do
+   { { ac_try="$ac_compiler $ac_option >&5"
+ case "(($ac_try" in
+   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+   *) ac_try_echo=$ac_try;;
+ esac
+ eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+ $as_echo "$ac_try_echo"; } >&5
+   (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+   ac_status=$?
+   if test -s conftest.err; then
+     sed '10a\
+ ... rest of stderr output deleted ...
+          10q' conftest.err >conftest.er1
+     cat conftest.er1 >&5
+   fi
+   rm -f conftest.er1 conftest.err
+   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+   test $ac_status = 0; }
+ done
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+ $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+ if ${ac_cv_c_compiler_gnu+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
diff -Nrcpad gcc-16-20250622/gnattools/configure.ac gcc-16-20250629/gnattools/configure.ac
*** gcc-16-20250622/gnattools/configure.ac	Sun Jun 22 22:33:24 2025
--- gcc-16-20250629/gnattools/configure.ac	Sun Jun 29 22:34:01 2025
*************** AC_CANONICAL_BUILD
*** 45,51 ****
  AC_CANONICAL_HOST
  AC_CANONICAL_TARGET
  
! ACX_NONCANONICAL_HOST
  ACX_NONCANONICAL_TARGET
  
  # Need to pass this down for now :-P
--- 45,51 ----
  AC_CANONICAL_HOST
  AC_CANONICAL_TARGET
  
! ACX_PROG_GNAT
  ACX_NONCANONICAL_TARGET
  
  # Need to pass this down for now :-P
diff -Nrcpad gcc-16-20250622/libgomp/ChangeLog gcc-16-20250629/libgomp/ChangeLog
*** gcc-16-20250622/libgomp/ChangeLog	Sun Jun 22 22:33:43 2025
--- gcc-16-20250629/libgomp/ChangeLog	Sun Jun 29 22:34:08 2025
***************
*** 1,3 ****
--- 1,13 ----
+ 2025-06-24  Tobias Burnus  <tburnus@baylibre.com>
+ 
+ 	* libgomp.texi (acc_attach, acc_detach): Update for Fortran
+ 	version.
+ 	* openacc.f90 (acc_attach{,_async}, acc_detach{,_finalize}{,_async}):
+ 	Add.
+ 	* openacc_lib.h: Likewise.
+ 	* testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90: New test.
+ 	* testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90: New test.
+ 
  2025-06-19  Tobias Burnus  <tburnus@baylibre.com>
  
  	* target.c (GOMP_REQUIRES_NAME_BUF_LEN): Define.
diff -Nrcpad gcc-16-20250622/libgomp/libgomp.texi gcc-16-20250629/libgomp/libgomp.texi
*** gcc-16-20250622/libgomp/libgomp.texi	Sun Jun 22 22:33:43 2025
--- gcc-16-20250629/libgomp/libgomp.texi	Sun Jun 29 22:34:08 2025
*************** address to pointing to the corresponding
*** 5967,5985 ****
  @item @emph{Prototype}: @tab @code{void acc_attach_async(h_void **ptr_addr, int async);}
  @end multitable
  
! @c @item @emph{Fortran}:
! @c @multitable @columnfractions .20 .80
! @c @item @emph{Interface}: @tab @code{subroutine acc_attach(ptr_addr)}
! @c @item @emph{Interface}: @tab @code{subroutine acc_attach_async(ptr_addr, async_arg)}
! @c @item                   @tab @code{type(*), dimension(..) :: ptr_addr}
! @c @item                   @tab @code{integer(acc_handle_kind), value :: async_arg}
! @c @end multitable
  
  @item @emph{Reference}:
  @uref{https://www.openacc.org, OpenACC specification v2.6}, section
  3.2.34.
! @c  @uref{https://www.openacc.org, OpenACC specification v3.3}, section
! @c 3.2.29.
  @end table
  
  
--- 5967,5985 ----
  @item @emph{Prototype}: @tab @code{void acc_attach_async(h_void **ptr_addr, int async);}
  @end multitable
  
! @item @emph{Fortran}:
! @multitable @columnfractions .20 .80
! @item @emph{Interface}: @tab @code{subroutine acc_attach(ptr_addr)}
! @item @emph{Interface}: @tab @code{subroutine acc_attach_async(ptr_addr, async_arg)}
! @item                   @tab @code{type(*), dimension(..) :: ptr_addr}
! @item                   @tab @code{integer(acc_handle_kind), value :: async_arg}
! @end multitable
  
  @item @emph{Reference}:
  @uref{https://www.openacc.org, OpenACC specification v2.6}, section
  3.2.34.
!  @uref{https://www.openacc.org, OpenACC specification v3.3}, section
! 3.2.29.
  @end table
  
  
*************** address to pointing to the corresponding
*** 5999,6019 ****
  @item @emph{Prototype}: @tab @code{void acc_detach_finalize_async(h_void **ptr_addr, int async);}
  @end multitable
  
! @c @item @emph{Fortran}:
! @c @multitable @columnfractions .20 .80
! @c @item @emph{Interface}: @tab @code{subroutine acc_detach(ptr_addr)}
! @c @item @emph{Interface}: @tab @code{subroutine acc_detach_async(ptr_addr, async_arg)}
! @c @item @emph{Interface}: @tab @code{subroutine acc_detach_finalize(ptr_addr)}
! @c @item @emph{Interface}: @tab @code{subroutine acc_detach_finalize_async(ptr_addr, async_arg)}
! @c @item                   @tab @code{type(*), dimension(..) :: ptr_addr}
! @c @item                   @tab @code{integer(acc_handle_kind), value :: async_arg}
! @c @end multitable
  
  @item @emph{Reference}:
  @uref{https://www.openacc.org, OpenACC specification v2.6}, section
  3.2.35.
! @c  @uref{https://www.openacc.org, OpenACC specification v3.3}, section
! @c 3.2.29.
  @end table
  
  
--- 5999,6019 ----
  @item @emph{Prototype}: @tab @code{void acc_detach_finalize_async(h_void **ptr_addr, int async);}
  @end multitable
  
! @item @emph{Fortran}:
! @multitable @columnfractions .20 .80
! @item @emph{Interface}: @tab @code{subroutine acc_detach(ptr_addr)}
! @item @emph{Interface}: @tab @code{subroutine acc_detach_async(ptr_addr, async_arg)}
! @item @emph{Interface}: @tab @code{subroutine acc_detach_finalize(ptr_addr)}
! @item @emph{Interface}: @tab @code{subroutine acc_detach_finalize_async(ptr_addr, async_arg)}
! @item                   @tab @code{type(*), dimension(..) :: ptr_addr}
! @item                   @tab @code{integer(acc_handle_kind), value :: async_arg}
! @end multitable
  
  @item @emph{Reference}:
  @uref{https://www.openacc.org, OpenACC specification v2.6}, section
  3.2.35.
! @uref{https://www.openacc.org, OpenACC specification v3.3}, section
! 3.2.29.
  @end table
  
  
diff -Nrcpad gcc-16-20250622/libgomp/openacc.f90 gcc-16-20250629/libgomp/openacc.f90
*** gcc-16-20250622/libgomp/openacc.f90	Sun Jun 22 22:33:43 2025
--- gcc-16-20250629/libgomp/openacc.f90	Sun Jun 29 22:34:08 2025
*************** module openacc
*** 798,803 ****
--- 798,805 ----
    public :: acc_memcpy_to_device, acc_memcpy_to_device_async
    public :: acc_memcpy_from_device, acc_memcpy_from_device_async
    public :: acc_memcpy_device, acc_memcpy_device_async
+   public :: acc_attach, acc_attach_async, acc_detach, acc_detach_async
+   public :: acc_detach_finalize, acc_detach_finalize_async
  
    integer, parameter :: openacc_version = 201711
  
*************** module openacc
*** 1067,1072 ****
--- 1069,1116 ----
        integer(acc_handle_kind), value :: async_arg
      end subroutine
    end interface
+ 
+   interface
+     subroutine acc_attach (ptr_addr) bind(C)
+       type(*), dimension(..) :: ptr_addr
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_attach_async (ptr_addr, async_arg) bind(C)
+       import :: acc_handle_kind
+       type(*), dimension(..) :: ptr_addr
+       integer(acc_handle_kind), value :: async_arg
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_detach (ptr_addr) bind(C)
+       type(*), dimension(..) :: ptr_addr
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_detach_async (ptr_addr, async_arg) bind(C)
+       import :: acc_handle_kind
+       type(*), dimension(..) :: ptr_addr
+       integer(acc_handle_kind), value :: async_arg
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_detach_finalize (ptr_addr) bind(C)
+       type(*), dimension(..) :: ptr_addr
+     end subroutine
+   end interface
+ 
+   interface
+     subroutine acc_detach_finalize_async (ptr_addr, async_arg) bind(C)
+       import :: acc_handle_kind
+       type(*), dimension(..) :: ptr_addr
+       integer(acc_handle_kind), value :: async_arg
+     end subroutine
+   end interface
  
    interface acc_copyin_async
      procedure :: acc_copyin_async_32_h
diff -Nrcpad gcc-16-20250622/libgomp/openacc_lib.h gcc-16-20250629/libgomp/openacc_lib.h
*** gcc-16-20250622/libgomp/openacc_lib.h	Sun Jun 22 22:33:43 2025
--- gcc-16-20250629/libgomp/openacc_lib.h	Sun Jun 29 22:34:08 2025
***************
*** 707,709 ****
--- 707,751 ----
            integer (acc_handle_kind) async_
          end subroutine
        end interface
+ 
+       interface
+         subroutine acc_attach (ptr_addr) bind(C)
+           type(*), dimension(..) :: ptr_addr
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_attach_async (ptr_addr, async_arg) bind(C)
+           import :: acc_handle_kind
+           type(*), dimension(..) :: ptr_addr
+           integer(acc_handle_kind), value :: async_arg
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_detach (ptr_addr) bind(C)
+           type(*), dimension(..) :: ptr_addr
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_detach_async (ptr_addr, async_arg) bind(C)
+           import :: acc_handle_kind
+           type(*), dimension(..) :: ptr_addr
+           integer(acc_handle_kind), value :: async_arg
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_detach_finalize (ptr_addr) bind(C)
+           type(*), dimension(..) :: ptr_addr
+         end subroutine
+       end interface
+ 
+       interface
+         subroutine acc_detach_finalize_async(ptr_addr, async_arg)bind(C)
+           import :: acc_handle_kind
+           type(*), dimension(..) :: ptr_addr
+           integer(acc_handle_kind), value :: async_arg
+         end subroutine
+       end interface
diff -Nrcpad gcc-16-20250622/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90 gcc-16-20250629/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90
*** gcc-16-20250622/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-1.f90	Sun Jun 29 22:34:09 2025
***************
*** 0 ****
--- 1,25 ----
+ ! { dg-do compile }
+ ! { dg-additional-options "-fdump-tree-original" }
+ 
+ use openacc
+ implicit none (type, external)
+ integer,pointer :: a, b(:)
+ integer,allocatable :: c, d(:)
+ 
+ call acc_attach(a)  ! ICE
+ call acc_attach_async(b, 4)
+ call acc_attach(c)
+ 
+ call acc_detach(a)
+ call acc_detach_async(b, 4)
+ call acc_detach_finalize(c)
+ call acc_detach_finalize_async(d,7)
+ end
+ 
+ ! { dg-final { scan-tree-dump-times "acc_attach \\(&a\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_attach_async \\(&\\(integer\\(kind=4\\)\\\[0:\\\] \\*\\) b.data, 4\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_attach \\(&c\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_detach \\(&a\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_detach_async \\(&\\(integer\\(kind=4\\)\\\[0:\\\] \\*\\) b.data, 4\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_detach_finalize \\(&c\\);" 1 "original" } }
+ ! { dg-final { scan-tree-dump-times "acc_detach_finalize_async \\(&\\(integer\\(kind=4\\)\\\[0:\\\] \\* restrict\\) d.data, 7\\);" 1 "original" } }
diff -Nrcpad gcc-16-20250622/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90 gcc-16-20250629/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90
*** gcc-16-20250622/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libgomp/testsuite/libgomp.oacc-fortran/acc-attach-detach-2.f90	Sun Jun 29 22:34:09 2025
***************
*** 0 ****
--- 1,62 ----
+ ! { dg-do run }
+ 
+ use openacc
+ implicit none (type, external)
+ integer, target :: tgt_a, tgt_b(5)
+ 
+ integer, pointer :: p1, p2(:)
+ 
+ type t
+   integer,pointer :: a => null ()
+   integer,pointer :: b(:) => null ()
+   integer,allocatable :: c, d(:)
+ end type t
+ 
+ type(t), target :: var
+ 
+ tgt_a = 51
+ tgt_b = [11,22,33,44,55]
+ 
+ var%b => tgt_b
+ !$acc enter data copyin(var, tgt_a, tgt_b)
+ var%a => tgt_a
+ 
+ call acc_attach(var%a)
+ call acc_attach(var%b)
+ 
+ !$acc serial
+ ! { dg-warning "using .vector_length \\(32\\)., ignoring 1" "" { target openacc_nvidia_accel_selected } .-1 }
+   if (var%a /= 51) stop 1
+   if (any (var%b /= [11,22,33,44,55])) stop 2
+ !$acc end serial
+ 
+ call acc_detach(var%a)
+ call acc_detach(var%b)
+ 
+ !$acc exit data delete(var, tgt_a, tgt_b)
+ 
+ var%c = 9
+ var%d = [1,2,3]
+ 
+ p1 => var%c
+ p2 => var%d
+ 
+ !$acc enter data copyin(p1, p2)
+ !$acc enter data copyin(var)
+ call acc_attach(var%c)
+ call acc_attach(var%d)
+ 
+ !$acc serial
+ ! { dg-warning "using .vector_length \\(32\\)., ignoring 1" "" { target openacc_nvidia_accel_selected } .-1 }
+   if (var%c /= 9) stop 3
+   if (any (var%d /= [1,2,3])) stop 4
+ !$acc end serial
+ 
+ call acc_detach(var%c)
+ call acc_detach(var%d)
+ 
+ !$acc exit data delete(var, p1, p2)
+ 
+ deallocate(var%d)
+ 
+ end
diff -Nrcpad gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_linux.cpp gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_linux.cpp
*** gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_linux.cpp	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_linux.cpp	Sun Jun 29 22:34:10 2025
***************
*** 86,91 ****
--- 86,95 ----
  #    include <sys/sysmacros.h>
  #  endif
  
+ #  if SANITIZER_LINUX && defined(__powerpc64__)
+ #    include <asm/ptrace.h>
+ #  endif
+ 
  #  if SANITIZER_FREEBSD
  #    include <machine/atomic.h>
  #    include <sys/exec.h>
diff -Nrcpad gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp
*** gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp	Sun Jun 29 22:34:10 2025
*************** static void GetTls(uptr *addr, uptr *siz
*** 619,639 ****
    *addr = tp - RoundUpTo(*size, align);
    *size = tp - *addr + ThreadDescriptorSize();
  #      else
!   if (SANITIZER_GLIBC)
!     *size += 1664;
!   else if (SANITIZER_FREEBSD)
!     *size += 128;  // RTLD_STATIC_TLS_EXTRA
! #        if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
    const uptr pre_tcb_size = TlsPreTcbSize();
    *addr -= pre_tcb_size;
    *size += pre_tcb_size;
! #        else
    // arm and aarch64 reserve two words at TP, so this underestimates the range.
    // However, this is sufficient for the purpose of finding the pointers to
    // thread-specific data keys.
    const uptr tcb_size = ThreadDescriptorSize();
    *addr -= tcb_size;
    *size += tcb_size;
  #        endif
  #      endif
  #    elif SANITIZER_NETBSD
--- 619,640 ----
    *addr = tp - RoundUpTo(*size, align);
    *size = tp - *addr + ThreadDescriptorSize();
  #      else
! #        if SANITIZER_GLIBC
!   *size += 1664;
! #        elif SANITIZER_FREEBSD
!   *size += 128;  // RTLD_STATIC_TLS_EXTRA
! #          if defined(__mips__) || defined(__powerpc64__) || SANITIZER_RISCV64
    const uptr pre_tcb_size = TlsPreTcbSize();
    *addr -= pre_tcb_size;
    *size += pre_tcb_size;
! #          else
    // arm and aarch64 reserve two words at TP, so this underestimates the range.
    // However, this is sufficient for the purpose of finding the pointers to
    // thread-specific data keys.
    const uptr tcb_size = ThreadDescriptorSize();
    *addr -= tcb_size;
    *size += tcb_size;
+ #          endif
  #        endif
  #      endif
  #    elif SANITIZER_NETBSD
diff -Nrcpad gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp
*** gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cpp	Sun Jun 29 22:34:10 2025
***************
*** 96,102 ****
  # include <sys/ptrace.h>
  #    if defined(__mips64) || defined(__aarch64__) || defined(__arm__) ||       \
          defined(__hexagon__) || defined(__loongarch__) || SANITIZER_RISCV64 || \
!         defined(__sparc__)
  #      include <asm/ptrace.h>
  #      ifdef __arm__
  typedef struct user_fpregs elf_fpregset_t;
--- 96,102 ----
  # include <sys/ptrace.h>
  #    if defined(__mips64) || defined(__aarch64__) || defined(__arm__) ||       \
          defined(__hexagon__) || defined(__loongarch__) || SANITIZER_RISCV64 || \
!         defined(__sparc__) || defined(__powerpc64__)
  #      include <asm/ptrace.h>
  #      ifdef __arm__
  typedef struct user_fpregs elf_fpregset_t;
diff -Nrcpad gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp
*** gcc-16-20250622/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cpp	Sun Jun 29 22:34:10 2025
***************
*** 31,37 ****
  #include <sys/types.h> // for pid_t
  #include <sys/uio.h> // for iovec
  #include <elf.h> // for NT_PRSTATUS
! #if (defined(__aarch64__) || SANITIZER_RISCV64 || SANITIZER_LOONGARCH64) && \
       !SANITIZER_ANDROID
  // GLIBC 2.20+ sys/user does not include asm/ptrace.h
  # include <asm/ptrace.h>
--- 31,38 ----
  #include <sys/types.h> // for pid_t
  #include <sys/uio.h> // for iovec
  #include <elf.h> // for NT_PRSTATUS
! #if (defined(__aarch64__) || defined(__powerpc64__) || \
!      SANITIZER_RISCV64 || SANITIZER_LOONGARCH64) &&    \
       !SANITIZER_ANDROID
  // GLIBC 2.20+ sys/user does not include asm/ptrace.h
  # include <asm/ptrace.h>
diff -Nrcpad gcc-16-20250622/libstdc++-v3/ChangeLog gcc-16-20250629/libstdc++-v3/ChangeLog
*** gcc-16-20250622/libstdc++-v3/ChangeLog	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libstdc++-v3/ChangeLog	Sun Jun 29 22:34:10 2025
***************
*** 1,3 ****
--- 1,287 ----
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (shuffle_fn::operator()):
+ 	Reimplement directly, based on the stl_algo.h implementation.
+ 	* testsuite/25_algorithms/shuffle/constrained.cc (test02):
+ 	New test.
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__sample_fn::operator()):
+ 	Reimplement the forward_iterator branch directly, based
+ 	on the stl_algo.h implementation.  Add explicit cast to
+ 	_Out's difference_type in the !forward_iterator branch.
+ 	* testsuite/25_algorithms/sample/constrained.cc (test02):
+ 	New test.
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__detail::__introselect): New,
+ 	based on the stl_algo.h implementation.
+ 	(nth_element_fn::operator()): Reimplement in terms of the above.
+ 	* testsuite/25_algorithms/nth_element/constrained.cc:
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__detail::__find_if_not_n): New,
+ 	based on the stl_algo.h implementation.
+ 	(__detail::__stable_partition_adaptive): Likewise.
+ 	(__stable_partition_fn::operator()): Reimplement in terms of
+ 	the above.
+ 	* testsuite/25_algorithms/stable_partition/constrained.cc
+ 	(test03): New test.
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__detail::__move_merge): New,
+ 	based on the stl_algo.h implementation.
+ 	(__detail::__merge_sort_loop): Likewise.
+ 	(__detail::__chunk_insertion_sort): Likewise.
+ 	(__detail::__merge_sort_with_buffer): Likewise.
+ 	(__detail::__stable_sort_adaptive): Likewise.
+ 	(__detail::__stable_sort_adaptive_resize): Likewise.
+ 	(__detail::__inplace_stable_sort): Likewise.
+ 	(__stable_sort_fn::operator()): Reimplement in terms of the above.
+ 	* testsuite/25_algorithms/stable_sort/constrained.cc:
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__detail::__move_merge_adaptive):
+ 	New, based on the stl_algo.h implementation.
+ 	(__detail::__move_merge_adaptive_backward): Likewise.
+ 	(__detail::__rotate_adaptive): Likewise.
+ 	(__detail::__merge_adaptive): Likewise.
+ 	(__detail::__merge_adaptive_resize): Likewise.
+ 	(__detail::__merge_without_buffer): Likewise.
+ 	(__inplace_merge_fn::operator()): Reimplement in terms of the
+ 	above.
+ 	* testsuite/25_algorithms/inplace_merge/constrained.cc (test03):
+ 	New test.
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	PR libstdc++/118209
+ 	* include/bits/max_size_type.h (__bit_width): New explicit
+ 	specialization for __max_size_type.
+ 	* include/bits/ranges_algo.h (__detail::__move_median_to_first):
+ 	New, based on the stl_algo.h implementation.
+ 	(__detail::__unguarded_liner_insert): Likewise.
+ 	(__detail::__insertion_sort): Likewise.
+ 	(__detail::__sort_threshold): Likewise.
+ 	(__detail::__unguarded_insertion_sort): Likewise.
+ 	(__detail::__final_insertion_sort): Likewise.
+ 	(__detail::__unguarded_partition): Likewise.
+ 	(__detail::__unguarded_partition_pivot): Likewise.
+ 	(__detail::__heap_select): Likewise.
+ 	(__detail::__partial_sort): Likewise.
+ 	(__detail::__introsort_loop): Likewise.
+ 	(__sort_fn::operator()): Reimplement in terms of the above.
+ 	* testsuite/25_algorithms/sort/118209.cc: New test.
+ 	* testsuite/25_algorithms/sort/constrained.cc (test03): New test.
+ 
+ 2025-06-27  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR libstdc++/100795
+ 	* include/bits/ranges_algo.h (__detail::__push_heap): New,
+ 	based on the stl_heap.h implementation.
+ 	(__push_heap_fn::operator()): Reimplement in terms of the above.
+ 	(__detail::__adjust_heap): New, based on the stl_heap.h
+ 	implementation.
+ 	(__deatil::__pop_heap): Likewise.
+ 	(__pop_heap_fn::operator()): Reimplement in terms of the above.
+ 	(__make_heap_fn::operator()): Likewise.
+ 	(__sort_heap_fn::operator()): Likewise.
+ 	* testsuite/25_algorithms/heap/constrained.cc (test03): New
+ 	test.
+ 
+ 2025-06-27  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/110739
+ 	* include/bits/chrono_io.h (__formatter_chrono::_S_empty_fs): Define.
+ 	(__formatter_chrono::_S_str_d2): Use _S_str_d3 for 3+ digits and
+ 	place allways_inline attribute after comment.
+ 	(__formatter_chrono::_S_str_d3): Extracted from _S_str_d2.
+ 	(__formatter_chrono::_M_H_I, __formatter_chrono::_M_R_X): Replace
+ 	_S_empty_spec with _S_empty_fs().
+ 	(__formatter_chrono::_M_j): Likewise and use _S_str_d3 in common
+ 	case.
+ 	(__format::operator-(_ChronoParts, _ChronoParts))
+ 	(__format::operator-=(_ChronoParts, _ChronoParts))
+ 	(__formatter_chrono::_S_fill_two_digits)
+ 	(__formatter_chrono::_S_str_d1): Place always_inline attribute
+ 	after comment.
+ 
+ 2025-06-27  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/110739
+ 	* include/bits/chrono_io.h (__formatter_chrono::_M_format_to):
+ 	Rename _Out to _OutIter for consistency, and update calls
+ 	to specifier functions.
+ 	(__formatter_chrono::_M_wi, __formatter_chrono::_M_C_y_Y)
+ 	(__formatter_chrono::_M_D_x, __formatter_chrono::_M_d_e)
+ 	(__formatter_chrono::_M_F, __formatter_chrono::_M_g_G)
+ 	(__formatter_chrono::_M_H_I, __formatter_chrono::_M_j)
+ 	(__formatter_chrono::_M_m, __formatter_chrono::_M_M)
+ 	(__formatter_chrono::_M_q, __formatter_chrono::_M_R_X)
+ 	(__formatter_chrono::_M_u_w, __formatter_chrono::_M_U_V_W)
+ 	(__formatter_chrono::_M_z, __formatter_chrono::_M_z):
+ 	Remove _FormatContext parameter, and  introduce _OutIter
+ 	for __out type.
+ 	(__formatter_chrono::_M_a_A, __formatter_chrono::_M_B_b)
+ 	(__formatter_chrono::_M_p, __formatter_chrono::_M_Q)
+ 	(__formatter_chrono::_M_r, __formatter_chrono::_M_S)
+ 	(__formatter_chrono::_M_subsecs, __formatter_chrono::_M_T):
+ 	Introduce separate _OutIter template parameter for __out.
+ 	(__formatter_chrono::_M_c, __formatter_chrono::_M_T):
+ 	Likewise, and adjust calls to specifiers functions.
+ 	* testsuite/std/time/format/empty_spec.cc: Make underlying
+ 	type for Rep configurable.
+ 
+ 2025-06-27  Iain Sandoe  <iain@sandoe.co.uk>
+ 
+ 	* config/abi/pre/gnu.ver: Keep the closing brace of the
+ 	CXXABI_1.3.17 symbol group together with the identifier
+ 	for the inherited group.
+ 
+ 2025-06-26  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/110739
+ 	* include/bits/chrono_io.h (__formatter_chrono::_M_use_locale_fmt):
+ 	Define.
+ 	(__formatter_chrono::_M_locale_fmt): Moved to front of the class.
+ 	(__formatter_chrono::_M_format_to): Construct and initialize
+ 	struct tm and call _M_locale_fmt if needed.
+ 	(__formatter_chrono::_M_c_r_x_X): Split into separate methods.
+ 	(__formatter_chrono::_M_c, __formatter_chrono::_M_r): Define.
+ 	(__formatter_chrono::_M_D): Renamed to _M_D_x.
+ 	(__formatter_chrono::_M_D_x): Renamed from _M_D.
+ 	(__formatter_chrono::_M_R_T): Split into _M_R_X and _M_T.
+ 	(__formatter_chrono::_M_R_X): Extracted from _M_R_T.
+ 	(__formatter_chrono::_M_T): Define in terms of _M_R_X and _M_subsecs.
+ 	(__formatter_chrono::_M_subsecs): Extracted from _M_S.
+ 	(__formatter_chrono::_M_S): Replaced __mod with __subs argument,
+ 	removed _M_locale_fmt call, and delegate to _M_subsecs.
+ 	(__formatter_chrono::_M_C_y_Y, __formatter_chrono::_M_d_e)
+ 	(__formatter_chrono::_M_H_I, __formatter_chrono::_M_m)
+ 	(__formatter_chrono::_M_u_w, __formatter_chrono::_M_U_V_W): Remove
+ 	__mod argument and call to _M_locale_fmt.
+ 
+ 2025-06-26  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/110739
+ 	* include/bits/chrono_io.h (__format::__no_timezone_available):
+ 	Removed, replaced with separate throws in formatter for
+ 	__local_time_fmt
+ 	(__format::_ChronoParts): Defined additional enumertors and
+ 	declared as enum class.
+ 	(__format::operator&(_ChronoParts, _ChronoParts))
+ 	(__format::operator&=(_ChronoParts&, _ChronoParts))
+ 	(__format::operator-(_ChronoParts, _ChronoParts))
+ 	(__format::operator-=(_ChronoParts&, _ChronoParts))
+ 	(__format::operator==(_ChronoParts, decltype(nullptr)))
+ 	(_ChronoSpec::_M_time_only, _ChronoSpec::_M_floating_point_rep)
+ 	(_ChronoSpec::_M_custom_rep, _ChronoSpec::_M_needed)
+ 	(_ChronoSpec::_M_needs, __format::_ChronoData): Define.
+ 	(__format::__formatter_chrono): Redefine to accept _ChronoData.
+ 	(__formatter_chrono::_M_format_to_ostream): Moved to
+ 	__formatter_duration.
+ 	(__format::__formatter_duration): Define.
+ 	(__formatter_chrono_info::format): Pass value-constructed
+ 	_ChronoData.
+ 	(std::formatter<chrono::day, _CharT>)
+ 	(std::formatter<chrono::month, _CharT>)
+ 	(std::formatter<chrono::year, _CharT>)
+ 	(std::formatter<chrono::weekday, _CharT>)
+ 	(std::formatter<chrono::weekday_indexed, _CharT>)
+ 	(std::formatter<chrono::weekday_last, _CharT>)
+ 	(std::formatter<chrono::month_day, _CharT>)
+ 	(std::formatter<chrono::month_day_last, _CharT>)
+ 	(std::formatter<chrono::month_weekday, _CharT>)
+ 	(std::formatter<chrono::month_weekday_indexed, _CharT>)
+ 	(std::formatter<chrono::month_weekday_last, _CharT>)
+ 	(std::formatter<chrono::year_month, _CharT>)
+ 	(std::formatter<chrono::year_month_day, _CharT>)
+ 	(std::formatter<chrono::year_month_day_last, _CharT>)
+ 	(std::formatter<chrono::year_month_weekday, _CharT>)
+ 	(std::formatter<chrono::year_month_weekday_indexed, _CharT>)
+ 	(std::formatter<chrono::year_month_weekday_last, _CharT>):
+ 	Construct _ChronoData in format, and configure _M_needed in
+ 	_ChronoSpec.
+ 	(std::formatter<chrono::duration<_Rep, _Period>, _CharT>)
+ 	(std::formatter<chrono::hh_mm_ss<_Duration>, _CharT>)
+ 	(std::formatter<chrono::sys_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::utc_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::tai_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::gps_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::file_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::local_time<_Duration>, _CharT>)
+ 	(std::formatter<chrono::_detail::__local_time_fmt<_Duration>, _CharT>):
+ 	Reworked in terms of __formatter_duration and _ChronoData.
+ 	(std::formatter<chrono::_detail::__utc_leap_second<_Duration>, _CharT>):
+ 	Removed.
+ 	(_Parser<_Duration>::operator()): Adjusted for _ChronoParts
+ 	being enum class.
+ 	* include/std/chrono (__detail::__utc_leap_second): Removed,
+ 	replaced with simply bumping _M_seconds in _ChronoData.
+ 	* testsuite/std/time/format/empty_spec.cc: Updated %S integral
+ 	ouput.
+ 
+ 2025-06-26  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* include/bits/version.def (exception_ptr_cast): Add.
+ 	* include/bits/version.h: Regenerate.
+ 	* libsupc++/exception: Define __glibcxx_want_exception_ptr_cast before
+ 	including bits/version.h.
+ 	* libsupc++/exception_ptr.h (std::exception_ptr_cast): Define.
+ 	(std::__exception_ptr::exception_ptr::_M_exception_ptr_cast): Declare.
+ 	* libsupc++/eh_ptr.cc
+ 	(std::__exception_ptr::exception_ptr::_M_exception_ptr_cast): Define.
+ 	* src/c++23/std.cc.in (std::exception_ptr_cast): Export.
+ 	* config/abi/pre/gnu.ver: Export
+ 	_ZNKSt15__exception_ptr13exception_ptr21_M_exception_ptr_castERKSt9type_info
+ 	at CXXABI_1.3.17.
+ 	* testsuite/util/testsuite_abi.cc (check_version): Allow CXXABI_1.3.17.
+ 	* testsuite/18_support/exception_ptr/exception_ptr_cast.cc: New test.
+ 
+ 2025-06-26  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* include/bits/version.def (type_order): New.
+ 	* include/bits/version.h: Regenerate.
+ 	* libsupc++/compare: Define __glibcxx_want_type_order before
+ 	including bits/version.h.
+ 	(std::type_order, std::type_order_v): New trait and template variable.
+ 	* src/c++23/std.cc.in (std::type_order, std::type_order_v): Export.
+ 	* testsuite/18_support/comparisons/type_order/1.cc: New test.
+ 
+ 2025-06-25  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* testsuite/std/time/format/precision.cc: New tests.
+ 
+ 2025-06-25  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	PR libstdc++/120650
+ 	* include/bits/chrono_io.h
+ 	(formatter<chrono::month_day_last,_CharT>::parse): Call _M_parse with
+ 	only Month being available.
+ 	* testsuite/std/time/format/data_not_present_neg.cc: New test.
+ 
+ 2025-06-24  Patrick Palka  <ppalka@redhat.com>
+ 	    Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	PR libstdc++/120717
+ 	* include/std/type_traits (__maybe_complete_object_type): New
+ 	helper trait, factored out from ...
+ 	(__is_complete_or_unbounded): ... here.  Only check sizeof on a
+ 	__maybe_complete_object_type type.  Fix formatting.
+ 	* testsuite/20_util/is_complete_or_unbounded/120717.cc: New test.
+ 
  2025-06-16  Jason Merrill  <jason@redhat.com>
  
  	* testsuite/20_util/is_complete_or_unbounded/memoization.cc
diff -Nrcpad gcc-16-20250622/libstdc++-v3/config/abi/pre/gnu.ver gcc-16-20250629/libstdc++-v3/config/abi/pre/gnu.ver
*** gcc-16-20250622/libstdc++-v3/config/abi/pre/gnu.ver	Sun Jun 22 22:33:49 2025
--- gcc-16-20250629/libstdc++-v3/config/abi/pre/gnu.ver	Sun Jun 29 22:34:10 2025
*************** CXXABI_1.3.16 {
*** 2899,2904 ****
--- 2899,2913 ----
  } CXXABI_1.3.15;
  #endif
  
+ CXXABI_1.3.17 {
+     # std::exception_ptr::_M_exception_ptr_cast
+     _ZNKSt15__exception_ptr13exception_ptr21_M_exception_ptr_castERKSt9type_info;
+ #ifdef __riscv
+ } CXXABI_1.3.16;
+ #else
+ } CXXABI_1.3.15;
+ #endif
+ 
  # Symbols in the support library (libsupc++) supporting transactional memory.
  CXXABI_TM_1 {
  
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/bits/chrono_io.h gcc-16-20250629/libstdc++-v3/include/bits/chrono_io.h
*** gcc-16-20250622/libstdc++-v3/include/bits/chrono_io.h	Sun Jun 22 22:33:50 2025
--- gcc-16-20250629/libstdc++-v3/include/bits/chrono_io.h	Sun Jun 29 22:34:11 2025
*************** namespace __format
*** 189,199 ****
  {
    [[noreturn,__gnu__::__always_inline__]]
    inline void
-   __no_timezone_available()
-   { __throw_format_error("format error: no timezone available for %Z or %z"); }
- 
-   [[noreturn,__gnu__::__always_inline__]]
-   inline void
    __not_valid_for_duration()
    { __throw_format_error("format error: chrono-format-spec not valid for "
  			 "chrono::duration"); }
--- 189,194 ----
*************** namespace __format
*** 204,212 ****
--- 199,278 ----
    { __throw_format_error("format error: chrono-format-spec not valid for "
  			 "argument type"); }
  
+   // Represents the information provided by a chrono type.
+   // e.g. month_weekday has month and weekday but no year or time of day,
+   // hh_mm_ss has time of day but no date, sys_time is time_point+timezone.
+   enum class _ChronoParts : unsigned short {
+     _None = 0, _TotalSeconds = 1u, _Subseconds = 1u << 2,
+ 
+     // time since epoch
+     _EpochUnits = 1u << 3, _UnitSuffix = 1u << 4,
+     _EpochSeconds = _EpochUnits | _TotalSeconds,
+ 
+     // local (wall) time
+     _LocalDays = 1u << 5,
+     _LocalSeconds = _LocalDays | _TotalSeconds,
+ 
+     _Year = 1u << 6, _Month = 1u << 7, _Day = 1u << 8,
+     _Weekday = 1u << 9, _WeekdayIndex = 1u << 10,  _DayOfYear = 1u << 11,
+     _IndexedWeekday = _Weekday | _WeekdayIndex,
+     _YearMonthDay = _Year | _Month | _Day,
+     _Date = _LocalDays | _YearMonthDay | _IndexedWeekday | _DayOfYear,
+ 
+     _HoursMinutesSeconds = 1u << 12,
+     _TimeOfDay = _HoursMinutesSeconds | _Subseconds,
+     _Time = _TimeOfDay | _TotalSeconds,
+     _EpochTime = _Time | _EpochUnits | _UnitSuffix,
+     _DateTime = _Date | _Time,
+ 
+     _ZoneAbbrev = 1u << 13, _ZoneOffset = 1u << 14,
+     _TimeZone = _ZoneAbbrev | _ZoneOffset,
+     _ZonedDateTime = _DateTime | _TimeZone,
+   };
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts
+   operator&(_ChronoParts __x, _ChronoParts __y) noexcept
+   { return static_cast<_ChronoParts>((unsigned)__x & (unsigned)__y); }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts&
+   operator&=(_ChronoParts& __x, _ChronoParts __y) noexcept
+   { return __x = __x & __y; }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts
+   operator|(_ChronoParts __x, _ChronoParts __y) noexcept
+   { return static_cast<_ChronoParts>((unsigned short)__x | (unsigned short)__y); }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts&
+   operator|=(_ChronoParts& __x, _ChronoParts __y) noexcept
+   { return __x = __x | __y; }
+ 
+   // returns copy of x with all bits from y unset.
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts
+   operator-(_ChronoParts __x, _ChronoParts __y) noexcept
+   { return static_cast<_ChronoParts>((unsigned short)__x & ~(unsigned short)__y); }
+ 
+   // unsets all bits of x that are set in y
+   [[__gnu__::__always_inline__]]
+   constexpr _ChronoParts&
+   operator-=(_ChronoParts& __x, _ChronoParts __y) noexcept
+   { return __x = __x - __y; }
+ 
+   [[__gnu__::__always_inline__]]
+   constexpr bool
+   operator==(_ChronoParts __x, decltype(nullptr)) noexcept
+   { return (unsigned short)__x == 0; }
+ 
    template<typename _CharT>
      struct _ChronoSpec : _Spec<_CharT>
      {
+       // When _M_prec_kind is _WP_none, the _M_prec contains the default
+       // value of fraction digits to be used for time '%S'.
+ 
        // Placed in tail-padding of __format::_Spec<C>.
        // This indicates that a locale-dependent conversion specifier such as
        // %a is used in the chrono-specs. This is not the same as the
*************** namespace __format
*** 214,242 ****
        // in the format-spec, e.g. "{:L%a}" is localized and locale-specific,
        // but "{:L}" is only localized and "{:%a}" is only locale-specific.
        unsigned _M_locale_specific : 1;
  
        basic_string_view<_CharT> _M_chrono_specs;
-     };
  
!   // Represents the information provided by a chrono type.
!   // e.g. month_weekday has month and weekday but no year or time of day,
!   // hh_mm_ss has time of day but no date, sys_time is time_point+timezone.
!   enum _ChronoParts {
!     _Year = 1, _Month = 2, _Day = 4, _Weekday = 8, _TimeOfDay = 16,
!     _TimeZone = 32,
!     _Date = _Year | _Month | _Day | _Weekday,
!     _DateTime = _Date | _TimeOfDay,
!     _ZonedDateTime = _DateTime | _TimeZone,
!     _Duration = 128 // special case
!   };
! 
!   constexpr _ChronoParts
!   operator|(_ChronoParts __x, _ChronoParts __y) noexcept
!   { return static_cast<_ChronoParts>((int)__x | (int)__y); }
! 
!   constexpr _ChronoParts&
!   operator|=(_ChronoParts& __x, _ChronoParts __y) noexcept
!   { return __x = __x | __y; }
  
    template<typename _CharT>
    struct _ChronoFormats
--- 280,302 ----
        // in the format-spec, e.g. "{:L%a}" is localized and locale-specific,
        // but "{:L}" is only localized and "{:%a}" is only locale-specific.
        unsigned _M_locale_specific : 1;
+       // Indicates that we are handling duration.
+       unsigned _M_time_only : 1;
+       // Indicates that duration should be treated as floating point.
+       unsigned _M_floating_point_rep : 1;
+       // Indicate that duration uses user-defined representation.
+       unsigned _M_custom_rep : 1;
+       unsigned _M_unused : 4;
  
+       // Chrono parts required by format specs
+       _ChronoParts _M_needed;
        basic_string_view<_CharT> _M_chrono_specs;
  
!       [[__gnu__::__always_inline__]]
!       constexpr bool
!       _M_needs(_ChronoParts __parts) const
!       { return (_M_needed & __parts) != 0; }
!     };
  
    template<typename _CharT>
    struct _ChronoFormats
*************** namespace __format
*** 340,345 ****
--- 400,551 ----
      { return _S_yml().substr(3); }
    };
  
+   template<typename _CharT>
+     struct _ChronoData
+     {
+       static constexpr unsigned _S_max_prec = 18;
+       using _Attoseconds = chrono::duration<__UINT_LEAST64_TYPE__, atto>;
+ 
+       using _FormatContext
+ 	= basic_format_context<_Sink_iter<_CharT>, _CharT>;
+       using _FormatArgs = basic_format_args<_FormatContext>;
+       static inline auto _S_args = std::make_format_args<_FormatContext>();
+ 
+       _ChronoData() = default;
+       _ChronoData(_ChronoData&&) = delete;
+ 
+       // time since epoch
+       chrono::seconds           _M_eseconds;
+       // n.b. due offset being seconds or coarser, local and epoch subseconds
+       // has the same value
+       _Attoseconds              _M_subseconds;
+       // _M_ereps.get(0) stores duration units
+       // _M_ereps.get(1) stores subseconds units
+       // _M_ereps.get(2) stores precision
+       _FormatArgs               _M_ereps = _S_args;
+       basic_string_view<_CharT> _M_unit_suffix;
+ 
+       // local (wall) time
+       chrono::local_seconds _M_lseconds;
+       chrono::local_days    _M_ldays;
+ 
+       chrono::year    _M_year;
+       chrono::month   _M_month;
+       chrono::day     _M_day;
+       chrono::weekday _M_weekday;
+       unsigned char   _M_weekday_index;
+       chrono::days    _M_day_of_year;
+ 
+       bool            _M_is_neg;
+       chrono::hours   _M_hours;
+       chrono::minutes _M_minutes;
+       chrono::seconds _M_seconds;
+ 
+       chrono::seconds           _M_zone_offset;
+       basic_string_view<_CharT> _M_zone_abbrev;
+       const char*               _M_zone_cstr = "";
+ 
+       template<typename _YearMonth>
+ 	[[__gnu__::__always_inline__]]
+ 	_ChronoParts
+ 	_M_fill_year_month(const _YearMonth& __ym, _ChronoParts __parts)
+ 	{
+ 	  _M_year = __ym.year();
+ 	  __parts -= _ChronoParts::_Year;
+ 	  _M_month = __ym.month();
+ 	  __parts -= _ChronoParts::_Month;
+ 	  return __parts;
+ 	}
+ 
+       [[__gnu__::__always_inline__]]
+       _ChronoParts
+       _M_fill_day(chrono::day __d, _ChronoParts __parts)
+       {
+ 	_M_day = __d;
+ 	__parts -= _ChronoParts::_Day;
+ 	_M_weekday_index = ((unsigned)__d + 6u) % 7u;
+ 	__parts -= _ChronoParts::_WeekdayIndex;
+ 	return __parts;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       _ChronoParts
+       _M_fill_weekday(chrono::weekday_indexed __wi, _ChronoParts __parts)
+       {
+ 	_M_weekday = __wi.weekday();
+ 	__parts -= _ChronoParts::_Weekday;
+ 	_M_weekday_index = __wi.index();
+ 	__parts -= _ChronoParts::_WeekdayIndex;
+ 	return __parts;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       _ChronoParts
+       _M_fill_aux(chrono::local_days __ld, _ChronoParts __parts)
+       {
+ 	using namespace chrono;
+ 	if ((__parts & _ChronoParts::_Weekday) != 0)
+ 	  _M_weekday = weekday(__ld);
+ 	__parts -= _ChronoParts::_Weekday;
+ 	if ((__parts & _ChronoParts::_DayOfYear) != 0)
+ 	  // See "Calculating Ordinal Dates" at
+ 	  // https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes
+ 	  _M_day_of_year = __ld - local_days(_M_year/January/0);
+ 	__parts -= _ChronoParts::_DayOfYear;
+ 	return __parts;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       _ChronoParts
+       _M_fill_ldays(chrono::local_days __ld, _ChronoParts __parts)
+       {
+ 	_M_ldays = __ld;
+ 	__parts -= _ChronoParts::_LocalDays;
+ 	return _M_fill_aux(__ld, __parts);
+       }
+ 
+       void
+       _M_fill_time(chrono::seconds __d)
+       {
+ 	chrono::hh_mm_ss<chrono::seconds> __hms(__d);
+ 	_M_hours = __hms.hours();
+ 	_M_minutes = __hms.minutes();
+ 	_M_seconds = __hms.seconds();
+       }
+ 
+       void
+       _M_fill_date_time(chrono::local_seconds __ls, _ChronoParts __parts)
+       {
+ 	_M_ldays = chrono::floor<chrono::days>(__ls);
+ 	__parts -= _ChronoParts::_LocalDays;
+ 	if ((__parts & _ChronoParts::_HoursMinutesSeconds) != 0)
+ 	  _M_fill_time(_M_lseconds - _M_ldays);
+ 
+ 	if ((__parts & _ChronoParts::_Date) != 0)
+ 	  {
+ 	    const chrono::year_month_day __ymd(_M_ldays);
+ 	    _M_fill_year_month(__ymd, __parts);
+ 	    _M_fill_day(__ymd.day(), __parts);
+ 	    _M_fill_aux(_M_ldays, __parts);
+ 	  }
+       }
+ 
+       void
+       _M_fill_zone(const char* __abbrev, const wchar_t* __wabbrev)
+       {
+ 	if constexpr (is_same_v<_CharT, char>)
+ 	  _M_zone_abbrev = __abbrev;
+ 	else
+ 	  _M_zone_abbrev = __wabbrev;
+ 	_M_zone_cstr = __abbrev;
+       }
+ 
+       [[__gnu__::__always_inline__]]
+       void
+       _M_fill_utc_zone()
+       { _M_fill_zone("UTC", L"UTC"); }
+     };
+ 
    // TODO rename this to chrono::__formatter? or chrono::__detail::__formatter?
    template<typename _CharT>
      struct __formatter_chrono
*************** namespace __format
*** 357,363 ****
        template<typename _ParseContext>
  	constexpr typename _ParseContext::iterator
  	_M_parse(_ParseContext& __pc, _ChronoParts __parts,
! 		 const _ChronoSpec<_CharT>& __def = {})
  	{
  	  auto __first = __pc.begin();
  	  auto __last = __pc.end();
--- 563,569 ----
        template<typename _ParseContext>
  	constexpr typename _ParseContext::iterator
  	_M_parse(_ParseContext& __pc, _ChronoParts __parts,
! 		 const _ChronoSpec<_CharT>& __def)
  	{
  	  auto __first = __pc.begin();
  	  auto __last = __pc.end();
*************** namespace __format
*** 388,398 ****
  	  if (__finished())
  	    return __first;
  
! 	  if (__parts & _ChronoParts::_Duration)
  	    {
! 	      __first = __spec._M_parse_precision(__first, __last, __pc);
! 	      if (__finished())
! 		return __first;
  	    }
  
  	  __spec._M_localized = false;
--- 594,611 ----
  	  if (__finished())
  	    return __first;
  
! 	  if (*__first == '.')
  	    {
! 	      if ((__parts & _ChronoParts::_EpochUnits) == 0
! 		  || !__spec._M_floating_point_rep)
! 		__throw_format_error("format error: invalid precision for duration");
! 
! 	      // Precision is allowed, but value is ignored.
! 	      __first = _Spec<_CharT>()._M_parse_precision(__first, __last, __pc);
! 	      // Still inditate that there was user supplied precision.
! 	      __spec._M_prec_kind = _WP_value;
! 	     if (__finished())
! 	       return __first;
  	    }
  
  	  __spec._M_localized = false;
*************** namespace __format
*** 418,424 ****
  	  // against __parts (so fail for %Y if no year in parts).
  	  // Save range in __spec._M_chrono_specs.
  	  __spec._M_debug = false;
! 	  __spec._M_locale_specific = true;
  	  __spec._M_chrono_specs = __string_view();
  
  	  const auto __chrono_specs = __first++; // Skip leading '%'
--- 631,638 ----
  	  // against __parts (so fail for %Y if no year in parts).
  	  // Save range in __spec._M_chrono_specs.
  	  __spec._M_debug = false;
! 	  __spec._M_locale_specific = false;
! 	  __spec._M_needed = _ChronoParts::_None;
  	  __spec._M_chrono_specs = __string_view();
  
  	  const auto __chrono_specs = __first++; // Skip leading '%'
*************** namespace __format
*** 428,444 ****
  
  	  _CharT __mod{};
  	  bool __conv = true;
- 	  int __needed = 0;
- 	  bool __locale_specific = false;
- 
  	  while (__first != __last)
  	    {
  	      enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
  	      _Mods __allowed_mods = _Mod_none;
  
  	      _CharT __c = *__first++;
  	      switch (__c)
  		{
  		case 'a':
  		case 'A':
  		  __needed = _Weekday;
--- 642,659 ----
  
  	  _CharT __mod{};
  	  bool __conv = true;
  	  while (__first != __last)
  	    {
  	      enum _Mods { _Mod_none, _Mod_E, _Mod_O, _Mod_E_O };
  	      _Mods __allowed_mods = _Mod_none;
  
+ 	      _ChronoParts __needed = _ChronoParts::_None;
+ 	      bool __locale_specific = false;
+ 
  	      _CharT __c = *__first++;
  	      switch (__c)
  		{
+ 		using enum _ChronoParts;
  		case 'a':
  		case 'A':
  		  __needed = _Weekday;
*************** namespace __format
*** 451,457 ****
  		  __locale_specific = true;
  		  break;
  		case 'c':
! 		  __needed = _DateTime;
  		  __allowed_mods = _Mod_E;
  		  __locale_specific = true;
  		  break;
--- 666,672 ----
  		  __locale_specific = true;
  		  break;
  		case 'c':
! 		  __needed = _Date|_HoursMinutesSeconds;
  		  __allowed_mods = _Mod_E;
  		  __locale_specific = true;
  		  break;
*************** namespace __format
*** 466,492 ****
  		  break;
  		case 'D':
  		case 'F':
! 		  __needed = _Date;
  		  break;
  		case 'g':
  		case 'G':
! 		  __needed = _Date;
  		  break;
  		case 'H':
  		case 'I':
! 		  __needed = _TimeOfDay;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'j':
! 		  if (!(__parts & _Duration))
! 		    __needed = _Date;
  		  break;
  		case 'm':
  		  __needed = _Month;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'M':
! 		  __needed = _TimeOfDay;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'p':
--- 681,707 ----
  		  break;
  		case 'D':
  		case 'F':
! 		  __needed = _YearMonthDay;
  		  break;
  		case 'g':
  		case 'G':
! 		  __needed = _LocalDays|_Weekday;
  		  break;
  		case 'H':
  		case 'I':
! 		  __needed = _HoursMinutesSeconds;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'j':
! 		  __needed = __spec._M_time_only ? _HoursMinutesSeconds
! 						 : _DayOfYear;
  		  break;
  		case 'm':
  		  __needed = _Month;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'M':
! 		  __needed = _HoursMinutesSeconds;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'p':
*************** namespace __format
*** 494,505 ****
  		  __locale_specific = true;
  		  [[fallthrough]];
  		case 'R':
  		case 'T':
  		  __needed = _TimeOfDay;
  		  break;
  		case 'q':
  		case 'Q':
! 		  __needed = _Duration;
  		  break;
  		case 'S':
  		  __needed = _TimeOfDay;
--- 709,724 ----
  		  __locale_specific = true;
  		  [[fallthrough]];
  		case 'R':
+ 		  __needed = _HoursMinutesSeconds;
+ 		  break;
  		case 'T':
  		  __needed = _TimeOfDay;
  		  break;
  		case 'q':
+ 		  __needed = _UnitSuffix;
+ 		  break;
  		case 'Q':
! 		  __needed = _EpochUnits;
  		  break;
  		case 'S':
  		  __needed = _TimeOfDay;
*************** namespace __format
*** 513,519 ****
  		case 'U':
  		case 'V':
  		case 'W':
! 		  __needed = _Date;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'x':
--- 732,738 ----
  		case 'U':
  		case 'V':
  		case 'W':
! 		  __needed = _LocalDays|_Year|_DayOfYear|_Weekday;
  		  __allowed_mods = _Mod_O;
  		  break;
  		case 'x':
*************** namespace __format
*** 522,528 ****
  		  __allowed_mods = _Mod_E;
  		  break;
  		case 'X':
! 		  __needed = _TimeOfDay;
  		  __locale_specific = true;
  		  __allowed_mods = _Mod_E;
  		  break;
--- 741,747 ----
  		  __allowed_mods = _Mod_E;
  		  break;
  		case 'X':
! 		  __needed = _HoursMinutesSeconds;
  		  __locale_specific = true;
  		  __allowed_mods = _Mod_E;
  		  break;
*************** namespace __format
*** 535,545 ****
  		  __allowed_mods = _Mod_E;
  		  break;
  		case 'z':
! 		  __needed = _TimeZone;
  		  __allowed_mods = _Mod_E_O;
  		  break;
  		case 'Z':
! 		  __needed = _TimeZone;
  		  break;
  		case 'n':
  		case 't':
--- 754,764 ----
  		  __allowed_mods = _Mod_E;
  		  break;
  		case 'z':
! 		  __needed = _ZoneOffset;
  		  __allowed_mods = _Mod_E_O;
  		  break;
  		case 'Z':
! 		  __needed = _ZoneAbbrev;
  		  break;
  		case 'n':
  		case 't':
*************** namespace __format
*** 567,576 ****
--- 786,801 ----
  		__locale_specific = true;
  	      __mod = _CharT();
  
+ 	      // localized formats do not include subseconds
+ 	      if (__locale_specific)
+ 		__needed -= _ChronoParts::_Subseconds;
+ 
  	      if ((__parts & __needed) != __needed)
  		__throw_format_error("chrono format error: format argument "
  				     "does not contain the information "
  				     "required by the chrono-specs");
+ 	      __spec._M_needed |= __needed;
+ 	      __spec._M_locale_specific |= __locale_specific;
  
  	      // Scan for next '%', ignoring literal-chars before it.
  	      size_t __pos = __string_view(__first, __last - __first).find('%');
*************** namespace __format
*** 596,616 ****
  	  _M_spec = __spec;
  	  _M_spec._M_chrono_specs
  		 = __string_view(__chrono_specs, __first - __chrono_specs);
- 	  _M_spec._M_locale_specific = __locale_specific;
  
  	  return __first;
  	}
  
-       // TODO this function template is instantiated for every different _Tp.
-       // Consider creating a polymorphic interface for calendar types so
-       // that we instantiate fewer different specializations. Similar to
-       // _Sink_iter for std::format. Replace each _S_year, _S_day etc. with
-       // member functions of that type.
        // pre: !_M_spec._M_chrono_specs.empty()
!       template<typename _Tp, typename _FormatContext>
  	typename _FormatContext::iterator
! 	_M_format(const _Tp& __t, _FormatContext& __fc,
! 		  bool __is_neg = false) const
  	{
  #if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
  	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
--- 821,834 ----
  	  _M_spec = __spec;
  	  _M_spec._M_chrono_specs
  		 = __string_view(__chrono_specs, __first - __chrono_specs);
  
  	  return __first;
  	}
  
        // pre: !_M_spec._M_chrono_specs.empty()
!       template<typename _FormatContext>
  	typename _FormatContext::iterator
! 	_M_format(const _ChronoData<_CharT>& __t, _FormatContext& __fc) const
  	{
  #if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
  	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
*************** namespace __format
*** 626,661 ****
  		  // in the locale's encoding to UTF-8.
  		  locale __loc = __fc.locale();
  		  if (__loc != locale::classic())
! 		    __fc._M_loc =  __with_encoding_conversion(__loc);
  		}
  #endif
- 	  // formatter<duration> passes the correct value of __is_neg
- 	  // for durations but for hh_mm_ss we decide it here.
- 	  if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
- 	    __is_neg = __t.is_negative();
  
  	  const size_t __padwidth = _M_spec._M_get_width(__fc);
  	  if (__padwidth == 0)
! 	    return _M_format_to(__t, __fc.out(), __fc, __is_neg);
  
  	  using _Out = typename _FormatContext::iterator;
  	  _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
! 	  _M_format_to(__t, __sink.out(), __fc, __is_neg);
  	  return __sink._M_finish(_M_spec._M_align, _M_spec._M_fill);
  	}
  
!       template<typename _Tp, typename _Out, typename _FormatContext>
! 	_Out
! 	_M_format_to(const _Tp& __t, _Out __out, _FormatContext& __fc,
! 		     bool __is_neg) const
  	{
  	  auto __first = _M_spec._M_chrono_specs.begin();
  	  const auto __last = _M_spec._M_chrono_specs.end();
  
! 	  auto __print_sign = [&__is_neg, &__out] {
! 	    if constexpr (chrono::__is_duration_v<_Tp>
! 			    || __is_specialization_of<_Tp, chrono::hh_mm_ss>)
! 	      if (__is_neg)
  		{
  		  *__out++ = _S_plus_minus[1];
  		  __is_neg = false;
--- 844,962 ----
  		  // in the locale's encoding to UTF-8.
  		  locale __loc = __fc.locale();
  		  if (__loc != locale::classic())
! 		    __fc._M_loc = __with_encoding_conversion(__loc);
  		}
  #endif
  
  	  const size_t __padwidth = _M_spec._M_get_width(__fc);
  	  if (__padwidth == 0)
! 	    return _M_format_to(__t, __fc.out(), __fc);
  
  	  using _Out = typename _FormatContext::iterator;
  	  _Padding_sink<_Out, _CharT> __sink(__fc.out(), __padwidth);
! 	  _M_format_to(__t, __sink.out(), __fc);
  	  return __sink._M_finish(_M_spec._M_align, _M_spec._M_fill);
  	}
  
! 
!       _ChronoSpec<_CharT> _M_spec;
! 
!     protected:
!       static constexpr const _CharT* _S_chars
! 	= _GLIBCXX_WIDEN("0123456789.Lf:/ +-{}");
!       static constexpr _CharT _S_dot = _S_chars[10];
!       static constexpr _CharT _S_colon = _S_chars[13];
!       static constexpr _CharT _S_slash = _S_chars[14];
!       static constexpr _CharT _S_space = _S_chars[15];
!       static constexpr const _CharT* _S_fp_fmt = _S_chars + 11;
!       static constexpr const _CharT* _S_plus_minus = _S_chars + 16;
!       static constexpr const _CharT* _S_minus_empty_spec = _S_chars + 17;
!       static constexpr const _CharT* _S_empty_spec = _S_chars + 18;
! 
!       [[__gnu__::__always_inline__]]
!       static _Runtime_format_string<_CharT>
!       _S_empty_fs()
!       { return _Runtime_format_string<_CharT>(_S_empty_spec); }
! 
!       // Return the formatting locale.
!       template<typename _FormatContext>
! 	std::locale
! 	_M_locale(_FormatContext& __fc) const
! 	{
! 	  if (!_M_spec._M_localized)
! 	    return std::locale::classic();
! 	  else
! 	    return __fc.locale();
! 	}
! 
!     private:
!       template<typename _OutIter>
! 	_OutIter
! 	_M_write(_OutIter __out, const locale& __loc, __string_view __s) const
! 	{
! #if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
! 	  __sso_string __buf;
! 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
! 	  // 3565. Handling of encodings in localized formatting
! 	  //       of chrono types is underspecified
! 	  if constexpr (is_same_v<_CharT, char>)
! 	    if constexpr (__unicode::__literal_encoding_is_utf8())
! 	      if (_M_spec._M_localized && _M_spec._M_locale_specific
! 		    && __loc != locale::classic())
! 		{
! 		  extern string_view
! 		  __locale_encoding_to_utf8(const locale&, string_view, void*);
! 
! 		  __s = __locale_encoding_to_utf8(__loc, __s, &__buf);
! 		}
! #endif
! 	  return __format::__write(std::move(__out), __s);
! 	}
! 
!       [[__gnu__::__always_inline__]]
!       static bool
!       _S_localized_spec(_CharT __conv, _CharT __mod)
!       {
! 	switch (__conv)
! 	  {
! 	  case 'c':
! 	  case 'r':
! 	  case 'x':
! 	  case 'X':
! 	    return true;
! 	  case 'z':
! 	    return false;
! 	  default:
! 	    return (bool)__mod;
! 	  };
!       }
! 
!       // Use the formatting locale's std::time_put facet to produce
!       // a locale-specific representation.
!       template<typename _Iter>
! 	_Iter
! 	_M_locale_fmt(_Iter __out, const locale& __loc, const struct tm& __tm,
! 		      char __fmt, char __mod) const
! 	{
! 	  basic_ostringstream<_CharT> __os;
! 	  __os.imbue(__loc);
! 	  const auto& __tp = use_facet<time_put<_CharT>>(__loc);
! 	  __tp.put(__os, __os, _S_space, &__tm, __fmt, __mod);
! 	  if (__os)
! 	    __out = _M_write(std::move(__out), __loc, __os.view());
! 	  return __out;
! 	}
! 
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_format_to(const _ChronoData<_CharT>& __t, _OutIter __out,
! 		     _FormatContext& __fc) const
  	{
  	  auto __first = _M_spec._M_chrono_specs.begin();
  	  const auto __last = _M_spec._M_chrono_specs.end();
  
! 	  auto __print_sign = [__is_neg = __t._M_is_neg, &__out] () mutable {
! 	    if (__is_neg)
  		{
  		  *__out++ = _S_plus_minus[1];
  		  __is_neg = false;
*************** namespace __format
*** 663,668 ****
--- 964,999 ----
  	    return std::move(__out);
  	  };
  
+ 	  struct tm __tm{};
+ 	  bool __use_locale_fmt = false;
+ 	  if (_M_spec._M_localized && _M_spec._M_locale_specific)
+ 	    if (__fc.locale() != locale::classic())
+ 	      {
+ 		__use_locale_fmt = true;
+ 
+ 		__tm.tm_year = (int)__t._M_year - 1900;
+ 		__tm.tm_yday = __t._M_day_of_year.count();
+ 		__tm.tm_mon = (unsigned)__t._M_month - 1;
+ 		__tm.tm_mday = (unsigned)__t._M_day;
+ 		__tm.tm_wday = __t._M_weekday.c_encoding();
+ 		__tm.tm_hour = __t._M_hours.count();
+ 		__tm.tm_min = __t._M_minutes.count();
+ 		__tm.tm_sec = __t._M_seconds.count();
+ 
+ 		// Some locales use %Z in their %c format but we don't want strftime
+ 		// to use the system's local time zone (from /etc/localtime or $TZ)
+ 		// as the output for %Z. Setting tm_isdst to -1 says there is no
+ 		// time zone info available for the time in __tm.
+ 		__tm.tm_isdst = -1;
+ 
+ #ifdef _GLIBCXX_USE_STRUCT_TM_TM_ZONE
+ 		// POSIX.1-2024 adds tm.tm_zone which will be used for %Z.
+ 		// BSD has had tm_zone since 1987 but as char* so cast away const.
+ 		if (__t._M_zone_cstr)
+ 		  __tm.tm_zone = const_cast<char*>(__t._M_zone_cstr);
+ #endif
+ 	      }
+ 
  	  // Characters to output for "%n", "%t" and "%%" specifiers.
  	  constexpr const _CharT* __literals = _GLIBCXX_WIDEN("\n\t%");
  
*************** namespace __format
*** 672,769 ****
  	  do
  	    {
  	      _CharT __c = *__first++;
! 	      switch (__c)
  		{
  		// %\0 is extension for handling weekday index
  		case '\0':
! 		  __out = _M_wi(__t, std::move(__out), __fc);
  		  break;
  		case 'a':
  		case 'A':
! 		  __out = _M_a_A(__t, std::move(__out), __fc, __c == 'A');
  		  break;
  		case 'b':
  		case 'h':
  		case 'B':
! 		  __out = _M_b_B(__t, std::move(__out), __fc, __c == 'B');
  		  break;
  		case 'c':
! 		case 'r':
! 		case 'x':
! 		case 'X':
! 		  __out = _M_c_r_x_X(__t, std::move(__out), __fc, __c, __mod);
  		  break;
  		case 'C':
  		case 'y':
  		case 'Y':
! 		  __out = _M_C_y_Y(__t, std::move(__out), __fc, __c, __mod);
  		  break;
  		case 'd':
  		case 'e':
! 		  __out = _M_d_e(__t, std::move(__out), __fc, __c, __mod == 'O');
  		  break;
  		case 'D':
! 		  __out = _M_D(__t, std::move(__out), __fc);
  		  break;
  		case 'F':
! 		  __out = _M_F(__t, std::move(__out), __fc);
  		  break;
  		case 'g':
  		case 'G':
! 		  __out = _M_g_G(__t, std::move(__out), __fc, __c == 'G');
  		  break;
  		case 'H':
  		case 'I':
! 		  __out = _M_H_I(__t, __print_sign(), __fc, __c, __mod == 'O');
  		  break;
  		case 'j':
! 		  __out = _M_j(__t, __print_sign(), __fc);
  		  break;
  		case 'm':
! 		  __out = _M_m(__t, std::move(__out), __fc, __mod == 'O');
  		  break;
  		case 'M':
! 		  __out = _M_M(__t, __print_sign(), __fc, __mod == 'O');
  		  break;
  		case 'p':
! 		  __out = _M_p(__t, std::move(__out), __fc);
  		  break;
  		case 'q':
! 		  __out = _M_q(__t, std::move(__out), __fc);
  		  break;
  		case 'Q':
! 		  // %Q The duration's numeric value.
! 		  if constexpr (chrono::__is_duration_v<_Tp>)
! 		    // _GLIBCXX_RESOLVE_LIB_DEFECTS
! 		    // 4118. How should duration formatters format custom rep?
! 		    __out = std::format_to(__print_sign(), _S_empty_spec,
! 					   +__t.count());
! 		  else
! 		    __throw_format_error("chrono format error: argument is "
! 					 "not a duration");
  		  break;
  		case 'R':
  		case 'T':
! 		  __out = _M_R_T(__t, __print_sign(), __fc, __c == 'T');
  		  break;
  		case 'S':
! 		  __out = _M_S(__t, __print_sign(), __fc, __mod == 'O');
  		  break;
  		case 'u':
  		case 'w':
! 		  __out = _M_u_w(__t, std::move(__out), __fc, __c, __mod == 'O');
  		  break;
  		case 'U':
  		case 'V':
  		case 'W':
! 		  __out = _M_U_V_W(__t, std::move(__out), __fc, __c,
! 				   __mod == 'O');
  		  break;
  		case 'z':
! 		  __out = _M_z(__t, std::move(__out), __fc, (bool)__mod);
  		  break;
  		case 'Z':
! 		  __out = _M_Z(__t, std::move(__out), __fc);
  		  break;
  		case 'n':
  		  *__out++ = __literals[0];
--- 1003,1098 ----
  	  do
  	    {
  	      _CharT __c = *__first++;
! 	      if (__use_locale_fmt && _S_localized_spec(__c, __mod)) [[unlikely]]
! 		__out = _M_locale_fmt(std::move(__out), __fc.locale(),
! 				      __tm, __c, __mod);
! 	      else switch (__c)
  		{
  		// %\0 is extension for handling weekday index
  		case '\0':
! 		  __out = _M_wi(__t._M_weekday_index, std::move(__out));
  		  break;
  		case 'a':
  		case 'A':
! 		  __out = _M_a_A(__t._M_weekday, std::move(__out), __fc, __c == 'A');
  		  break;
  		case 'b':
  		case 'h':
  		case 'B':
! 		  __out = _M_b_B(__t._M_month, std::move(__out), __fc, __c == 'B');
  		  break;
  		case 'c':
! 		  __out = _M_c(__t, std::move(__out), __fc);
  		  break;
  		case 'C':
  		case 'y':
  		case 'Y':
! 		  __out = _M_C_y_Y(__t._M_year, std::move(__out), __c);
  		  break;
  		case 'd':
  		case 'e':
! 		  __out = _M_d_e(__t._M_day, std::move(__out), __c);
  		  break;
  		case 'D':
! 		case 'x':
! 		  __out = _M_D_x(__t, std::move(__out));
  		  break;
  		case 'F':
! 		  __out = _M_F(__t, std::move(__out));
  		  break;
  		case 'g':
  		case 'G':
! 		  __out = _M_g_G(__t, std::move(__out), __c == 'G');
  		  break;
  		case 'H':
  		case 'I':
! 		  __out = _M_H_I(__t._M_hours, __print_sign(), __c);
  		  break;
  		case 'j':
! 		  __out = _M_j(__t, __print_sign());
  		  break;
  		case 'm':
! 		  __out = _M_m(__t._M_month, std::move(__out));
  		  break;
  		case 'M':
! 		  __out = _M_M(__t._M_minutes, __print_sign());
  		  break;
  		case 'p':
! 		  __out = _M_p(__t._M_hours, std::move(__out), __fc);
  		  break;
  		case 'q':
! 		  __out = _M_q(__t._M_unit_suffix, std::move(__out));
  		  break;
  		case 'Q':
! 		  __out = _M_Q(__t, __print_sign(), __fc);
! 		  break;
! 		case 'r':
! 		  __out = _M_r(__t, __print_sign(), __fc);
  		  break;
  		case 'R':
+ 		case 'X':
+ 		  __out = _M_R_X(__t, __print_sign(), __c != 'R');
+ 		  break;
  		case 'T':
! 		  __out = _M_T(__t, __print_sign(), __fc);
  		  break;
  		case 'S':
! 		  __out = _M_S(__t, __print_sign(), __fc, __mod != 'O');
  		  break;
  		case 'u':
  		case 'w':
! 		  __out = _M_u_w(__t._M_weekday, std::move(__out), __c);
  		  break;
  		case 'U':
  		case 'V':
  		case 'W':
! 		  __out = _M_U_V_W(__t, std::move(__out), __c);
  		  break;
  		case 'z':
! 		  __out = _M_z(__t._M_zone_offset, std::move(__out), (bool)__mod);
  		  break;
  		case 'Z':
! 		  __out = _M_Z(__t._M_zone_abbrev, std::move(__out));
  		  break;
  		case 'n':
  		  *__out++ = __literals[0];
*************** namespace __format
*** 804,881 ****
  	  return std::move(__out);
  	}
  
-       // Format duration for empty chrono-specs, e.g. "{}" (C++20 [time.format] p6).
-       template<typename _Rep, typename _Period, typename _FormatContext>
- 	typename _FormatContext::iterator
- 	_M_format_to_ostream(const chrono::duration<_Rep, _Period>& __d,
- 			     bool __is_neg, _FormatContext& __fc) const
- 	{
- 	   basic_ostringstream<_CharT> __os;
- 	   __os.imbue(_M_locale(__fc));
- 
- 	   if (__is_neg) [[unlikely]]
- 	     __os << _S_plus_minus[1];
- 	   __os << __d;
- 
- 	  auto __str = std::move(__os).str();
- 	  return __format::__write_padded_as_spec(__str, __str.size(),
- 						  __fc, _M_spec);
- 	}
- 
-       _ChronoSpec<_CharT> _M_spec;
- 
-     private:
-       // Return the formatting locale.
-       template<typename _FormatContext>
- 	std::locale
- 	_M_locale(_FormatContext& __fc) const
- 	{
- 	  if (!_M_spec._M_localized)
- 	    return std::locale::classic();
- 	  else
- 	    return __fc.locale();
- 	}
- 
-       static constexpr const _CharT* _S_chars
- 	= _GLIBCXX_WIDEN("0123456789:/ +-{}");
-       static constexpr _CharT _S_colon = _S_chars[10];
-       static constexpr _CharT _S_slash = _S_chars[11];
-       static constexpr _CharT _S_space = _S_chars[12];
-       static constexpr const _CharT* _S_plus_minus = _S_chars + 13;
-       static constexpr const _CharT* _S_minus_empty_spec = _S_chars + 14;
-       static constexpr const _CharT* _S_empty_spec = _S_chars + 15;
- 
        template<typename _OutIter>
  	_OutIter
! 	_M_write(_OutIter __out, const locale& __loc, __string_view __s) const
! 	{
! #if defined _GLIBCXX_USE_NL_LANGINFO_L && __CHAR_BIT__ == 8
! 	  __sso_string __buf;
! 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
! 	  // 3565. Handling of encodings in localized formatting
! 	  //       of chrono types is underspecified
! 	  if constexpr (is_same_v<_CharT, char>)
! 	    if constexpr (__unicode::__literal_encoding_is_utf8())
! 	      if (_M_spec._M_localized && _M_spec._M_locale_specific
! 		    && __loc != locale::classic())
! 		{
! 		  extern string_view
! 		  __locale_encoding_to_utf8(const locale&, string_view, void*);
! 
! 		  __s = __locale_encoding_to_utf8(__loc, __s, &__buf);
! 		}
! #endif
! 	  return __format::__write(std::move(__out), __s);
! 	}
! 
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_wi(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx) const
  	{
  	  // %\0 Extension to format weekday index, used only by empty format spec
- 	  unsigned __wi = _S_weekday_index(__t);
- 
  	  _CharT __buf[3];
  	  __out = __format::__write(std::move(__out), _S_str_d1(__buf, __wi));
  	  if (_M_spec._M_debug && (__wi < 1 || __wi > 5))
--- 1133,1143 ----
  	  return std::move(__out);
  	}
  
        template<typename _OutIter>
  	_OutIter
! 	_M_wi(unsigned __wi, _OutIter __out) const
  	{
  	  // %\0 Extension to format weekday index, used only by empty format spec
  	  _CharT __buf[3];
  	  __out = __format::__write(std::move(__out), _S_str_d1(__buf, __wi));
  	  if (_M_spec._M_debug && (__wi < 1 || __wi > 5))
*************** namespace __format
*** 884,897 ****
  	  return std::move(__out);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_a_A(const _Tp& __t, typename _FormatContext::iterator __out,
  	       _FormatContext& __ctx, bool __full) const
  	{
  	  // %a Locale's abbreviated weekday name.
  	  // %A Locale's full weekday name.
- 	  chrono::weekday __wd = _S_weekday(__t);
  	  if (!__wd.ok())
  	    {
  	      if (!_M_spec._M_debug)
--- 1146,1158 ----
  	  return std::move(__out);
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_a_A(chrono::weekday __wd, _OutIter __out,
  	       _FormatContext& __ctx, bool __full) const
  	{
  	  // %a Locale's abbreviated weekday name.
  	  // %A Locale's full weekday name.
  	  if (!__wd.ok())
  	    {
  	      if (!_M_spec._M_debug)
*************** namespace __format
*** 915,928 ****
  	  return _M_write(std::move(__out), __loc, __str);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_b_B(const _Tp& __t, typename _FormatContext::iterator __out,
  	       _FormatContext& __ctx, bool __full) const
  	{
  	  // %b Locale's abbreviated month name.
  	  // %B Locale's full month name.
- 	  chrono::month __m = _S_month(__t);
  	  if (!__m.ok())
  	    {
  	      if (!_M_spec._M_debug)
--- 1176,1188 ----
  	  return _M_write(std::move(__out), __loc, __str);
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_b_B(chrono::month __m, _OutIter __out,
  	       _FormatContext& __ctx, bool __full) const
  	{
  	  // %b Locale's abbreviated month name.
  	  // %B Locale's full month name.
  	  if (!__m.ok())
  	    {
  	      if (!_M_spec._M_debug)
*************** namespace __format
*** 946,1026 ****
  	  return _M_write(std::move(__out), __loc, __str);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_c_r_x_X(const _Tp& __t, typename _FormatContext::iterator __out,
! 		   _FormatContext& __ctx, _CharT __conv, _CharT __mod) const
  	{
! 	  // %c  Locale's date and time representation.
! 	  // %Ec Locale's alternate date and time representation.
! 	  // %r  Locale's 12-hour clock time.
! 	  // %x  Locale's date rep
! 	  // %Ex Locale's alternative date representation.
! 	  // %X  Locale's time rep
! 	  // %EX Locale's alternative time representation.
! 
! 	  using namespace chrono;
! 	  using ::std::chrono::__detail::__utc_leap_second;
! 	  using ::std::chrono::__detail::__local_time_fmt;
! 
! 	  struct tm __tm{};
! 
! 	  // Some locales use %Z in their %c format but we don't want strftime
! 	  // to use the system's local time zone (from /etc/localtime or $TZ)
! 	  // as the output for %Z. Setting tm_isdst to -1 says there is no
! 	  // time zone info available for the time in __tm.
! 	  __tm.tm_isdst = -1;
! 
! #ifdef _GLIBCXX_USE_STRUCT_TM_TM_ZONE
! 	  // POSIX.1-2024 adds tm.tm_zone which will be used for %Z.
! 	  // BSD has had tm_zone since 1987 but as char* so cast away const.
! 	  if constexpr (__is_time_point_v<_Tp>)
! 	    {
! 	      // One of sys_time, utc_time, or local_time.
! 	      if constexpr (!is_same_v<typename _Tp::clock, local_t>)
! 		__tm.tm_zone = const_cast<char*>("UTC");
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
! 	    {
! 	      // local-time-format-t is used to provide time zone info for
! 	      // one of zoned_time, tai_time, gps_time, or local_time.
! 	      if (__t._M_abbrev)
! 		__tm.tm_zone = const_cast<char*>(__t._M_abbrev->c_str());
! 	    }
! 	  else
! 	    __tm.tm_zone = const_cast<char*>("UTC");
! #endif
! 
! 	  if (__conv == 'c' || __conv == 'x')
! 	  {
! 	    auto __d = _S_days(__t); // Either sys_days or local_days.
! 	    using _TDays = decltype(__d);
! 	    const year_month_day __ymd(__d);
! 	    const auto __y = __ymd.year();
! 
! 	    __tm.tm_year = (int)__y - 1900;
! 	    __tm.tm_yday = (__d - _TDays(__y/January/1)).count();
! 	    __tm.tm_mon = (unsigned)__ymd.month() - 1;
! 	    __tm.tm_mday = (unsigned)__ymd.day();
! 	    __tm.tm_wday = weekday(__d).c_encoding();
! 	  }
! 
! 	  if (__conv != 'x')
! 	  {
! 	    const auto __hms = _S_hms(__t);
! 	    __tm.tm_hour = __hms.hours().count();
! 	    __tm.tm_min = __hms.minutes().count();
! 	    __tm.tm_sec = __hms.seconds().count();
! 	  }
  
! 	  return _M_locale_fmt(std::move(__out), _M_locale(__ctx), __tm,
! 			       __conv, __mod);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_C_y_Y(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx, _CharT __conv, _CharT __mod = 0) const
  	{
  	  // %C  Year divided by 100 using floored division.
  	  // %EC Locale's alternative preresentation of the century (era name).
--- 1206,1233 ----
  	  return _M_write(std::move(__out), __loc, __str);
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_c(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	     _FormatContext& __ctx) const
  	{
! 	  // %c  Locale's date and time representation, for C-locale: %a %b %e %T %Y
! 	  // %Ec Locale's alternate date and time representation, for C-locale same as above
  
! 	  __out = _M_a_A(__t._M_weekday, std::move(__out), __ctx, false);
! 	  *__out = _S_space;
! 	  __out = _M_b_B(__t._M_month, std::move(++__out), __ctx, false);
! 	  *__out = _S_space;
! 	  __out = _M_d_e(__t._M_day, std::move(++__out), 'e');
! 	  *__out = _S_space;
! 	  __out = _M_R_X(__t, std::move(++__out), true);
! 	  *__out = _S_space;
! 	  return _M_C_y_Y(__t._M_year, std::move(++__out), 'Y');
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_C_y_Y(chrono::year __y, _OutIter __out, _CharT __conv) const
  	{
  	  // %C  Year divided by 100 using floored division.
  	  // %EC Locale's alternative preresentation of the century (era name).
*************** namespace __format
*** 1030,1046 ****
  	  // %Y  Year as a decimal number.
  	  // %EY Locale's alternative full year representation.
  
- 	  chrono::year __y = _S_year(__t);
- 
- 	  if (__mod && _M_spec._M_localized) [[unlikely]]
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		struct tm __tm{};
- 		__tm.tm_year = (int)__y - 1900;
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     __conv, __mod);
- 	      }
- 
  	  int __yi = (int)__y;
  	  const bool __is_neg = __yi < 0;
  	  __yi = __builtin_abs(__yi);
--- 1237,1242 ----
*************** namespace __format
*** 1080,1094 ****
  	  return __out;
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_D(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext&) const
  	{
! 	  auto __ymd = _S_date(__t);
! 	  auto __di = (unsigned)__ymd.day();
! 	  auto __mi = (unsigned)__ymd.month();
! 	  auto __yi = __builtin_abs((int)__ymd.year()) % 100;
  
  	  if (__mi >= 100 || __di >= 100) [[unlikely]]
  	    {
--- 1276,1292 ----
  	  return __out;
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_D_x(const _ChronoData<_CharT>& __t, _OutIter __out) const
  	{
! 	  // %D  Equivalent to %m/%d/%y
! 	  // %x  Locale's date rep, for C-locale: %m/%d/%y
! 	  // %Ex Locale's alternative date representation, for C-locale same as above
! 
! 	  auto __di = (unsigned)__t._M_day;
! 	  auto __mi = (unsigned)__t._M_month;
! 	  auto __yi = __builtin_abs((int)__t._M_year) % 100;
  
  	  if (__mi >= 100 || __di >= 100) [[unlikely]]
  	    {
*************** namespace __format
*** 1112,1139 ****
  	  return std::move(__out);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_d_e(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx, _CharT __conv, bool __mod = false) const
  	{
  	  // %d  The day of month as a decimal number.
  	  // %Od Locale's alternative representation.
  	  // %e  Day of month as decimal number, padded with space.
  	  // %Oe Locale's alternative digits.
  
- 	  chrono::day __d = _S_day(__t);
  	  unsigned __i = (unsigned)__d;
  
- 	  if (__mod && _M_spec._M_localized) [[unlikely]]
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		struct tm __tm{};
- 		__tm.tm_mday = __i;
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     (char)__conv, 'O');
- 	      }
- 
  	  _CharT __buf[3];
  	  auto __sv = _S_str_d2(__buf, __i);
  	  if (__conv == _CharT('e') && __i < 10)
--- 1310,1326 ----
  	  return std::move(__out);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_d_e(chrono::day __d, _OutIter __out, _CharT __conv) const
  	{
  	  // %d  The day of month as a decimal number.
  	  // %Od Locale's alternative representation.
  	  // %e  Day of month as decimal number, padded with space.
  	  // %Oe Locale's alternative digits.
  
  	  unsigned __i = (unsigned)__d;
  
  	  _CharT __buf[3];
  	  auto __sv = _S_str_d2(__buf, __i);
  	  if (__conv == _CharT('e') && __i < 10)
*************** namespace __format
*** 1150,1164 ****
  	  return std::move(__out);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_F(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext&) const
  	{
! 	  auto __ymd = _S_date(__t);
! 	  auto __di = (unsigned)__ymd.day();
! 	  auto __mi = (unsigned)__ymd.month();
! 	  auto __yi = (int)__ymd.year();
  	  const bool __is_neg = __yi < 0;
  	  __yi = __builtin_abs(__yi);
  
--- 1337,1349 ----
  	  return std::move(__out);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_F(const _ChronoData<_CharT>& __t, _OutIter __out) const
  	{
! 	  auto __di = (unsigned)__t._M_day;
! 	  auto __mi = (unsigned)__t._M_month;
! 	  auto __yi = (int)__t._M_year;
  	  const bool __is_neg = __yi < 0;
  	  __yi = __builtin_abs(__yi);
  
*************** namespace __format
*** 1185,1233 ****
  	      __out = __format::__write(std::move(__out), __sv);
  	    }
  
! 	  if (_M_spec._M_debug && !__ymd.ok())
  	    __out = __format::__write(std::move(__out),
  		      __string_view(_GLIBCXX_WIDEN(" is not a valid date")));
  	  return std::move(__out);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_g_G(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx, bool __full) const
  	{
  	  // %g last two decimal digits of the ISO week-based year.
  	  // %G ISO week-based year.
  	  using namespace chrono;
! 	  auto __d = _S_days(__t);
  	  // Move to nearest Thursday:
! 	  __d -= (weekday(__d) - Monday) - days(3);
  	  // ISO week-based year is the year that contains that Thursday:
  	  year __y = year_month_day(__d).year();
! 	  return _M_C_y_Y(__y, std::move(__out), __ctx, "yY"[__full]);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_H_I(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx, _CharT __conv, bool __mod = false) const
  	{
  	  // %H  The hour (24-hour clock) as a decimal number.
  	  // %OH Locale's alternative representation.
  	  // %I  The hour (12-hour clock) as a decimal number.
  	  // %OI Locale's alternative representation.
  
! 	  const auto __hms = _S_hms(__t);
! 	  int __i = __hms.hours().count();
! 
! 	  if (__mod && _M_spec._M_localized) [[unlikely]]
! 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
! 	      {
! 		struct tm __tm{};
! 		__tm.tm_hour = __i;
! 		return _M_locale_fmt(std::move(__out), __loc, __tm,
! 				     (char)__conv, 'O');
! 	      }
  
  	  if (__conv == _CharT('I'))
  	    {
--- 1370,1407 ----
  	      __out = __format::__write(std::move(__out), __sv);
  	    }
  
! 	  if (_M_spec._M_debug && !(__t._M_year/__t._M_month/__t._M_day).ok())
  	    __out = __format::__write(std::move(__out),
  		      __string_view(_GLIBCXX_WIDEN(" is not a valid date")));
  	  return std::move(__out);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_g_G(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	       bool __full) const
  	{
  	  // %g last two decimal digits of the ISO week-based year.
  	  // %G ISO week-based year.
  	  using namespace chrono;
! 	  auto __d = __t._M_ldays;
  	  // Move to nearest Thursday:
! 	  __d -= (__t._M_weekday - Monday) - days(3);
  	  // ISO week-based year is the year that contains that Thursday:
  	  year __y = year_month_day(__d).year();
! 	  return _M_C_y_Y(__y, std::move(__out), "yY"[__full]);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_H_I(chrono::hours __h, _OutIter __out, _CharT __conv) const
  	{
  	  // %H  The hour (24-hour clock) as a decimal number.
  	  // %OH Locale's alternative representation.
  	  // %I  The hour (12-hour clock) as a decimal number.
  	  // %OI Locale's alternative representation.
  
! 	  int __i = __h.count();
  
  	  if (__conv == _CharT('I'))
  	    {
*************** namespace __format
*** 1236,1330 ****
  		__i = 12;
  	    }
  	  else if (__i >= 100) [[unlikely]]
! 	    return std::format_to(std::move(__out), _S_empty_spec, __i);
  
  	  return __format::__write(std::move(__out), _S_two_digits(__i));
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_j(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext&) const
  	{
! 	  if constexpr (chrono::__is_duration_v<_Tp>)
! 	    {
! 	      // Decimal number of days, without padding.
! 	      unsigned __d = chrono::duration_cast<chrono::days>(__t).count();
! 	      return std::format_to(std::move(__out), _S_empty_spec, __d);
! 	    }
! 	  else
! 	    {
! 	      // Day of the year as a decimal number, padding with zero.
! 	      using namespace chrono;
! 	      auto __day = _S_days(__t);
! 	      auto __ymd = _S_date(__t);
! 	      days __d;
! 	      // See "Calculating Ordinal Dates" at
! 	      // https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes
! 	      if constexpr (is_same_v<typename decltype(__day)::clock, local_t>)
! 		__d = __day - local_days(__ymd.year()/January/0);
! 	      else
! 		__d = __day - sys_days(__ymd.year()/January/0);
! 	      return std::format_to(std::move(__out), _GLIBCXX_WIDEN("{:03d}"),
! 				    __d.count());
! 	    }
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_m(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx, bool __mod) const
  	{
  	  // %m  month as a decimal number.
  	  // %Om Locale's alternative representation.
  
- 	  auto __m = _S_month(__t);
  	  auto __i = (unsigned)__m;
  
- 	  if (__mod && _M_spec._M_localized) [[unlikely]] // %Om
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		struct tm __tm{};
- 		__tm.tm_mon = __i - 1;
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     'm', 'O');
- 	      }
- 
  	  _CharT __buf[3];
  	  return __format::__write(std::move(__out), _S_str_d2(__buf, __i));
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_M(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx, bool __mod) const
  	{
  	  // %M  The minute as a decimal number.
  	  // %OM Locale's alternative representation.
  
- 	  auto __m = _S_hms(__t).minutes();
  	  auto __i = __m.count();
- 
- 	  if (__mod && _M_spec._M_localized) [[unlikely]] // %OM
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		struct tm __tm{};
- 		__tm.tm_min = __i;
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     'M', 'O');
- 	      }
- 
  	  return __format::__write(std::move(__out), _S_two_digits(__i));
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_p(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx) const
  	{
  	  // %p The locale's equivalent of the AM/PM designations.
! 	  auto __hms = _S_hms(__t);
! 	  auto __hi = __hms.hours().count();
  	  if (__hi >= 24) [[unlikely]]
  	    __hi %= 24;
  
--- 1410,1469 ----
  		__i = 12;
  	    }
  	  else if (__i >= 100) [[unlikely]]
! 	    return std::format_to(std::move(__out), _S_empty_fs(), __i);
  
  	  return __format::__write(std::move(__out), _S_two_digits(__i));
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_j(const _ChronoData<_CharT>& __t, _OutIter __out) const
  	{
! 	  if (_M_spec._M_time_only)
! 	  {
! 	    // Decimal number of days, without padding.
! 	    auto __d = chrono::floor<chrono::days>(__t._M_hours).count();
! 	    return std::format_to(std::move(__out), _S_empty_fs(), __d);
! 	  }
! 
! 	  auto __d = __t._M_day_of_year.count();
! 	  if (__d >= 1000) [[unlikely]]
! 	    return std::format_to(std::move(__out), _S_empty_fs(), __d);
! 
! 	  _CharT __buf[3];
! 	  return __format::__write(std::move(__out), _S_str_d3(__buf, __d));
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_m(chrono::month __m, _OutIter __out) const
  	{
  	  // %m  month as a decimal number.
  	  // %Om Locale's alternative representation.
  
  	  auto __i = (unsigned)__m;
  
  	  _CharT __buf[3];
  	  return __format::__write(std::move(__out), _S_str_d2(__buf, __i));
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_M(chrono::minutes __m, _OutIter __out) const
  	{
  	  // %M  The minute as a decimal number.
  	  // %OM Locale's alternative representation.
  
  	  auto __i = __m.count();
  	  return __format::__write(std::move(__out), _S_two_digits(__i));
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_p(chrono::hours __h, _OutIter __out, _FormatContext& __ctx) const
  	{
  	  // %p The locale's equivalent of the AM/PM designations.
! 	  auto __hi =  __h.count();
  	  if (__hi >= 24) [[unlikely]]
  	    __hi %= 24;
  
*************** namespace __format
*** 1335,1489 ****
  	  return _M_write(std::move(__out), __loc, __ampm[__hi >= 12]);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_q(const _Tp&, typename _FormatContext::iterator __out,
! 	     _FormatContext&) const
  	{
  	  // %q The duration's unit suffix
! 	  if constexpr (!chrono::__is_duration_v<_Tp>)
! 	    __throw_format_error("format error: argument is not a duration");
! 	  else
! 	    {
! 	      namespace __d = chrono::__detail;
! 	      using period = typename _Tp::period;
! 	      return __d::__fmt_units_suffix<period, _CharT>(std::move(__out));
! 	    }
  	}
  
!       // %Q handled in _M_format
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_R_T(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx, bool __secs) const
  	{
! 	  // %R Equivalent to %H:%M
! 	  // %T Equivalent to %H:%M:%S
! 	  auto __hms = _S_hms(__t);
! 	  auto __hi = __hms.hours().count();
  
!    	  _CharT __buf[6];
  	  __buf[2] = _S_colon;
  	  __buf[5] = _S_colon;
! 	  __string_view __sv(__buf, 5 + __secs);
  
  	  if (__hi >= 100) [[unlikely]]
  	    {
! 	      __out = std::format_to(std::move(__out), _S_empty_spec, __hi);
  	      __sv.remove_prefix(2);
  	    }
  	  else
  	    _S_fill_two_digits(__buf, __hi);
  
! 	  _S_fill_two_digits(__buf + 3, __hms.minutes().count());
! 	  __out = __format::__write(std::move(__out), __sv);
  	  if (__secs)
! 	    __out = _M_S(__hms, std::move(__out), __ctx);
! 	  return __out;
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_S(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx, bool __mod = false) const
  	{
  	  // %S  Seconds as a decimal number.
  	  // %OS The locale's alternative representation.
! 	  auto __hms = _S_hms(__t);
! 	  auto __s = __hms.seconds();
  
! 	  if (__mod) [[unlikely]] // %OS
! 	    {
! 	      if (_M_spec._M_localized)
! 		if (auto __loc = __ctx.locale(); __loc != locale::classic())
! 		  {
! 		    struct tm __tm{};
! 		    __tm.tm_sec = (int)__s.count();
! 		    return _M_locale_fmt(std::move(__out), __loc, __tm,
! 					 'S', 'O');
! 		  }
  
! 	      // %OS formats don't include subseconds, so just format that:
! 	      return __format::__write(std::move(__out),
! 				       _S_two_digits(__s.count()));
  	    }
  
! 	  if constexpr (__hms.fractional_width == 0)
! 	    __out = __format::__write(std::move(__out),
! 				      _S_two_digits(__s.count()));
! 	  else
  	    {
! 	      locale __loc = _M_locale(__ctx);
! 	      auto __ss = __hms.subseconds();
! 	      using rep = typename decltype(__ss)::rep;
! 	      if constexpr (is_floating_point_v<rep>)
! 		{
! 		  chrono::duration<rep> __fs = __s + __ss;
! 		  __out = std::format_to(std::move(__out), __loc,
! 					 _GLIBCXX_WIDEN("{:#0{}.{}Lf}"),
! 					 __fs.count(),
! 					 3 + __hms.fractional_width,
! 					 __hms.fractional_width);
! 		}
  	      else
! 		{
! 		  const auto& __np
! 		    = use_facet<numpunct<_CharT>>(__loc);
! 		  __out = __format::__write(std::move(__out),
! 					    _S_two_digits(__s.count()));
! 		  *__out++ = __np.decimal_point();
! 		  if constexpr (is_integral_v<rep>)
! 		    __out = std::format_to(std::move(__out),
! 					   _GLIBCXX_WIDEN("{:0{}}"),
! 					   __ss.count(),
! 					   __hms.fractional_width);
! 		  else
! 		    {
! 		      auto __str = std::format(_S_empty_spec, __ss.count());
! 		      __out = std::format_to(std::move(__out),
! 					     _GLIBCXX_WIDEN("{:0>{}s}"),
! 					     __str,
! 					     __hms.fractional_width);
! 		    }
! 		}
  	    }
! 	  return __out;
  	}
  
        // %t handled in _M_format
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_u_w(const _Tp& __t, typename _FormatContext::iterator __out,
! 	       _FormatContext& __ctx, _CharT __conv, bool __mod = false) const
  	{
  	  // %u  ISO weekday as a decimal number (1-7), where Monday is 1.
  	  // %Ou Locale's alternative numeric rep.
  	  // %w  Weekday as a decimal number (0-6), where Sunday is 0.
  	  // %Ow Locale's alternative numeric rep.
- 
- 	  chrono::weekday __wd = _S_weekday(__t);
- 
- 	  if (__mod && _M_spec._M_localized) [[unlikely]]
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		struct tm __tm{};
- 		__tm.tm_wday = __wd.c_encoding();
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     (char)__conv, 'O');
- 	      }
- 
  	  unsigned __wdi = __conv == 'u' ? __wd.iso_encoding()
  					 : __wd.c_encoding();
  	  _CharT __buf[3];
  	  return __format::__write(std::move(__out), _S_str_d1(__buf, __wdi));
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_U_V_W(const _Tp& __t, typename _FormatContext::iterator __out,
! 		 _FormatContext& __ctx, _CharT __conv, bool __mod = false) const
  	{
  	  // %U  Week number of the year as a decimal number, from first Sunday.
  	  // %OU Locale's alternative numeric rep.
--- 1474,1658 ----
  	  return _M_write(std::move(__out), __loc, __ampm[__hi >= 12]);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_q(__string_view __us, _OutIter __out) const
  	{
  	  // %q The duration's unit suffix
! 	  return __format::__write(std::move(__out), __us);
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_Q(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	     _FormatContext&) const
! 	{
! 	  // %Q The duration's numeric value.
! 	  return std::vformat_to(std::move(__out), _S_empty_spec, __t._M_ereps);
! 	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_r(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	     _FormatContext& __ctx) const
  	{
! 	  // %r Locale's 12-hour clock time, for C-locale: %I:%M:%S %p
! 	  auto __hi = __t._M_hours.count() % 12;
! 	  if (__hi == 0)
! 	    __hi = 12;
  
! 	  _CharT __buf[9];
  	  __buf[2] = _S_colon;
  	  __buf[5] = _S_colon;
! 	  __buf[8] = _S_space;
! 	  _S_fill_two_digits(__buf, __hi);
! 	  _S_fill_two_digits(__buf + 3, __t._M_minutes.count());
! 	  _S_fill_two_digits(__buf + 6, __t._M_seconds.count());
! 
! 	  __string_view __sv(__buf, 9);
! 	  __out = __format::__write(std::move(__out), __sv);
! 	  return _M_p(__t._M_hours, std::move(__out), __ctx);
! 	}
! 
!       template<typename _OutIter>
! 	_OutIter
! 	_M_R_X(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	       bool __secs) const
! 	{
! 	  // %R  Equivalent to %H:%M
! 	  // %X  Locale's time rep, for C-locale: %H:%M:%S (without subseconds)
! 	  // %EX Locale's alternative time representation, for C-locale same as above
! 
! 	  auto __hi = __t._M_hours.count();
! 
! 	  _CharT __buf[8];
! 	  __buf[2] = _S_colon;
! 	  __buf[5] = _S_colon;
! 	  __string_view __sv(__buf, 8);
  
  	  if (__hi >= 100) [[unlikely]]
  	    {
! 	      __out = std::format_to(std::move(__out), _S_empty_fs(), __hi);
  	      __sv.remove_prefix(2);
  	    }
  	  else
  	    _S_fill_two_digits(__buf, __hi);
  
! 	  _S_fill_two_digits(__buf + 3, __t._M_minutes.count());
  	  if (__secs)
! 	    _S_fill_two_digits(__buf + 6, __t._M_seconds.count());
! 	  else
! 	    __sv.remove_suffix(3);
! 
! 	  return __format::__write(std::move(__out), __sv);
  	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_S(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	     _FormatContext& __ctx, bool __subs = true) const
  	{
  	  // %S  Seconds as a decimal number.
  	  // %OS The locale's alternative representation.
! 	  auto __s = __t._M_seconds;
  
! 	  __out = __format::__write(std::move(__out),
! 				    _S_two_digits(__s.count()));
! 	  if (__subs)
! 	    __out = _M_subsecs(__t, std::move(__out), __ctx);
! 	  return __out;
! 	}
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_subsecs(const _ChronoData<_CharT>& __t, _OutIter __out,
! 		   _FormatContext& __ctx) const
! 	{
! 	  unsigned __prec = _M_spec._M_prec_kind != _WP_none
! 			  ? _M_spec._M_get_precision(__ctx)
! 			  : _M_spec._M_prec;
! 	  if (__prec == 0)
! 	    return __out;
! 
! 	  _CharT __dot = _S_dot;
! 	  if (_M_spec._M_localized)
! 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
! 	    {
! 	      const auto& __np = use_facet<numpunct<_CharT>>(__loc);
! 	      __dot = __np.decimal_point();
  	    }
+ 	  *__out = __dot;
+ 	  ++__out;
  
! 	  if (_M_spec._M_floating_point_rep)
  	    {
! 	      _Str_sink<_CharT> __sink;
! 	      if (_M_spec._M_localized && _M_spec._M_custom_rep)
! 		 std::vformat_to(__sink.out(), _M_locale(__ctx),
! 				 _GLIBCXX_WIDEN("{1:0.{2}Lf}"), __t._M_ereps);
  	      else
! 		 std::vformat_to(__sink.out(),
! 				 _GLIBCXX_WIDEN("{1:0.{2}f}"), __t._M_ereps);
! 
! 	      auto __sv = __sink.view();
! 	      // Skip leading zero and dot
! 	      __sv.remove_prefix(2);
! 	      return __format::__write(std::move(__out), __sv);
  	    }
! 
! 	  constexpr unsigned __max_prec = _ChronoData<_CharT>::_S_max_prec;
! 	  constexpr typename _ChronoData<_CharT>::_Attoseconds::rep __pow10t[]
! 	  {
! 	    1u,
! 	    10u,                     100u,                     1000u,
! 	    10'000u,                 100'000u,                 1000'000u,
! 	    10'000'000u,             100'000'000u,             1000'000'000u,
! 	    10'000'000'000u,         100'000'000'000u,         1000'000'000'000u,
! 	    10'000'000'000'000u,     100'000'000'000'000u,     1000'000'000'000'000u,
! 	    10'000'000'000'000'000u, 100'000'000'000'000'000u, 1000'000'000'000'000'000u,
! 	  };
! 
! 	  auto __subs = __t._M_subseconds.count();
! 	  if (__prec < __max_prec)
! 	    __subs /= __pow10t[__max_prec - __prec];
! 	  else if (__prec > __max_prec)
! 	    __prec = __max_prec;
! 
! 	  using _FmtStr = _Runtime_format_string<_CharT>;
! 	  return std::format_to(__out, _FmtStr(_GLIBCXX_WIDEN("{0:0{1}}")),
! 				__subs, __prec);
  	}
  
        // %t handled in _M_format
  
!       template<typename _OutIter, typename _FormatContext>
! 	_OutIter
! 	_M_T(const _ChronoData<_CharT>& __t, _OutIter __out,
! 	     _FormatContext& __ctx) const
! 	{
! 	  // %T Equivalent to %H:%M:%S, with subseconds
! 	  __out = _M_R_X(__t, std::move(__out), true);
! 	  return _M_subsecs(__t, std::move(__out), __ctx);
! 	}
! 
!       template<typename _OutIter>
! 	_OutIter
! 	_M_u_w(chrono::weekday __wd, _OutIter __out, _CharT __conv) const
  	{
  	  // %u  ISO weekday as a decimal number (1-7), where Monday is 1.
  	  // %Ou Locale's alternative numeric rep.
  	  // %w  Weekday as a decimal number (0-6), where Sunday is 0.
  	  // %Ow Locale's alternative numeric rep.
  	  unsigned __wdi = __conv == 'u' ? __wd.iso_encoding()
  					 : __wd.c_encoding();
  	  _CharT __buf[3];
  	  return __format::__write(std::move(__out), _S_str_d1(__buf, __wdi));
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_U_V_W(const _ChronoData<_CharT>& __t, _OutIter __out,
! 		 _CharT __conv) const
  	{
  	  // %U  Week number of the year as a decimal number, from first Sunday.
  	  // %OU Locale's alternative numeric rep.
*************** namespace __format
*** 1492,1618 ****
  	  // %W  Week number of the year as a decimal number, from first Monday.
  	  // %OW Locale's alternative numeric rep.
  	  using namespace chrono;
- 	  auto __d = _S_days(__t);
- 	  using _TDays = decltype(__d); // Either sys_days or local_days.
- 
- 	  if (__mod && _M_spec._M_localized) [[unlikely]]
- 	    if (auto __loc = __ctx.locale(); __loc != locale::classic())
- 	      {
- 		const year_month_day __ymd(__d);
- 		const year __y = __ymd.year();
- 		struct tm __tm{};
- 		__tm.tm_year = (int)__y - 1900;
- 		__tm.tm_yday = (__d - _TDays(__y/January/1)).count();
- 		__tm.tm_wday = weekday(__d).c_encoding();
- 		return _M_locale_fmt(std::move(__out), __loc, __tm,
- 				     (char)__conv, 'O');
- 	      }
  
! 	  _TDays __first; // First day of week 1.
  	  if (__conv == 'V') // W01 begins on Monday before first Thursday.
  	    {
  	      // Move to nearest Thursday:
! 	      __d -= (weekday(__d) - Monday) - days(3);
  	      // ISO week of __t is number of weeks since January 1 of the
  	      // same year as that nearest Thursday.
! 	      __first = _TDays(year_month_day(__d).year()/January/1);
  	    }
  	  else
  	    {
- 	      year __y;
- 	      if constexpr (requires { __t.year(); })
- 		__y = __t.year();
- 	      else
- 		__y = year_month_day(__d).year();
  	      const weekday __weekstart = __conv == 'U' ? Sunday : Monday;
! 	      __first = _TDays(__y/January/__weekstart[1]);
  	    }
  	  auto __weeks = chrono::floor<weeks>(__d - __first);
  	  __string_view __sv = _S_two_digits(__weeks.count() + 1);
  	  return __format::__write(std::move(__out), __sv);
  	}
  
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_z(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext&, bool __mod = false) const
  	{
! 	  using ::std::chrono::__detail::__utc_leap_second;
! 	  using ::std::chrono::__detail::__local_time_fmt;
! 
! 	  auto __utc = __mod ? __string_view(_GLIBCXX_WIDEN("+00:00"), 6)
! 			     : __string_view(_GLIBCXX_WIDEN("+0000"), 5);
! 
! 	  if constexpr (chrono::__is_time_point_v<_Tp>)
! 	    {
! 	      if constexpr (is_same_v<typename _Tp::clock,
! 				      chrono::system_clock>)
! 		return __format::__write(std::move(__out), __utc);
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
  	    {
! 	      if (__t._M_offset_sec)
! 		{
! 		  auto __sv = __utc;
! 		  basic_string<_CharT> __s;
! 		  if (*__t._M_offset_sec != 0s)
! 		    {
! 		      chrono:: hh_mm_ss __hms(*__t._M_offset_sec);
! 		      __s = _S_plus_minus[__hms.is_negative()];
! 		      __s += _S_two_digits(__hms.hours().count());
! 		      if (__mod)
! 			__s += _S_colon;
! 		      __s += _S_two_digits(__hms.minutes().count());
! 		      __sv = __s;
! 		    }
! 		  return __format::__write(std::move(__out), __sv);
! 		}
  	    }
- 	  else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
- 	    return __format::__write(std::move(__out), __utc);
  
! 	  __no_timezone_available();
! 	}
! 
!       template<typename _Tp, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_Z(const _Tp& __t, typename _FormatContext::iterator __out,
! 	     _FormatContext& __ctx) const
! 	{
! 	  using ::std::chrono::__detail::__utc_leap_second;
! 	  using ::std::chrono::__detail::__local_time_fmt;
  
! 	  __string_view __utc(_GLIBCXX_WIDEN("UTC"), 3);
! 	  if constexpr (chrono::__is_time_point_v<_Tp>)
! 	    {
! 	      if constexpr (is_same_v<typename _Tp::clock,
! 				      chrono::system_clock>)
! 		return __format::__write(std::move(__out), __utc);
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
! 	    {
! 	      if (__t._M_abbrev)
! 		{
! 		  string_view __sv = *__t._M_abbrev;
! 		  if constexpr (is_same_v<_CharT, char>)
! 		    return __format::__write(std::move(__out), __sv);
! 		  else
! 		    {
! 		      // TODO use resize_and_overwrite
! 		      basic_string<_CharT> __ws(__sv.size(), _CharT());
! 		      auto& __ct = use_facet<ctype<_CharT>>(_M_locale(__ctx));
! 		      __ct.widen(__sv.begin(), __sv.end(), __ws.data());
! 		      __string_view __wsv = __ws;
! 		      return __format::__write(std::move(__out), __wsv);
! 		    }
! 		}
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
! 	    return __format::__write(std::move(__out), __utc);
  
! 	  __no_timezone_available();
  	}
  
        // %% handled in _M_format
  
        // A string view of single digit character, "0".."9".
--- 1661,1716 ----
  	  // %W  Week number of the year as a decimal number, from first Monday.
  	  // %OW Locale's alternative numeric rep.
  	  using namespace chrono;
  
! 	  auto __d = __t._M_ldays;
! 	  local_days __first; // First day of week 1.
  	  if (__conv == 'V') // W01 begins on Monday before first Thursday.
  	    {
  	      // Move to nearest Thursday:
! 	      __d -= (__t._M_weekday - Monday) - days(3);
  	      // ISO week of __t is number of weeks since January 1 of the
  	      // same year as that nearest Thursday.
! 	      __first = local_days(year_month_day(__d).year()/January/1);
  	    }
  	  else
  	    {
  	      const weekday __weekstart = __conv == 'U' ? Sunday : Monday;
! 	      __first = local_days(__t._M_year/January/__weekstart[1]);
  	    }
  	  auto __weeks = chrono::floor<weeks>(__d - __first);
  	  __string_view __sv = _S_two_digits(__weeks.count() + 1);
  	  return __format::__write(std::move(__out), __sv);
  	}
  
!       template<typename _OutIter>
! 	_OutIter
! 	_M_z(chrono::seconds __ts, _OutIter __out, bool __mod = false) const
  	{
! 	  if (__ts == 0s)
  	    {
! 	      __string_view __zero
! 		= __mod ? _GLIBCXX_WIDEN("+00:00") : _GLIBCXX_WIDEN("+0000");
! 	      return __format::__write(std::move(__out), __zero);
  	    }
  
! 	  chrono::hh_mm_ss<chrono::seconds> __hms(__ts);
! 	  unsigned __mo = 3 + __mod;
  
! 	  _CharT __buf[6];
! 	  __buf[0] = _S_plus_minus[__hms.is_negative()];
! 	  __buf[3] = _S_colon;
! 	  _S_fill_two_digits(__buf + 1, __hms.hours().count());
! 	  _S_fill_two_digits(__buf + __mo, __hms.minutes().count());
  
! 	  __string_view __sv(__buf, __mo + 2);
! 	  return __format::__write(std::move(__out), __sv);
  	}
  
+       template<typename _OutIter>
+ 	_OutIter
+ 	_M_Z(__string_view __abbrev, _OutIter __out) const
+ 	{ return __format::__write(std::move(__out), __abbrev);	}
+ 
        // %% handled in _M_format
  
        // A string view of single digit character, "0".."9".
*************** namespace __format
*** 1639,1646 ****
  	};
        }
  
-       [[__gnu__::__always_inline__]]
        // Fills __buf[0] and __buf[1] with 2 digit value of __n.
        static void
        _S_fill_two_digits(_CharT* __buf, unsigned __n)
        {
--- 1737,1744 ----
  	};
        }
  
        // Fills __buf[0] and __buf[1] with 2 digit value of __n.
+       [[__gnu__::__always_inline__]]
        static void
        _S_fill_two_digits(_CharT* __buf, unsigned __n)
        {
*************** namespace __format
*** 1649,1657 ****
  	__buf[1] = __sv[1];
        }
  
-       [[__gnu__::__always_inline__]]
        // Returns decimal representation of __n.
        // Returned string_view may point to __buf.
        static basic_string_view<_CharT>
        _S_str_d1(span<_CharT, 3> __buf, unsigned __n)
        {
--- 1747,1755 ----
  	__buf[1] = __sv[1];
        }
  
        // Returns decimal representation of __n.
        // Returned string_view may point to __buf.
+       [[__gnu__::__always_inline__]]
        static basic_string_view<_CharT>
        _S_str_d1(span<_CharT, 3> __buf, unsigned __n)
        {
*************** namespace __format
*** 1660,1863 ****
  	return _S_str_d2(__buf, __n);
        }
  
-       [[__gnu__::__always_inline__]]
        // Returns decimal representation of __n, padded to 2 digits.
        // Returned string_view may point to __buf.
        static basic_string_view<_CharT>
        _S_str_d2(span<_CharT, 3> __buf, unsigned __n)
        {
  	if (__n < 100) [[likely]]
  	  return _S_two_digits(__n);
  
  	_S_fill_two_digits(__buf.data(), __n / 10);
! 	__buf[2] = _S_digit(__n % 10)[0];
  	return __string_view(__buf.data(), 3);
        }
  
!       // Accessors for the components of chrono types:
! 
!       // Returns a hh_mm_ss.
!       template<typename _Tp>
! 	static decltype(auto)
! 	_S_hms(const _Tp& __t)
  	{
! 	  using ::std::chrono::__detail::__utc_leap_second;
! 	  using ::std::chrono::__detail::__local_time_fmt;
! 
! 	  if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
! 	    return __t;
! 	  else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
! 	    return __t._M_time;
! 	  else if constexpr (chrono::__is_duration_v<_Tp>)
! 	    return chrono::hh_mm_ss<_Tp>(__t);
! 	  else if constexpr (chrono::__is_time_point_v<_Tp>)
! 	    return chrono::hh_mm_ss(__t - chrono::floor<chrono::days>(__t));
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
! 	    return _S_hms(__t._M_time);
  	  else
! 	    {
! 	      __invalid_chrono_spec();
! 	      return chrono::hh_mm_ss<chrono::seconds>();
! 	    }
! 	}
  
!       // Returns a sys_days or local_days.
!       template<typename _Tp>
! 	static auto
! 	_S_days(const _Tp& __t)
  	{
! 	  using namespace chrono;
! 	  using ::std::chrono::__detail::__utc_leap_second;
! 	  using ::std::chrono::__detail::__local_time_fmt;
  
! 	  if constexpr (__is_time_point_v<_Tp>)
! 	    return chrono::floor<days>(__t);
! 	  else if constexpr (__is_specialization_of<_Tp, __utc_leap_second>)
! 	    return __t._M_date;
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
! 	    return chrono::floor<days>(__t._M_time);
! 	  else if constexpr (is_same_v<_Tp, year_month_day>
! 			       || is_same_v<_Tp, year_month_day_last>
! 			       || is_same_v<_Tp, year_month_weekday>
! 			       || is_same_v<_Tp, year_month_weekday_last>)
! 	    return sys_days(__t);
! 	  else
  	    {
! 	      if constexpr (__is_duration_v<_Tp>)
! 		__not_valid_for_duration();
! 	      else
! 		__invalid_chrono_spec();
! 	      return chrono::sys_days();
  	    }
! 	}
  
!       // Returns a year_month_day.
!       template<typename _Tp>
! 	static chrono::year_month_day
! 	_S_date(const _Tp& __t)
! 	{
! 	  if constexpr (is_same_v<_Tp, chrono::year_month_day>)
! 	    return __t;
! 	  else
! 	    return chrono::year_month_day(_S_days(__t));
! 	}
  
!       template<typename _Tp>
! 	static chrono::day
! 	_S_day(const _Tp& __t)
  	{
! 	  using namespace chrono;
  
! 	  if constexpr (is_same_v<_Tp, day>)
! 	    return __t;
! 	  else if constexpr (requires { __t.day(); })
! 	    return __t.day();
! 	  else
! 	    return _S_date(__t).day();
  	}
  
!       template<typename _Tp>
! 	static chrono::month
! 	_S_month(const _Tp& __t)
  	{
! 	  using namespace chrono;
! 
! 	  if constexpr (is_same_v<_Tp, month>)
! 	    return __t;
! 	  else if constexpr (requires { __t.month(); })
! 	    return __t.month();
! 	  else
! 	    return _S_date(__t).month();
! 	}
  
!       template<typename _Tp>
! 	static chrono::year
! 	_S_year(const _Tp& __t)
! 	{
! 	  using namespace chrono;
  
! 	  if constexpr (is_same_v<_Tp, year>)
! 	    return __t;
! 	  else if constexpr (requires { __t.year(); })
! 	    return __t.year();
! 	  else
! 	    return _S_date(__t).year();
  	}
  
!       template<typename _Tp>
! 	static chrono::weekday
! 	_S_weekday(const _Tp& __t)
  	{
! 	  using namespace ::std::chrono;
! 	  using ::std::chrono::__detail::__local_time_fmt;
  
! 	  if constexpr (is_same_v<_Tp, weekday>)
! 	    return __t;
! 	  else if constexpr (requires { __t.weekday(); })
! 	    return __t.weekday();
! 	  else if constexpr (is_same_v<_Tp, month_weekday>)
! 	    return __t.weekday_indexed().weekday();
! 	  else if constexpr (is_same_v<_Tp, month_weekday_last>)
! 	    return __t.weekday_last().weekday();
! 	  else
! 	    return weekday(_S_days(__t));
! 	}
  
!       template<typename _Tp>
! 	static unsigned
! 	_S_weekday_index(const _Tp& __t)
! 	{
! 	  using namespace ::std::chrono;
  
! 	  if constexpr (is_same_v<_Tp, weekday_indexed>)
! 	    return __t.index();
! 	  else if constexpr (requires { __t.weekday_indexed(); })
! 	    return __t.weekday_indexed().index();
! 	  else
! 	    return ((unsigned)_S_day(__t) + 6) / 7;
! 	}
  
!       // Remove subsecond precision from a time_point.
!       template<typename _Tp>
! 	static auto
! 	_S_floor_seconds(const _Tp& __t)
! 	{
! 	  using chrono::__detail::__local_time_fmt;
! 	  if constexpr (chrono::__is_time_point_v<_Tp>
! 			  || chrono::__is_duration_v<_Tp>)
! 	    {
! 	      if constexpr (_Tp::period::den != 1)
! 		return chrono::floor<chrono::seconds>(__t);
! 	      else
! 		return __t;
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, chrono::hh_mm_ss>)
! 	    {
! 	      if constexpr (_Tp::fractional_width != 0)
! 		return chrono::floor<chrono::seconds>(__t.to_duration());
! 	      else
! 		return __t;
! 	    }
! 	  else if constexpr (__is_specialization_of<_Tp, __local_time_fmt>)
! 	    return _S_floor_seconds(__t._M_time);
! 	  else
! 	    return __t;
  	}
  
!       // Use the formatting locale's std::time_put facet to produce
!       // a locale-specific representation.
!       template<typename _Iter>
! 	_Iter
! 	_M_locale_fmt(_Iter __out, const locale& __loc, const struct tm& __tm,
! 		      char __fmt, char __mod) const
  	{
! 	  basic_ostringstream<_CharT> __os;
! 	  __os.imbue(__loc);
! 	  const auto& __tp = use_facet<time_put<_CharT>>(__loc);
! 	  __tp.put(__os, __os, _S_space, &__tm, __fmt, __mod);
! 	  if (__os)
! 	    __out = _M_write(std::move(__out), __loc, __os.view());
! 	  return __out;
  	}
      };
  
--- 1758,1961 ----
  	return _S_str_d2(__buf, __n);
        }
  
        // Returns decimal representation of __n, padded to 2 digits.
        // Returned string_view may point to __buf.
+       [[__gnu__::__always_inline__]]
        static basic_string_view<_CharT>
        _S_str_d2(span<_CharT, 3> __buf, unsigned __n)
        {
  	if (__n < 100) [[likely]]
  	  return _S_two_digits(__n);
+         return _S_str_d3(__buf, __n);
+       }
  
+       // Returns decimal representation of __n, padded to 3 digits.
+       // Returned string_view points to __buf.
+       [[__gnu__::__always_inline__]]
+       static basic_string_view<_CharT>
+       _S_str_d3(span<_CharT, 3> __buf, unsigned __n)
+       {
  	_S_fill_two_digits(__buf.data(), __n / 10);
! 	__buf[2] = _S_chars[__n % 10];
  	return __string_view(__buf.data(), 3);
        }
+     };
  
!   template<typename _CharT>
!     struct __formatter_duration : private __formatter_chrono<_CharT>
!     {
!       template<typename _Rep, typename _Period>
! 	constexpr static auto
! 	_S_subseconds(const chrono::duration<_Rep, _Period>& __d)
  	{
! 	  if constexpr (chrono::treat_as_floating_point_v<_Rep>)
! 	    return chrono::duration<_Rep>(__d);
! 	  else if constexpr (_Period::den == 1)
! 	    return chrono::seconds(0);
  	  else
! 	   {
! 	     using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
! 	     using _CRep = common_type_t<_Rep, typename _Attoseconds::rep>;
! 	     chrono::duration<_CRep, _Period> subs(__d.count());
! 	     return chrono::duration_cast<_Attoseconds>(subs);
! 	   }
!        }
  
!     public:
!       template<typename _Duration>
! 	static consteval
! 	_ChronoSpec<_CharT>
! 	_S_spec_for(_ChronoParts __parts)
  	{
! 	  using _Rep = typename _Duration::rep;
! 	  using enum _ChronoParts;
  
! 	  _ChronoSpec<_CharT> __res{};
! 	  __res._M_time_only = (__parts & _Date) == 0;
! 	  __res._M_floating_point_rep = chrono::treat_as_floating_point_v<_Rep>;
! 	  __res._M_custom_rep = !is_arithmetic_v<_Rep>;
! 	  __res._M_prec = chrono::hh_mm_ss<_Duration>::fractional_width;
! 	  if ((__parts & _TimeOfDay) != 0)
! 	     __res._M_localized = __res._M_prec > 0 || __res._M_floating_point_rep;
! 
! 	  if ((__parts & _TimeOfDay) != 0)
! 	    __res._M_needed |= _TimeOfDay;
! 	  if ((__parts & _Date) != 0)
! 	    __res._M_needed |= _YearMonthDay;
! 	  if ((__parts & _ZoneAbbrev) != 0)
! 	    __res._M_needed |= _ZoneAbbrev;
! 
! 	  switch (__parts)
  	    {
! 	    case _ZonedDateTime:
! 	      __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ftz();
! 	      break;
! 	    case _DateTime:
! 	      __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ft();
! 	      break;
! 	    case _Date:
! 	      __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_f();
! 	      break;
! 	    case _Time:
! 	      __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_t();
! 	      break;
! 	    case _None:
! 	      break;
  	    }
! 	  return __res;
! 	};
  
!       using __formatter_chrono<_CharT>::__formatter_chrono;
!       using __formatter_chrono<_CharT>::_M_locale;
!       using __formatter_chrono<_CharT>::_M_spec;
  
!       template<typename _Duration, typename _ParseContext>
! 	constexpr typename _ParseContext::iterator
! 	_M_parse(_ParseContext& __pc, _ChronoParts __parts,
! 		 const _ChronoSpec<_CharT>& __def = {})
  	{
! 	  using _Rep = typename _Duration::rep;
! 	  using enum _ChronoParts;
  
! 	  auto __res
! 	    = __formatter_chrono<_CharT>::_M_parse(__pc, __parts, __def);
! 	  // check for custom floating point durations, if digits of output
! 	  // will contain subseconds, then formatters must support specifying
! 	  // precision.
! 	  if constexpr (!is_floating_point_v<_Rep>)
! 	    if constexpr (chrono::treat_as_floating_point_v<_Rep>)
! 	      if (_M_spec._M_needs(_Subseconds|_EpochUnits)
! 		    || _M_spec._M_prec_kind != _WP_none
! 		    || _M_spec._M_prec_value > 0)
! 		{
! 		  constexpr const _CharT* __fs = _GLIBCXX_WIDEN("#02.5Lf");
! 		  basic_format_parse_context<_CharT> __npc(__fs);
! 		  formatter<_Rep, _CharT> __fmtter;
! 		  __fmtter.parse(__npc);
! 		}
! 	  return __res;
  	}
  
!       // Format duration for empty chrono-specs, e.g. "{}" (C++20 [time.format] p6).
!       template<typename _Rep, typename _Period, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_format_to_ostream(const chrono::duration<_Rep, _Period>& __d,
! 			     bool __is_neg,
! 			     _FormatContext& __fc) const
  	{
! 	   basic_ostringstream<_CharT> __os;
! 	   __os.imbue(this->_M_locale(__fc));
  
! 	   if (__is_neg) [[unlikely]]
! 	     __os << this->_S_plus_minus[1];
! 	   __os << __d;
  
! 	  auto __str = std::move(__os).str();
! 	  return __format::__write_padded_as_spec(__str, __str.size(),
! 						  __fc, _M_spec);
  	}
  
!       template<typename _Rep1, typename _Period1,
! 	       typename _Rep2, typename _Period2,
! 	       typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_format_units(_ChronoData<_CharT>& __cd,
! 			const chrono::duration<_Rep1, _Period1>& __ed,
! 			const chrono::duration<_Rep2, _Period2>& __ss,
! 			_FormatContext& __fc) const
  	{
! 	  __format::_Str_sink<_CharT> __suffix_store;
! 	  constexpr auto _S_unit_suffix
! 	    = chrono::__detail::__units_suffix<_Period1, _CharT>();
! 	  if constexpr (!_S_unit_suffix.empty())
! 	    __cd._M_unit_suffix = _S_unit_suffix;
! 	  else if (_M_spec._M_needs(_ChronoParts::_UnitSuffix))
! 	    {
! 	      chrono::__detail::
! 		__fmt_units_suffix<_Period1, _CharT>(__suffix_store.out());
! 	      __cd._M_unit_suffix = __suffix_store.view();
! 	    }
  
! 	  const auto __prec = _M_spec._M_prec_kind != _WP_none
! 			    ? _M_spec._M_get_precision(__fc)
! 			    : _M_spec._M_prec;
  
! 	  using _ErasedContext = typename _ChronoData<_CharT>::_FormatContext;
! 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
! 	  // 4118. How should duration formatters format custom rep?
! 	  auto __ereps = +__ed.count();
! 	  if (!_M_spec._M_needs(_ChronoParts::_Subseconds))
! 	  {
! 	    auto __ssreps = 0u;
! 	    auto __args_store
! 	      = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
! 	    __cd._M_ereps = __args_store;
! 	    return this->_M_format(__cd, __fc);
! 	  }
  
! 	  using _Attoseconds = _ChronoData<_CharT>::_Attoseconds;
! 	  auto __nss = _S_subseconds(__ss);
! 	  __cd._M_subseconds = chrono::duration_cast<_Attoseconds>(__nss);
  
! 	  auto __ssreps = __nss.count();
! 	  auto __args_store
! 	    = std::make_format_args<_ErasedContext>(__ereps, __ssreps, __prec);
! 	  __cd._M_ereps = __args_store;
! 
! 	  return this->_M_format(__cd, __fc);
  	}
  
!       // pre: __cd._M_lseconds and __cd._M_eseconds are set.
!       template<typename _Rep1, typename _Period1, typename _FormatContext>
! 	typename _FormatContext::iterator
! 	_M_format_time_point(_ChronoData<_CharT>& __cd,
! 			     const chrono::duration<_Rep1, _Period1>& __ed,
! 			     _FormatContext& __fc) const
  	{
! 	  auto __parts = _M_spec._M_needed - _ChronoParts::_TotalSeconds;
! 	  if ((__parts & _ChronoParts::_DateTime) != 0)
! 	    __cd._M_fill_date_time(__cd._M_lseconds, __parts);
! 	  return _M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
  	}
      };
  
*************** namespace __format
*** 1877,1883 ****
  	  // n.b. only acceptable chrono-spec for info is one containing
  	  // only whitespaces and %%, that do not depend on formatted object.
  	  if (!_M_f._M_spec._M_chrono_specs.empty()) [[unlikely]]
! 	    return _M_f._M_format(chrono::day(1), __fc);
  
  	  const size_t __padwidth = _M_f._M_spec._M_get_width(__fc);
  	  if (__padwidth == 0)
--- 1975,1981 ----
  	  // n.b. only acceptable chrono-spec for info is one containing
  	  // only whitespaces and %%, that do not depend on formatted object.
  	  if (!_M_f._M_spec._M_chrono_specs.empty()) [[unlikely]]
! 	    return _M_f._M_format(_ChronoData<_CharT>{}, __fc);
  
  	  const size_t __padwidth = _M_f._M_spec._M_get_width(__fc);
  	  if (__padwidth == 0)
*************** namespace __format
*** 1949,1960 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using namespace __format;
! 	auto __it = _M_f._M_parse(__pc, _Duration|_TimeOfDay, __defSpec);
! 	if constexpr (!is_floating_point_v<_Rep>)
! 	  if (_M_f._M_spec._M_prec_kind != __format::_WP_none)
! 	    __throw_format_error("format error: invalid precision for duration");
! 	return __it;
        }
  
        template<typename _Out>
--- 2047,2054 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _EpochTime, __defSpec);
        }
  
        template<typename _Out>
*************** namespace __format
*** 1981,1992 ****
  	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_localized = !is_integral_v<_Rep>;
  	  if constexpr (is_integral_v<_Rep>)
! 	    __res._M_chrono_specs = _GLIBCXX_WIDEN("%Q%q");
  	  return __res;
  	}();
  
--- 2075,2094 ----
  	}
  
      private:
+       using _Duration = chrono::duration<_Rep, _Period>;
+ 
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  using enum __format::_ChronoParts;
! 	  auto __res = __format::__formatter_duration<_CharT>::
! 			 template _S_spec_for<_Duration>(_None);
  	  __res._M_localized = !is_integral_v<_Rep>;
+ 	  // n.b. for integral format output is the same as ostream output
  	  if constexpr (is_integral_v<_Rep>)
! 	    {
! 	      __res._M_needed = _EpochUnits|_UnitSuffix;
! 	      __res._M_chrono_specs = _GLIBCXX_WIDEN("%Q%q");
! 	    }
  	  return __res;
  	}();
  
*************** namespace __format
*** 1996,2008 ****
  		  bool __is_neg,
  		  basic_format_context<_Out, _CharT>& __fc) const
  	{
  	  if constexpr (!is_integral_v<_Rep>)
  	    if (_M_f._M_spec._M_chrono_specs.empty())
  	      return _M_f._M_format_to_ostream(__d, __is_neg, __fc);
! 	  return _M_f._M_format(__d, __fc, __is_neg);
  	}
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<__format::__char _CharT>
--- 2098,2119 ----
  		  bool __is_neg,
  		  basic_format_context<_Out, _CharT>& __fc) const
  	{
+ 	  using namespace chrono;
+ 	  using enum __format::_ChronoParts;
  	  if constexpr (!is_integral_v<_Rep>)
  	    if (_M_f._M_spec._M_chrono_specs.empty())
  	      return _M_f._M_format_to_ostream(__d, __is_neg, __fc);
! 
! 	  __format::_ChronoData<_CharT> __cd;
! 	  __cd._M_is_neg = __is_neg;
! 	  auto __ts = chrono::floor<chrono::seconds>(__d);
! 	  __cd._M_eseconds = __ts;
! 	  if (_M_f._M_spec._M_needs(_HoursMinutesSeconds))
! 	    __cd._M_fill_time(__ts);
! 	  return _M_f._M_format_units(__cd, __d, __d - __ts, __fc);
  	}
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<__format::__char _CharT>
*************** namespace __format
*** 2010,2029 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Day, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_d();
  	  return __res;
  	}();
  
--- 2121,2151 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Day|_WeekdayIndex, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_day(__t, __defSpec._M_needed);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_needed = _Day;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_d();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2035,2056 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Month, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_m();
  	  return __res;
  	}();
  
--- 2157,2189 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Month, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_month = __t;
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Month;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_m();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2062,2081 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Year, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_y();
  	  return __res;
  	}();
  
--- 2195,2225 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Year, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_year = __t;
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_needed = _Year;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_y();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2087,2108 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Weekday, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_w();
  	  return __res;
  	}();
  
--- 2231,2263 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Weekday, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_weekday = __t;
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Weekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_w();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2114,2135 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Weekday, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday_indexed& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_wi();
  	  return __res;
  	}();
  
--- 2269,2301 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _IndexedWeekday, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday_indexed& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_weekday(__t, __defSpec._M_needed);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _IndexedWeekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wi();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2141,2162 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Weekday, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_wl();
  	  return __res;
  	}();
  
--- 2307,2339 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Weekday, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_weekday = __t.weekday();
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Weekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_wl();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2169,2192 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	return _M_f._M_parse(__pc, __format::_Month|__format::_Day,
! 			     __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_md();
  	  return __res;
  	}();
  
--- 2346,2378 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Month|_Day|_WeekdayIndex, __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_month = __t.month();
! 	  __cd._M_fill_day(__t.day(), __defSpec._M_needed);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Month|_Day;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_md();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2199,2222 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	return _M_f._M_parse(__pc, __format::_Month|__format::_Day,
! 			     __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_day_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ml();
  	  return __res;
  	}();
  
--- 2385,2416 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Month, __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_day_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_month = __t.month();
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Month;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ml();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2229,2252 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday,
! 			     __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_mwi();
  	  return __res;
  	}();
  
--- 2423,2455 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Month|_IndexedWeekday, __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_month = __t.month();
! 	  __cd._M_fill_weekday(__t.weekday_indexed(), __defSpec._M_needed);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Month|_IndexedWeekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwi();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2259,2282 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	return _M_f._M_parse(__pc, __format::_Month|__format::_Weekday,
! 			     __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_mwl();
  	  return __res;
  	}();
  
--- 2462,2494 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Month|_Weekday, __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::month_weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_month = __t.month();
! 	  __cd._M_weekday = __t.weekday_last().weekday();
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Month|_Weekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_mwl();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2289,2312 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	return _M_f._M_parse(__pc, __format::_Year|__format::_Month,
! 			     __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ym();
  	  return __res;
  	}();
  
--- 2501,2532 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Year|_Month, __defSpec);
        }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_year_month(__t, __defSpec._M_needed);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
         static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Year|_Month;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ym();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2318,2337 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Date, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_f();
  	  return __res;
  	}();
  
--- 2538,2575 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Date, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_day& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  auto __parts = _M_f._M_spec._M_needed;
! 	  __parts = __cd._M_fill_year_month(__t, __parts);
! 	  __parts = __cd._M_fill_day(__t.day(), __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::local_days __ld(__t);
! 	  __cd._M_fill_ldays(__ld, __parts);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
! 	  __res._M_needed = _YearMonthDay;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_f();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2343,2364 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Date, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_day_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_yml();
  	  return __res;
  	}();
  
--- 2581,2624 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Date, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_day_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  auto __parts = _M_f._M_spec._M_needed;
! 	  __parts = __cd._M_fill_year_month(__t, __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::local_days __ld(__t);
! 	  __parts = __cd._M_fill_ldays(__ld, __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::year_month_day __ymd(__ld);
! 	  __cd._M_fill_day(__ymd.day(), __parts);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Year|_Month;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_yml();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2370,2391 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Date, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ymwi();
  	  return __res;
  	}();
  
--- 2630,2675 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Date, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_weekday& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  auto __parts = _M_f._M_spec._M_needed;
! 	  __parts = __cd._M_fill_year_month(__t, __parts);
! 	  __parts = __cd._M_fill_weekday(__t.weekday_indexed(), __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::local_days __ld(__t);
! 	  __parts = __cd._M_fill_ldays(__ld, __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::year_month_day __ymd(__ld);
! 	  // n.b. weekday index is supplied by input, do not override it
! 	  __cd._M_day = __ymd.day();
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Year|_Month|_IndexedWeekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwi();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2397,2418 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_Date, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
!       	{ return _M_f._M_format(__t, __fc); }
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ymwl();
  	  return __res;
  	}();
  
--- 2681,2726 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f._M_parse(__pc, _Date, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::year_month_weekday_last& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  auto __parts = _M_f._M_spec._M_needed;
! 	  __parts = __cd._M_fill_year_month(__t, __parts);
! 	  __cd._M_weekday = __t.weekday_last().weekday();
! 	  __parts -= __format::_ChronoParts::_Weekday;
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::local_days __ld(__t);
! 	  __parts = __cd._M_fill_ldays(__ld, __parts);
! 	  if (__parts == 0)
! 	    return _M_f._M_format(__cd, __fc);
! 
! 	  chrono::year_month_day __ymd(__ld);
! 	  __cd._M_fill_day(__ymd.day(), __parts);
! 	  return _M_f._M_format(__cd, __fc);
! 	}
  
      private:
  	static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
+ 	  using __format::_ChronoFormats;
+ 	  using enum __format::_ChronoParts;
+ 
  	  __format::_ChronoSpec<_CharT> __res{};
  	  __res._M_debug = true;
  	  __res._M_localized = true;
  	  __res._M_locale_specific = true;
! 	  __res._M_needed = _Year|_Month|_Weekday;
! 	  __res._M_chrono_specs = _ChronoFormats<_CharT>::_S_ymwl();
  	  return __res;
  	}();
  
*************** namespace __format
*** 2424,2447 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_TimeOfDay, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_t();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
  #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
--- 2732,2774 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Precision>(__pc, _Time, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  using enum __format::_ChronoParts;
! 
! 	  __format::_ChronoData<_CharT> __cd;
! 	  __cd._M_is_neg = __t.is_negative();
! 	  __cd._M_hours = __t.hours();
! 	  __cd._M_minutes = __t.minutes();
! 	  __cd._M_seconds = __t.seconds();
! 
! 	  _Precision __d(0);
! 	  // n.b. computing total duration or total seconds may overflow,
! 	  // do not compute them if not requested.
! 	  if (_M_f._M_spec._M_needs(_EpochUnits))
! 	    __d = __t.to_duration();
! 	  if (_M_f._M_spec._M_needs(_TotalSeconds))
! 	    __cd._M_eseconds
! 	      = __cd._M_hours + __cd._M_minutes + __cd._M_seconds;
! 	  return _M_f._M_format_units(__cd, __d, __t.subseconds(), __fc);
! 	}
  
      private:
!       using _Precision
! 	= typename chrono::hh_mm_ss<chrono::duration<_Rep, _Period>>::precision;
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	   template _S_spec_for<_Precision>(__format::_ChronoParts::_Time);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
  #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
*************** namespace __format
*** 2486,2492 ****
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	auto __next = _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec);
  	if constexpr (!__stream_insertable)
  	  if (_M_f._M_spec._M_chrono_specs.empty())
  	    __format::__invalid_chrono_spec(); // chrono-specs can't be empty
--- 2813,2821 ----
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
        {
! 	using enum __format::_ChronoParts;
! 	auto __next
! 	  = _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
  	if constexpr (!__stream_insertable)
  	  if (_M_f._M_spec._M_chrono_specs.empty())
  	    __format::__invalid_chrono_spec(); // chrono-specs can't be empty
*************** namespace __format
*** 2497,2503 ****
         typename basic_format_context<_Out, _CharT>::iterator
         format(const chrono::sys_time<_Duration>& __t,
  	      basic_format_context<_Out, _CharT>& __fc) const
!        { return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr bool __stream_insertable
--- 2826,2840 ----
         typename basic_format_context<_Out, _CharT>::iterator
         format(const chrono::sys_time<_Duration>& __t,
  	      basic_format_context<_Out, _CharT>& __fc) const
!        {
! 	 __format::_ChronoData<_CharT> __cd{};
! 	 __cd._M_fill_utc_zone();
! 
! 	 _Duration __ed = __t.time_since_epoch();
! 	 __cd._M_eseconds = chrono::floor<chrono::seconds>(__ed);
! 	 __cd._M_lseconds = chrono::local_seconds(__cd._M_eseconds);
! 	 return _M_f._M_format_time_point(__cd, __ed, __fc);
!        }
  
      private:
        static constexpr bool __stream_insertable
*************** namespace __format
*** 2506,2525 ****
  
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  __format::_ChronoSpec<_CharT> __res{};
  	  if constexpr (!__stream_insertable)
! 	    return __res;
  	  else if constexpr (is_convertible_v<_Duration, chrono::days>)
! 	    __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_f();
! 	  else
! 	    {
! 	      __res._M_localized = true;
! 	      __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	    }
! 	  return __res;
  	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
--- 2843,2859 ----
  
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  using enum __format::_ChronoParts;
! 	  __format::_ChronoParts __needed = _DateTime;
  	  if constexpr (!__stream_insertable)
! 	    __needed = _None;
  	  else if constexpr (is_convertible_v<_Duration, chrono::days>)
! 	    __needed = _Date;
! 	  return __format::__formatter_duration<_CharT>::
! 		   template _S_spec_for<_Duration>(__needed);
  	}();
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2528,2567 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::utc_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
  	  // Adjust by removing leap seconds to get equivalent sys_time.
  	  // We can't just use clock_cast because we want to know if the time
  	  // falls within a leap second insertion, and format seconds as "60".
- 	  using chrono::__detail::__utc_leap_second;
- 	  using chrono::seconds;
- 	  using chrono::sys_time;
- 	  using _CDur = common_type_t<_Duration, seconds>;
  	  const auto __li = chrono::get_leap_second_info(__t);
! 	  sys_time<_CDur> __s{__t.time_since_epoch() - __li.elapsed};
! 	  if (!__li.is_leap_second) [[likely]]
! 	    return _M_f._M_format(__s, __fc);
! 	  else
! 	    return _M_f._M_format(__utc_leap_second(__s), __fc);
  	}
  
      private:
!       friend formatter<chrono::__detail::__utc_leap_second<_Duration>, _CharT>;
! 
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
--- 2862,2904 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::utc_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
+ 	  using __format::_ChronoParts;
+ 	  using namespace chrono;
+ 	  __format::_ChronoData<_CharT> __cd{};
+ 	  __cd._M_fill_utc_zone();
+ 
+ 	  _Duration __ed = __t.time_since_epoch();
+ 	  __cd._M_eseconds = chrono::floor<seconds>(__ed);
  	  // Adjust by removing leap seconds to get equivalent sys_time.
  	  // We can't just use clock_cast because we want to know if the time
  	  // falls within a leap second insertion, and format seconds as "60".
  	  const auto __li = chrono::get_leap_second_info(__t);
! 	  __cd._M_lseconds = local_seconds(__cd._M_eseconds - __li.elapsed);
! 	  auto __parts = _M_f._M_spec._M_needed - _ChronoParts::_TotalSeconds;
! 	  if ((__parts & _ChronoParts::_DateTime) != 0)
! 	  {
! 	    __cd._M_fill_date_time(__cd._M_lseconds, __parts);
! 	    __cd._M_seconds += seconds(__li.is_leap_second);
! 	  }
! 	  return _M_f._M_format_units(__cd, __ed, __ed - __cd._M_eseconds, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	  template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2570,2606 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::tai_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
! 	  // Convert to __local_time_fmt with abbrev "TAI" and offset 0s.
! 	  // We use __local_time_fmt and not sys_time (as the standard implies)
! 	  // because %Z for sys_time would print "UTC" and we want "TAI" here.
  
  	  // Offset is 1970y/January/1 - 1958y/January/1
  	  constexpr chrono::days __tai_offset = chrono::days(4383);
! 	  using _CDur = common_type_t<_Duration, chrono::days>;
! 	  chrono::local_time<_CDur> __lt(__t.time_since_epoch() - __tai_offset);
! 	  const string __abbrev("TAI", 3);
! 	  const chrono::seconds __off = 0s;
! 	  const auto __lf = chrono::local_time_format(__lt, &__abbrev, &__off);
! 	  return _M_f._M_format(__lf, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
--- 2907,2940 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::tai_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
! 	  using namespace chrono;
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_zone("TAI", L"TAI");
  
+ 	  _Duration __ed = __t.time_since_epoch();
+ 	  __cd._M_eseconds = chrono::floor<seconds>(__ed);
  	  // Offset is 1970y/January/1 - 1958y/January/1
  	  constexpr chrono::days __tai_offset = chrono::days(4383);
! 	  __cd._M_lseconds = local_seconds(__cd._M_eseconds - __tai_offset);
! 	  return _M_f._M_format_time_point(__cd, __ed, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	  template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2609,2645 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::gps_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
! 	  // Convert to __local_time_fmt with abbrev "GPS" and offset 0s.
! 	  // We use __local_time_fmt and not sys_time (as the standard implies)
! 	  // because %Z for sys_time would print "UTC" and we want "GPS" here.
  
  	  // Offset is 1980y/January/Sunday[1] - 1970y/January/1
  	  constexpr chrono::days __gps_offset = chrono::days(3657);
! 	  using _CDur = common_type_t<_Duration, chrono::days>;
! 	  chrono::local_time<_CDur> __lt(__t.time_since_epoch() + __gps_offset);
! 	  const string __abbrev("GPS", 3);
! 	  const chrono::seconds __off = 0s;
! 	  const auto __lf = chrono::local_time_format(__lt, &__abbrev, &__off);
! 	  return _M_f._M_format(__lf, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
--- 2943,2976 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
  	format(const chrono::gps_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
! 	  using namespace chrono;
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_zone("GPS", L"GPS");
  
+ 	  _Duration __ed = __t.time_since_epoch();
+ 	  __cd._M_eseconds = chrono::floor<seconds>(__ed);
  	  // Offset is 1980y/January/Sunday[1] - 1970y/January/1
  	  constexpr chrono::days __gps_offset = chrono::days(3657);
! 	  __cd._M_lseconds = local_seconds(__cd._M_eseconds + __gps_offset);
! 	  return _M_f._M_format_time_point(__cd, __ed, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	  template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2647,2653 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
--- 2978,2987 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
*************** namespace __format
*** 2655,2673 ****
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
  	  using namespace chrono;
! 	  return _M_f._M_format(chrono::clock_cast<system_clock>(__t), __fc);
  	}
  
      private:
!        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
       };
  
    template<typename _Duration, __format::__char _CharT>
--- 2989,3011 ----
  	       basic_format_context<_Out, _CharT>& __fc) const
  	{
  	  using namespace chrono;
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  __cd._M_fill_utc_zone();
! 
! 	  _Duration __ed = __t.time_since_epoch();
! 	  __cd._M_eseconds = chrono::floor<seconds>(__ed);
! 	  auto __st = chrono::clock_cast<system_clock>(__t);
! 	  __cd._M_lseconds
! 	    = local_seconds(chrono::floor<seconds>(__st.time_since_epoch()));
! 	  return _M_f._M_format_time_point(__cd, __ed, __fc);
  	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	  template _S_spec_for<_Duration>(__format::_ChronoParts::_DateTime);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
       };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2675,2703 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {  return _M_f._M_parse(__pc, __format::_DateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
! 	format(const chrono::local_time<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  __format::_ChronoSpec<_CharT> __res{};
  	  if constexpr (is_convertible_v<_Duration, chrono::days>)
! 	    __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_f();
! 	  else
! 	    {
! 	      __res._M_localized = true;
! 	      __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ft();
! 	    }
! 	  return __res;
  	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
--- 3013,3047 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _DateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
! 	format(const chrono::local_time<_Duration>& __lt,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  __format::_ChronoData<_CharT> __cd{};
! 	  _Duration __ed = __lt.time_since_epoch();
! 	  __cd._M_lseconds = chrono::floor<chrono::seconds>(__lt);
! 	  __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
! 	  return _M_f._M_format_time_point(__cd, __ed, __fc);
! 	}
  
      private:
        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
  	{
! 	  using enum __format::_ChronoParts;
! 	  __format::_ChronoParts __needed = _DateTime;
  	  if constexpr (is_convertible_v<_Duration, chrono::days>)
! 	    __needed = _Date;
! 	  return __format::__formatter_duration<_CharT>::
! 		   template _S_spec_for<_Duration>(__needed);
  	}();
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
    template<typename _Duration, __format::__char _CharT>
*************** namespace __format
*** 2705,2728 ****
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       { return _M_f._M_parse(__pc, __format::_ZonedDateTime, __defSpec); }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
! 	format(const chrono::__detail::__local_time_fmt<_Duration>& __t,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{ return _M_f._M_format(__t, __fc); }
  
      private:
!        static constexpr __format::_ChronoSpec<_CharT> __defSpec = []
! 	{
! 	  __format::_ChronoSpec<_CharT> __res{};
! 	  __res._M_localized = true;
! 	  __res._M_chrono_specs = __format::_ChronoFormats<_CharT>::_S_ftz();
! 	  return __res;
! 	}();
  
!       __format::__formatter_chrono<_CharT> _M_f{__defSpec};
      };
  
  #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
--- 3049,3107 ----
      {
        constexpr typename basic_format_parse_context<_CharT>::iterator
        parse(basic_format_parse_context<_CharT>& __pc)
!       {
! 	using enum __format::_ChronoParts;
! 	return _M_f.template _M_parse<_Duration>(__pc, _ZonedDateTime, __defSpec);
!       }
  
        template<typename _Out>
  	typename basic_format_context<_Out, _CharT>::iterator
! 	format(const chrono::__detail::__local_time_fmt<_Duration>& __zt,
  	       basic_format_context<_Out, _CharT>& __fc) const
! 	{
! 	  using enum __format::_ChronoParts;
! 	  __format::_ChronoData<_CharT> __cd{};
! 
! 	  if (_M_f._M_spec._M_needs(_ZoneOffset))
! 	    {
! 	      if (!__zt._M_offset_sec)
! 		std::__throw_format_error("format error: no timezone available for %z");
! 	      __cd._M_zone_offset = *__zt._M_offset_sec;
! 	    }
! 
! 	  basic_string<_CharT> __zone_store;
! 	  if (_M_f._M_spec._M_needs(_ZoneAbbrev))
! 	    {
! 	      if (!__zt._M_abbrev)
! 		std::__throw_format_error("format error: no timezone available for %Z");
! 
! 	      __cd._M_zone_cstr = __zt._M_abbrev->data();
! 	      if constexpr (is_same_v<_CharT, char>)
! 		__cd._M_zone_abbrev = *__zt._M_abbrev;
! 	      else
! 		{
! 		  // TODO: use resize_for_override
! 		  __zone_store.resize(__zt._M_abbrev->size());
! 		  auto& __ct = use_facet<ctype<_CharT>>(_M_f._M_locale(__fc));
! 		  __ct.widen(__zt._M_abbrev->data(),
! 			     __zt._M_abbrev->data() + __zt._M_abbrev->size(),
! 			     __zone_store.data());
! 		  __cd._M_zone_abbrev = __zone_store;
! 		}
! 	    }
! 
! 	  _Duration __ed = __zt._M_time.time_since_epoch();
! 	  __cd._M_lseconds = chrono::floor<chrono::seconds>(__zt._M_time);
! 	  __cd._M_eseconds = __cd._M_lseconds.time_since_epoch();
! 	  return _M_f._M_format_time_point(__cd, __ed, __fc);
! 	}
  
      private:
!       static constexpr __format::_ChronoSpec<_CharT> __defSpec =
! 	__format::__formatter_duration<_CharT>::
! 	  template _S_spec_for<_Duration>(__format::_ChronoParts::_ZonedDateTime);
  
!       __format::__formatter_duration<_CharT> _M_f{__defSpec};
      };
  
  #if _GLIBCXX_USE_CXX11_ABI || ! _GLIBCXX_USE_DUAL_ABI
*************** namespace __format
*** 2746,2763 ****
      };
  #endif
  
-   // Partial specialization needed for %c formatting of __utc_leap_second.
-   template<typename _Duration, __format::__char _CharT>
-     struct formatter<chrono::__detail::__utc_leap_second<_Duration>, _CharT>
-     : formatter<chrono::utc_time<_Duration>, _CharT>
-     {
-       template<typename _Out>
- 	typename basic_format_context<_Out, _CharT>::iterator
- 	format(const chrono::__detail::__utc_leap_second<_Duration>& __t,
- 	       basic_format_context<_Out, _CharT>& __fc) const
- 	{ return this->_M_f._M_format(__t, __fc); }
-     };
- 
  namespace chrono
  {
  /// @addtogroup chrono
--- 3125,3130 ----
*************** namespace __detail
*** 3515,3522 ****
        if (!__offset)
  	__offset = &__off;
        using __format::_ChronoParts;
!       auto __need = _ChronoParts::_Year | _ChronoParts::_Month
! 		    | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
        __detail::_Parser_t<_Duration> __p(__need);
        if (__p(__is, __fmt, __abbrev, __offset))
  	{
--- 3882,3888 ----
        if (!__offset)
  	__offset = &__off;
        using __format::_ChronoParts;
!       auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
        __detail::_Parser_t<_Duration> __p(__need);
        if (__p(__is, __fmt, __abbrev, __offset))
  	{
*************** namespace __detail
*** 3574,3581 ****
  		minutes* __offset = nullptr)
      {
        using __format::_ChronoParts;
!       auto __need = _ChronoParts::_Year | _ChronoParts::_Month
! 		    | _ChronoParts::_Day | _ChronoParts::_TimeOfDay;
        __detail::_Parser_t<_Duration> __p(__need);
        if (__p(__is, __fmt, __abbrev, __offset))
  	{
--- 3940,3946 ----
  		minutes* __offset = nullptr)
      {
        using __format::_ChronoParts;
!       auto __need = _ChronoParts::_YearMonthDay | _ChronoParts::_TimeOfDay;
        __detail::_Parser_t<_Duration> __p(__need);
        if (__p(__is, __fmt, __abbrev, __offset))
  	{
*************** namespace __detail
*** 3828,3835 ****
  	  minutes __tz_offset = __bad_min;
  	  basic_string<_CharT, _Traits> __tz_abbr;
  
! 	  if ((_M_need & _ChronoParts::_TimeOfDay)
! 		&& (_M_need & _ChronoParts::_Year))
  	    {
  	      // For time_points assume "00:00:00" is implicitly present,
  	      // so we don't fail to parse if it's not (PR libstdc++/114240).
--- 4193,4200 ----
  	  minutes __tz_offset = __bad_min;
  	  basic_string<_CharT, _Traits> __tz_abbr;
  
! 	  if ((_M_need & _ChronoParts::_TimeOfDay) != 0
! 		&& (_M_need & _ChronoParts::_Year) != 0)
  	    {
  	      // For time_points assume "00:00:00" is implicitly present,
  	      // so we don't fail to parse if it's not (PR libstdc++/114240).
*************** namespace __detail
*** 4102,4108 ****
  			}
  		      else
  			{
! 			  if (_M_need & _ChronoParts::_TimeOfDay)
  			    __err |= ios_base::failbit;
  			  break;
  			}
--- 4467,4473 ----
  			}
  		      else
  			{
! 			  if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
  			    __err |= ios_base::failbit;
  			  break;
  			}
*************** namespace __detail
*** 4170,4176 ****
  			__min = minutes(__val);
  		      else
  			{
! 			  if (_M_need & _ChronoParts::_TimeOfDay)
  			    __err |= ios_base::failbit;
  			  break;
  			}
--- 4535,4541 ----
  			__min = minutes(__val);
  		      else
  			{
! 			  if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
  			    __err |= ios_base::failbit;
  			  break;
  			}
*************** namespace __detail
*** 4260,4266 ****
  		      auto __val = __read_unsigned(2);
  		      if (__val == -1 || __val > 23) [[unlikely]]
  			{
! 			  if (_M_need & _ChronoParts::_TimeOfDay)
  			    __err |= ios_base::failbit;
  			  break;
  			}
--- 4625,4631 ----
  		      auto __val = __read_unsigned(2);
  		      if (__val == -1 || __val > 23) [[unlikely]]
  			{
! 			  if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
  			    __err |= ios_base::failbit;
  			  break;
  			}
*************** namespace __detail
*** 4271,4277 ****
  		      __val = __read_unsigned(2);
  		      if (__val == -1 || __val > 60) [[unlikely]]
  			{
! 			  if (_M_need & _ChronoParts::_TimeOfDay)
  			    __err |= ios_base::failbit;
  			  break;
  			}
--- 4636,4642 ----
  		      __val = __read_unsigned(2);
  		      if (__val == -1 || __val > 60) [[unlikely]]
  			{
! 			  if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
  			    __err |= ios_base::failbit;
  			  break;
  			}
*************** namespace __detail
*** 4306,4312 ****
  			__s = seconds(__val);
  		      else
  			{
! 			  if (_M_need & _ChronoParts::_TimeOfDay)
  			    __err |= ios_base::failbit;
  			  break;
  			}
--- 4671,4677 ----
  			__s = seconds(__val);
  		      else
  			{
! 			  if ((_M_need & _ChronoParts::_TimeOfDay) != 0)
  			    __err |= ios_base::failbit;
  			  break;
  			}
*************** namespace __detail
*** 4780,4802 ****
  
  	      // Whether the caller wants _M_wd.
  	      // The _Weekday bit is only set for chrono::weekday.
! 	      const bool __need_wday = _M_need & _ChronoParts::_Weekday;
  
  	      // Whether the caller wants _M_sys_days and _M_time.
  	      // Only true for durations and time_points.
! 	      const bool __need_time = _M_need & _ChronoParts::_TimeOfDay;
  
  	      if (__need_wday && __wday != __bad_wday)
  		_M_wd = __wday; // Caller only wants a weekday and we have one.
! 	      else if (_M_need & _ChronoParts::_Date) // subsumes __need_wday
  		{
  		  // Whether the caller wants _M_ymd.
  		  // True for chrono::year etc., false for time_points.
  		  const bool __need_ymd = !__need_wday && !__need_time;
  
! 		  if ((_M_need & _ChronoParts::_Year && __y == __bad_y)
! 		     || (_M_need & _ChronoParts::_Month && __m == __bad_mon)
! 		     || (_M_need & _ChronoParts::_Day && __d == __bad_day))
  		    {
  		      // Missing at least one of y/m/d so calculate sys_days
  		      // from the other data we have available.
--- 5145,5167 ----
  
  	      // Whether the caller wants _M_wd.
  	      // The _Weekday bit is only set for chrono::weekday.
! 	      const bool __need_wday = (_M_need & _ChronoParts::_Weekday) != 0;
  
  	      // Whether the caller wants _M_sys_days and _M_time.
  	      // Only true for durations and time_points.
! 	      const bool __need_time = (_M_need & _ChronoParts::_TimeOfDay) != 0;
  
  	      if (__need_wday && __wday != __bad_wday)
  		_M_wd = __wday; // Caller only wants a weekday and we have one.
! 	      else if ((_M_need & _ChronoParts::_Date) != 0) // subsumes __need_wday
  		{
  		  // Whether the caller wants _M_ymd.
  		  // True for chrono::year etc., false for time_points.
  		  const bool __need_ymd = !__need_wday && !__need_time;
  
! 		  if (((_M_need & _ChronoParts::_Year) != 0 && __y == __bad_y)
! 		     || ((_M_need & _ChronoParts::_Month) != 0 && __m == __bad_mon)
! 		     || ((_M_need & _ChronoParts::_Day) != 0 && __d == __bad_day))
  		    {
  		      // Missing at least one of y/m/d so calculate sys_days
  		      // from the other data we have available.
*************** namespace __detail
*** 4873,4879 ****
  		      // but check that their values are in range.
  		      // Make unwanted fields valid so that _M_ymd.ok() is true.
  
! 		      if (_M_need & _ChronoParts::_Year)
  			{
  			  if (!__y.ok()) [[unlikely]]
  			    __err |= ios_base::failbit;
--- 5238,5244 ----
  		      // but check that their values are in range.
  		      // Make unwanted fields valid so that _M_ymd.ok() is true.
  
! 		      if ((_M_need & _ChronoParts::_Year) != 0)
  			{
  			  if (!__y.ok()) [[unlikely]]
  			    __err |= ios_base::failbit;
*************** namespace __detail
*** 4881,4887 ****
  		      else if (__y == __bad_y)
  			__y = 1972y; // Leap year so that Feb 29 is valid.
  
! 		      if (_M_need & _ChronoParts::_Month)
  			{
  			  if (!__m.ok()) [[unlikely]]
  			    __err |= ios_base::failbit;
--- 5246,5252 ----
  		      else if (__y == __bad_y)
  			__y = 1972y; // Leap year so that Feb 29 is valid.
  
! 		      if ((_M_need & _ChronoParts::_Month) != 0)
  			{
  			  if (!__m.ok()) [[unlikely]]
  			    __err |= ios_base::failbit;
*************** namespace __detail
*** 4889,4895 ****
  		      else if (__m == __bad_mon)
  			__m = January;
  
! 		      if (_M_need & _ChronoParts::_Day)
  			{
  			  if (__d < day(1) || __d > (__y/__m/last).day())
  			    __err |= ios_base::failbit;
--- 5254,5260 ----
  		      else if (__m == __bad_mon)
  			__m = January;
  
! 		      if ((_M_need & _ChronoParts::_Day) != 0)
  			{
  			  if (__d < day(1) || __d > (__y/__m/last).day())
  			    __err |= ios_base::failbit;
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/bits/max_size_type.h gcc-16-20250629/libstdc++-v3/include/bits/max_size_type.h
*** gcc-16-20250622/libstdc++-v3/include/bits/max_size_type.h	Sun Jun 22 22:33:50 2025
--- gcc-16-20250629/libstdc++-v3/include/bits/max_size_type.h	Sun Jun 29 22:34:11 2025
***************
*** 36,41 ****
--- 36,42 ----
  
  #if __cplusplus > 201703L && __cpp_lib_concepts
  #include <ext/numeric_traits.h>
+ #include <bit> // __bit_width
  #include <numbers>
  
  // This header implements unsigned and signed integer-class types (as per
*************** namespace ranges
*** 818,823 ****
--- 819,834 ----
        { return min(); }
      };
  
+   template<>
+   inline constexpr int
+   __bit_width(ranges::__detail::__max_size_type __x) noexcept
+   {
+     if (__x._M_msb)
+       return numeric_limits<ranges::__detail::__max_size_type>::digits;
+     else
+       return std::__bit_width(__x._M_val);
+   }
+ 
  _GLIBCXX_END_NAMESPACE_VERSION
  } // namespace
  
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/bits/ranges_algo.h gcc-16-20250629/libstdc++-v3/include/bits/ranges_algo.h
*** gcc-16-20250622/libstdc++-v3/include/bits/ranges_algo.h	Sun Jun 22 22:33:50 2025
--- gcc-16-20250629/libstdc++-v3/include/bits/ranges_algo.h	Sun Jun 29 22:34:11 2025
***************
*** 32,37 ****
--- 32,38 ----
  
  #if __cplusplus > 201703L
  
+ #include <bit> // __bit_width
  #if __cplusplus > 202002L
  #include <optional>
  #endif
*************** namespace ranges
*** 1838,1851 ****
        operator()(_Iter __first, _Sent __last, _Out __out,
  		 iter_difference_t<_Iter> __n, _Gen&& __g) const
        {
  	if constexpr (forward_iterator<_Iter>)
  	  {
! 	    // FIXME: Forwarding to std::sample here requires computing __lasti
! 	    // which may take linear time.
! 	    auto __lasti = ranges::next(__first, __last);
! 	    return _GLIBCXX_STD_A::
! 	      sample(std::move(__first), std::move(__lasti), std::move(__out),
! 		     __n, std::forward<_Gen>(__g));
  	  }
  	else
  	  {
--- 1839,1908 ----
        operator()(_Iter __first, _Sent __last, _Out __out,
  		 iter_difference_t<_Iter> __n, _Gen&& __g) const
        {
+ 	// FIXME: Correctly handle integer-class difference types.
  	if constexpr (forward_iterator<_Iter>)
  	  {
! 	    using _Size = iter_difference_t<_Iter>;
! 	    using __distrib_type = uniform_int_distribution<_Size>;
! 	    using __param_type = typename __distrib_type::param_type;
! 	    using _USize = __detail::__make_unsigned_like_t<_Size>;
! 	    using __uc_type
! 	      = common_type_t<typename remove_reference_t<_Gen>::result_type, _USize>;
! 
! 	    if (__first == __last)
! 	      return __out;
! 
! 	    __distrib_type __d{};
! 	    _Size __unsampled_sz = ranges::distance(__first, __last);
! 	    __n = std::min(__n, __unsampled_sz);
! 
! 	    // If possible, we use __gen_two_uniform_ints to efficiently produce
! 	    // two random numbers using a single distribution invocation:
! 
! 	    const __uc_type __urngrange = __g.max() - __g.min();
! 	    if (__urngrange / __uc_type(__unsampled_sz) >= __uc_type(__unsampled_sz))
! 	      // I.e. (__urngrange >= __unsampled_sz * __unsampled_sz) but without
! 	      // wrapping issues.
! 	      {
! 		while (__n != 0 && __unsampled_sz >= 2)
! 		  {
! 		    const pair<_Size, _Size> __p =
! 		      __gen_two_uniform_ints(__unsampled_sz, __unsampled_sz - 1, __g);
! 
! 		    --__unsampled_sz;
! 		    if (__p.first < __n)
! 		      {
! 			*__out = *__first;
! 			++__out;
! 			--__n;
! 		      }
! 
! 		    ++__first;
! 
! 		    if (__n == 0) break;
! 
! 		    --__unsampled_sz;
! 		    if (__p.second < __n)
! 		      {
! 			*__out = *__first;
! 			++__out;
! 			--__n;
! 		      }
! 
! 		    ++__first;
! 		  }
! 	      }
! 
! 	    // The loop above is otherwise equivalent to this one-at-a-time version:
! 
! 	    for (; __n != 0; ++__first)
! 	      if (__d(__g, __param_type{0, --__unsampled_sz}) < __n)
! 		{
! 		  *__out = *__first;
! 		  ++__out;
! 		  --__n;
! 		}
! 	    return __out;
  	  }
  	else
  	  {
*************** namespace ranges
*** 1866,1872 ****
  		if (__k < __n)
  		  __out[__k] = *__first;
  	      }
! 	    return __out + __sample_sz;
  	  }
        }
  
--- 1923,1929 ----
  		if (__k < __n)
  		  __out[__k] = *__first;
  	      }
! 	    return __out + iter_difference_t<_Out>(__sample_sz);
  	  }
        }
  
*************** namespace ranges
*** 1895,1903 ****
        _Iter
        operator()(_Iter __first, _Sent __last, _Gen&& __g) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::shuffle(std::move(__first), __lasti, std::forward<_Gen>(__g));
! 	return __lasti;
        }
  
      template<random_access_range _Range, typename _Gen>
--- 1952,2012 ----
        _Iter
        operator()(_Iter __first, _Sent __last, _Gen&& __g) const
        {
! 	// FIXME: Correctly handle integer-class difference types.
! 	if (__first == __last)
! 	  return __first;
! 
! 	using _DistanceType = iter_difference_t<_Iter>;
! 	using __ud_type = __detail::__make_unsigned_like_t<_DistanceType>;
! 	using __distr_type = std::uniform_int_distribution<__ud_type>;
! 	using __p_type = typename __distr_type::param_type;
! 
! 	using __uc_type
! 	  = common_type_t<typename remove_reference_t<_Gen>::result_type, __ud_type>;
! 
! 	const __uc_type __urngrange = __g.max() - __g.min();
! 	const __uc_type __urange = __uc_type(__last - __first);
! 
! 	if (__urngrange / __urange >= __urange)
! 	  // I.e. (__urngrange >= __urange * __urange) but without wrap issues.
! 	  {
! 	    _Iter __i = __first + 1;
! 
! 	    // Since we know the range isn't empty, an even number of elements
! 	    // means an uneven number of elements /to swap/, in which case we
! 	    // do the first one up front:
! 
! 	    if ((__urange % 2) == 0)
! 	      {
! 		__distr_type __d{0, 1};
! 		ranges::iter_swap(__i++, __first + __d(__g));
! 	      }
! 
! 	    // Now we know that __last - __i is even, so we do the rest in pairs,
! 	    // using a single distribution invocation to produce swap positions
! 	    // for two successive elements at a time:
! 
! 	    while (__i != __last)
! 	      {
! 		const __uc_type __swap_range = __uc_type(__i - __first) + 1;
! 
! 		const pair<__uc_type, __uc_type> __pospos =
! 		  __gen_two_uniform_ints(__swap_range, __swap_range + 1, __g);
! 
! 		ranges::iter_swap(__i++, __first + __pospos.first);
! 		ranges::iter_swap(__i++, __first + __pospos.second);
! 	      }
! 
! 	    return __i;
! 	  }
! 
! 	__distr_type __d;
! 
! 	_Iter __i = __first + 1;
! 	for (; __i != __last; ++__i)
! 	  ranges::iter_swap(__i, __first + __d(__g, __p_type(0, __i - __first)));
! 
! 	return __i;
        }
  
      template<random_access_range _Range, typename _Gen>
*************** namespace ranges
*** 1913,1918 ****
--- 2022,2049 ----
  
    inline constexpr __shuffle_fn shuffle{};
  
+   namespace __detail
+   {
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __push_heap(_Iter __first,
+ 		  iter_difference_t<_Iter> __holeIndex,
+ 		  iter_difference_t<_Iter> __topIndex,
+ 		  iter_value_t<_Iter> __value,
+ 		  _Comp __comp)
+       {
+ 	auto __parent = (__holeIndex - 1) / 2;
+ 	while (__holeIndex > __topIndex
+ 	       && __comp(*(__first + __parent), __value))
+ 	  {
+ 	    *(__first + __holeIndex) = ranges::iter_move(__first + __parent);
+ 	    __holeIndex = __parent;
+ 	    __parent = (__holeIndex - 1) / 2;
+ 	  }
+ 	*(__first + __holeIndex) = std::move(__value);
+       }
+   } // namespace __detail
+ 
    struct __push_heap_fn
    {
      template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 1922,1931 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::push_heap(__first, __lasti,
! 		       __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2053,2069 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 	    __detail::__push_heap(__first, (__last - __first) - 1,
! 				  0, ranges::iter_move(__last - 1),
! 				  __comp_proj);
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 1941,1946 ****
--- 2079,2126 ----
  
    inline constexpr __push_heap_fn push_heap{};
  
+   namespace __detail
+   {
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __adjust_heap(_Iter __first,
+ 		    iter_difference_t<_Iter> __holeIndex,
+ 		    iter_difference_t<_Iter> __len,
+ 		    iter_value_t<_Iter> __value,
+ 		    _Comp __comp)
+       {
+ 	auto __topIndex = __holeIndex;
+ 	auto __secondChild = __holeIndex;
+ 	while (__secondChild < (__len - 1) / 2)
+ 	  {
+ 	    __secondChild = 2 * (__secondChild + 1);
+ 	    if (__comp(*(__first + __secondChild),
+ 		       *(__first + (__secondChild - 1))))
+ 	      __secondChild--;
+ 	    *(__first + __holeIndex) = ranges::iter_move(__first + __secondChild);
+ 	    __holeIndex = __secondChild;
+ 	  }
+ 	if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
+ 	  {
+ 	    __secondChild = 2 * (__secondChild + 1);
+ 	    *(__first + __holeIndex) = ranges::iter_move(__first + (__secondChild - 1));
+ 	    __holeIndex = __secondChild - 1;
+ 	  }
+ 	__detail::__push_heap(__first, __holeIndex, __topIndex,
+ 			      std::move(__value), __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __pop_heap(_Iter __first, _Iter __last, _Iter __result, _Comp __comp)
+       {
+ 	iter_value_t<_Iter> __value = ranges::iter_move(__result);
+ 	*__result = ranges::iter_move(__first);
+ 	__detail::__adjust_heap(__first, 0, __last - __first,
+ 				std::move(__value), __comp);
+       }
+   } // namespace __detail
+ 
    struct __pop_heap_fn
    {
      template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 1950,1959 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::pop_heap(__first, __lasti,
! 		      __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2130,2147 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    if (__last - __first > 1)
! 	      {
! 		auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 		__detail::__pop_heap(__first, __last - 1, __last - 1, __comp_proj);
! 	      }
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 1978,1987 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::make_heap(__first, __lasti,
! 		       __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2166,2194 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    const auto __len = __last - __first;
! 	    if (__len < 2)
! 	      return __last;
! 
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 	    auto __parent = (__len - 2) / 2;
! 	    while (true)
! 	      {
! 		iter_value_t<_Iter> __value = ranges::iter_move(__first + __parent);
! 		__detail::__adjust_heap(__first, __parent, __len,
! 					std::move(__value),
! 					__comp_proj);
! 		if (__parent == 0)
! 		  break;
! 		__parent--;
! 	      }
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 2006,2015 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::sort_heap(__first, __lasti,
! 		       __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2213,2232 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 	    _Iter __ret = __last;
! 	    while (__last - __first > 1)
! 	      {
! 		--__last;
! 		__detail::__pop_heap(__first, __last, __last, __comp_proj);
! 	      }
! 	    return __ret;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 2092,2097 ****
--- 2309,2462 ----
  
    inline constexpr __is_heap_fn is_heap{};
  
+   namespace __detail
+   {
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __move_median_to_first(_Iter __result, _Iter __a, _Iter __b, _Iter __c,
+ 			     _Comp __comp)
+       {
+ 	if (__comp(*__a, *__b))
+ 	  {
+ 	    if (__comp(*__b, *__c))
+ 	      ranges::iter_swap(__result, __b);
+ 	    else if (__comp(*__a, *__c))
+ 	      ranges::iter_swap(__result, __c);
+ 	    else
+ 	      ranges::iter_swap(__result, __a);
+ 	  }
+ 	else if (__comp(*__a, *__c))
+ 	  ranges::iter_swap(__result, __a);
+ 	else if (__comp(*__b, *__c))
+ 	  ranges::iter_swap(__result, __c);
+ 	else
+ 	  ranges::iter_swap(__result, __b);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __unguarded_linear_insert(_Iter __last, _Comp __comp)
+       {
+ 	iter_value_t<_Iter> __val = ranges::iter_move(__last);
+ 	_Iter __next = __last;
+ 	--__next;
+ 	while (__comp(__val, *__next))
+ 	  {
+ 	    *__last = ranges::iter_move(__next);
+ 	    __last = __next;
+ 	    --__next;
+ 	  }
+ 	*__last = std::move(__val);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __insertion_sort(_Iter __first, _Iter __last, _Comp __comp)
+       {
+ 	if (__first == __last)
+ 	  return;
+ 
+ 	for (_Iter __i = __first + 1; __i != __last; ++__i)
+ 	  {
+ 	    if (__comp(*__i, *__first))
+ 	      {
+ 		iter_value_t<_Iter> __val = ranges::iter_move(__i);
+ 		ranges::move_backward(__first, __i, __i + 1);
+ 		*__first = std::move(__val);
+ 	      }
+ 	    else
+ 	      __detail::__unguarded_linear_insert(__i, __comp);
+ 	  }
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __unguarded_insertion_sort(_Iter __first, _Iter __last, _Comp __comp)
+       {
+ 	for (_Iter __i = __first; __i != __last; ++__i)
+ 	  __detail::__unguarded_linear_insert(__i, __comp);
+       }
+ 
+     inline constexpr int __sort_threshold = 16;
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __final_insertion_sort(_Iter __first, _Iter __last, _Comp __comp)
+       {
+ 	if (__last - __first > __sort_threshold)
+ 	  {
+ 	    __detail::__insertion_sort(__first, __first + __sort_threshold, __comp);
+ 	    __detail::__unguarded_insertion_sort(__first + __sort_threshold, __last,
+ 						 __comp);
+ 	  }
+ 	else
+ 	  __detail::__insertion_sort(__first, __last, __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr _Iter
+       __unguarded_partition(_Iter __first, _Iter __last, _Iter __pivot, _Comp __comp)
+       {
+ 	while (true)
+ 	  {
+ 	    while (__comp(*__first, *__pivot))
+ 	      ++__first;
+ 	    --__last;
+ 	    while (__comp(*__pivot, *__last))
+ 	      --__last;
+ 	    if (!(__first < __last))
+ 	      return __first;
+ 	    ranges::iter_swap(__first, __last);
+ 	    ++__first;
+ 	  }
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr _Iter
+       __unguarded_partition_pivot(_Iter __first, _Iter __last, _Comp __comp)
+       {
+ 	_Iter __mid = __first + (__last - __first) / 2;
+ 	__detail::__move_median_to_first(__first, __first + 1, __mid, __last - 1, __comp);
+ 	return __detail::__unguarded_partition(__first + 1, __last, __first, __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __heap_select(_Iter __first, _Iter __middle, _Iter __last, _Comp __comp)
+       {
+ 	ranges::make_heap(__first, __middle, __comp);
+ 	for (_Iter __i = __middle; __i < __last; ++__i)
+ 	  if (__comp(*__i, *__first))
+ 	    __detail::__pop_heap(__first, __middle, __i, __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __partial_sort(_Iter __first, _Iter __middle, _Iter __last, _Comp __comp)
+       {
+ 	__detail::__heap_select(__first, __middle, __last, __comp);
+ 	ranges::sort_heap(__first, __middle, __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __introsort_loop(_Iter __first, _Iter __last, unsigned __depth_limit, _Comp __comp)
+       {
+ 	while (__last - __first > __sort_threshold)
+ 	  {
+ 	    if (__depth_limit == 0)
+ 	      {
+ 		__detail::__partial_sort(__first, __last, __last, __comp);
+ 		return;
+ 	      }
+ 	    --__depth_limit;
+ 	    _Iter __cut = __detail::__unguarded_partition_pivot(__first, __last, __comp);
+ 	    __detail::__introsort_loop(__cut, __last, __depth_limit, __comp);
+ 	    __last = __cut;
+ 	  }
+       }
+   } // namespace __detail
+ 
    struct __sort_fn
    {
      template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 2101,2110 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	_GLIBCXX_STD_A::sort(std::move(__first), __lasti,
! 			     __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2466,2486 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    if (__first != __last)
! 	      {
! 		auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 		auto __n = __detail::__to_unsigned_like(__last - __first);
! 		unsigned __depth_limit = (std::__bit_width(__n) - 1) * 2;
! 		__detail::__introsort_loop(__first, __last, __depth_limit, __comp_proj);
! 		__detail::__final_insertion_sort(__first, __last, __comp_proj);
! 	      }
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 2120,2125 ****
--- 2496,2664 ----
  
    inline constexpr __sort_fn sort{};
  
+   namespace __detail
+   {
+     // This is a helper function for the __merge_sort_loop routines.
+     template<typename _Iter, typename _Out, typename _Comp>
+       _Out
+       __move_merge(_Iter __first1, _Iter __last1,
+ 		   _Iter __first2, _Iter __last2,
+ 		   _Out __result, _Comp __comp)
+       {
+ 	while (__first1 != __last1 && __first2 != __last2)
+ 	  {
+ 	    if (__comp(*__first2, *__first1))
+ 	      {
+ 		*__result = ranges::iter_move(__first2);
+ 		++__first2;
+ 	      }
+ 	    else
+ 	      {
+ 		*__result = ranges::iter_move(__first1);
+ 		++__first1;
+ 	      }
+ 	    ++__result;
+ 	  }
+ 	return ranges::move(__first2, __last2,
+ 			    ranges::move(__first1, __last1, __result).out).out;
+       }
+ 
+     template<typename _Iter, typename _Out, typename _Distance, typename _Comp>
+       void
+       __merge_sort_loop(_Iter __first, _Iter __last, _Out __result,
+ 			_Distance __step_size, _Comp __comp)
+       {
+ 	const _Distance __two_step = 2 * __step_size;
+ 
+ 	while (__last - __first >= __two_step)
+ 	  {
+ 	    __result = __detail::__move_merge(__first, __first + __step_size,
+ 					      __first + __step_size,
+ 					      __first + __two_step,
+ 					      __result, __comp);
+ 	    __first += __two_step;
+ 	  }
+ 	__step_size = ranges::min(_Distance(__last - __first), __step_size);
+ 
+ 	__detail::__move_merge(__first, __first + __step_size,
+ 			       __first + __step_size, __last, __result, __comp);
+       }
+ 
+     template<typename _Iter, typename _Distance, typename _Compare>
+       constexpr void
+       __chunk_insertion_sort(_Iter __first, _Iter __last,
+ 			     _Distance __chunk_size, _Compare __comp)
+       {
+ 	while (__last - __first >= __chunk_size)
+ 	  {
+ 	    __detail::__insertion_sort(__first, __first + __chunk_size, __comp);
+ 	    __first += __chunk_size;
+ 	  }
+ 	__detail::__insertion_sort(__first, __last, __comp);
+       }
+ 
+     template<typename _Iter, typename _Pointer, typename _Comp>
+       void
+       __merge_sort_with_buffer(_Iter __first, _Iter __last,
+ 			       _Pointer __buffer, _Comp __comp)
+       {
+ 	using _Distance = iter_difference_t<_Iter>;
+ 
+ 	const _Distance __len = __last - __first;
+ 	const _Pointer __buffer_last = __buffer + ptrdiff_t(__len);
+ 
+ 	constexpr int __chunk_size = 7;
+ 	_Distance __step_size = __chunk_size;
+ 	__detail::__chunk_insertion_sort(__first, __last, __step_size, __comp);
+ 
+ 	while (__step_size < __len)
+ 	  {
+ 	    __detail::__merge_sort_loop(__first, __last, __buffer,
+ 					__step_size, __comp);
+ 	    __step_size *= 2;
+ 	    __detail::__merge_sort_loop(__buffer, __buffer_last, __first,
+ 					ptrdiff_t(__step_size), __comp);
+ 	    __step_size *= 2;
+ 	  }
+       }
+ 
+     template<typename _Iter, typename _Pointer, typename _Comp>
+       void
+       __merge_adaptive(_Iter __first, _Iter __middle, _Iter __last,
+ 		       iter_difference_t<_Iter> __len1,
+ 		       iter_difference_t<_Iter> __len2,
+ 		       _Pointer __buffer, _Comp __comp); // defined near inplace_merge
+ 
+     template<typename _Iter, typename _Distance, typename _Pointer, typename _Comp>
+       void
+       __merge_adaptive_resize(_Iter __first, _Iter __middle, _Iter __last,
+ 			      _Distance __len1, _Distance __len2,
+ 			      _Pointer __buffer, _Distance __buffer_size,
+ 			      _Comp __comp); // defined near inplace_merge
+ 
+     template<typename _Iter, typename _Distance, typename _Comp>
+       constexpr void
+       __merge_without_buffer(_Iter __first, _Iter __middle, _Iter __last,
+ 			     _Distance __len1, _Distance __len2,
+ 			     _Comp __comp); // defined near inplace_merge
+ 
+     template<typename _Iter, typename _Pointer, typename _Comp>
+       void
+       __stable_sort_adaptive(_Iter __first, _Iter __middle, _Iter __last,
+ 			     _Pointer __buffer, _Comp __comp)
+       {
+ 	__detail::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);
+ 	__detail::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);
+ 
+ 	__detail::__merge_adaptive(__first, __middle, __last,
+ 				   __middle - __first, __last - __middle,
+ 				   __buffer, __comp);
+       }
+ 
+     template<typename _Iter, typename _Pointer, typename _Distance, typename _Comp>
+       void
+       __stable_sort_adaptive_resize(_Iter __first, _Iter __last,
+ 				    _Pointer __buffer, _Distance __buffer_size,
+ 				    _Comp __comp)
+       {
+ 	const _Distance __len = (__last - __first + 1) / 2;
+ 	const _Iter __middle = __first + __len;
+ 	if (__len > __buffer_size)
+ 	  {
+ 	    __detail::__stable_sort_adaptive_resize(__first, __middle, __buffer,
+ 						    __buffer_size, __comp);
+ 	    __detail::__stable_sort_adaptive_resize(__middle, __last, __buffer,
+ 						    __buffer_size, __comp);
+ 	    __detail::__merge_adaptive_resize(__first, __middle, __last,
+ 					      _Distance(__middle - __first),
+ 					      _Distance(__last - __middle),
+ 					      __buffer, __buffer_size,
+ 					      __comp);
+ 	  }
+ 	else
+ 	  __detail::__stable_sort_adaptive(__first, __middle, __last,
+ 					   __buffer, __comp);
+       }
+ 
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __inplace_stable_sort(_Iter __first, _Iter __last, _Comp __comp)
+       {
+ 	if (__last - __first < 15)
+ 	  {
+ 	    __detail::__insertion_sort(__first, __last, __comp);
+ 	    return;
+ 	  }
+ 	_Iter __middle = __first + (__last - __first) / 2;
+ 	__detail::__inplace_stable_sort(__first, __middle, __comp);
+ 	__detail::__inplace_stable_sort(__middle, __last, __comp);
+ 	__detail::__merge_without_buffer(__first, __middle, __last,
+ 					 __middle - __first,
+ 					 __last - __middle,
+ 					 __comp);
+       }
+   } // namespace __detail
+ 
    struct __stable_sort_fn
    {
      template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 2130,2139 ****
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::stable_sort(std::move(__first), __lasti,
! 			 __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2669,2714 ----
        operator()(_Iter __first, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    using _DistanceType = iter_difference_t<_Iter>;
! 
! 	    if (__first == __last)
! 	      return __last;
! 
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 
! #if _GLIBCXX_HOSTED
! # if __glibcxx_constexpr_algorithms >= 202306L // >= C++26
! 	    if consteval {
! 	      __detail::__inplace_stable_sort(__first, __last, __comp_proj);
! 	      return __last;
! 	    }
! # endif
! 
! 	    typedef _Temporary_buffer<_Iter, iter_value_t<_Iter>> _TmpBuf;
! 	    // __stable_sort_adaptive sorts the range in two halves,
! 	    // so the buffer only needs to fit half the range at once.
! 	    _TmpBuf __buf(__first, ptrdiff_t((__last - __first + 1) / 2));
! 
! 	    if (__buf._M_requested_size() == __buf.size()) [[likely]]
! 	      __detail::__stable_sort_adaptive(__first,
! 					       __first + _DistanceType(__buf.size()),
! 					       __last, __buf.begin(), __comp_proj);
! 	    else if (__buf.begin()) [[unlikely]]
! 	      __detail::__inplace_stable_sort(__first, __last, __comp_proj);
! 	    else
! 	      __detail::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),
! 						      _DistanceType(__buf.size()),
! 						      __comp_proj);
! #else
! 	    __detail::__inplace_stable_sort(__first, __last, __comp_proj);
! #endif
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 2338,2343 ****
--- 2913,2945 ----
  
    inline constexpr __is_sorted_fn is_sorted{};
  
+   namespace __detail
+   {
+     template<typename _Iter, typename _Comp>
+       constexpr void
+       __introselect(_Iter __first, _Iter __nth, _Iter __last,
+ 		    iter_difference_t<_Iter> __depth_limit, _Comp __comp)
+       {
+ 	while (__last - __first > 3)
+ 	  {
+ 	    if (__depth_limit == 0)
+ 	      {
+ 		__detail::__heap_select(__first, __nth + 1, __last, __comp);
+ 		// Place the nth largest element in its final position.
+ 		ranges::iter_swap(__first, __nth);
+ 		return;
+ 	      }
+ 	    --__depth_limit;
+ 	    _Iter __cut = __detail::__unguarded_partition_pivot(__first, __last, __comp);
+ 	    if (__cut <= __nth)
+ 	      __first = __cut;
+ 	    else
+ 	      __last = __cut;
+ 	  }
+ 	__detail::__insertion_sort(__first, __last, __comp);
+       }
+   } // namespace __detail
+ 
    struct __nth_element_fn
    {
      template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 2347,2357 ****
        operator()(_Iter __first, _Iter __nth, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	_GLIBCXX_STD_A::nth_element(std::move(__first), std::move(__nth),
! 				    __lasti,
! 				    __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<random_access_range _Range,
--- 2949,2969 ----
        operator()(_Iter __first, _Iter __nth, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, __nth, ranges::next(__first, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    if (__first == __last || __nth == __last)
! 	      return __last;
! 
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 	    auto __n = __detail::__to_unsigned_like(__last - __first);
! 	    __detail::__introselect(__first, __nth, __last,
! 				    std::__bit_width(__n) * 2,
! 				    __comp_proj);
! 	    return __last;
! 	  }
        }
  
      template<random_access_range _Range,
*************** namespace ranges
*** 2666,2671 ****
--- 3278,3357 ----
    inline constexpr __partition_fn partition{};
  
  #if _GLIBCXX_HOSTED
+   namespace __detail
+   {
+     // Like find_if_not(), but uses and updates a count of the
+     // remaining range length instead of comparing against an end
+     // iterator.
+     template<typename _Iter, typename _Pred, typename _Distance>
+       constexpr _Iter
+       __find_if_not_n(_Iter __first, _Distance& __len, _Pred __pred)
+       {
+ 	for (; __len; --__len,  (void) ++__first)
+ 	  if (!__pred(*__first))
+ 	    break;
+ 	return __first;
+       }
+ 
+     template<typename _Iter, typename _Sent, typename _Pointer,
+ 	     typename _Pred, typename _Distance>
+       constexpr subrange<_Iter>
+       __stable_partition_adaptive(_Iter __first, _Sent __last,
+ 				  _Pred __pred, _Distance __len,
+ 				  _Pointer __buffer,
+ 				  _Distance __buffer_size)
+       {
+ 	if (__len == 1)
+ 	  return {__first, ranges::next(__first, 1)};
+ 
+ 	if (__len <= __buffer_size)
+ 	  {
+ 	    _Iter __result1 = __first;
+ 	    _Pointer __result2 = __buffer;
+ 
+ 	    // The precondition guarantees that !__pred(__first), so
+ 	    // move that element to the buffer before starting the loop.
+ 	    // This ensures that we only call __pred once per element.
+ 	    *__result2 = ranges::iter_move(__first);
+ 	    ++__result2;
+ 	    ++__first;
+ 	    for (; __first != __last; ++__first)
+ 	      if (__pred(*__first))
+ 		{
+ 		  *__result1 = ranges::iter_move(__first);
+ 		  ++__result1;
+ 		}
+ 	      else
+ 		{
+ 		  *__result2 = ranges::iter_move(__first);
+ 		  ++__result2;
+ 		}
+ 
+ 	    ranges::move(__buffer, __result2, __result1);
+ 	    return {__result1, __first};
+ 	  }
+ 
+ 	_Iter __middle = __first;
+ 	ranges::advance(__middle, __len / 2);
+ 	_Iter __left_split
+ 	  = __detail::__stable_partition_adaptive(__first, __middle, __pred,
+ 						  __len / 2, __buffer,
+ 						  __buffer_size).begin();
+ 
+ 	// Advance past true-predicate values to satisfy this
+ 	// function's preconditions.
+ 	_Distance __right_len = __len - __len / 2;
+ 	_Iter __right_split = __detail::__find_if_not_n(__middle, __right_len, __pred);
+ 
+ 	if (__right_len)
+ 	  __right_split
+ 	    = __detail::__stable_partition_adaptive(__right_split, __last, __pred,
+ 						    __right_len, __buffer, __buffer_size).begin();
+ 
+ 	return ranges::rotate(__left_split, __middle, __right_split);
+       }
+   } // namespace __detail
+ 
    struct __stable_partition_fn
    {
      template<bidirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 2677,2687 ****
        operator()(_Iter __first, _Sent __last,
  		 _Pred __pred, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	auto __middle
! 	  = std::stable_partition(std::move(__first), __lasti,
! 				  __detail::__make_pred_proj(__pred, __proj));
! 	return {std::move(__middle), std::move(__lasti)};
        }
  
      template<bidirectional_range _Range, typename _Proj = identity,
--- 3363,3395 ----
        operator()(_Iter __first, _Sent __last,
  		 _Pred __pred, _Proj __proj = {}) const
        {
! 	__first = ranges::find_if_not(__first, __last, __pred, __proj);
! 
! 	if (__first == __last)
! 	  return {__first, __first};
! 
! 	using _DistanceType = iter_difference_t<_Iter>;
! 	const _DistanceType __len = ranges::distance(__first, __last);
! 
! 	auto __pred_proj = __detail::__make_pred_proj(__pred, __proj);
! 
! #if __glibcxx_constexpr_algorithms >= 202306L // >= C++26
! 	if consteval {
! 	  // Simulate a _Temporary_buffer of length 1:
! 	  iter_value_t<_Iter> __buf = ranges::iter_move(__first);
! 	  *__first = std::move(__buf);
! 	  return __detail::__stable_partition_adaptive(__first, __last,
! 						       __pred_proj,
! 						       __len, &__buf,
! 						       _DistanceType(1));
! 	}
! #endif
! 
! 	_Temporary_buffer<_Iter, iter_value_t<_Iter>> __buf(__first, ptrdiff_t(__len));
! 	return __detail::__stable_partition_adaptive(__first, __last,
! 						     __pred_proj,
! 						     __len, __buf.begin(),
! 						     _DistanceType(__buf.size()));
        }
  
      template<bidirectional_range _Range, typename _Proj = identity,
*************** namespace ranges
*** 2877,2882 ****
--- 3585,3799 ----
  
    inline constexpr __merge_fn merge{};
  
+   namespace __detail
+   {
+     template<typename _Iter1, typename _Iter2, typename _Out, typename _Comp>
+       void
+       __move_merge_adaptive(_Iter1 __first1, _Iter1 __last1,
+ 			    _Iter2 __first2, _Iter2 __last2,
+ 			    _Out __result, _Comp __comp)
+       {
+ 	while (__first1 != __last1 && __first2 != __last2)
+ 	  {
+ 	    if (__comp(*__first2, *__first1))
+ 	      {
+ 		*__result = ranges::iter_move(__first2);
+ 		++__first2;
+ 	      }
+ 	    else
+ 	      {
+ 		*__result = ranges::iter_move(__first1);
+ 		++__first1;
+ 	      }
+ 	    ++__result;
+ 	  }
+ 	if (__first1 != __last1)
+ 	  ranges::move(__first1, __last1, __result);
+       }
+ 
+     template<typename _Iter1, typename _Iter2, typename _Iter3, typename _Comp>
+       void
+       __move_merge_adaptive_backward(_Iter1 __first1, _Iter1 __last1,
+ 				     _Iter2 __first2, _Iter2 __last2,
+ 				     _Iter3 __result, _Comp __comp)
+       {
+ 	if (__first1 == __last1)
+ 	  {
+ 	    ranges::move_backward(__first2, __last2, __result);
+ 	    return;
+ 	  }
+ 	else if (__first2 == __last2)
+ 	  return;
+ 
+ 	--__last1;
+ 	--__last2;
+ 	while (true)
+ 	  {
+ 	    if (__comp(*__last2, *__last1))
+ 	      {
+ 		*--__result = ranges::iter_move(__last1);
+ 		if (__first1 == __last1)
+ 		  {
+ 		    ranges::move_backward(__first2, ++__last2, __result);
+ 		    return;
+ 		  }
+ 		--__last1;
+ 	      }
+ 	    else
+ 	      {
+ 		*--__result = ranges::iter_move(__last2);
+ 		if (__first2 == __last2)
+ 		  return;
+ 		--__last2;
+ 	      }
+ 	  }
+       }
+ 
+     template<typename _Iter1, typename _Iter2>
+       _Iter1
+       __rotate_adaptive(_Iter1 __first, _Iter1 __middle, _Iter1 __last,
+ 			iter_difference_t<_Iter1> __len1,
+ 			iter_difference_t<_Iter1> __len2,
+ 			_Iter2 __buffer,
+ 			iter_difference_t<_Iter1> __buffer_size)
+       {
+ 	_Iter2 __buffer_end;
+ 	if (__len1 > __len2 && __len2 <= __buffer_size)
+ 	  {
+ 	    if (__len2)
+ 	      {
+ 		__buffer_end = ranges::move(__middle, __last, __buffer).out;
+ 		ranges::move_backward(__first, __middle, __last);
+ 		return ranges::move(__buffer, __buffer_end, __first).out;
+ 	      }
+ 	    else
+ 	      return __first;
+ 	  }
+ 	else if (__len1 <= __buffer_size)
+ 	  {
+ 	    if (__len1)
+ 	      {
+ 		__buffer_end = ranges::move(__first, __middle, __buffer).out;
+ 		ranges::move(__middle, __last, __first);
+ 		return ranges::move_backward(__buffer, __buffer_end, __last).out;
+ 	      }
+ 	    else
+ 	      return __last;
+ 	  }
+ 	else
+ 	  return ranges::rotate(__first, __middle, __last).begin();
+       }
+ 
+     template<typename _Iter, typename _Pointer, typename _Comp>
+       void
+       __merge_adaptive(_Iter __first, _Iter __middle, _Iter __last,
+ 		       iter_difference_t<_Iter> __len1,
+ 		       iter_difference_t<_Iter> __len2,
+ 		       _Pointer __buffer, _Comp __comp)
+       {
+ 	if (__len1 <= __len2)
+ 	  {
+ 	    _Pointer __buffer_end = ranges::move(__first, __middle, __buffer).out;
+ 	    __detail::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,
+ 					    __first, __comp);
+ 	  }
+ 	else
+ 	  {
+ 	    _Pointer __buffer_end = ranges::move(__middle, __last, __buffer).out;
+ 	    __detail::__move_merge_adaptive_backward(__first, __middle, __buffer,
+ 						     __buffer_end, __last, __comp);
+ 	  }
+       }
+ 
+     template<typename _Iter, typename _Distance, typename _Pointer, typename _Comp>
+       void
+       __merge_adaptive_resize(_Iter __first, _Iter __middle, _Iter __last,
+ 			      _Distance __len1, _Distance __len2,
+ 			      _Pointer __buffer, _Distance __buffer_size,
+ 			      _Comp __comp)
+       {
+ 	if (__len1 <= __buffer_size || __len2 <= __buffer_size)
+ 	  __detail::__merge_adaptive(__first, __middle, __last,
+ 				     __len1, __len2, __buffer, __comp);
+ 	else
+ 	  {
+ 	    _Iter __first_cut = __first;
+ 	    _Iter __second_cut = __middle;
+ 	    _Distance __len11 = 0;
+ 	    _Distance __len22 = 0;
+ 	    if (__len1 > __len2)
+ 	      {
+ 		__len11 = __len1 / 2;
+ 		ranges::advance(__first_cut, __len11);
+ 		__second_cut = ranges::lower_bound(__middle, __last, *__first_cut,
+ 						   __comp);
+ 		__len22 = ranges::distance(__middle, __second_cut);
+ 	      }
+ 	    else
+ 	      {
+ 		__len22 = __len2 / 2;
+ 		ranges::advance(__second_cut, __len22);
+ 		__first_cut = ranges::upper_bound(__first, __middle, *__second_cut,
+ 						  __comp);
+ 		__len11 = ranges::distance(__first, __first_cut);
+ 	      }
+ 
+ 	    _Iter __new_middle
+ 	      = __detail::__rotate_adaptive(__first_cut, __middle, __second_cut,
+ 					    _Distance(__len1 - __len11), __len22,
+ 					    __buffer, __buffer_size);
+ 	    __detail::__merge_adaptive_resize(__first, __first_cut, __new_middle,
+ 					      __len11, __len22,
+ 					      __buffer, __buffer_size, __comp);
+ 	    __detail::__merge_adaptive_resize(__new_middle, __second_cut, __last,
+ 					      _Distance(__len1 - __len11),
+ 					      _Distance(__len2 - __len22),
+ 					      __buffer, __buffer_size, __comp);
+ 	  }
+       }
+ 
+     template<typename _Iter, typename _Distance, typename _Comp>
+       constexpr void
+       __merge_without_buffer(_Iter __first, _Iter __middle, _Iter __last,
+ 			     _Distance __len1, _Distance __len2, _Comp __comp)
+       {
+ 	if (__len1 == 0 || __len2 == 0)
+ 	  return;
+ 
+ 	if (__len1 + __len2 == 2)
+ 	  {
+ 	    if (__comp(*__middle, *__first))
+ 	      ranges::iter_swap(__first, __middle);
+ 	    return;
+ 	  }
+ 
+ 	_Iter __first_cut = __first;
+ 	_Iter __second_cut = __middle;
+ 	_Distance __len11 = 0;
+ 	_Distance __len22 = 0;
+ 	if (__len1 > __len2)
+ 	  {
+ 	    __len11 = __len1 / 2;
+ 	    ranges::advance(__first_cut, __len11);
+ 	    __second_cut = ranges::lower_bound(__middle, __last, *__first_cut, __comp);
+ 	    __len22 = ranges::distance(__middle, __second_cut);
+ 	  }
+ 	else
+ 	  {
+ 	    __len22 = __len2 / 2;
+ 	    ranges::advance(__second_cut, __len22);
+ 	    __first_cut = ranges::upper_bound(__first, __middle, *__second_cut, __comp);
+ 	    __len11 = ranges::distance(__first, __first_cut);
+ 	  }
+ 
+ 	_Iter __new_middle = ranges::rotate(__first_cut, __middle, __second_cut).begin();
+ 	__detail::__merge_without_buffer(__first, __first_cut, __new_middle,
+ 					 __len11, __len22, __comp);
+ 	__detail::__merge_without_buffer(__new_middle, __second_cut, __last,
+ 					 __len1 - __len11, __len2 - __len22, __comp);
+       }
+   } // namespace __detail
+ 
    struct __inplace_merge_fn
    {
      template<bidirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
*************** namespace ranges
*** 2888,2897 ****
        operator()(_Iter __first, _Iter __middle, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	auto __lasti = ranges::next(__first, __last);
! 	std::inplace_merge(std::move(__first), std::move(__middle), __lasti,
! 			   __detail::__make_comp_proj(__comp, __proj));
! 	return __lasti;
        }
  
      template<bidirectional_range _Range,
--- 3805,3854 ----
        operator()(_Iter __first, _Iter __middle, _Sent __last,
  		 _Comp __comp = {}, _Proj __proj = {}) const
        {
! 	if constexpr (!same_as<_Iter, _Sent>)
! 	  return (*this)(__first, __middle, ranges::next(__middle, __last),
! 			 std::move(__comp), std::move(__proj));
! 	else
! 	  {
! 	    using _DistanceType = iter_difference_t<_Iter>;
! 
! 	    if (__first == __middle || __middle == __last)
! 	      return __last;
! 
! 	    const _DistanceType __len1 = ranges::distance(__first, __middle);
! 	    const _DistanceType __len2 = ranges::distance(__middle, __last);
! 
! 	    auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
! 
! #if _GLIBCXX_HOSTED
! # if __glibcxx_constexpr_algorithms >= 202306L // >= C++26
! 	    if consteval {
! 	      __detail::__merge_without_buffer(__first, __middle, __last,
! 					       __len1, __len2, __comp_proj);
! 	      return __last;
! 	    }
! # endif
! 	    using _TmpBuf = _Temporary_buffer<_Iter, iter_value_t<_Iter>>;
! 	    // __merge_adaptive will use a buffer for the smaller of
! 	    // [first,middle) and [middle,last).
! 	    _TmpBuf __buf(__first, ptrdiff_t(ranges::min(__len1, __len2)));
! 
! 	    if (__buf.size() == __buf._M_requested_size()) [[likely]]
! 	      __detail::__merge_adaptive
! 		(__first, __middle, __last, __len1, __len2, __buf.begin(), __comp_proj);
! 	    else if (__buf.begin() == 0) [[unlikely]]
! 	      __detail::__merge_without_buffer
! 		(__first, __middle, __last, __len1, __len2, __comp_proj);
! 	    else
! 	      __detail::__merge_adaptive_resize
! 		(__first, __middle, __last, __len1, __len2, __buf.begin(),
! 		 _DistanceType(__buf.size()), __comp_proj);
! #else
! 	    __detail::__merge_without_buffer
! 	      (__first, __middle, __last, __len1, __len2, __comp_proj);
! #endif
! 	    return __last;
! 	  }
        }
  
      template<bidirectional_range _Range,
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/bits/version.def gcc-16-20250629/libstdc++-v3/include/bits/version.def
*** gcc-16-20250622/libstdc++-v3/include/bits/version.def	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/include/bits/version.def	Sun Jun 29 22:34:11 2025
*************** ftms = {
*** 2012,2017 ****
--- 2012,2035 ----
    };
  };
  
+ ftms = {
+   name = type_order;
+   values = {
+     v = 202506;
+     cxxmin = 26;
+     extra_cond = "__has_builtin(__builtin_type_order) "
+     "&& __cpp_lib_three_way_comparison >= 201907L";
+   };
+ };
+ 
+ ftms = {
+   name = exception_ptr_cast;
+   values = {
+     v = 202506;
+     cxxmin = 26;
+   };
+ };
+ 
  // Standard test specifications.
  stds[97] = ">= 199711L";
  stds[03] = ">= 199711L";
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/bits/version.h gcc-16-20250629/libstdc++-v3/include/bits/version.h
*** gcc-16-20250622/libstdc++-v3/include/bits/version.h	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/include/bits/version.h	Sun Jun 29 22:34:11 2025
***************
*** 2253,2256 ****
--- 2253,2276 ----
  #endif /* !defined(__cpp_lib_sstream_from_string_view) && defined(__glibcxx_want_sstream_from_string_view) */
  #undef __glibcxx_want_sstream_from_string_view
  
+ #if !defined(__cpp_lib_type_order)
+ # if (__cplusplus >  202302L) && (__has_builtin(__builtin_type_order) && __cpp_lib_three_way_comparison >= 201907L)
+ #  define __glibcxx_type_order 202506L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_type_order)
+ #   define __cpp_lib_type_order 202506L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_type_order) && defined(__glibcxx_want_type_order) */
+ #undef __glibcxx_want_type_order
+ 
+ #if !defined(__cpp_lib_exception_ptr_cast)
+ # if (__cplusplus >  202302L)
+ #  define __glibcxx_exception_ptr_cast 202506L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_exception_ptr_cast)
+ #   define __cpp_lib_exception_ptr_cast 202506L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_exception_ptr_cast) && defined(__glibcxx_want_exception_ptr_cast) */
+ #undef __glibcxx_want_exception_ptr_cast
+ 
  #undef __glibcxx_want_all
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/std/chrono gcc-16-20250629/libstdc++-v3/include/std/chrono
*** gcc-16-20250622/libstdc++-v3/include/std/chrono	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/include/std/chrono	Sun Jun 29 22:34:11 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 2305,2312 ****
  	  __r *= 10;
  	return __r;
        }
- 
-       template<typename _Duration> struct __utc_leap_second;
      }
      /// @endcond
  
--- 2305,2310 ----
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 2481,2510 ****
  	__byte_duration<ratio<1>>   _M_s{};
  	bool			    _M_is_neg{};
  	__subseconds<precision>	    _M_ss{};
- 
- 	template<typename> friend struct __detail::__utc_leap_second;
        };
  
-     /// @cond undocumented
-     namespace __detail
-     {
-       // Represents a time that is within a leap second insertion.
-       template<typename _Duration>
- 	struct __utc_leap_second
- 	{
- 	  explicit
- 	  __utc_leap_second(const sys_time<_Duration>& __s)
- 	  : _M_date(chrono::floor<days>(__s)), _M_time(__s - _M_date)
- 	  {
- 	    ++_M_time._M_s;
- 	  }
- 
- 	  sys_days _M_date;
- 	  hh_mm_ss<common_type_t<_Duration, days>> _M_time;
- 	};
-     }
-     /// @endcond
- 
      // 12/24 HOURS FUNCTIONS
  
      constexpr bool
--- 2479,2486 ----
diff -Nrcpad gcc-16-20250622/libstdc++-v3/include/std/type_traits gcc-16-20250629/libstdc++-v3/include/std/type_traits
*** gcc-16-20250622/libstdc++-v3/include/std/type_traits	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/include/std/type_traits	Sun Jun 29 22:34:11 2025
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 280,290 ****
  
    // Forward declarations
    template<typename>
!     struct is_reference;
!   template<typename>
!     struct is_function;
!   template<typename>
!     struct is_void;
    template<typename>
      struct remove_cv;
    template<typename>
--- 280,286 ----
  
    // Forward declarations
    template<typename>
!     struct is_object;
    template<typename>
      struct remove_cv;
    template<typename>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 294,314 ****
    template<typename>
      struct __is_array_unknown_bounds;
  
    // Helper functions that return false_type for incomplete classes,
    // incomplete unions and arrays of known bound from those.
  
!   template <typename _Tp, size_t = sizeof(_Tp)>
!     constexpr true_type __is_complete_or_unbounded(__type_identity<_Tp>)
!     { return {}; }
  
!   template <typename _TypeIdentity,
!       typename _NestedType = typename _TypeIdentity::type>
!     constexpr typename __or_<
!       is_reference<_NestedType>,
!       is_function<_NestedType>,
!       is_void<_NestedType>,
!       __is_array_unknown_bounds<_NestedType>
!     >::type __is_complete_or_unbounded(_TypeIdentity)
      { return {}; }
  
    // __remove_cv_t (std::remove_cv_t for C++11).
--- 290,319 ----
    template<typename>
      struct __is_array_unknown_bounds;
  
+   // An object type which is not an unbounded array.
+   // It might still be an incomplete type, but if this is false_type
+   // then we can be certain it's not a complete object type.
+   template<typename _Tp>
+     using __maybe_complete_object_type
+       = __and_<is_object<_Tp>, __not_<__is_array_unknown_bounds<_Tp>>>;
+ 
    // Helper functions that return false_type for incomplete classes,
    // incomplete unions and arrays of known bound from those.
  
!   // More specialized overload for complete object types (returning true_type).
!   template<typename _Tp,
! 	   typename = __enable_if_t<__maybe_complete_object_type<_Tp>::value>,
! 	   size_t = sizeof(_Tp)>
!     constexpr true_type
!     __is_complete_or_unbounded(__type_identity<_Tp>)
!     { return {}; };
  
!   // Less specialized overload for reference and unknown-bound array types
!   // (returning true_type), and incomplete types (returning false_type).
!   template<typename _TypeIdentity,
! 	   typename _NestedType = typename _TypeIdentity::type>
!     constexpr typename __not_<__maybe_complete_object_type<_NestedType>>::type
!     __is_complete_or_unbounded(_TypeIdentity)
      { return {}; }
  
    // __remove_cv_t (std::remove_cv_t for C++11).
diff -Nrcpad gcc-16-20250622/libstdc++-v3/libsupc++/compare gcc-16-20250629/libstdc++-v3/libsupc++/compare
*** gcc-16-20250622/libstdc++-v3/libsupc++/compare	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/libsupc++/compare	Sun Jun 29 22:34:11 2025
***************
*** 35,40 ****
--- 35,41 ----
  #endif
  
  #define __glibcxx_want_three_way_comparison
+ #define __glibcxx_want_type_order
  #include <bits/version.h>
  
  #if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
*************** namespace std _GLIBCXX_VISIBILITY(defaul
*** 1261,1266 ****
--- 1262,1289 ----
  					 std::declval<_Up&>()));
    } // namespace __detail
    /// @endcond
+ 
+ #if __glibcxx_type_order >= 202506L // C++ >= 26
+   /// Total ordering of types.
+   /// @since C++26
+ 
+   template<typename _Tp, typename _Up>
+     struct type_order
+     {
+       static constexpr strong_ordering value = __builtin_type_order(_Tp, _Up);
+       using value_type = strong_ordering;
+       using type = type_order<_Tp, _Up>;
+       constexpr operator value_type() const noexcept { return value; }
+       constexpr value_type operator()() const noexcept { return value; }
+     };
+ 
+   /// @ingroup variable_templates
+   /// @since C++26
+   template<typename _Tp, typename _Up>
+     inline constexpr strong_ordering type_order_v
+       = __builtin_type_order(_Tp, _Up);
+ #endif // __glibcxx_type_order >= 202506L
+ 
  #endif // __cpp_lib_three_way_comparison >= 201907L
  } // namespace std
  
diff -Nrcpad gcc-16-20250622/libstdc++-v3/libsupc++/eh_ptr.cc gcc-16-20250629/libstdc++-v3/libsupc++/eh_ptr.cc
*** gcc-16-20250622/libstdc++-v3/libsupc++/eh_ptr.cc	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/libsupc++/eh_ptr.cc	Sun Jun 29 22:34:11 2025
*************** std::rethrow_exception(std::exception_pt
*** 220,223 ****
--- 220,239 ----
    std::terminate();
  }
  
+ const void*
+ std::__exception_ptr::exception_ptr::_M_exception_ptr_cast(const type_info& t)
+   const noexcept
+ {
+   void *ptr = _M_exception_object;
+   if (__builtin_expect(ptr == nullptr, false))
+     return nullptr;
+   __cxa_refcounted_exception *eh
+     = __get_refcounted_exception_header_from_obj (_M_exception_object);
+   const type_info* __thr_type = eh->exc.exceptionType;
+   if (t.__do_catch(__thr_type, &ptr, 1))
+     return ptr;
+   return nullptr;
+ }
+ 
+ 
  #undef _GLIBCXX_EH_PTR_COMPAT
diff -Nrcpad gcc-16-20250622/libstdc++-v3/libsupc++/exception gcc-16-20250629/libstdc++-v3/libsupc++/exception
*** gcc-16-20250622/libstdc++-v3/libsupc++/exception	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/libsupc++/exception	Sun Jun 29 22:34:11 2025
***************
*** 38,43 ****
--- 38,44 ----
  #include <bits/exception.h>
  
  #define __glibcxx_want_uncaught_exceptions
+ #define __glibcxx_want_exception_ptr_cast
  #include <bits/version.h>
  
  extern "C++" {
diff -Nrcpad gcc-16-20250622/libstdc++-v3/libsupc++/exception_ptr.h gcc-16-20250629/libstdc++-v3/libsupc++/exception_ptr.h
*** gcc-16-20250622/libstdc++-v3/libsupc++/exception_ptr.h	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/libsupc++/exception_ptr.h	Sun Jun 29 22:34:11 2025
*************** namespace std _GLIBCXX_VISIBILITY(defaul
*** 80,85 ****
--- 80,92 ----
    /// Throw the object pointed to by the exception_ptr.
    void rethrow_exception(exception_ptr) __attribute__ ((__noreturn__));
  
+ #if __cpp_lib_exception_ptr_cast >= 202506L
+   template<typename _Ex>
+   const _Ex* exception_ptr_cast(const exception_ptr&) noexcept;
+   template<typename _Ex>
+   void exception_ptr_cast(const exception_ptr&&) = delete;
+ #endif
+ 
    namespace __exception_ptr
    {
      using std::rethrow_exception; // So that ADL finds it.
*************** namespace std _GLIBCXX_VISIBILITY(defaul
*** 109,114 ****
--- 116,128 ----
        friend void std::rethrow_exception(exception_ptr);
        template<typename _Ex>
        friend exception_ptr std::make_exception_ptr(_Ex) _GLIBCXX_USE_NOEXCEPT;
+ #if __cpp_lib_exception_ptr_cast >= 202506L
+       template<typename _Ex>
+       friend const _Ex* std::exception_ptr_cast(const exception_ptr&) noexcept;
+ #endif
+ 
+       const void* _M_exception_ptr_cast(const type_info&) const
+ 	_GLIBCXX_USE_NOEXCEPT;
  
      public:
        exception_ptr() _GLIBCXX_USE_NOEXCEPT;
*************** namespace std _GLIBCXX_VISIBILITY(defaul
*** 284,289 ****
--- 298,317 ----
      { return exception_ptr(); }
  #endif
  
+ #if __cpp_lib_exception_ptr_cast >= 202506L
+   template<typename _Ex>
+     [[__gnu__::__always_inline__]]
+     inline const _Ex* exception_ptr_cast(const exception_ptr& __p) noexcept
+     {
+ #ifdef __cpp_rtti
+       const type_info &__id = typeid(const _Ex&);
+       return static_cast<const _Ex*>(__p._M_exception_ptr_cast(__id));
+ #else
+       return nullptr;
+ #endif
+     }
+ #endif
+ 
  #undef _GLIBCXX_EH_PTR_USED
  
    /// @} group exceptions
diff -Nrcpad gcc-16-20250622/libstdc++-v3/src/c++23/std.cc.in gcc-16-20250629/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20250622/libstdc++-v3/src/c++23/std.cc.in	Sun Jun 22 22:33:51 2025
--- gcc-16-20250629/libstdc++-v3/src/c++23/std.cc.in	Sun Jun 29 22:34:11 2025
*************** export namespace std
*** 888,893 ****
--- 888,897 ----
    using std::partial_order;
    using std::strong_order;
    using std::weak_order;
+ #if __glibcxx_type_order >= 202506L
+   using std::type_order;
+   using std::type_order_v;
+ #endif
  }
  
  // 28.4 <complex>
*************** export namespace std
*** 1050,1055 ****
--- 1054,1062 ----
    using std::throw_with_nested;
    using std::uncaught_exception;
    using std::uncaught_exceptions;
+ #if __cpp_lib_exception_ptr_cast >= 202506L
+   using std::exception_ptr_cast;
+ #endif
  }
  
  // 34.4 <execution>
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc gcc-16-20250629/libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libstdc++-v3/testsuite/18_support/comparisons/type_order/1.cc	Sun Jun 29 22:34:12 2025
***************
*** 0 ****
--- 1,95 ----
+ // Copyright (C) 2025 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/>.
+ 
+ // { dg-do compile { target c++26 } }
+ 
+ #include <compare>
+ 
+ #if __cpp_lib_type_order != 202506L
+ # error "__cpp_lib_type_order != 202506"
+ #endif
+ 
+ static_assert (std::is_same_v <decltype (std::type_order <int, int>::value),
+ 			       const std::strong_ordering>);
+ static_assert (std::is_same_v <decltype (std::type_order_v <char, short>),
+ 			       const std::strong_ordering>);
+ struct S;
+ struct T;
+ template <typename T>
+ struct U
+ {
+ };
+ typedef int int2;
+ struct V {};
+ namespace
+ {
+   struct W {};
+ }
+ 
+ template <typename T, typename U>
+ struct eq
+ {
+   constexpr eq ()
+   {
+     static_assert (std::type_order <T, U>::value == std::strong_ordering::equal);
+     static_assert (std::type_order <U, T>::value == std::strong_ordering::equal);
+     static_assert (std::type_order_v <T, U> == std::strong_ordering::equal);
+     static_assert (std::type_order_v <U, T> == std::strong_ordering::equal);
+   }
+ };
+ template <typename T, typename U>
+ struct ne
+ {
+   constexpr ne ()
+   {
+     static_assert (std::type_order <T, U>::value != std::strong_ordering::equal);
+     static_assert (std::type_order <U, T>::value != std::strong_ordering::equal);
+     static_assert (std::type_order <T, U>::value == std::strong_ordering::greater
+ 		   ? std::type_order <U, T>::value == std::strong_ordering::less
+ 		   : std::type_order <U, T>::value == std::strong_ordering::greater);
+     static_assert (std::type_order_v <T, U> != std::strong_ordering::equal);
+     static_assert (std::type_order_v <U, T> != std::strong_ordering::equal);
+     static_assert (std::type_order_v <T, U> == std::strong_ordering::greater
+ 		   ? std::type_order_v <U, T> == std::strong_ordering::less
+ 		   : std::type_order_v <U, T> == std::strong_ordering::greater);
+   }
+ };
+ 
+ constexpr eq <void, void> a;
+ constexpr eq <const void, const void> b;
+ constexpr eq <int, int> c;
+ constexpr eq <long int, long int> d;
+ constexpr eq <const volatile unsigned, const volatile unsigned> e;
+ constexpr eq <S, S> f;
+ constexpr eq <U <int>, U <int>> g;
+ constexpr eq <unsigned[2], unsigned[2]> h;
+ constexpr eq <int, int2> i;
+ constexpr eq <int (*) (int, long), int (*) (int, long)> j;
+ constexpr ne <int, long> k;
+ constexpr ne <const int, int> l;
+ constexpr ne <S, T> m;
+ constexpr ne <int &, int &&> n;
+ constexpr ne <U <S>, U <T>> o;
+ constexpr ne <U <short>, U <char>> p;
+ static_assert (std::type_order_v <S, T> != std::strong_ordering::less
+ 	       || std::type_order_v <T, V> != std::strong_ordering::less
+ 	       || std::type_order_v <S, V> == std::strong_ordering::less);
+ constexpr ne <int (*) (int, long), int (*) (int, int)> q;
+ constexpr eq <W, W> r;
+ constexpr ne <V, W> s;
+ constexpr eq <U <W>, U <W>> t;
+ constexpr ne <U <V>, U <W>> u;
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/18_support/exception_ptr/exception_ptr_cast.cc gcc-16-20250629/libstdc++-v3/testsuite/18_support/exception_ptr/exception_ptr_cast.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/18_support/exception_ptr/exception_ptr_cast.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libstdc++-v3/testsuite/18_support/exception_ptr/exception_ptr_cast.cc	Sun Jun 29 22:34:12 2025
***************
*** 0 ****
--- 1,81 ----
+ // { dg-do run { target c++26 } }
+ 
+ // Copyright (C) 2025 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/>.
+ 
+ // exception_ptr_cast.
+ 
+ #include <exception>
+ #include <testsuite_hooks.h>
+ 
+ #if __cpp_lib_exception_ptr_cast != 202506L
+ # error "__cpp_lib_exception_ptr_cast != 202506"
+ #endif
+ 
+ struct A { int a; };
+ struct B : A {};
+ struct C : B {};
+ struct D {};
+ struct E : virtual C { int e; virtual ~E () {} };
+ struct F : virtual E, virtual C { int f; };
+ struct G : virtual F, virtual C, virtual E {
+   G () : g (4) { a = 1; e = 2; f = 3; } int g;
+ };
+ 
+ void test01()
+ {
+   auto a = std::make_exception_ptr(C{ 42 });
+   auto b = std::exception_ptr_cast<C>(a);
+   VERIFY( b != nullptr );
+   VERIFY( b->a == 42 );
+   auto c = std::exception_ptr_cast<B>(a);
+   VERIFY( c == static_cast<const B*>(b) );
+   auto d = std::exception_ptr_cast<A>(a);
+   VERIFY( d == static_cast<const A*>(b) );
+   auto e = std::exception_ptr_cast<D>(a);
+   VERIFY( e == nullptr );
+   auto f = std::make_exception_ptr(42L);
+   auto g = std::exception_ptr_cast<long>(f);
+   VERIFY( g != nullptr );
+   VERIFY( *g == 42L );
+   try
+     {
+       throw G ();
+     }
+   catch (...)
+     {
+       auto h = std::current_exception();
+       auto i = std::exception_ptr_cast<G>(h);
+       VERIFY( i != nullptr );
+       VERIFY( i->a == 1 && i->e == 2 && i->f == 3 && i->g == 4 );
+       auto j = std::exception_ptr_cast<A>(h);
+       VERIFY( j == static_cast<const A*>(i) );
+       auto k = std::exception_ptr_cast<C>(h);
+       VERIFY( k == static_cast<const C*>(i) );
+       auto l = std::exception_ptr_cast<E>(h);
+       VERIFY( l == static_cast<const E*>(i) );
+       auto m = std::exception_ptr_cast<F>(h);
+       VERIFY( m == static_cast<const F*>(i) );
+       auto n = std::exception_ptr_cast<G>(a);
+       VERIFY( n == nullptr );
+     }
+ }
+ 
+ int main()
+ {
+   test01();
+ }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/120717.cc gcc-16-20250629/libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/120717.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/120717.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libstdc++-v3/testsuite/20_util/is_complete_or_unbounded/120717.cc	Sun Jun 29 22:34:12 2025
***************
*** 0 ****
--- 1,20 ----
+ // PR libstdc++/120717
+ // { dg-do compile { target c++11 } }
+ // { dg-additional-options "-Wsfinae-incomplete" }
+ 
+ #include <type_traits>
+ 
+ // Verify __is_complete_or_unbounded doesn't try to instantiate the underlying
+ // type of a reference or array of unknown bound.
+ template<class T> struct A { static_assert(false, "do not instantiate"); };
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<A<int>&>{}), "");
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<A<int>&&>{}), "");
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<A<int>[]>{}), "");
+ 
+ // Verify __is_complete_or_unbounded doesn't produce unexpected
+ // -Wsfinae-incomplete warnings.
+ struct B;
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<B&>{}), "");
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<B&&>{}), "");
+ static_assert(std::__is_complete_or_unbounded(std::__type_identity<B[]>{}), "");
+ struct B { }; // { dg-bogus "-Wsfinae-incomplete" }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc	Sun Jun 22 22:33:58 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/heap/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
  
*************** test02()
*** 97,106 ****
--- 98,152 ----
    return ok;
  }
  
+ constexpr bool
+ test03()
+ {
+   // PR libstdc++/100795 - ranges::heap algos should not use std::heap directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   for (int i = 1; i < 20; i++)
+     ranges::push_heap(w.begin(), w.begin() + i);
+   ranges::sort_heap(w);
+   VERIFY( ranges::equal(w, v) );
+   ranges::make_heap(w);
+   auto it = ranges::pop_heap(w);
+   VERIFY( it[-1] == 19 );
+ 
+   for (int i = 1; i < 20; i++)
+     ranges::push_heap(w.begin(), w.begin() + i, std::ranges::greater{});
+   ranges::sort_heap(w, std::ranges::greater{});
+   VERIFY( ranges::equal(w, v | std::views::reverse) );
+   ranges::make_heap(w, std::ranges::greater{});
+   it = ranges::pop_heap(w, std::ranges::greater{});
+   VERIFY( it[-1] == 0 );
+ 
+   for (int i = 1; i < 20; i++)
+     ranges::push_heap(w.begin(), w.begin() + i, std::ranges::greater{}, std::negate{});
+   ranges::sort_heap(w, std::ranges::greater{}, std::negate{});
+   VERIFY( ranges::equal(w, v) );
+   ranges::make_heap(w, std::ranges::greater{}, std::negate{});
+   it = ranges::pop_heap(w, std::ranges::greater{}, std::negate{});
+   VERIFY( it[-1] == 19 );
+ 
+   return true;
+ }
+ 
  int
  main()
  {
    test01<test_range>();
    test01<test_container>();
    static_assert(test02());
+   static_assert(test03());
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc	Sun Jun 22 22:33:58 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/inplace_merge/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 18,23 ****
--- 18,24 ----
  // { dg-do run { target c++20 } }
  
  #include <algorithm>
+ #include <ranges>
  #include <vector>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test02()
*** 60,68 ****
--- 61,104 ----
  }
  
  
+ void
+ test03()
+ {
+   // PR libstdc++/100795 - ranges::inplace_merge should not use
+   // std::inplace_merge directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   ranges::sort(w | std::views::take(10));
+   ranges::sort(w | std::views::drop(10));
+   ranges::inplace_merge(w, w.begin() + 10);
+   VERIFY( ranges::equal(w, v) );
+ 
+   ranges::sort(w | std::views::take(10), std::ranges::greater{});
+   ranges::sort(w | std::views::drop(10), std::ranges::greater{});
+   ranges::inplace_merge(w, w.begin() + 10, std::ranges::greater{});
+   VERIFY( ranges::equal(w, v | std::views::reverse) );
+ 
+   ranges::sort(w | std::views::take(10), std::ranges::greater{}, std::negate{});
+   ranges::sort(w | std::views::drop(10), std::ranges::greater{}, std::negate{});
+   ranges::inplace_merge(w, w.begin() + 10, std::ranges::greater{}, std::negate{});
+   VERIFY( ranges::equal(w, v) );
+ }
+ 
  int
  main()
  {
    test01();
    test02();
+   test03();
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc	Sun Jun 22 22:33:58 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/nth_element/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
  
*************** test02()
*** 67,75 ****
--- 68,106 ----
    return x[3] == 4;
  }
  
+ constexpr bool
+ test03()
+ {
+   // PR libstdc++/100795 - ranges::sort should not use std::sort directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   ranges::nth_element(w, w.begin() + 10);
+   VERIFY( w[10] == 10 );
+ 
+   ranges::nth_element(w, w.begin() + 5, std::ranges::greater{});
+   VERIFY( w[5] == 19 - 5 );
+ 
+   ranges::nth_element(w, w.begin() + 15, std::ranges::greater{}, std::negate{});
+   VERIFY( w[15] == 15 );
+ 
+   return true;
+ }
+ 
  int
  main()
  {
    test01();
    static_assert(test02());
+   static_assert(test03());
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc	Sun Jun 22 22:33:59 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sample/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
  
*************** test01()
*** 59,67 ****
--- 60,93 ----
      }
  }
  
+ void
+ test02()
+ {
+   // PR libstdc++/100795 - ranges::sample should not use std::sample
+ #if 0 // FIXME: ranges::sample rejects integer-class difference types.
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ #else
+   auto v = std::views::iota(0, 20);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   ranges::sample(v, w.begin(), 20, rng);
+   ranges::sort(w);
+   VERIFY( ranges::equal(w, v) );
+ }
+ 
  int
  main()
  {
    test01<forward_iterator_wrapper, output_iterator_wrapper>();
    test01<input_iterator_wrapper, random_access_iterator_wrapper>();
+   test02();
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc	Sun Jun 22 22:33:59 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/shuffle/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <vector>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test01()
*** 62,69 ****
--- 63,94 ----
      }
  }
  
+ void
+ test02()
+ {
+   // PR libstdc++/100795 - ranges::shuffle should not use std::shuffle directly
+ #if 0 // FIXME: ranges::shuffle rejects integer-class difference types.
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ #else
+   auto v = std::views::iota(0, 20);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   std::ranlux48_base g;
+   ranges::shuffle(w, g);
+ }
+ 
  int
  main()
  {
    test01();
+   test02();
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sort/118209.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sort/118209.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sort/118209.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sort/118209.cc	Sun Jun 29 22:34:34 2025
***************
*** 0 ****
--- 1,23 ----
+ // PR libstdc++ - ranges::sort doesn't use iter_move, cannot sort zip of move-only type
+ // { dg-do compile { target c++23 } }
+ 
+ #include <algorithm>
+ #include <ranges>
+ #include <vector>
+ 
+ struct F {
+   int a = -1;
+   explicit F(int d) : a(d) { }
+   F(const F&) = delete;
+   F(F&& o) : a(o.a) { }
+   void operator=(const F&) = delete;
+   F& operator=(F&& o) { return *this; }
+   auto operator<=>(const F&) const = default;
+ };
+ 
+ int main () {
+   int a[] = {3,2,1};
+   std::vector<F> v(a, a+3);
+   std::ranges::sort(v); // OK
+   std::ranges::sort(std::views::zip(v)); // didn't compile
+ }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc	Sun Jun 22 22:33:59 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/sort/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <vector>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test02()
*** 72,80 ****
--- 73,111 ----
  	  && ranges::equal(x, y, {}, &X::i, &X::i));
  }
  
+ constexpr bool
+ test03()
+ {
+   // PR libstdc++/100795 - ranges::sort should not use std::sort directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   ranges::sort(w);
+   VERIFY( ranges::equal(w, v) );
+ 
+   ranges::sort(w, std::ranges::greater{});
+   VERIFY( ranges::equal(w, v | std::views::reverse) );
+ 
+   ranges::sort(w, std::ranges::greater{}, std::negate{});
+   VERIFY( ranges::equal(w, v) );
+ 
+   return true;
+ }
+ 
  int
  main()
  {
    test01();
    static_assert(test02());
+   static_assert(test03());
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc	Sun Jun 22 22:33:59 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/stable_partition/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 21,26 ****
--- 21,27 ----
  // { dg-require-effective-target hosted }
  
  #include <algorithm>
+ #include <ranges>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
  
*************** test02()
*** 70,78 ****
--- 71,104 ----
      }
  }
  
+ void
+ test03()
+ {
+   // PR libstdc++/100795 - ranges::stable_partition should not use
+   // std::stable_partition directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   auto pred = [] (int a) { return a%2==0; };
+   ranges::stable_partition(w, pred);
+   VERIFY( ranges::all_of(w.begin(), w.begin() + 10, pred) );
+   VERIFY( ranges::none_of(w.begin() + 10, w.end(), pred) );
+ }
+ 
  int
  main()
  {
    test01();
    test02();
+   test03();
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc	Sun Jun 22 22:33:59 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/25_algorithms/stable_sort/constrained.cc	Sun Jun 29 22:34:34 2025
***************
*** 20,25 ****
--- 20,26 ----
  
  #include <algorithm>
  #include <random>
+ #include <ranges>
  #include <vector>
  #include <testsuite_hooks.h>
  #include <testsuite_iterators.h>
*************** test01()
*** 62,69 ****
--- 63,99 ----
      }
  }
  
+ void
+ test02()
+ {
+   // PR libstdc++/100795 - ranges::stable_sort should not use std::stable_sort
+   // directly
+ #if __SIZEOF_INT128__
+   auto v = std::views::iota(__int128(0), __int128(20));
+ #else
+   auto v = std::views::iota(0ll, 20ll);
+ #endif
+ 
+   int storage[20] = {2,5,4,3,1,6,7,9,10,8,11,14,12,13,15,16,18,0,19,17};
+   auto w = v | std::views::transform([&](auto i) -> int& { return storage[i]; });
+   using type = decltype(w);
+   using cat = std::iterator_traits<std::ranges::iterator_t<type>>::iterator_category;
+   static_assert( std::same_as<cat, std::output_iterator_tag> );
+   static_assert( std::ranges::random_access_range<type> );
+ 
+   ranges::stable_sort(w);
+   VERIFY( ranges::equal(w, v) );
+ 
+   ranges::stable_sort(w, std::ranges::greater{});
+   VERIFY( ranges::equal(w, v | std::views::reverse) );
+ 
+   ranges::stable_sort(w, std::ranges::greater{}, std::negate{});
+   VERIFY( ranges::equal(w, v) );
+ }
+ 
  int
  main()
  {
    test01();
+   test02();
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/data_not_present_neg.cc gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/data_not_present_neg.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/data_not_present_neg.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/data_not_present_neg.cc	Sun Jun 29 22:34:37 2025
***************
*** 0 ****
--- 1,164 ----
+ // { dg-do compile { target c++20 } }
+ 
+ #include <chrono>
+ #include <format>
+ 
+ using namespace std::chrono;
+ 
+ auto d1 = std::format("{:%w}", 10d); // { dg-error "call to consteval function" }
+ auto d2 = std::format("{:%m}", 10d); // { dg-error "call to consteval function" }
+ auto d3 = std::format("{:%y}", 10d); // { dg-error "call to consteval function" }
+ auto d4 = std::format("{:%F}", 10d); // { dg-error "call to consteval function" }
+ auto d5 = std::format("{:%T}", 10d); // { dg-error "call to consteval function" }
+ auto d6 = std::format("{:%Q}", 10d); // { dg-error "call to consteval function" }
+ auto d7 = std::format("{:%Z}", 10d); // { dg-error "call to consteval function" }
+ 
+ auto w1 = std::format("{:%d}", Thursday); // { dg-error "call to consteval function" }
+ auto w2 = std::format("{:%m}", Thursday); // { dg-error "call to consteval function" }
+ auto w3 = std::format("{:%y}", Thursday); // { dg-error "call to consteval function" }
+ auto w4 = std::format("{:%F}", Thursday); // { dg-error "call to consteval function" }
+ auto w5 = std::format("{:%T}", Thursday); // { dg-error "call to consteval function" }
+ auto w6 = std::format("{:%Q}", Thursday); // { dg-error "call to consteval function" }
+ auto w7 = std::format("{:%Z}", Thursday); // { dg-error "call to consteval function" }
+ 
+ auto wi1 = std::format("{:%d}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi2 = std::format("{:%m}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi3 = std::format("{:%y}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi4 = std::format("{:%F}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi5 = std::format("{:%T}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi6 = std::format("{:%Q}", Thursday[2]); // { dg-error "call to consteval function" }
+ auto wi7 = std::format("{:%Z}", Thursday[2]); // { dg-error "call to consteval function" }
+ 
+ auto wl1 = std::format("{:%d}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl2 = std::format("{:%m}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl3 = std::format("{:%y}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl4 = std::format("{:%F}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl5 = std::format("{:%T}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl6 = std::format("{:%Q}", Thursday[last]); // { dg-error "call to consteval function" }
+ auto wl7 = std::format("{:%Z}", Thursday[last]); // { dg-error "call to consteval function" }
+ 
+ auto m1 = std::format("{:%d}", January); // { dg-error "call to consteval function" }
+ auto m2 = std::format("{:%w}", January); // { dg-error "call to consteval function" }
+ auto m3 = std::format("{:%y}", January); // { dg-error "call to consteval function" }
+ auto m4 = std::format("{:%F}", January); // { dg-error "call to consteval function" }
+ auto m5 = std::format("{:%T}", January); // { dg-error "call to consteval function" }
+ auto m6 = std::format("{:%Q}", January); // { dg-error "call to consteval function" }
+ auto m7 = std::format("{:%Z}", January); // { dg-error "call to consteval function" }
+ 
+ auto yr1 = std::format("{:%d}", 2025y); // { dg-error "call to consteval function" }
+ auto yr2 = std::format("{:%w}", 2025y); // { dg-error "call to consteval function" }
+ auto yr3 = std::format("{:%m}", 2025y); // { dg-error "call to consteval function" }
+ auto yr4 = std::format("{:%F}", 2025y); // { dg-error "call to consteval function" }
+ auto yr5 = std::format("{:%T}", 2025y); // { dg-error "call to consteval function" }
+ auto yr6 = std::format("{:%Q}", 2025y); // { dg-error "call to consteval function" }
+ auto yr7 = std::format("{:%Z}", 2025y); // { dg-error "call to consteval function" }
+ 
+ auto md1 = std::format("{:%w}", January/10d); // { dg-error "call to consteval function" }
+ auto md2 = std::format("{:%y}", January/10d); // { dg-error "call to consteval function" }
+ auto md3 = std::format("{:%F}", January/10d); // { dg-error "call to consteval function" }
+ auto md4 = std::format("{:%T}", January/10d); // { dg-error "call to consteval function" }
+ auto md5 = std::format("{:%Q}", January/10d); // { dg-error "call to consteval function" }
+ auto md6 = std::format("{:%Z}", January/10d); // { dg-error "call to consteval function" }
+ 
+ auto mwi1 = std::format("{:%d}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto mwi2 = std::format("{:%y}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto mwi3 = std::format("{:%F}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto mwi4 = std::format("{:%T}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto mwi5 = std::format("{:%Q}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto mwi6 = std::format("{:%Z}", January/Thursday[2]); // { dg-error "call to consteval function" }
+ 
+ auto mwl1 = std::format("{:%d}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto mwl2 = std::format("{:%y}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto mwl3 = std::format("{:%F}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto mwl4 = std::format("{:%T}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto mwl5 = std::format("{:%Q}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto mwl6 = std::format("{:%Z}", January/Thursday[last]); // { dg-error "call to consteval function" }
+ 
+ auto ml1 = std::format("{:%d}", January/last); // { dg-error "call to consteval function" }
+ auto ml2 = std::format("{:%w}", January/last); // { dg-error "call to consteval function" }
+ auto ml3 = std::format("{:%y}", January/last); // { dg-error "call to consteval function" }
+ auto ml4 = std::format("{:%F}", January/last); // { dg-error "call to consteval function" }
+ auto ml5 = std::format("{:%T}", January/last); // { dg-error "call to consteval function" }
+ auto ml6 = std::format("{:%Q}", January/last); // { dg-error "call to consteval function" }
+ auto ml7 = std::format("{:%Z}", January/last); // { dg-error "call to consteval function" }
+ 
+ auto ym1 = std::format("{:%d}", 2024y/March); // { dg-error "call to consteval function" }
+ auto ym2 = std::format("{:%w}", 2024y/March); // { dg-error "call to consteval function" }
+ auto ym3 = std::format("{:%F}", 2024y/March); // { dg-error "call to consteval function" }
+ auto ym4 = std::format("{:%T}", 2024y/March); // { dg-error "call to consteval function" }
+ auto ym5 = std::format("{:%Q}", 2024y/March); // { dg-error "call to consteval function" }
+ auto ym6 = std::format("{:%Z}", 2024y/March); // { dg-error "call to consteval function" }
+ 
+ auto ymd1 = std::format("{:%T}", 2021y/January/10d); // { dg-error "call to consteval function" }
+ auto ymd2 = std::format("{:%Q}", 2021y/January/10d); // { dg-error "call to consteval function" }
+ auto ymd3 = std::format("{:%Z}", 2021y/January/10d); // { dg-error "call to consteval function" }
+ 
+ auto ymwi1 = std::format("{:%T}", 2021y/January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto ymwi2 = std::format("{:%Q}", 2021y/January/Thursday[2]); // { dg-error "call to consteval function" }
+ auto ymwi3 = std::format("{:%Z}", 2021y/January/Thursday[2]); // { dg-error "call to consteval function" }
+ 
+ auto ymwl1 = std::format("{:%T}", 2021y/January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto ymwl2 = std::format("{:%Q}", 2021y/January/Thursday[last]); // { dg-error "call to consteval function" }
+ auto ymwl3 = std::format("{:%Z}", 2021y/January/Thursday[last]); // { dg-error "call to consteval function" }
+ 
+ auto yml1 = std::format("{:%T}", 2021y/January/last); // { dg-error "call to consteval function" }
+ auto yml2 = std::format("{:%Q}", 2021y/January/last); // { dg-error "call to consteval function" }
+ auto yml3 = std::format("{:%Z}", 2021y/January/last); // { dg-error "call to consteval function" }
+ 
+ auto ls1 = std::format("{:%Q}", local_seconds(20s)); // { dg-error "call to consteval function" }
+ auto ls2 = std::format("{:%Z}", local_seconds(10s)); // { dg-error "call to consteval function" }
+ auto ld1 = std::format("{:%Q}", local_days(days(20))); // { dg-error "call to consteval function" }
+ auto ld2 = std::format("{:%Z}", local_days(days(10))); // { dg-error "call to consteval function" }
+ 
+ auto ss1 = std::format("{:%Q}", sys_seconds(20s)); // { dg-error "call to consteval function" }
+ auto sd1 = std::format("{:%Q}", sys_days(days(20))); // { dg-error "call to consteval function" }
+ 
+ auto utc = std::format("{:%Q}", utc_clock::now()); // { dg-error "call to consteval function" }
+ auto gps = std::format("{:%Q}", gps_clock::now()); // { dg-error "call to consteval function" }
+ auto tai = std::format("{:%Q}", tai_clock::now()); // { dg-error "call to consteval function" }
+ auto file = std::format("{:%Q}", file_clock::now()); // { dg-error "call to consteval function" }
+ 
+ const auto ltc = local_seconds(10s);
+ #if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
+ const auto zt = zoned_time<seconds>("Europe/Sofia", local_seconds(10s));
+ auto zt1 = std::format("{:%Q}", zt); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ #endif
+ auto lf1 = std::format("{:%Q}", local_time_format(ltc)); // { dg-error "call to consteval function" }
+ 
+ auto dur1 = std::format("{:%d}", 123s); // { dg-error "call to consteval function" }
+ auto dur2 = std::format("{:%w}", 123s); // { dg-error "call to consteval function" }
+ auto dur3 = std::format("{:%m}", 123s); // { dg-error "call to consteval function" }
+ auto dur4 = std::format("{:%y}", 123s); // { dg-error "call to consteval function" }
+ auto dur5 = std::format("{:%F}", 123s); // { dg-error "call to consteval function" }
+ auto dur6 = std::format("{:%Z}", 123s); // { dg-error "call to consteval function" }
+ 
+ using HMS = hh_mm_ss<seconds>;
+ auto hms1 = std::format("{:%d}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms2 = std::format("{:%w}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms3 = std::format("{:%m}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms4 = std::format("{:%y}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms5 = std::format("{:%F}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms6 = std::format("{:%Q}", HMS(1255s)); // { dg-error "call to consteval function" }
+ auto hms7 = std::format("{:%Z}", HMS(1255s)); // { dg-error "call to consteval function" }
+ 
+ #if _GLIBCXX_USE_CXX11_ABI || !_GLIBCXX_USE_DUAL_ABI
+ auto li1 = std::format("{:%d}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li2 = std::format("{:%w}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li3 = std::format("{:%m}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li4 = std::format("{:%y}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li5 = std::format("{:%F}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li6 = std::format("{:%T}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li7 = std::format("{:%Q}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto li8 = std::format("{:%Z}", local_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ 
+ auto si1 = std::format("{:%d}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si2 = std::format("{:%w}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si3 = std::format("{:%m}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si4 = std::format("{:%y}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si5 = std::format("{:%F}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si6 = std::format("{:%T}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si7 = std::format("{:%Q}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ auto si8 = std::format("{:%Z}", sys_info()); // { dg-error "call to consteval function" "" { target cxx11_abi } }
+ #endif
+ 
+ // { dg-error "call to non-'constexpr' function" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/empty_spec.cc gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/empty_spec.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/empty_spec.cc	Sun Jun 22 22:34:03 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/empty_spec.cc	Sun Jun 29 22:34:37 2025
*************** test_padding()
*** 77,91 ****
    VERIFY( res == WIDEN("==16 is not a valid month==") );
  }
  
! template<typename Ret = void>
  struct Rep
  {
    using Return
      = std::conditional_t<std::is_void_v<Ret>, Rep, Ret>;
  
!   Rep(long v = 0) : val(v) {}
  
!   operator long() const
    { return val; }
  
    Return
--- 77,94 ----
    VERIFY( res == WIDEN("==16 is not a valid month==") );
  }
  
! template<typename Ret = void, typename Under = long>
  struct Rep
  {
    using Return
      = std::conditional_t<std::is_void_v<Ret>, Rep, Ret>;
  
!   Rep(Under v = 0) : val(v) {}
  
!   template<typename ORet, typename OUnder>
!   Rep(Rep<ORet, OUnder> o) : val(o.val) {}
! 
!   operator Under() const
    { return val; }
  
    Return
*************** struct Rep
*** 119,155 ****
    operator<<(std::basic_ostream<CharT>& os, const Rep& t)
    { return os << t.val << WIDEN("[via <<]"); }
  
!   long val;
  };
  
! template<typename Ret, typename Other>
    requires std::is_integral_v<Other>
! struct std::common_type<Rep<Ret>, Other>
  {
!   using type = Rep<Ret>;
  };
  
! template<typename Ret, typename Other>
    requires std::is_integral_v<Other>
! struct std::common_type<Other, Rep<Ret>>
!   : std::common_type<Rep<Ret>, Other>
  { };
  
! template<typename Ret>
! struct std::numeric_limits<Rep<Ret>>
!   : std::numeric_limits<long>
  { };
  
! template<typename Ret, typename CharT>
! struct std::formatter<Rep<Ret>, CharT>
!   : std::formatter<long, CharT>
  {
    template<typename Out>
    typename std::basic_format_context<Out, CharT>::iterator
    format(const Rep<Ret>& t, std::basic_format_context<Out, CharT>& ctx) const
    {
      constexpr std::basic_string_view<CharT> suffix = WIDEN("[via format]");
!     auto out = std::formatter<long, CharT>::format(t.val, ctx);
      return std::ranges::copy(suffix, out).out;
    }
  };
--- 122,164 ----
    operator<<(std::basic_ostream<CharT>& os, const Rep& t)
    { return os << t.val << WIDEN("[via <<]"); }
  
!   Under val;
  };
  
! template<typename Ret, typename Under1, typename Under2>
! struct std::common_type<Rep<Ret, Under1>, Rep<Ret, Under2>>
! {
!   using type = Rep<Ret, std::common_type_t<Under1, Under2>>;
! };
! 
! template<typename Ret, typename Under, typename Other>
    requires std::is_integral_v<Other>
! struct std::common_type<Rep<Ret, Under>, Other>
  {
!   using type = Rep<Ret, std::common_type_t<Under, Other>>;
  };
  
! template<typename Ret, typename Under, typename Other>
    requires std::is_integral_v<Other>
! struct std::common_type<Other, Rep<Ret, Under>>
!   : std::common_type<Rep<Ret, Under>, Other>
  { };
  
! template<typename Ret, typename Under>
! struct std::numeric_limits<Rep<Ret, Under>>
!   : std::numeric_limits<Under>
  { };
  
! template<typename Ret, typename Under, typename CharT>
! struct std::formatter<Rep<Ret, Under>, CharT>
!   : std::formatter<Under, CharT>
  {
    template<typename Out>
    typename std::basic_format_context<Out, CharT>::iterator
    format(const Rep<Ret>& t, std::basic_format_context<Out, CharT>& ctx) const
    {
      constexpr std::basic_string_view<CharT> suffix = WIDEN("[via format]");
!     auto out = std::formatter<Under, CharT>::format(t.val, ctx);
      return std::ranges::copy(suffix, out).out;
    }
  };
*************** test_hh_mm_ss_cust()
*** 355,384 ****
    // +plus returns long, so formatted as long
    const duration<Rep<long>, std::milli> asLong(dt.count());
    verify( hms<milliseconds>(asLong),
! 	  WIDEN("22:24:54.123[via format]") );
    verify( hms<deciseconds>(asLong),
! 	  WIDEN("22:24:54.1[via format]") );
    verify( hms<seconds>(asLong),
  	  WIDEN("22:24:54") );
    verify( hms<milliseconds>(-asLong),
! 	  WIDEN("-22:24:54.123[via format]") );
    verify( hms<deciseconds>(-asLong),
! 	  WIDEN("-22:24:54.1[via format]") );
    verify( hms<seconds>(-asLong),
  	  WIDEN("-22:24:54") );
  
    // +asRep returns Rep<>, so formatted as Rep<>
    const duration<Rep<>, std::milli> asRep(dt.count());
    verify( hms<milliseconds>(asRep),
! 	  WIDEN("22:24:54.123[via format]") );
    verify( hms<deciseconds>(asRep),
! 	  WIDEN("22:24:54.1[via format]") );
    verify( hms<seconds>(asLong),
  	  WIDEN("22:24:54") );
    verify( hms<milliseconds>(-asLong),
! 	  WIDEN("-22:24:54.123[via format]") );
    verify( hms<deciseconds>(-asLong),
! 	  WIDEN("-22:24:54.1[via format]") );
    verify( hms<seconds>(-asLong),
  	  WIDEN("-22:24:54") );
  }
--- 364,393 ----
    // +plus returns long, so formatted as long
    const duration<Rep<long>, std::milli> asLong(dt.count());
    verify( hms<milliseconds>(asLong),
! 	  WIDEN("22:24:54.123") );
    verify( hms<deciseconds>(asLong),
! 	  WIDEN("22:24:54.1") );
    verify( hms<seconds>(asLong),
  	  WIDEN("22:24:54") );
    verify( hms<milliseconds>(-asLong),
! 	  WIDEN("-22:24:54.123") );
    verify( hms<deciseconds>(-asLong),
! 	  WIDEN("-22:24:54.1") );
    verify( hms<seconds>(-asLong),
  	  WIDEN("-22:24:54") );
  
    // +asRep returns Rep<>, so formatted as Rep<>
    const duration<Rep<>, std::milli> asRep(dt.count());
    verify( hms<milliseconds>(asRep),
! 	  WIDEN("22:24:54.123") );
    verify( hms<deciseconds>(asRep),
! 	  WIDEN("22:24:54.1") );
    verify( hms<seconds>(asLong),
  	  WIDEN("22:24:54") );
    verify( hms<milliseconds>(-asLong),
! 	  WIDEN("-22:24:54.123") );
    verify( hms<deciseconds>(-asLong),
! 	  WIDEN("-22:24:54.1") );
    verify( hms<seconds>(-asLong),
  	  WIDEN("-22:24:54") );
  }
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/precision.cc gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/precision.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/std/time/format/precision.cc	Sun Jun 22 22:34:03 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/std/time/format/precision.cc	Sun Jun 29 22:34:37 2025
*************** test_empty()
*** 16,21 ****
--- 16,25 ----
    std::basic_string<CharT> res;
  
    const duration<double> d(33.111222);
+   res = std::format(WIDEN("{:}"), d);
+   VERIFY( res == WIDEN("33.1112s") );
+   res = std::format(WIDEN("{:.0}"), d);
+   VERIFY( res == WIDEN("33.1112s") );
    res = std::format(WIDEN("{:.3}"), d);
    VERIFY( res == WIDEN("33.1112s") );
    res = std::format(WIDEN("{:.6}"), d);
*************** test_empty()
*** 25,30 ****
--- 29,38 ----
  
    // Uses ostream operator<<
    const duration<double, std::nano> nd = d;
+   res = std::format(WIDEN("{:}"), nd);
+   VERIFY( res == WIDEN("3.31112e+10ns") );
+   res = std::format(WIDEN("{:.0}"), nd);
+   VERIFY( res == WIDEN("3.31112e+10ns") );
    res = std::format(WIDEN("{:.3}"), nd);
    VERIFY( res == WIDEN("3.31112e+10ns") );
    res = std::format(WIDEN("{:.6}"), nd);
*************** test_Q()
*** 40,45 ****
--- 48,57 ----
    std::basic_string<CharT> res;
  
    const duration<double> d(7.111222);
+   res = std::format(WIDEN("{:%Q}"), d);
+   VERIFY( res == WIDEN("7.111222") );
+   res = std::format(WIDEN("{:.0%Q}"), d);
+   VERIFY( res == WIDEN("7.111222") );
    res = std::format(WIDEN("{:.3%Q}"), d);
    VERIFY( res == WIDEN("7.111222") );
    res = std::format(WIDEN("{:.6%Q}"), d);
*************** test_Q()
*** 47,53 ****
--- 59,81 ----
    res = std::format(WIDEN("{:.9%Q}"), d);
    VERIFY( res == WIDEN("7.111222") );
  
+   duration<double, std::milli> md = d;
+   res = std::format(WIDEN("{:%Q}"), md);
+   VERIFY( res == WIDEN("7111.222") );
+   res = std::format(WIDEN("{:.0%Q}"), md);
+   VERIFY( res == WIDEN("7111.222") );
+   res = std::format(WIDEN("{:.3%Q}"), md);
+   VERIFY( res == WIDEN("7111.222") );
+   res = std::format(WIDEN("{:.6%Q}"), md);
+   VERIFY( res == WIDEN("7111.222") );
+   res = std::format(WIDEN("{:.9%Q}"), md);
+   VERIFY( res == WIDEN("7111.222") );
+ 
    const duration<double, std::nano> nd = d;
+   res = std::format(WIDEN("{:%Q}"), nd);
+   VERIFY( res == WIDEN("7111222000") );
+   res = std::format(WIDEN("{:.0%Q}"), nd);
+   VERIFY( res == WIDEN("7111222000") );
    res = std::format(WIDEN("{:.3%Q}"), nd);
    VERIFY( res == WIDEN("7111222000") );
    res = std::format(WIDEN("{:.6%Q}"), nd);
*************** test_Q()
*** 58,69 ****
  
  template<typename CharT>
  void
! test_S()
  {
    std::basic_string<CharT> res;
  
    // Precision is ignored, but period affects output
!   const duration<double> d(5.111222);
    res = std::format(WIDEN("{:.3%S}"), d);
    VERIFY( res == WIDEN("05") );
    res = std::format(WIDEN("{:.6%S}"), d);
--- 86,101 ----
  
  template<typename CharT>
  void
! test_S_fp()
  {
    std::basic_string<CharT> res;
  
    // Precision is ignored, but period affects output
!   duration<double> d(5.111222);
!   res = std::format(WIDEN("{:%S}"), d);
!   VERIFY( res == WIDEN("05") );
!   res = std::format(WIDEN("{:.0%S}"), d);
!   VERIFY( res == WIDEN("05") );
    res = std::format(WIDEN("{:.3%S}"), d);
    VERIFY( res == WIDEN("05") );
    res = std::format(WIDEN("{:.6%S}"), d);
*************** test_S()
*** 71,77 ****
    res = std::format(WIDEN("{:.9%S}"), d);
    VERIFY( res == WIDEN("05") );
  
!   const duration<double, std::milli> md = d;
    res = std::format(WIDEN("{:.3%S}"), md);
    VERIFY( res == WIDEN("05.111") );
    res = std::format(WIDEN("{:.6%S}"), md);
--- 103,113 ----
    res = std::format(WIDEN("{:.9%S}"), d);
    VERIFY( res == WIDEN("05") );
  
!   duration<double, std::milli> md = d;
!   res = std::format(WIDEN("{:%S}"), md);
!   VERIFY( res == WIDEN("05.111") );
!   res = std::format(WIDEN("{:.0%S}"), md);
!   VERIFY( res == WIDEN("05.111") );
    res = std::format(WIDEN("{:.3%S}"), md);
    VERIFY( res == WIDEN("05.111") );
    res = std::format(WIDEN("{:.6%S}"), md);
*************** test_S()
*** 79,91 ****
    res = std::format(WIDEN("{:.9%S}"), md);
    VERIFY( res == WIDEN("05.111") );
  
!   const duration<double, std::nano> nd = d;
    res = std::format(WIDEN("{:.3%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
    res = std::format(WIDEN("{:.6%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
    res = std::format(WIDEN("{:.9%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
  }
  
  template<typename CharT>
--- 115,184 ----
    res = std::format(WIDEN("{:.9%S}"), md);
    VERIFY( res == WIDEN("05.111") );
  
!   duration<double, std::micro> ud = d;
!   res = std::format(WIDEN("{:%S}"), ud);
!   VERIFY( res == WIDEN("05.111222") );
!   res = std::format(WIDEN("{:.0%S}"), ud);
!   VERIFY( res == WIDEN("05.111222") );
!   res = std::format(WIDEN("{:.3%S}"), ud);
!   VERIFY( res == WIDEN("05.111222") );
!   res = std::format(WIDEN("{:.6%S}"), ud);
!   VERIFY( res == WIDEN("05.111222") );
!   res = std::format(WIDEN("{:.9%S}"), ud);
!   VERIFY( res == WIDEN("05.111222") );
! 
!   duration<double, std::nano> nd = d;
!   res = std::format(WIDEN("{:%S}"), nd);
!   VERIFY( res == WIDEN("05.111222000") );
!   res = std::format(WIDEN("{:.0%S}"), nd);
!   VERIFY( res == WIDEN("05.111222000") );
    res = std::format(WIDEN("{:.3%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
    res = std::format(WIDEN("{:.6%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
    res = std::format(WIDEN("{:.9%S}"), nd);
    VERIFY( res == WIDEN("05.111222000") );
+ 
+   duration<double, std::pico> pd = d;
+   res = std::format(WIDEN("{:%S}"), pd);
+   VERIFY( res == WIDEN("05.111222000000") );
+   res = std::format(WIDEN("{:.0%S}"), pd);
+   VERIFY( res == WIDEN("05.111222000000") );
+   res = std::format(WIDEN("{:.3%S}"), pd);
+   VERIFY( res == WIDEN("05.111222000000") );
+   res = std::format(WIDEN("{:.6%S}"), pd);
+   VERIFY( res == WIDEN("05.111222000000") );
+   res = std::format(WIDEN("{:.9%S}"), pd);
+   VERIFY( res == WIDEN("05.111222000000") );
+ }
+ 
+ template<typename CharT>
+ void
+ test_S_int()
+ {
+   std::basic_string<CharT> res;
+   const nanoseconds src(7'000'012'345);
+ 
+   auto d = floor<seconds>(src);
+   res = std::format(WIDEN("{:%S}"), d);
+   VERIFY( res == WIDEN("07") );
+ 
+   auto md = floor<milliseconds>(src);
+   res = std::format(WIDEN("{:%S}"), md);
+   VERIFY( res == WIDEN("07.000") );
+ 
+   auto ud = floor<microseconds>(src);
+   res = std::format(WIDEN("{:%S}"), ud);
+   VERIFY( res == WIDEN("07.000012") );
+ 
+   auto nd = floor<nanoseconds>(src);
+   res = std::format(WIDEN("{:%S}"), nd);
+   VERIFY( res == WIDEN("07.000012345") );
+ 
+   using picoseconds = duration<unsigned long long, std::pico>;
+   auto pd = floor<picoseconds>(src);
+   res = std::format(WIDEN("{:%S}"), pd);
+   VERIFY( res == WIDEN("07.000012345000") );
  }
  
  template<typename CharT>
*************** test_all()
*** 94,100 ****
  {
    test_empty<CharT>();
    test_Q<CharT>();
!   test_S<CharT>();
  }
  
  int main()
--- 187,194 ----
  {
    test_empty<CharT>();
    test_Q<CharT>();
!   test_S_int<CharT>();
!   test_S_fp<CharT>();
  }
  
  int main()
diff -Nrcpad gcc-16-20250622/libstdc++-v3/testsuite/util/testsuite_abi.cc gcc-16-20250629/libstdc++-v3/testsuite/util/testsuite_abi.cc
*** gcc-16-20250622/libstdc++-v3/testsuite/util/testsuite_abi.cc	Sun Jun 22 22:34:04 2025
--- gcc-16-20250629/libstdc++-v3/testsuite/util/testsuite_abi.cc	Sun Jun 29 22:34:37 2025
*************** check_version(symbol& test, bool added)
*** 241,246 ****
--- 241,247 ----
  #ifdef __riscv
        known_versions.push_back("CXXABI_1.3.16");
  #endif
+       known_versions.push_back("CXXABI_1.3.17");
        known_versions.push_back("CXXABI_IEEE128_1.3.13");
        known_versions.push_back("CXXABI_TM_1");
        known_versions.push_back("CXXABI_FLOAT128");
