diff -Nrcpad gcc-13-20250508/LAST_UPDATED gcc-13-20250515/LAST_UPDATED
*** gcc-13-20250508/LAST_UPDATED	Thu May  8 22:33:20 2025
--- gcc-13-20250515/LAST_UPDATED	Thu May 15 22:32:50 2025
***************
*** 1 ****
! Obtained from git: releases/gcc-13 revision 351ac78e48fa897080cf8bbb71618df9c428ad30
--- 1 ----
! Obtained from git: releases/gcc-13 revision 9ad74a57904744418a7319a492a698ddbfb787ca
diff -Nrcpad gcc-13-20250508/MD5SUMS gcc-13-20250515/MD5SUMS
*** gcc-13-20250508/MD5SUMS	Thu May  8 22:33:24 2025
--- gcc-13-20250515/MD5SUMS	Thu May 15 22:32:56 2025
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-13-20250508.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-13-20250515.tar.xz tarball.
  #
  # Besides verifying that all files in the tarball were correctly expanded,
  # it also can be used to determine if any files have changed since the
*************** d32239bcb673463ab874e80d47fae504  COPYIN
*** 21,27 ****
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 8921d9d0267dc2a12c896ca6184f5316  LAST_UPDATED
  81b3330d422f3ce1ef8b720dfae35068  MAINTAINERS
  2b61ddbd876fa839639a7ca551773426  Makefile.def
  5d2d6a74f897f8158d37f5f2ec6877ce  Makefile.in
--- 21,27 ----
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 7a5239ac3e6f720ea7e8fce07bf54ae6  LAST_UPDATED
  81b3330d422f3ce1ef8b720dfae35068  MAINTAINERS
  2b61ddbd876fa839639a7ca551773426  Makefile.def
  5d2d6a74f897f8158d37f5f2ec6877ce  Makefile.in
*************** a22e70b3f29292d0e628450f4bb11e62  fixinc
*** 475,481 ****
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! dbdb2e9d2f397a180b670de0c3e28ebd  gcc/ChangeLog
  a3b63c675afa7a655cc2bfa8a907af79  gcc/ChangeLog-1997
  d9a88529352a010253c2e8fb1ed6023b  gcc/ChangeLog-1998
  240f08f81cb4699e8b49347db38233db  gcc/ChangeLog-1999
--- 475,481 ----
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 80aff61c2644305e6a17a9c99bcb84c7  gcc/ChangeLog
  a3b63c675afa7a655cc2bfa8a907af79  gcc/ChangeLog-1997
  d9a88529352a010253c2e8fb1ed6023b  gcc/ChangeLog-1998
  240f08f81cb4699e8b49347db38233db  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 510,522 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 006143521e459c6c85e18f7f305f58af  gcc/DATESTAMP
  d41d8cd98f00b204e9800998ecf8427e  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  1f93f45664cdb0f660bcb8a952ca6078  gcc/LANGUAGES
! 49f87a7e0f2b3f3730bdd17bfe67af21  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  8c961c26ecaaf1660ca9888b2b0bca59  gcc/README.Portability
  f6d47a542d432aed7e7eaaecb71d3a4c  gcc/acinclude.m4
--- 510,522 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 6ab0746b8823132ea0518ffa8c26715b  gcc/DATESTAMP
  d41d8cd98f00b204e9800998ecf8427e  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  1f93f45664cdb0f660bcb8a952ca6078  gcc/LANGUAGES
! eebb79e2d53445139885768b9e77fc98  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  8c961c26ecaaf1660ca9888b2b0bca59  gcc/README.Portability
  f6d47a542d432aed7e7eaaecb71d3a4c  gcc/acinclude.m4
*************** da68b1c5283ed68c563e46ff6573c10a  gcc/cf
*** 3181,3187 ****
  b69a154b40defaf9e2ab375547199a50  gcc/cgraph.cc
  018a16a4b62363ae44492c72bd779cfa  gcc/cgraph.h
  4adf120975b7f6553fea856b9e4c1622  gcc/cgraphbuild.cc
! e12eced2454a68c176f1d69ad3c515dc  gcc/cgraphclones.cc
  cc69456dd81e60eab5d0dc055bd1d4e4  gcc/cgraphunit.cc
  40601133406a9a11490ce86068a4e987  gcc/cif-code.def
  cf7fe7388be54e205514fd0c3032a455  gcc/collect-utils.cc
--- 3181,3187 ----
  b69a154b40defaf9e2ab375547199a50  gcc/cgraph.cc
  018a16a4b62363ae44492c72bd779cfa  gcc/cgraph.h
  4adf120975b7f6553fea856b9e4c1622  gcc/cgraphbuild.cc
! 0f74e2779559c94f9c0cb9e33873b535  gcc/cgraphclones.cc
  cc69456dd81e60eab5d0dc055bd1d4e4  gcc/cgraphunit.cc
  40601133406a9a11490ce86068a4e987  gcc/cif-code.def
  cf7fe7388be54e205514fd0c3032a455  gcc/collect-utils.cc
*************** de96fdd9da0d4a9bb48655452dc138c2  gcc/co
*** 3300,3306 ****
  7110ab6fb22b0e5dc8f7c105640b73f4  gcc/config/aarch64/aarch64-tune.md
  59a2e50c10aa66ea9757d8594c3cb6dc  gcc/config/aarch64/aarch64-tuning-flags.def
  703c876523c318a07e43cdfe4a0a2bee  gcc/config/aarch64/aarch64-vxworks.h
! 895865b6a5ea36bce581f027d89bab9e  gcc/config/aarch64/aarch64.cc
  8df0eba1e11a7d9dcc4820353ddc6ba5  gcc/config/aarch64/aarch64.h
  a0a174ab1c6d081490ab52ebf1d0bee1  gcc/config/aarch64/aarch64.md
  27b3d58e07a631b044b51b2920e36271  gcc/config/aarch64/aarch64.opt
--- 3300,3306 ----
  7110ab6fb22b0e5dc8f7c105640b73f4  gcc/config/aarch64/aarch64-tune.md
  59a2e50c10aa66ea9757d8594c3cb6dc  gcc/config/aarch64/aarch64-tuning-flags.def
  703c876523c318a07e43cdfe4a0a2bee  gcc/config/aarch64/aarch64-vxworks.h
! d32970a53b05552eadc6493e3657fc9d  gcc/config/aarch64/aarch64.cc
  8df0eba1e11a7d9dcc4820353ddc6ba5  gcc/config/aarch64/aarch64.h
  a0a174ab1c6d081490ab52ebf1d0bee1  gcc/config/aarch64/aarch64.md
  27b3d58e07a631b044b51b2920e36271  gcc/config/aarch64/aarch64.opt
*************** e9b8122841fbfbbc30fee8ed6613c399  gcc/do
*** 5498,5504 ****
  b4c57b64e59441421fbf276de0639649  gcc/doc/install.texi
  0f44cc63abf9b607d1b8880175256326  gcc/doc/install.texi2html
  34b99c10f577dd2da256de717941c862  gcc/doc/interface.texi
! 94abd76659fbaa9ffc0054a41923449b  gcc/doc/invoke.texi
  f64676ceacf4c713f83bad704dbc5eaf  gcc/doc/languages.texi
  e36a87d027eabff1a8595ee341342560  gcc/doc/libgcc.texi
  8b6fb2575a94998971924157a5cabfd8  gcc/doc/loop.texi
--- 5498,5504 ----
  b4c57b64e59441421fbf276de0639649  gcc/doc/install.texi
  0f44cc63abf9b607d1b8880175256326  gcc/doc/install.texi2html
  34b99c10f577dd2da256de717941c862  gcc/doc/interface.texi
! b5fe517d44d3c4b55830c628f692e4c0  gcc/doc/invoke.texi
  f64676ceacf4c713f83bad704dbc5eaf  gcc/doc/languages.texi
  e36a87d027eabff1a8595ee341342560  gcc/doc/libgcc.texi
  8b6fb2575a94998971924157a5cabfd8  gcc/doc/loop.texi
*************** bea216ccfb736c1b9a309ecf9afff70a  gcc/fi
*** 5567,5573 ****
  57947e4060d24d010e8c4dd7ba984127  gcc/file-find.h
  afd42e14b3f2852408195e6a82376326  gcc/file-prefix-map.cc
  cd0af84836966e2df321c3d08905a631  gcc/file-prefix-map.h
! 917ebde63babc279cc2dbdf9ebf5af07  gcc/final.cc
  5ecf2be631b0f86d2248af1c89340d18  gcc/fixed-value.cc
  fe6768163b0ca6c41fea1719448908eb  gcc/fixed-value.h
  20c9ffc1f2abf2ab017b88632fa9f63a  gcc/flag-types.h
--- 5567,5573 ----
  57947e4060d24d010e8c4dd7ba984127  gcc/file-find.h
  afd42e14b3f2852408195e6a82376326  gcc/file-prefix-map.cc
  cd0af84836966e2df321c3d08905a631  gcc/file-prefix-map.h
! f17f6b6aae9854537fcf8702abb390d6  gcc/final.cc
  5ecf2be631b0f86d2248af1c89340d18  gcc/fixed-value.cc
  fe6768163b0ca6c41fea1719448908eb  gcc/fixed-value.h
  20c9ffc1f2abf2ab017b88632fa9f63a  gcc/flag-types.h
*************** a11dc84518ffe22131bef7c5c59fb394  gcc/gi
*** 5780,5787 ****
  cd5746fe031b5d538b360fa10b1d17af  gcc/gimple-range-cache.h
  e9fa223929f8020fb122ede18c383ffa  gcc/gimple-range-edge.cc
  63552731dc609ddfd75542482f4ac3f9  gcc/gimple-range-edge.h
! 026c72667bfbb609f4eb2edd688d7f93  gcc/gimple-range-fold.cc
! 80a33f217a8462e04c962982e13c342f  gcc/gimple-range-fold.h
  630825f89ae6bad2278bb7f7782a3d83  gcc/gimple-range-gori.cc
  83fa369894ed79484edcd88e46e5ff5d  gcc/gimple-range-gori.h
  7b1dc20ba60b4caa74daea9f1f124b18  gcc/gimple-range-infer.cc
--- 5780,5787 ----
  cd5746fe031b5d538b360fa10b1d17af  gcc/gimple-range-cache.h
  e9fa223929f8020fb122ede18c383ffa  gcc/gimple-range-edge.cc
  63552731dc609ddfd75542482f4ac3f9  gcc/gimple-range-edge.h
! e4f0c00a688b3744a867a1aabeee69fb  gcc/gimple-range-fold.cc
! 91c4c0f1e668a1c3844c18cf84d74fce  gcc/gimple-range-fold.h
  630825f89ae6bad2278bb7f7782a3d83  gcc/gimple-range-gori.cc
  83fa369894ed79484edcd88e46e5ff5d  gcc/gimple-range-gori.h
  7b1dc20ba60b4caa74daea9f1f124b18  gcc/gimple-range-infer.cc
*************** e29891d13b0ac2e960cac756204b9b46  gcc/gi
*** 5793,5800 ****
  a03b4f17862e24c25dc27bd52bf6e4c9  gcc/gimple-range-tests.cc
  1d284fef5facc9d3af2d9f27e0a7939b  gcc/gimple-range-trace.cc
  7a8faab9d11d2332278fc21791ee0b3e  gcc/gimple-range-trace.h
! dfa9268a94fe4ee9bba75c8c97f0200d  gcc/gimple-range.cc
! 0976244211621a90be645055605c6daf  gcc/gimple-range.h
  09f02da5a2f5cbc14b2967c94d2c1697  gcc/gimple-ssa-backprop.cc
  8d00f32ff8f171436e955a222205301e  gcc/gimple-ssa-isolate-paths.cc
  749a81e49450342357c075a9b79b8992  gcc/gimple-ssa-nonnull-compare.cc
--- 5793,5800 ----
  a03b4f17862e24c25dc27bd52bf6e4c9  gcc/gimple-range-tests.cc
  1d284fef5facc9d3af2d9f27e0a7939b  gcc/gimple-range-trace.cc
  7a8faab9d11d2332278fc21791ee0b3e  gcc/gimple-range-trace.h
! 5d089e48413b174d906755a37859dc74  gcc/gimple-range.cc
! d3d0bf916b0feeb213e0d274c25a85c9  gcc/gimple-range.h
  09f02da5a2f5cbc14b2967c94d2c1697  gcc/gimple-ssa-backprop.cc
  8d00f32ff8f171436e955a222205301e  gcc/gimple-ssa-isolate-paths.cc
  749a81e49450342357c075a9b79b8992  gcc/gimple-ssa-nonnull-compare.cc
*************** b829ed0032c899e107be2db349c913f3  gcc/ta
*** 7637,7643 ****
  811da275a2b9d3186a6decf96c01b0ed  gcc/targhooks.cc
  edb193a32070c4a7626fb75382def9b9  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! b967e5955a4a6559dad7ab9782326062  gcc/testsuite/ChangeLog
  862f04afbd87da2cc6bc432c3f28430f  gcc/testsuite/ChangeLog-1993-2007
  029a5d8dacd25eb5d4711452ac448e5b  gcc/testsuite/ChangeLog-2008
  13ac28c41d51b66b4ec40dba6bd50f39  gcc/testsuite/ChangeLog-2009
--- 7637,7643 ----
  811da275a2b9d3186a6decf96c01b0ed  gcc/targhooks.cc
  edb193a32070c4a7626fb75382def9b9  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! 108ad75a7ef3dbf07e605b50dcf64589  gcc/testsuite/ChangeLog
  862f04afbd87da2cc6bc432c3f28430f  gcc/testsuite/ChangeLog-1993-2007
  029a5d8dacd25eb5d4711452ac448e5b  gcc/testsuite/ChangeLog-2008
  13ac28c41d51b66b4ec40dba6bd50f39  gcc/testsuite/ChangeLog-2009
*************** db740268984e13059571b37af26229f7  gcc/te
*** 18092,18097 ****
--- 18092,18098 ----
  5300ced02ead4880cbff47e1d6373999  gcc/testsuite/g++.dg/cpp23/normalize5.C
  8125bd59f190ca2bccecdec26bb94127  gcc/testsuite/g++.dg/cpp23/normalize6.C
  ef7d7c0e26159c8de94fcb3f8aeb2c11  gcc/testsuite/g++.dg/cpp23/normalize7.C
+ 1559cfc237c4cd0b5a977e0a3e97dcef  gcc/testsuite/g++.dg/cpp23/pr117287-attr.C
  5fe66da6d2baee159060686defa0e47e  gcc/testsuite/g++.dg/cpp23/size_t-literals.C
  15ad584a4607eb422fa274d5aec5df69  gcc/testsuite/g++.dg/cpp23/static-operator-call1.C
  2fcd37e13aa3cc9c26d3a3e7d923dbab  gcc/testsuite/g++.dg/cpp23/static-operator-call2.C
*************** e8eff4c0ef885b002db007e536bb99f2  gcc/te
*** 27498,27503 ****
--- 27499,27505 ----
  25af1620df0107cd03f275ddc7fd98b6  gcc/testsuite/g++.dg/torture/pr111465.C
  f5cb8caa482838045861d5ee18445814  gcc/testsuite/g++.dg/torture/pr113896.C
  ef666186552a9562e70783bbdf98ac33  gcc/testsuite/g++.dg/torture/pr115694.C
+ 9df51f0b5a7e716286f2e97dfd28d477  gcc/testsuite/g++.dg/torture/pr119610.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
*************** f3ce91773bd0b4a3127c481ccd50f20e  gcc/te
*** 32828,32833 ****
--- 32830,32836 ----
  ab6c5e333d0a740ae5ecff69966813a2  gcc/testsuite/g++.target/aarch64/sve/min_1.C
  6bb662ee32d75fad86cbbcc07aab9998  gcc/testsuite/g++.target/aarch64/sve/pr102252.C
  0dc60096927b240a4fb696311ad6b402  gcc/testsuite/g++.target/aarch64/sve/pr107920.C
+ a36c6629cdaa92f5a41aa0c862cf5a54  gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C
  29fcc7f7695fcab2e4779698100f3053  gcc/testsuite/g++.target/aarch64/sve/pr96974.C
  6c0e94c363caf9e62df35ea98b4918ed  gcc/testsuite/g++.target/aarch64/sve/pr98177-1.C
  e64000c150bb204c31dca884ee33dd4f  gcc/testsuite/g++.target/aarch64/sve/pr98177-2.C
*************** c9d7810fb25abff9e36f2472a26b7432  gcc/te
*** 36350,36355 ****
--- 36353,36359 ----
  70ba48592053a7f5813dc5b2438d1c9d  gcc/testsuite/gcc.c-torture/execute/pr115033.c
  5ddda4b8eb54ab388a566dc4456abe06  gcc/testsuite/gcc.c-torture/execute/pr117095.c
  ff6bb4fb6706fea0c26d717754a6569c  gcc/testsuite/gcc.c-torture/execute/pr117432.c
+ 5ea8b1886f746d04f95ef6475b79bbac  gcc/testsuite/gcc.c-torture/execute/pr117498.c
  5802f1a3b7f07033d3e5c9e6bc333779  gcc/testsuite/gcc.c-torture/execute/pr118915.c
  fd7185346c3b94c0a7f7afba7b6bc241  gcc/testsuite/gcc.c-torture/execute/pr119071.c
  b7150a91a8e64c0a2f8d47a9f857fd6e  gcc/testsuite/gcc.c-torture/execute/pr119291.c
*************** b70865b06d221ed2025f4fc757d9e20a  gcc/te
*** 43117,43122 ****
--- 43121,43127 ----
  f741ddb64786110b58c8991c33d44c79  gcc/testsuite/gcc.dg/ipa/pr111571.c
  6cadebd8b42bda8557c5814d0103a2fa  gcc/testsuite/gcc.dg/ipa/pr112616.c
  b7a69609ea582386c302afd514d8e233  gcc/testsuite/gcc.dg/ipa/pr114247.c
+ e39432b4ae7797e55b13f6d2fd29a4a6  gcc/testsuite/gcc.dg/ipa/pr119852.c
  40bd41302666d56c4edf7330db97920e  gcc/testsuite/gcc.dg/ipa/pr42706.c
  e4887053c792f4f78b03804c148839ce  gcc/testsuite/gcc.dg/ipa/pr45644.c
  6e1b4f2c5d0c0d768778da8e3b7df828  gcc/testsuite/gcc.dg/ipa/pr48195.c
*************** f94e7e93a949cf8bbb4daed6f2adcefe  gcc/tr
*** 100342,100347 ****
--- 100347,100353 ----
  41f165f234cc64d36b07d87290ce6d0a  gcc/trans-mem.h
  08f249c7fa2dbee7c097b1ee10aca886  gcc/tree-affine.cc
  af4dad4e7c08b9fb38895d9d5c6480a5  gcc/tree-affine.h
+ 58ecb6d9b62baf05e7298fc077e53e01  gcc/tree-assume.cc
  7917044c19ad94d1944a953647469ac9  gcc/tree-call-cdce.cc
  52b912862453c1b9940486ad40517d7a  gcc/tree-cfg.cc
  2921805a6732bc91a8722618d4189584  gcc/tree-cfg.h
*************** cd908450e118b05ca187c7712f7fdbbb  gcc/tr
*** 100485,100491 ****
  672861a6f3b4ede253a47c708e10856d  gcc/tree-vector-builder.h
  ca7a666858d4e46dfb08e1e6932bb5f4  gcc/tree-vectorizer.cc
  273e2d8b40a81cd971fbfbf62d964bfa  gcc/tree-vectorizer.h
! 77cb16f595a988710bcea28078cf75a3  gcc/tree-vrp.cc
  1506b4121fe3a1f91b7dce7fd11903b1  gcc/tree-vrp.h
  cf071e7cb5ad16b6a14bede98d4c0aa5  gcc/tree.cc
  90cbee0521eed701cdda38cb80c79c9a  gcc/tree.def
--- 100491,100497 ----
  672861a6f3b4ede253a47c708e10856d  gcc/tree-vector-builder.h
  ca7a666858d4e46dfb08e1e6932bb5f4  gcc/tree-vectorizer.cc
  273e2d8b40a81cd971fbfbf62d964bfa  gcc/tree-vectorizer.h
! bc72028fa27951bff9394d746764fc75  gcc/tree-vrp.cc
  1506b4121fe3a1f91b7dce7fd11903b1  gcc/tree-vrp.h
  cf071e7cb5ad16b6a14bede98d4c0aa5  gcc/tree.cc
  90cbee0521eed701cdda38cb80c79c9a  gcc/tree.def
*************** dcdcea9380167bc0fc31fbcc9ae7cd70  libgo/
*** 105607,105620 ****
  1e4c9666f505813e54ed2b3d4056d2f8  libgo/go/crypto/tls/example_test.go
  6c121e7342c13fdc786312f66d8dbb99  libgo/go/crypto/tls/generate_cert.go
  92c22ddf04bfc1134e9ce858e4fe63d1  libgo/go/crypto/tls/handshake_client.go
! b1c3932241580b99b951fae0edb61fd8  libgo/go/crypto/tls/handshake_client_test.go
  0427ef397843c02f3be96cfacd0f14a3  libgo/go/crypto/tls/handshake_client_tls13.go
  46b69f2680156d5e71cb8c6ae2343e94  libgo/go/crypto/tls/handshake_messages.go
  0945ccb0c15b2deb95d8ca2b33b0ea54  libgo/go/crypto/tls/handshake_messages_test.go
  5acf20b462aafc7a101527ee55f5c865  libgo/go/crypto/tls/handshake_server.go
! 2b8b5b21bf0ce23f0cc1267b74babf93  libgo/go/crypto/tls/handshake_server_test.go
  4de3e07cdf2105cfcbfc08e792804987  libgo/go/crypto/tls/handshake_server_tls13.go
! b064ac2d0b92b42852f6ecd68366b46d  libgo/go/crypto/tls/handshake_test.go
  9a32a638fe102dd2d9c10bdc7fea9e5e  libgo/go/crypto/tls/handshake_unix_test.go
  a7f68e8d2ee39cb8a707a0e0eba8ca47  libgo/go/crypto/tls/key_agreement.go
  aa7a95034a03be2806fa57040be5dc21  libgo/go/crypto/tls/key_schedule.go
--- 105613,105626 ----
  1e4c9666f505813e54ed2b3d4056d2f8  libgo/go/crypto/tls/example_test.go
  6c121e7342c13fdc786312f66d8dbb99  libgo/go/crypto/tls/generate_cert.go
  92c22ddf04bfc1134e9ce858e4fe63d1  libgo/go/crypto/tls/handshake_client.go
! f76251738608d414afc6c3f485ba35a8  libgo/go/crypto/tls/handshake_client_test.go
  0427ef397843c02f3be96cfacd0f14a3  libgo/go/crypto/tls/handshake_client_tls13.go
  46b69f2680156d5e71cb8c6ae2343e94  libgo/go/crypto/tls/handshake_messages.go
  0945ccb0c15b2deb95d8ca2b33b0ea54  libgo/go/crypto/tls/handshake_messages_test.go
  5acf20b462aafc7a101527ee55f5c865  libgo/go/crypto/tls/handshake_server.go
! 20c613e2c2699d3c223d49f0ca1b8984  libgo/go/crypto/tls/handshake_server_test.go
  4de3e07cdf2105cfcbfc08e792804987  libgo/go/crypto/tls/handshake_server_tls13.go
! 6a407d52ecada2de1da0168e7271f0c0  libgo/go/crypto/tls/handshake_test.go
  9a32a638fe102dd2d9c10bdc7fea9e5e  libgo/go/crypto/tls/handshake_unix_test.go
  a7f68e8d2ee39cb8a707a0e0eba8ca47  libgo/go/crypto/tls/key_agreement.go
  aa7a95034a03be2806fa57040be5dc21  libgo/go/crypto/tls/key_schedule.go
*************** d6a3256a046d57feca0ff021235c9ede  libgo/
*** 105745,105751 ****
  e2ec9bd8f6f42c104c048bb324bf00d7  libgo/go/crypto/tls/testdata/example-key.pem
  e0281d4b0d8067540dc185550b995938  libgo/go/crypto/tls/ticket.go
  fb39d36797992586f3178188718b0c36  libgo/go/crypto/tls/tls.go
! 7f2c0871f5c00a0aeaa3fad129d50796  libgo/go/crypto/tls/tls_test.go
  fee50745a618969de6971115cea99c5b  libgo/go/crypto/x509/cert_pool.go
  6ba0dbba8fd8e3ffecd7972e85cfdc83  libgo/go/crypto/x509/hybrid_pool_test.go
  7fc12e96e70223731b3f6723c759bcee  libgo/go/crypto/x509/name_constraints_test.go
--- 105751,105757 ----
  e2ec9bd8f6f42c104c048bb324bf00d7  libgo/go/crypto/tls/testdata/example-key.pem
  e0281d4b0d8067540dc185550b995938  libgo/go/crypto/tls/ticket.go
  fb39d36797992586f3178188718b0c36  libgo/go/crypto/tls/tls.go
! bdd3816b98bd07ab38ad8cfdfc5ac82b  libgo/go/crypto/tls/tls_test.go
  fee50745a618969de6971115cea99c5b  libgo/go/crypto/x509/cert_pool.go
  6ba0dbba8fd8e3ffecd7972e85cfdc83  libgo/go/crypto/x509/hybrid_pool_test.go
  7fc12e96e70223731b3f6723c759bcee  libgo/go/crypto/x509/name_constraints_test.go
*************** c265574887f4390ecccd1073ee5c0190  libssp
*** 113434,113440 ****
  02470b541ab713bd1bfb8e6787e65f2c  libssp/strncpy-chk.c
  8a7a0719ef45cb3ae0041192eac8d550  libssp/vsnprintf-chk.c
  d662ba7536e1bd06226d47b1a7f1f4e2  libssp/vsprintf-chk.c
! aec723bd2836f4dc325f80b119d1c07f  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 113440,113446 ----
  02470b541ab713bd1bfb8e6787e65f2c  libssp/strncpy-chk.c
  8a7a0719ef45cb3ae0041192eac8d550  libssp/vsnprintf-chk.c
  d662ba7536e1bd06226d47b1a7f1f4e2  libssp/vsprintf-chk.c
! b5fb425d5fa8f883df7a473422082ba3  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** ffceba0f3c20f451f9753c101c0fa634  libstd
*** 113836,113842 ****
  01c6fb78afa342def6da44376b90a890  libstdc++-v3/doc/html/manual/source_code_style.html
  f875f3f4cddfe4fee6aff2308ccb4563  libstdc++-v3/doc/html/manual/source_design_notes.html
  391422dd4f4cdbd4d764a952a0f345e6  libstdc++-v3/doc/html/manual/source_organization.html
! 272b42a4dc92f3cb25c0a22c5decd562  libstdc++-v3/doc/html/manual/status.html
  ea0c531c09fa230f346f8ba700961e4a  libstdc++-v3/doc/html/manual/std_contents.html
  dbb5f81a9e8864374fbb835eaa4e8b0d  libstdc++-v3/doc/html/manual/streambufs.html
  99d2fb8d1299bbdeefb3417992bcd322  libstdc++-v3/doc/html/manual/strings.html
--- 113842,113848 ----
  01c6fb78afa342def6da44376b90a890  libstdc++-v3/doc/html/manual/source_code_style.html
  f875f3f4cddfe4fee6aff2308ccb4563  libstdc++-v3/doc/html/manual/source_design_notes.html
  391422dd4f4cdbd4d764a952a0f345e6  libstdc++-v3/doc/html/manual/source_organization.html
! 7810b58abc912971d66aae870302da12  libstdc++-v3/doc/html/manual/status.html
  ea0c531c09fa230f346f8ba700961e4a  libstdc++-v3/doc/html/manual/std_contents.html
  dbb5f81a9e8864374fbb835eaa4e8b0d  libstdc++-v3/doc/html/manual/streambufs.html
  99d2fb8d1299bbdeefb3417992bcd322  libstdc++-v3/doc/html/manual/strings.html
*************** d7f222c42325cd44eadad2c59eef7e6f  libstd
*** 114083,114089 ****
  4f70307aa2cb0ee63e0118644ca335f7  libstdc++-v3/doc/xml/manual/status_cxx2014.xml
  7497dc124fde2f4f2c9ec52524ddd874  libstdc++-v3/doc/xml/manual/status_cxx2017.xml
  2b8d7fa4458f9cef741ce5f3a1ea20c2  libstdc++-v3/doc/xml/manual/status_cxx2020.xml
! 81a55f3f8e9f280c79ce3059134011f4  libstdc++-v3/doc/xml/manual/status_cxx2023.xml
  e12241b98a6c1e835b7b1d1bb31761ca  libstdc++-v3/doc/xml/manual/status_cxxis29124.xml
  4bd1d4baf604762339c18293f55fea6a  libstdc++-v3/doc/xml/manual/status_cxxtr1.xml
  69ef1453c4992cd33717252bf276663e  libstdc++-v3/doc/xml/manual/status_cxxtr24733.xml
--- 114089,114095 ----
  4f70307aa2cb0ee63e0118644ca335f7  libstdc++-v3/doc/xml/manual/status_cxx2014.xml
  7497dc124fde2f4f2c9ec52524ddd874  libstdc++-v3/doc/xml/manual/status_cxx2017.xml
  2b8d7fa4458f9cef741ce5f3a1ea20c2  libstdc++-v3/doc/xml/manual/status_cxx2020.xml
! 978a702dd6ecf22eddec8319d1845acb  libstdc++-v3/doc/xml/manual/status_cxx2023.xml
  e12241b98a6c1e835b7b1d1bb31761ca  libstdc++-v3/doc/xml/manual/status_cxxis29124.xml
  4bd1d4baf604762339c18293f55fea6a  libstdc++-v3/doc/xml/manual/status_cxxtr1.xml
  69ef1453c4992cd33717252bf276663e  libstdc++-v3/doc/xml/manual/status_cxxtr24733.xml
diff -Nrcpad gcc-13-20250508/gcc/ChangeLog gcc-13-20250515/gcc/ChangeLog
*** gcc-13-20250508/gcc/ChangeLog	Thu May  8 22:32:13 2025
--- gcc-13-20250515/gcc/ChangeLog	Thu May 15 22:32:07 2025
***************
*** 1,3 ****
--- 1,42 ----
+ 2025-05-13  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	Backported from master:
+ 	2025-05-06  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/119852
+ 	* cgraphclones.cc (dump_callgraph_transformation): Document the
+ 	function.  Do not dump if suffix is NULL.
+ 
+ 2025-05-13  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	Backported from master:
+ 	2025-05-06  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	* doc/invoke.texi (Developer Options): Document -fdump-ipa-clones.
+ 
+ 2025-05-12  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	Backported from master:
+ 	2025-01-12  Andrew Pinski  <quic_apinski@quicinc.com>
+ 
+ 	PR middle-end/118411
+ 	* final.cc (get_attr_length_1): Handle asm for CALL_INSN
+ 	and JUMP_INSNs.
+ 
+ 2025-05-09  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	Backported from master:
+ 	2025-04-24  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR target/119610
+ 	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
+ 	Add a bytes_below_sp parameter and use it to calculate the CFA
+ 	offsets.  Attach the first SVE CFA note to the move into the
+ 	associated temporary register.
+ 	(aarch64_allocate_and_probe_stack_space): Update calls accordingly.
+ 	Start out with bytes_per_sp set to the frame size and decrement
+ 	it after each allocation.
+ 
  2025-05-07  Richard Biener  <rguenther@suse.de>
  
  	Backported from master:
diff -Nrcpad gcc-13-20250508/gcc/DATESTAMP gcc-13-20250515/gcc/DATESTAMP
*** gcc-13-20250508/gcc/DATESTAMP	Thu May  8 22:32:13 2025
--- gcc-13-20250515/gcc/DATESTAMP	Thu May 15 22:32:07 2025
***************
*** 1 ****
! 20250508
--- 1 ----
! 20250515
diff -Nrcpad gcc-13-20250508/gcc/Makefile.in gcc-13-20250515/gcc/Makefile.in
*** gcc-13-20250508/gcc/Makefile.in	Thu May  8 22:32:13 2025
--- gcc-13-20250515/gcc/Makefile.in	Thu May 15 22:32:07 2025
*************** OBJS = \
*** 1633,1638 ****
--- 1633,1639 ----
  	ubsan.o \
  	sanopt.o \
  	sancov.o \
+ 	tree-assume.o \
  	tree-call-cdce.o \
  	tree-cfg.o \
  	tree-cfgcleanup.o \
diff -Nrcpad gcc-13-20250508/gcc/cgraphclones.cc gcc-13-20250515/gcc/cgraphclones.cc
*** gcc-13-20250508/gcc/cgraphclones.cc	Thu May  8 22:32:14 2025
--- gcc-13-20250515/gcc/cgraphclones.cc	Thu May 15 22:32:08 2025
*************** cgraph_node::expand_all_artificial_thunk
*** 304,315 ****
        e = e->next_caller;
  }
  
  void
  dump_callgraph_transformation (const cgraph_node *original,
  			       const cgraph_node *clone,
  			       const char *suffix)
  {
!   if (symtab->ipa_clones_dump_file)
      {
        fprintf (symtab->ipa_clones_dump_file,
  	       "Callgraph clone;%s;%d;%s;%d;%d;%s;%d;%s;%d;%d;%s\n",
--- 304,323 ----
        e = e->next_caller;
  }
  
+ /* Dump information about creation of a call graph node clone to the dump file
+    created by the -fdump-ipa-clones option.  ORIGINAL is the function being
+    cloned, CLONE is the new clone.  SUFFIX is a string that helps identify the
+    reason for cloning, often it is the suffix used by a particular IPA pass to
+    create unique function names.  SUFFIX can be NULL and in that case the
+    dumping will not take place, which must be the case only for helper clones
+    which will never be emitted to the output.  */
+ 
  void
  dump_callgraph_transformation (const cgraph_node *original,
  			       const cgraph_node *clone,
  			       const char *suffix)
  {
!   if (suffix && symtab->ipa_clones_dump_file)
      {
        fprintf (symtab->ipa_clones_dump_file,
  	       "Callgraph clone;%s;%d;%s;%d;%d;%s;%d;%s;%d;%d;%s\n",
diff -Nrcpad gcc-13-20250508/gcc/config/aarch64/aarch64.cc gcc-13-20250515/gcc/config/aarch64/aarch64.cc
*** gcc-13-20250508/gcc/config/aarch64/aarch64.cc	Thu May  8 22:32:14 2025
--- gcc-13-20250515/gcc/config/aarch64/aarch64.cc	Thu May 15 22:32:08 2025
*************** aarch64_stack_clash_protection_alloca_pr
*** 9707,9719 ****
  
  
  /* Allocate POLY_SIZE bytes of stack space using TEMP1 and TEMP2 as scratch
!    registers.  If POLY_SIZE is not large enough to require a probe this function
!    will only adjust the stack.  When allocating the stack space
!    FRAME_RELATED_P is then used to indicate if the allocation is frame related.
!    FINAL_ADJUSTMENT_P indicates whether we are allocating the area below
!    the saved registers.  If we are then we ensure that any allocation
!    larger than the ABI defined buffer needs a probe so that the
!    invariant of having a 1KB buffer is maintained.
  
     We emit barriers after each stack adjustment to prevent optimizations from
     breaking the invariant that we never drop the stack more than a page.  This
--- 9707,9722 ----
  
  
  /* Allocate POLY_SIZE bytes of stack space using TEMP1 and TEMP2 as scratch
!    registers, given that the stack pointer is currently BYTES_BELOW_SP bytes
!    above the bottom of the static frame.
! 
!    If POLY_SIZE is not large enough to require a probe this function will only
!    adjust the stack.  When allocating the stack space FRAME_RELATED_P is then
!    used to indicate if the allocation is frame related.  FINAL_ADJUSTMENT_P
!    indicates whether we are allocating the area below the saved registers.
!    If we are then we ensure that any allocation larger than the ABI defined
!    buffer needs a probe so that the invariant of having a 1KB buffer is
!    maintained.
  
     We emit barriers after each stack adjustment to prevent optimizations from
     breaking the invariant that we never drop the stack more than a page.  This
*************** aarch64_stack_clash_protection_alloca_pr
*** 9726,9731 ****
--- 9729,9735 ----
  static void
  aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
  					poly_int64 poly_size,
+ 					poly_int64 bytes_below_sp,
  					bool frame_related_p,
  					bool final_adjustment_p)
  {
*************** aarch64_allocate_and_probe_stack_space (
*** 9786,9793 ****
        aarch64_add_offset (Pmode, temp1, CONST0_RTX (Pmode),
  			  poly_size, temp1, temp2, false, true);
  
!       rtx_insn *insn = get_last_insn ();
! 
        if (frame_related_p)
  	{
  	  /* This is done to provide unwinding information for the stack
--- 9790,9797 ----
        aarch64_add_offset (Pmode, temp1, CONST0_RTX (Pmode),
  			  poly_size, temp1, temp2, false, true);
  
!       auto initial_cfa_offset = frame.frame_size - bytes_below_sp;
!       auto final_cfa_offset = initial_cfa_offset + poly_size;
        if (frame_related_p)
  	{
  	  /* This is done to provide unwinding information for the stack
*************** aarch64_allocate_and_probe_stack_space (
*** 9797,9824 ****
  	     The tie will expand to nothing but the optimizers will not touch
  	     the instruction.  */
  	  rtx stack_ptr_copy = gen_rtx_REG (Pmode, STACK_CLASH_SVE_CFA_REGNUM);
! 	  emit_move_insn (stack_ptr_copy, stack_pointer_rtx);
  	  emit_insn (gen_stack_tie (stack_ptr_copy, stack_pointer_rtx));
  
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
! 	  add_reg_note (insn, REG_CFA_DEF_CFA, stack_ptr_copy);
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
        rtx probe_const = gen_int_mode (min_probe_threshold, Pmode);
        rtx guard_const = gen_int_mode (guard_size, Pmode);
  
!       insn = emit_insn (gen_probe_sve_stack_clash (Pmode, stack_pointer_rtx,
! 						   stack_pointer_rtx, temp1,
! 						   probe_const, guard_const));
  
        /* Now reset the CFA register if needed.  */
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			gen_rtx_PLUS (Pmode, stack_pointer_rtx,
! 				      gen_int_mode (poly_size, Pmode)));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9801,9831 ----
  	     The tie will expand to nothing but the optimizers will not touch
  	     the instruction.  */
  	  rtx stack_ptr_copy = gen_rtx_REG (Pmode, STACK_CLASH_SVE_CFA_REGNUM);
! 	  auto *insn = emit_move_insn (stack_ptr_copy, stack_pointer_rtx);
  	  emit_insn (gen_stack_tie (stack_ptr_copy, stack_pointer_rtx));
  
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
! 	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_ptr_copy,
! 				       initial_cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
        rtx probe_const = gen_int_mode (min_probe_threshold, Pmode);
        rtx guard_const = gen_int_mode (guard_size, Pmode);
  
!       auto *insn
! 	= emit_insn (gen_probe_sve_stack_clash (Pmode, stack_pointer_rtx,
! 						stack_pointer_rtx, temp1,
! 						probe_const, guard_const));
  
        /* Now reset the CFA register if needed.  */
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx,
! 				       final_cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_allocate_and_probe_stack_space (
*** 9864,9875 ****
  	 We can determine which allocation we are doing by looking at
  	 the value of FRAME_RELATED_P since the final allocations are not
  	 frame related.  */
        if (frame_related_p)
  	{
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, temp1, rounded_size));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9871,9883 ----
  	 We can determine which allocation we are doing by looking at
  	 the value of FRAME_RELATED_P since the final allocations are not
  	 frame related.  */
+       auto cfa_offset = frame.frame_size - (bytes_below_sp - rounded_size);
        if (frame_related_p)
  	{
  	  /* We want the CFA independent of the stack pointer for the
  	     duration of the loop.  */
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, temp1, cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_allocate_and_probe_stack_space (
*** 9891,9897 ****
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx, rounded_size));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
--- 9899,9905 ----
        if (frame_related_p)
  	{
  	  add_reg_note (insn, REG_CFA_DEF_CFA,
! 			plus_constant (Pmode, stack_pointer_rtx, cfa_offset));
  	  RTX_FRAME_RELATED_P (insn) = 1;
  	}
  
*************** aarch64_expand_prologue (void)
*** 10107,10123 ****
       code below does not handle it for -fstack-clash-protection.  */
    gcc_assert (known_eq (initial_adjust, 0) || callee_adjust == 0);
  
    /* Will only probe if the initial adjustment is larger than the guard
       less the amount of the guard reserved for use by the caller's
       outgoing args.  */
    aarch64_allocate_and_probe_stack_space (tmp0_rtx, tmp1_rtx, initial_adjust,
! 					  true, false);
  
    if (callee_adjust != 0)
!     aarch64_push_regs (reg1, reg2, callee_adjust);
! 
!   /* The offset of the current SP from the bottom of the static frame.  */
!   poly_int64 bytes_below_sp = frame_size - initial_adjust - callee_adjust;
  
    if (emit_frame_chain)
      {
--- 10115,10135 ----
       code below does not handle it for -fstack-clash-protection.  */
    gcc_assert (known_eq (initial_adjust, 0) || callee_adjust == 0);
  
+   /* The offset of the current SP from the bottom of the static frame.  */
+   poly_int64 bytes_below_sp = frame_size;
+ 
    /* Will only probe if the initial adjustment is larger than the guard
       less the amount of the guard reserved for use by the caller's
       outgoing args.  */
    aarch64_allocate_and_probe_stack_space (tmp0_rtx, tmp1_rtx, initial_adjust,
! 					  bytes_below_sp, true, false);
!   bytes_below_sp -= initial_adjust;
  
    if (callee_adjust != 0)
!     {
!       aarch64_push_regs (reg1, reg2, callee_adjust);
!       bytes_below_sp -= callee_adjust;
!     }
  
    if (emit_frame_chain)
      {
*************** aarch64_expand_prologue (void)
*** 10179,10184 ****
--- 10191,10197 ----
  		  || known_eq (initial_adjust, 0));
        aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx,
  					      sve_callee_adjust,
+ 					      bytes_below_sp,
  					      !frame_pointer_needed, false);
        bytes_below_sp -= sve_callee_adjust;
      }
*************** aarch64_expand_prologue (void)
*** 10190,10198 ****
  
    /* We may need to probe the final adjustment if it is larger than the guard
       that is assumed by the called.  */
-   gcc_assert (known_eq (bytes_below_sp, final_adjust));
    aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
  					  !frame_pointer_needed, true);
    if (emit_frame_chain && maybe_ne (final_adjust, 0))
      emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx));
  }
--- 10203,10213 ----
  
    /* We may need to probe the final adjustment if it is larger than the guard
       that is assumed by the called.  */
    aarch64_allocate_and_probe_stack_space (tmp1_rtx, tmp0_rtx, final_adjust,
+ 					  bytes_below_sp,
  					  !frame_pointer_needed, true);
+   bytes_below_sp -= final_adjust;
+   gcc_assert (known_eq (bytes_below_sp, 0));
    if (emit_frame_chain && maybe_ne (final_adjust, 0))
      emit_insn (gen_stack_tie (stack_pointer_rtx, hard_frame_pointer_rtx));
  }
diff -Nrcpad gcc-13-20250508/gcc/doc/invoke.texi gcc-13-20250515/gcc/doc/invoke.texi
*** gcc-13-20250508/gcc/doc/invoke.texi	Thu May  8 22:32:15 2025
--- gcc-13-20250515/gcc/doc/invoke.texi	Thu May 15 22:32:09 2025
*************** By default, the dump will contain messag
*** 19191,19196 ****
--- 19191,19283 ----
  optimizations (equivalent to @option{-optimized}) together with
  low-level details about the analysis.
  
+ @opindex fdump-ipa-clones
+ @item -fdump-ipa-clones
+ 
+ Create a dump file containing information about creation of call graph
+ node clones and removals of call graph nodes during inter-procedural
+ optimizations and transformations.  Its main intended use is that tools
+ that create live-patches can determine the set of functions that need to
+ be live-patched to completely replace a particular function (see
+ @option{-flive-patching}).  The file name is generated by appending
+ suffix @code{ipa-clones} to the source file name, and the file is
+ created in the same directory as the output file.  Each entry in the
+ file is on a separate line containing semicolon separated fields.
+ 
+ In the case of call graph clone creation, the individual fields are:
+ 
+ @enumerate
+ @item
+ String @code{Callgraph clone}.
+ 
+ @item
+ Name of the function being cloned as it is presented to the assembler.
+ 
+ @item
+ A number that uniquely represents the function being cloned in the call
+ graph.  Note that the number is unique only within a compilation unit or
+ within whole-program analysis but is likely to be different in the two
+ phases.
+ 
+ @item
+ The file name of the source file where the function is defined.
+ 
+ @item
+ The line on which the function definition is located.
+ 
+ @item
+ The column where the function definition is located.
+ 
+ @item
+ Name of the new function clone as it is presented to the assembler.
+ 
+ @item
+ A number that uniquely represents the new function clone in the call
+ graph.  Note that the number is unique only within a compilation unit or
+ within whole-program analysis but is likely to be different in the two
+ phases.
+ 
+ @item
+ The file name of the source file where the source code location of the
+ new clone points to.
+ 
+ @item
+ The line to which the source code location of the new clone points to.
+ 
+ @item
+ The column to which the source code location of the new clone points to.
+ 
+ @item
+ A string that determines the reason for cloning.
+ 
+ @end enumerate
+ 
+ In the case of call graph clone removal, the individual fields are:
+ 
+ @enumerate
+ @item
+ String @code{Callgraph removal}.
+ 
+ @item
+ Name of the function being removed as it would be presented to the assembler.
+ 
+ @item
+ A number that uniquely represents the function being cloned in the call
+ graph.  Note that the number is unique only within a compilation unit or
+ within whole-program analysis but is likely to be different in the two
+ phases.
+ 
+ @item
+ The file name of the source file where the function is defined.
+ 
+ @item
+ The line on which the function definition is located.
+ 
+ @item
+ The column where the function definition is located.
+ 
+ @end enumerate
+ 
  @opindex fdump-lang
  @item -fdump-lang
  Dump language-specific information.  The file name is made by appending
diff -Nrcpad gcc-13-20250508/gcc/final.cc gcc-13-20250515/gcc/final.cc
*** gcc-13-20250508/gcc/final.cc	Thu May  8 22:32:15 2025
--- gcc-13-20250515/gcc/final.cc	Thu May 15 22:32:09 2025
*************** get_attr_length_1 (rtx_insn *insn, int (
*** 362,368 ****
  
        case CALL_INSN:
        case JUMP_INSN:
! 	length = fallback_fn (insn);
  	break;
  
        case INSN:
--- 362,372 ----
  
        case CALL_INSN:
        case JUMP_INSN:
! 	body = PATTERN (insn);
! 	if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
! 	  length = asm_insn_count (body) * fallback_fn (insn);
! 	else
! 	  length = fallback_fn (insn);
  	break;
  
        case INSN:
diff -Nrcpad gcc-13-20250508/gcc/gimple-range-fold.cc gcc-13-20250515/gcc/gimple-range-fold.cc
*** gcc-13-20250508/gcc/gimple-range-fold.cc	Thu May  8 22:32:16 2025
--- gcc-13-20250515/gcc/gimple-range-fold.cc	Thu May 15 22:32:09 2025
*************** fur_source::register_relation (edge e AT
*** 103,123 ****
  {
  }
  
- // This version of fur_source will pick a range up off an edge.
- 
- class fur_edge : public fur_source
- {
- public:
-   fur_edge (edge e, range_query *q = NULL);
-   virtual bool get_operand (vrange &r, tree expr) override;
-   virtual bool get_phi_operand (vrange &r, tree expr, edge e) override;
- private:
-   edge m_edge;
- };
- 
  // Instantiate an edge based fur_source.
  
- inline
  fur_edge::fur_edge (edge e, range_query *q) : fur_source (q)
  {
    m_edge = e;
--- 103,110 ----
diff -Nrcpad gcc-13-20250508/gcc/gimple-range-fold.h gcc-13-20250515/gcc/gimple-range-fold.h
*** gcc-13-20250508/gcc/gimple-range-fold.h	Thu May  8 22:32:16 2025
--- gcc-13-20250515/gcc/gimple-range-fold.h	Thu May 15 22:32:09 2025
*************** protected:
*** 149,154 ****
--- 149,166 ----
    relation_oracle *m_oracle;
  };
  
+ // This version of fur_source will pick a range up off an edge.
+ 
+ class fur_edge : public fur_source
+ {
+ public:
+   fur_edge (edge e, range_query *q = NULL);
+   virtual bool get_operand (vrange &r, tree expr) override;
+   virtual bool get_phi_operand (vrange &r, tree expr, edge e) override;
+ private:
+   edge m_edge;
+ };
+ 
  // This class uses ranges to fold a gimple statement producing a range for
  // the LHS.  The source of all operands is supplied via the fur_source class
  // which provides a range_query as well as a source location and any other
diff -Nrcpad gcc-13-20250508/gcc/gimple-range.cc gcc-13-20250515/gcc/gimple-range.cc
*** gcc-13-20250508/gcc/gimple-range.cc	Thu May  8 22:32:16 2025
--- gcc-13-20250515/gcc/gimple-range.cc	Thu May 15 22:32:09 2025
*************** disable_ranger (struct function *fun)
*** 729,920 ****
    fun->x_range_query = NULL;
  }
  
- // ------------------------------------------------------------------------
- 
- // If there is a non-varying value associated with NAME, return true and the
- // range in R.
- 
- bool
- assume_query::assume_range_p (vrange &r, tree name)
- {
-   if (global.get_global_range (r, name))
-     return !r.varying_p ();
-   return false;
- }
- 
- // Query used by GORI to pick up any known value on entry to a block.
- 
- bool
- assume_query::range_of_expr (vrange &r, tree expr, gimple *stmt)
- {
-   if (!gimple_range_ssa_p (expr))
-     return get_tree_range (r, expr, stmt);
- 
-   if (!global.get_global_range (r, expr))
-     r.set_varying (TREE_TYPE (expr));
-   return true;
- }
- 
- // If the current function returns an integral value, and has a single return
- // statement, it will calculate any SSA_NAMES it can determine ranges for
- // assuming the function returns 1.
- 
- assume_query::assume_query ()
- {
-   basic_block exit_bb = EXIT_BLOCK_PTR_FOR_FN (cfun);
-   if (single_pred_p (exit_bb))
-     {
-       basic_block bb = single_pred (exit_bb);
-       gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
-       if (gsi_end_p (gsi))
- 	return;
-       gimple *s = gsi_stmt (gsi);
-       if (!is_a<greturn *> (s))
- 	return;
-       greturn *gret = as_a<greturn *> (s);
-       tree op = gimple_return_retval (gret);
-       if (!gimple_range_ssa_p (op))
- 	return;
-       tree lhs_type = TREE_TYPE (op);
-       if (!irange::supports_p (lhs_type))
- 	return;
- 
-       unsigned prec = TYPE_PRECISION (lhs_type);
-       int_range<2> lhs_range (lhs_type, wi::one (prec), wi::one (prec));
-       global.set_global_range (op, lhs_range);
- 
-       gimple *def = SSA_NAME_DEF_STMT (op);
-       if (!def || gimple_get_lhs (def) != op)
- 	return;
-       fur_stmt src (gret, this);
-       calculate_stmt (def, lhs_range, src);
-     }
- }
- 
- // Evaluate operand OP on statement S, using the provided LHS range.
- // If successful, set the range in the global table, then visit OP's def stmt.
- 
- void
- assume_query::calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src)
- {
-   Value_Range op_range (TREE_TYPE (op));
-   if (m_gori.compute_operand_range (op_range, s, lhs, op, src)
-       && !op_range.varying_p ())
-     {
-       Value_Range range (TREE_TYPE (op));
-       if (global.get_global_range (range, op))
- 	op_range.intersect (range);
-       global.set_global_range (op, op_range);
-       gimple *def_stmt = SSA_NAME_DEF_STMT (op);
-       if (def_stmt && gimple_get_lhs (def_stmt) == op)
- 	calculate_stmt (def_stmt, op_range, src);
-     }
- }
- 
- // Evaluate PHI statement, using the provided LHS range.
- // Check each constant argument predecessor if it can be taken
- // provide LHS to any symbolic arguments, and process their def statements.
- 
- void
- assume_query::calculate_phi (gphi *phi, vrange &lhs_range, fur_source &src)
- {
-   for (unsigned x= 0; x < gimple_phi_num_args (phi); x++)
-     {
-       tree arg = gimple_phi_arg_def (phi, x);
-       Value_Range arg_range (TREE_TYPE (arg));
-       if (gimple_range_ssa_p (arg))
- 	{
- 	  // A symbol arg will be the LHS value.
- 	  arg_range = lhs_range;
- 	  range_cast (arg_range, TREE_TYPE (arg));
- 	  if (!global.get_global_range (arg_range, arg))
- 	    {
- 	      global.set_global_range (arg, arg_range);
- 	      gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
- 	      if (def_stmt && gimple_get_lhs (def_stmt) == arg)
- 		calculate_stmt (def_stmt, arg_range, src);
- 	    }
- 	}
-       else if (get_tree_range (arg_range, arg, NULL))
- 	{
- 	  // If this is a constant value that differs from LHS, this
- 	  // edge cannot be taken.
- 	  arg_range.intersect (lhs_range);
- 	  if (arg_range.undefined_p ())
- 	    continue;
- 	  // Otherwise check the condition feeding this edge.
- 	  edge e = gimple_phi_arg_edge (phi, x);
- 	  check_taken_edge (e, src);
- 	}
-     }
- }
- 
- // If an edge is known to be taken, examine the outgoing edge to see
- // if it carries any range information that can also be evaluated.
- 
- void
- assume_query::check_taken_edge (edge e, fur_source &src)
- {
-   gimple *stmt = gimple_outgoing_range_stmt_p (e->src);
-   if (stmt && is_a<gcond *> (stmt))
-     {
-       int_range<2> cond;
-       gcond_edge_range (cond, e);
-       calculate_stmt (stmt, cond, src);
-     }
- }
- 
- // Evaluate statement S which produces range LHS_RANGE.
- 
- void
- assume_query::calculate_stmt (gimple *s, vrange &lhs_range, fur_source &src)
- {
-   gimple_range_op_handler handler (s);
-   if (handler)
-     {
-       tree op = gimple_range_ssa_p (handler.operand1 ());
-       if (op)
- 	calculate_op (op, s, lhs_range, src);
-       op = gimple_range_ssa_p (handler.operand2 ());
-       if (op)
- 	calculate_op (op, s, lhs_range, src);
-     }
-   else if (is_a<gphi *> (s))
-     {
-       calculate_phi (as_a<gphi *> (s), lhs_range, src);
-       // Don't further check predecessors of blocks with PHIs.
-       return;
-     }
- 
-   // Even if the walk back terminates before the top, if this is a single
-   // predecessor block, see if the predecessor provided any ranges to get here.
-   if (single_pred_p (gimple_bb (s)))
-     check_taken_edge (single_pred_edge (gimple_bb (s)), src);
- }
- 
- // Show everything that was calculated.
- 
- void
- assume_query::dump (FILE *f)
- {
-   fprintf (f, "Assumption details calculated:\n");
-   for (unsigned i = 0; i < num_ssa_names; i++)
-     {
-       tree name = ssa_name (i);
-       if (!name || !gimple_range_ssa_p (name))
- 	continue;
-       tree type = TREE_TYPE (name);
-       if (!Value_Range::supports_type_p (type))
- 	continue;
- 
-       Value_Range assume_range (type);
-       if (assume_range_p (assume_range, name))
- 	{
- 	  print_generic_expr (f, name, TDF_SLIM);
- 	  fprintf (f, " -> ");
- 	  assume_range.dump (f);
- 	  fputc ('\n', f);
- 	}
-     }
-   fprintf (f, "------------------------------\n");
- }
--- 729,731 ----
diff -Nrcpad gcc-13-20250508/gcc/gimple-range.h gcc-13-20250515/gcc/gimple-range.h
*** gcc-13-20250508/gcc/gimple-range.h	Thu May  8 22:32:16 2025
--- gcc-13-20250515/gcc/gimple-range.h	Thu May 15 22:32:09 2025
*************** protected:
*** 81,103 ****
  extern gimple_ranger *enable_ranger (struct function *m,
  				     bool use_imm_uses = true);
  extern void disable_ranger (struct function *);
- 
- class assume_query : public range_query
- {
- public:
-   assume_query ();
-   bool assume_range_p (vrange &r, tree name);
-   virtual bool range_of_expr (vrange &r, tree expr, gimple * = NULL);
-   void dump (FILE *f);
- protected:
-   void calculate_stmt (gimple *s, vrange &lhs_range, fur_source &src);
-   void calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src);
-   void calculate_phi (gphi *phi, vrange &lhs_range, fur_source &src);
-   void check_taken_edge (edge e, fur_source &src);
- 
-   ssa_global_cache global;
-   gori_compute m_gori;
- };
- 
- 
  #endif // GCC_GIMPLE_RANGE_H
--- 81,84 ----
diff -Nrcpad gcc-13-20250508/gcc/testsuite/ChangeLog gcc-13-20250515/gcc/testsuite/ChangeLog
*** gcc-13-20250508/gcc/testsuite/ChangeLog	Thu May  8 22:32:17 2025
--- gcc-13-20250515/gcc/testsuite/ChangeLog	Thu May 15 22:32:10 2025
***************
*** 1,3 ****
--- 1,28 ----
+ 2025-05-13  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	Backported from master:
+ 	2025-05-06  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/119852
+ 	* gcc.dg/ipa/pr119852.c: New test.
+ 
+ 2025-05-11  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	Backported from master:
+ 	2025-01-31  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/117498
+ 	* gcc.c-torture/execute/pr117498.c: New test.
+ 
+ 2025-05-09  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	Backported from master:
+ 	2025-04-24  Richard Sandiford  <richard.sandiford@arm.com>
+ 
+ 	PR target/119610
+ 	* g++.dg/torture/pr119610.C: New test.
+ 	* g++.target/aarch64/sve/pr119610-sve.C: Likewise.
+ 
  2025-05-07  Richard Biener  <rguenther@suse.de>
  
  	Backported from master:
diff -Nrcpad gcc-13-20250508/gcc/testsuite/g++.dg/cpp23/pr117287-attr.C gcc-13-20250515/gcc/testsuite/g++.dg/cpp23/pr117287-attr.C
*** gcc-13-20250508/gcc/testsuite/g++.dg/cpp23/pr117287-attr.C	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/testsuite/g++.dg/cpp23/pr117287-attr.C	Thu May 15 22:32:11 2025
***************
*** 0 ****
--- 1,38 ----
+ // P1774R8 - Portable assumptions
+ // { dg-do run { target c++23 } }
+ // { dg-options "-O2 --param=logical-op-non-short-circuit=0" }
+ // Test the we can optimize based on conditions in assume.
+ 
+ static inline bool
+ foo (unsigned x)
+ {
+   return x == 4 || x == 5 || x == 9 || x == 10;
+ }
+ 
+ int v;
+ 
+ [[gnu::noipa]] void
+ bar (const char *p)
+ {
+   if (p[0] != (v ? 'a' : 'b') || p[1])
+     __builtin_abort ();
+ }
+ 
+ [[gnu::noipa]] void
+ baz (unsigned x)
+ {
+   bool a = x == 5;
+   [[assume (foo (x))]];
+   bar (a ? "a" : "b");
+ }
+ 
+ int
+ main ()
+ {
+   baz (4);
+   v = 1;
+   baz (5);
+   v = 0;
+   baz (9);
+   baz (10);
+ }
diff -Nrcpad gcc-13-20250508/gcc/testsuite/g++.dg/torture/pr119610.C gcc-13-20250515/gcc/testsuite/g++.dg/torture/pr119610.C
*** gcc-13-20250508/gcc/testsuite/g++.dg/torture/pr119610.C	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/testsuite/g++.dg/torture/pr119610.C	Thu May 15 22:32:12 2025
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do run }
+ // { dg-additional-options "-fstack-protector-strong" { target fstack_protector } }
+ // { dg-additional-options "-fstack-clash-protection" { target supports_stack_clash_protection } }
+ 
+ int *ptr;
+ void foo() {
+   int c[1024*128];
+   ptr = c;
+   throw 1;
+ }
+ int main()
+ {
+   try {
+     foo();
+   } catch(int x) {
+     return 0;
+   }
+ }
diff -Nrcpad gcc-13-20250508/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C gcc-13-20250515/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C
*** gcc-13-20250508/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/testsuite/g++.target/aarch64/sve/pr119610-sve.C	Thu May 15 22:32:12 2025
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do run { target aarch64_sve_hw } }
+ // { dg-additional-options "-fstack-protector-strong" { target fstack_protector } }
+ // { dg-additional-options "-fstack-clash-protection" { target supports_stack_clash_protection } }
+ 
+ void *a_ptr, *b_ptr;
+ void foo() {
+   __SVInt32_t a;
+   int b[1024*128];
+   a_ptr = &a;
+   b_ptr = b;
+   throw 1;
+ }
+ int main()
+ {
+   try {
+     foo();
+   } catch(int x) {
+     return 0;
+   }
+ }
diff -Nrcpad gcc-13-20250508/gcc/testsuite/gcc.c-torture/execute/pr117498.c gcc-13-20250515/gcc/testsuite/gcc.c-torture/execute/pr117498.c
*** gcc-13-20250508/gcc/testsuite/gcc.c-torture/execute/pr117498.c	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/testsuite/gcc.c-torture/execute/pr117498.c	Thu May 15 22:32:13 2025
***************
*** 0 ****
--- 1,35 ----
+ /* PR middle-end/117498 */
+ 
+ int a, d, f;
+ char g;
+ volatile int c = 1;
+ 
+ int
+ foo ()
+ {
+   if (c == 0)
+     return -1;
+   return 1;
+ }
+ 
+ void
+ bar (int h, int i, char *k, char *m)
+ {
+   for (; d < i; d += 2)
+     for (int j = 0; j < h; j++)
+       m[j] = k[4 * j];
+ }
+ 
+ void
+ baz (long h)
+ {
+   char n = 0;
+   bar (h, 4, &n, &g);
+ }
+ 
+ int
+ main ()
+ {
+   f = foo ();
+   baz ((unsigned char) f - 4);
+ }
diff -Nrcpad gcc-13-20250508/gcc/testsuite/gcc.dg/ipa/pr119852.c gcc-13-20250515/gcc/testsuite/gcc.dg/ipa/pr119852.c
*** gcc-13-20250508/gcc/testsuite/gcc.dg/ipa/pr119852.c	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/testsuite/gcc.dg/ipa/pr119852.c	Thu May 15 22:32:13 2025
***************
*** 0 ****
--- 1,50 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -fdump-ipa-clones"  } */
+ 
+ typedef struct rtx_def *rtx;
+ enum rtx_code {
+   LAST_AND_UNUSED_RTX_CODE};
+ extern const char * const rtx_format[((int) LAST_AND_UNUSED_RTX_CODE)];
+ struct rtx_def {
+   enum rtx_code code;
+ };
+ typedef int (*rtx_function) (rtx *, void *);
+ extern int for_each_rtx (rtx *, rtx_function, void *);
+ int
+ replace_label (rtx *x, void *data)
+ {
+   rtx l = *x;
+   if (l == (rtx) 0)
+     {
+  {
+    rtx new_c, new_l;
+    for_each_rtx (&new_c, replace_label, data);
+  }
+     }
+ }
+ static int
+ for_each_rtx_1 (rtx exp, int n, rtx_function f, void *data)
+ {
+   int result, i, j;
+   const char *format = (rtx_format[(int) (((enum rtx_code) (exp)->code))]);
+   rtx *x;
+   for (; format[n] != '\0'; n++)
+     {
+       switch (format[n])
+  {
+  case 'e':
+    result = (*f) (x, data);
+      {
+        result = for_each_rtx_1 (*x, i, f, data);
+      }
+  }
+     }
+ }
+ int
+ for_each_rtx (rtx *x, rtx_function f, void *data)
+ {
+   int i;
+   return for_each_rtx_1 (*x, i, f, data);
+ }
+ 
+ /* { dg-final { scan-ipa-dump-not "(null)"  "ipa-clones"  } } */
diff -Nrcpad gcc-13-20250508/gcc/tree-assume.cc gcc-13-20250515/gcc/tree-assume.cc
*** gcc-13-20250508/gcc/tree-assume.cc	Thu Jan  1 00:00:00 1970
--- gcc-13-20250515/gcc/tree-assume.cc	Thu May 15 22:32:24 2025
***************
*** 0 ****
--- 1,650 ----
+ /* Support for C++23 ASSUME keyword functionailty.
+    Copyright (C) 2023-2024 Free Software Foundation, Inc.
+    Contributed by Andrew MacLeod <amacleod@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/>.  */
+ 
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+ #include "basic-block.h"
+ #include "bitmap.h"
+ #include "options.h"
+ #include "function.h"
+ #include "cfg.h"
+ #include "tree.h"
+ #include "gimple.h"
+ #include "tree-pass.h"
+ #include "ssa.h"
+ #include "gimple-iterator.h"
+ #include "gimple-range.h"
+ #include "tree-dfa.h"
+ #include "gimple-pretty-print.h"
+ #include "tree-cfg.h"
+ #include "value-range-storage.h"
+ 
+ // This global cache is used with the range engine as markers for what
+ // has been visited during this incarnation.  Once the ranger evaluates
+ // a name, it is typically not re-evaluated again.
+ 
+ class ssa_cache : public range_query
+ {
+ public:
+   ssa_cache ();
+   ~ssa_cache ();
+   virtual bool has_range (tree name) const;
+   virtual bool get_range (vrange &r, tree name) const;
+   virtual bool set_range (tree name, const vrange &r);
+   virtual bool merge_range (tree name, const vrange &r);
+   virtual void clear_range (tree name);
+   virtual void clear ();
+   void dump (FILE *f = stderr);
+   virtual bool range_of_expr (vrange &r, tree expr, gimple *stmt = NULL);
+ protected:
+   vec<vrange *> m_tab;
+   vrange_allocator *m_range_allocator;
+ };
+ 
+ // This is the same as global cache, except it maintains an active bitmap
+ // rather than depending on a zero'd out vector of pointers.  This is better
+ // for sparsely/lightly used caches.
+ 
+ class ssa_lazy_cache : public ssa_cache
+ {
+ public:
+   inline ssa_lazy_cache () { active_p = BITMAP_ALLOC (NULL); }
+   inline ~ssa_lazy_cache () { BITMAP_FREE (active_p); }
+   inline bool empty_p () const { return bitmap_empty_p (active_p); }
+   virtual bool has_range (tree name) const;
+   virtual bool set_range (tree name, const vrange &r);
+   virtual bool merge_range (tree name, const vrange &r);
+   virtual bool get_range (vrange &r, tree name) const;
+   virtual void clear_range (tree name);
+   virtual void clear ();
+ protected:
+   bitmap active_p;
+ };
+ 
+ 
+ // --------------------------------------------------------------------------
+ 
+ // Initialize an ssa cache.
+ 
+ ssa_cache::ssa_cache ()
+ {
+   m_tab.create (0);
+   m_range_allocator = new obstack_vrange_allocator;
+ }
+ 
+ // Deconstruct an ssa cache.
+ 
+ ssa_cache::~ssa_cache ()
+ {
+   m_tab.release ();
+   delete m_range_allocator;
+ }
+ 
+ // Enable a query to evaluate staements/ramnges based on picking up ranges
+ // from just an ssa-cache.
+ 
+ bool
+ ssa_cache::range_of_expr (vrange &r, tree expr, gimple *stmt)
+ {
+   if (!gimple_range_ssa_p (expr))
+     return get_tree_range (r, expr, stmt);
+ 
+   if (!get_range (r, expr))
+     gimple_range_global (r, expr, cfun);
+   return true;
+ }
+ 
+ // Return TRUE if the global range of NAME has a cache entry.
+ 
+ bool
+ ssa_cache::has_range (tree name) const
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (v >= m_tab.length ())
+     return false;
+   return m_tab[v] != NULL;
+ }
+ 
+ // Retrieve the global range of NAME from cache memory if it exists.
+ // Return the value in R.
+ 
+ bool
+ ssa_cache::get_range (vrange &r, tree name) const
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (v >= m_tab.length ())
+     return false;
+ 
+   vrange *stow = m_tab[v];
+   if (!stow)
+     return false;
+   r = *stow;
+   return true;
+ }
+ 
+ // Set the range for NAME to R in the ssa cache.
+ // Return TRUE if there was already a range set, otherwise false.
+ 
+ bool
+ ssa_cache::set_range (tree name, const vrange &r)
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (v >= m_tab.length ())
+     m_tab.safe_grow_cleared (num_ssa_names + 1);
+ 
+   vrange *m = m_tab[v];
+   if (m && m->fits_p (r))
+     *m = r;
+   else
+     m_tab[v] = m_range_allocator->clone (r);
+   return m != NULL;
+ }
+ 
+ // If NAME has a range, intersect it with R, otherwise set it to R.
+ // Return TRUE if the range is new or changes.
+ 
+ bool
+ ssa_cache::merge_range (tree name, const vrange &r)
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (v >= m_tab.length ())
+     m_tab.safe_grow_cleared (num_ssa_names + 1);
+ 
+   vrange *m = m_tab[v];
+   // Check if this is a new value.
+   if (!m)
+     m_tab[v] = m_range_allocator->clone (r);
+   else
+     {
+       Value_Range curr (TREE_TYPE (name));
+       curr = *m;
+       // If there is no change, return false.
+       if (!curr.intersect (r))
+ 	return false;
+ 
+       if (m->fits_p (curr))
+ 	*m = curr;
+       else
+ 	m_tab[v] = m_range_allocator->clone ((const vrange &)curr);
+     }
+   return true;
+ }
+ 
+ // Set the range for NAME to R in the ssa cache.
+ 
+ void
+ ssa_cache::clear_range (tree name)
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (v >= m_tab.length ())
+     return;
+   m_tab[v] = NULL;
+ }
+ 
+ // Clear the ssa cache.
+ 
+ void
+ ssa_cache::clear ()
+ {
+   if (m_tab.address ())
+     memset (m_tab.address(), 0, m_tab.length () * sizeof (vrange *));
+ }
+ 
+ // Dump the contents of the ssa cache to F.
+ 
+ void
+ ssa_cache::dump (FILE *f)
+ {
+   for (unsigned x = 1; x < num_ssa_names; x++)
+     {
+       if (!gimple_range_ssa_p (ssa_name (x)))
+ 	continue;
+       Value_Range r (TREE_TYPE (ssa_name (x)));
+       // Dump all non-varying ranges.
+       if (get_range (r, ssa_name (x)) && !r.varying_p ())
+ 	{
+ 	  print_generic_expr (f, ssa_name (x), TDF_NONE);
+ 	  fprintf (f, "  : ");
+ 	  r.dump (f);
+ 	  fprintf (f, "\n");
+ 	}
+     }
+ 
+ }
+ 
+ // Return true if NAME has an active range in the cache.
+ 
+ bool
+ ssa_lazy_cache::has_range (tree name) const
+ {
+   return bitmap_bit_p (active_p, SSA_NAME_VERSION (name));
+ }
+ 
+ // Set range of NAME to R in a lazy cache.  Return FALSE if it did not already
+ // have a range.
+ 
+ bool
+ ssa_lazy_cache::set_range (tree name, const vrange &r)
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (!bitmap_set_bit (active_p, v))
+     {
+       // There is already an entry, simply set it.
+       gcc_checking_assert (v < m_tab.length ());
+       return ssa_cache::set_range (name, r);
+     }
+   if (v >= m_tab.length ())
+     m_tab.safe_grow (num_ssa_names + 1);
+   m_tab[v] = m_range_allocator->clone (r);
+   return false;
+ }
+ 
+ // If NAME has a range, intersect it with R, otherwise set it to R.
+ // Return TRUE if the range is new or changes.
+ 
+ bool
+ ssa_lazy_cache::merge_range (tree name, const vrange &r)
+ {
+   unsigned v = SSA_NAME_VERSION (name);
+   if (!bitmap_set_bit (active_p, v))
+     {
+       // There is already an entry, simply merge it.
+       gcc_checking_assert (v < m_tab.length ());
+       return ssa_cache::merge_range (name, r);
+     }
+   if (v >= m_tab.length ())
+     m_tab.safe_grow (num_ssa_names + 1);
+   m_tab[v] = m_range_allocator->clone (r);
+   return true;
+ }
+ 
+ // Return TRUE if NAME has a range, and return it in R.
+ 
+ bool
+ ssa_lazy_cache::get_range (vrange &r, tree name) const
+ {
+   if (!bitmap_bit_p (active_p, SSA_NAME_VERSION (name)))
+     return false;
+   return ssa_cache::get_range (r, name);
+ }
+ 
+ // Remove NAME from the active range list.
+ 
+ void
+ ssa_lazy_cache::clear_range (tree name)
+ {
+   bitmap_clear_bit (active_p, SSA_NAME_VERSION (name));
+ }
+ 
+ // Remove all ranges from the active range list.
+ 
+ void
+ ssa_lazy_cache::clear ()
+ {
+   bitmap_clear (active_p);
+ }
+ 
+ // An assume query utilizes the current range query to implement the assume
+ // keyword.
+ // For any return value of 1 from the function, it attempts to determine
+ // which paths lead to a 1 value being returned. On those paths, it determines
+ // the ranges of any ssa_names listed in bitmap P (usually the parm list for
+ // the function), and combines them all.
+ // These ranges are then set as the global ranges for those parms in this
+ // function.
+ // Other functions which refer to this function in an assume builtin
+ // will then pick up these ranges for the parameters via the inferred range
+ // mechanism.
+ //   See gimple-range-infer.cc::gimple_infer_range::check_assume_func ()
+ //
+ // my_func (int x)
+ // {
+ //   <...>
+ //   assume [[(x == 1 || x ==4))]]
+ //   if (x ==3)
+ //
+ // a small temporary assume function consisting of
+ // assume_f1 (int x) { return x == 1 || x == 4; }
+ // is constructed by the front end, and optimized, at the very end of
+ // optimization, instead of generating code, we instead invoke the assume pass
+ // which uses this query to set the the global value of parm x to [1,1][4,4]
+ //
+ // Meanwhile., my_func has been rewritten to be:
+ //
+ // my_func (int x_2)
+ // {
+ //   <...>
+ //   assume_builtin_call  assume_f1 (x_2);
+ //   if (x_2 == 3)
+ //
+ // When ranger is processing the assume_builtin_call, it looks up the global
+ // value of the parameter in assume_f1, which is [1,1][4,4].  It then registers
+ // and inferred range at this statement setting the value x_2 to [1,1][4,4]
+ //
+ // Any uses of x_2 after this statement will now utilize this inferred range.
+ //
+ // When VRP processes if (x_2 == 3), it picks up the inferred range, and
+ // determines that x_2 can never be 3, and will rewrite the branch to
+ //   if (0 != 0)
+ 
+ class assume_query
+ {
+ public:
+   assume_query (gimple_ranger *ranger, function *f, bitmap p);
+ protected:
+   inline void process_stmts (gimple *s, vrange &lhs_range)
+   {
+     fur_depend src (s, &(m_ranger->gori ()), m_ranger);
+     calculate_stmt (s, lhs_range, src);
+     update_parms (src);
+   }
+   void update_parms (fur_source &src);
+   void calculate_stmt (gimple *s, vrange &lhs_range, fur_source &src);
+   void calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src);
+   void calculate_phi (gphi *phi, vrange &lhs_range);
+ 
+   ssa_lazy_cache m_path;   // Values found on path
+   ssa_lazy_cache m_parms;  // Cumulative parameter value calculated
+   gimple_ranger *m_ranger;
+   bitmap m_parm_list;	   // Parameter ssa-names list.
+   function *m_func;
+ };
+ 
+ // If function F returns a integral value, and has a single return
+ // statement, try to calculate the range of each value in P that leads
+ // to the return statement returning TRUE.
+ 
+ assume_query::assume_query (gimple_ranger *ranger, function *f, bitmap p)
+   : m_ranger (ranger), m_parm_list (p), m_func (f)
+ {
+   basic_block exit_bb = EXIT_BLOCK_PTR_FOR_FN (f);
+   // If there is more than one predecessor to the exit block, bail.
+   if (!single_pred_p (exit_bb))
+     return;
+ 
+   basic_block bb = single_pred (exit_bb);
+   gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
+   if (gsi_end_p (gsi))
+     return;
+   gimple *s = gsi_stmt (gsi);
+   if (!is_a<greturn *> (s))
+     return;
+ 
+   // Check if the single return value is a symbolic and supported type.
+   greturn *gret = as_a<greturn *> (s);
+   tree op = gimple_return_retval (gret);
+   if (!gimple_range_ssa_p (op))
+     return;
+   tree lhs_type = TREE_TYPE (op);
+   if (!irange::supports_p (lhs_type))
+     return;
+ 
+   // Only values of interest are when the return value is 1.  The definition
+   // of the return value must be in the same block, or we have
+   // complicated flow control we don't understand, and just return.
+   unsigned prec = TYPE_PRECISION (lhs_type);
+   int_range<2> lhs_range (lhs_type, wi::one (prec), wi::one (prec));
+ 
+   gimple *def = SSA_NAME_DEF_STMT (op);
+   if (!def || gimple_get_lhs (def) != op || gimple_bb (def) != bb)
+     return;
+ 
+   // Determine if this is a PHI or a linear sequence to deal with.
+   if (is_a<gphi *> (def))
+     calculate_phi (as_a<gphi *> (def), lhs_range);
+   else
+     process_stmts (def, lhs_range);
+ 
+   if (dump_file)
+     fprintf (dump_file, "Assumptions :\n--------------\n");
+ 
+   // Now export any interesting values that were found.
+   bitmap_iterator bi;
+   unsigned x;
+   EXECUTE_IF_SET_IN_BITMAP (m_parm_list, 0, x, bi)
+     {
+       tree name = ssa_name (x);
+       tree type = TREE_TYPE (name);
+       Value_Range assume_range (type);
+       // Set the global range of NAME to anything calculated.
+       if (m_parms.get_range (assume_range, name) && !assume_range.varying_p ())
+ 	{
+ 	  set_range_info (name, assume_range);
+ 	  if (dump_file)
+ 	    {
+ 	      print_generic_expr (dump_file, name, TDF_SLIM);
+ 	      fprintf (dump_file, " -> ");
+ 	      assume_range.dump (dump_file);
+ 	      fputc ('\n', dump_file);
+ 	    }
+ 	}
+     }
+ }
+ 
+ // This function will update all the current values of interesting parameters.
+ // It tries, in order:
+ //    a) a range found via path calculations.
+ //    b) range of the parm at SRC point in the IL. (either edge or stmt)
+ //    c) VARYING if those options fail.
+ //  The value is then unioned with any existing value, allowing for the
+ //  cumulation of all ranges leading to the return that return 1.
+ 
+ void
+ assume_query::update_parms (fur_source &src)
+ {
+   // Merge any parameter values.
+   bitmap_iterator bi;
+   unsigned x;
+   EXECUTE_IF_SET_IN_BITMAP (m_parm_list, 0, x, bi)
+     {
+       tree name = ssa_name (x);
+       tree type = TREE_TYPE (name);
+ 
+       // Find a valu efrom calculations.
+       Value_Range glob_range (type);
+       if (!m_path.get_range (glob_range, name)
+ 	  && !src.get_operand (glob_range, name))
+ 	glob_range.set_varying (type);
+ 
+       // Find any current value of parm, and combine them.
+       Value_Range parm_range (type);
+       if (m_parms.get_range (parm_range, name))
+ 	glob_range.union_ (parm_range);
+ 
+       // Set this new value.
+       m_parms.set_range (name, glob_range);
+     }
+   // Now reset the path values for the next path.
+   m_path.clear ();
+ }
+ 
+ 
+ // Evaluate PHI statement, using the provided LHS range.
+ // Only process edge that are both taken and returns the LHS of the PHI.
+ 
+ void
+ assume_query::calculate_phi (gphi *phi, vrange &lhs_range)
+ {
+   for (unsigned x= 0; x < gimple_phi_num_args (phi); x++)
+     {
+       tree arg = gimple_phi_arg_def (phi, x);
+       Value_Range arg_range (TREE_TYPE (arg));
+       edge e = gimple_phi_arg_edge (phi, x);
+       Value_Range edge_range (TREE_TYPE (arg));
+       // If we can't get an edge range, be conservative and assume the
+       // edge can be taken.
+       // NOte this can be either an ssa_name or a constant.
+       if (m_ranger->range_on_edge (edge_range, e, arg))
+ 	{
+ 	  if (gimple_range_ssa_p (arg))
+ 	    {
+ 	      arg_range = lhs_range;
+ 	      range_cast (arg_range, TREE_TYPE (arg));
+ 
+ 	      // An SSA_NAME arg will start with the LHS value.
+ 	      // Check the range of ARG on the edge leading here.  If that range
+ 	      // cannot be any value from the LHS of the PHI, then this branch
+ 	      // will not  be taken to return the LHS value and can be ignored.
+ 	      arg_range.intersect (edge_range);
+ 	      if (arg_range.undefined_p ())
+ 		continue;
+ 
+ 	      // If the def is in the immediate preceeding block, process it
+ 	      // with GORI to determine what values can produce this
+ 	      // argument value.  Otherwise there is more flow, so just query
+ 	      // the edge for parm ranges and be conservative.
+ 	      gimple *def_stmt = SSA_NAME_DEF_STMT (arg);
+ 	      if (def_stmt && gimple_get_lhs (def_stmt) == arg
+ 		  && gimple_bb (def_stmt) == e->src)
+ 		{
+ 		  process_stmts (def_stmt, arg_range);
+ 		  continue;
+ 		}
+ 	      // Fall through to process the edge.
+ 	    }
+ 	  else
+ 	    {
+ 	      // If this is a constant value that differs from LHS, this
+ 	      // edge cannot be taken and we can ignore it. Otherwise fall
+ 	      // thorugh and process the edge.
+ 	      edge_range.intersect (lhs_range);
+ 	      if (edge_range.undefined_p ())
+ 		continue;
+ 	    }
+ 	}
+       // If this point is reached the edge needs processing.
+       fur_edge src (e, m_ranger);
+       update_parms (src);
+     }
+ }
+ 
+ // Evaluate operand OP on statement S, using the provided LHS range.
+ // If successful, set the range in path table, then visit OP's def stmt
+ // if it is in the same BB.
+ 
+ void
+ assume_query::calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src)
+ {
+   basic_block bb = gimple_bb (s);
+   Value_Range op_range (TREE_TYPE (op));
+   if (src.gori () &&
+       src.gori ()->compute_operand_range (op_range, s, lhs, op, src)
+       && !op_range.varying_p ())
+     {
+       // Set the global range, merging if there is already a range.
+       m_path.merge_range (op, op_range);
+       gimple *def_stmt = SSA_NAME_DEF_STMT (op);
+       // Terminate if the patway leads to a different block as we
+       // are not analyzing flow.
+       if (def_stmt && gimple_get_lhs (def_stmt) == op
+ 	  && gimple_bb (def_stmt) == bb)
+ 	calculate_stmt (def_stmt, op_range, src);
+     }
+ }
+ 
+ 
+ // Evaluate statement S which produces range LHS_RANGE.  Use GORI to
+ // determine what values the operands can have to produce the LHS,
+ // and set these in the M_PATH table.
+ 
+ void
+ assume_query::calculate_stmt (gimple *s, vrange &lhs_range, fur_source &src)
+ {
+   gimple_range_op_handler handler (s);
+   if (handler)
+     {
+       tree op = gimple_range_ssa_p (handler.operand1 ());
+       if (op)
+ 	calculate_op (op, s, lhs_range, src);
+       op = gimple_range_ssa_p (handler.operand2 ());
+       if (op)
+ 	calculate_op (op, s, lhs_range, src);
+     }
+ }
+ 
+ namespace {
+ 
+ const pass_data pass_data_assumptions =
+ {
+   GIMPLE_PASS, /* type */
+   "assumptions", /* name */
+   OPTGROUP_NONE, /* optinfo_flags */
+   TV_TREE_ASSUMPTIONS, /* tv_id */
+   PROP_ssa, /* properties_required */
+   PROP_assumptions_done, /* properties_provided */
+   0, /* properties_destroyed */
+   0, /* todo_flags_start */
+   0, /* todo_flags_end */
+ };
+ 
+ 
+ class pass_assumptions : public gimple_opt_pass
+ {
+ public:
+   pass_assumptions (gcc::context *ctxt)
+     : gimple_opt_pass (pass_data_assumptions, ctxt)
+   {}
+ 
+   /* opt_pass methods: */
+   bool gate (function *fun) final override { return fun->assume_function; }
+   unsigned int execute (function *fun) final override
+     {
+       // Create a bitmap of all the parameters in this function.
+       // Invoke the assume_query to determine what values these parameters
+       // have when the function returns TRUE, and set the global values of
+       // those parameters in this function based on that.  This will later be
+       // utilized by ranger when prcessing the builtin_assumer function.
+       auto_bitmap decls;
+       for (tree arg = DECL_ARGUMENTS (fun->decl); arg; arg = DECL_CHAIN (arg))
+ 	{
+ 	  tree name = ssa_default_def (fun, arg);
+ 	  if (!name || !gimple_range_ssa_p (name))
+ 	    continue;
+ 	  tree type = TREE_TYPE (name);
+ 	  if (!Value_Range::supports_type_p (type))
+ 	    continue;
+ 	  bitmap_set_bit (decls, SSA_NAME_VERSION (name));
+ 	}
+       // If there are no parameters to map, simply return;
+       if (bitmap_empty_p (decls))
+ 	return TODO_discard_function;
+ 
+       gimple_ranger *ranger = enable_ranger (fun);
+ 
+       // This assume query will set any global values required.
+       assume_query query (ranger, fun, decls);
+ 
+       disable_ranger (fun);
+       if (dump_file)
+ 	gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
+ 
+       return TODO_discard_function;
+     }
+ 
+ }; // class pass_assumptions
+ 
+ } // anon namespace
+ 
+ gimple_opt_pass *
+ make_pass_assumptions (gcc::context *ctx)
+ {
+   return new pass_assumptions (ctx);
+ }
diff -Nrcpad gcc-13-20250508/gcc/tree-vrp.cc gcc-13-20250515/gcc/tree-vrp.cc
*** gcc-13-20250508/gcc/tree-vrp.cc	Thu May  8 22:33:02 2025
--- gcc-13-20250515/gcc/tree-vrp.cc	Thu May 15 22:32:24 2025
*************** public:
*** 1196,1263 ****
    int my_pass;
  }; // class pass_vrp
  
- const pass_data pass_data_assumptions =
- {
-   GIMPLE_PASS, /* type */
-   "assumptions", /* name */
-   OPTGROUP_NONE, /* optinfo_flags */
-   TV_TREE_ASSUMPTIONS, /* tv_id */
-   PROP_ssa, /* properties_required */
-   PROP_assumptions_done, /* properties_provided */
-   0, /* properties_destroyed */
-   0, /* todo_flags_start */
-   0, /* todo_flags_end */
- };
- 
- class pass_assumptions : public gimple_opt_pass
- {
- public:
-   pass_assumptions (gcc::context *ctxt)
-     : gimple_opt_pass (pass_data_assumptions, ctxt)
-   {}
- 
-   /* opt_pass methods: */
-   bool gate (function *fun) final override { return fun->assume_function; }
-   unsigned int execute (function *) final override
-     {
-       assume_query query;
-       if (dump_file)
- 	fprintf (dump_file, "Assumptions :\n--------------\n");
- 
-       for (tree arg = DECL_ARGUMENTS (cfun->decl); arg; arg = DECL_CHAIN (arg))
- 	{
- 	  tree name = ssa_default_def (cfun, arg);
- 	  if (!name || !gimple_range_ssa_p (name))
- 	    continue;
- 	  tree type = TREE_TYPE (name);
- 	  if (!Value_Range::supports_type_p (type))
- 	    continue;
- 	  Value_Range assume_range (type);
- 	  if (query.assume_range_p (assume_range, name))
- 	    {
- 	      // Set the global range of NAME to anything calculated.
- 	      set_range_info (name, assume_range);
- 	      if (dump_file)
- 		{
- 		  print_generic_expr (dump_file, name, TDF_SLIM);
- 		  fprintf (dump_file, " -> ");
- 		  assume_range.dump (dump_file);
- 		  fputc ('\n', dump_file);
- 		}
- 	    }
- 	}
-       if (dump_file)
- 	{
- 	  fputc ('\n', dump_file);
- 	  gimple_dump_cfg (dump_file, dump_flags & ~TDF_DETAILS);
- 	  if (dump_flags & TDF_DETAILS)
- 	    query.dump (dump_file);
- 	}
-       return TODO_discard_function;
-     }
- 
- }; // class pass_assumptions
- 
  } // anon namespace
  
  gimple_opt_pass *
--- 1196,1201 ----
*************** make_pass_early_vrp (gcc::context *ctxt)
*** 1271,1279 ****
  {
    return new pass_vrp (ctxt, pass_data_early_vrp);
  }
- 
- gimple_opt_pass *
- make_pass_assumptions (gcc::context *ctx)
- {
-   return new pass_assumptions (ctx);
- }
--- 1209,1211 ----
diff -Nrcpad gcc-13-20250508/libgo/go/crypto/tls/handshake_client_test.go gcc-13-20250515/libgo/go/crypto/tls/handshake_client_test.go
*** gcc-13-20250508/libgo/go/crypto/tls/handshake_client_test.go	Thu May  8 22:33:06 2025
--- gcc-13-20250515/libgo/go/crypto/tls/handshake_client_test.go	Thu May 15 22:32:25 2025
*************** func testResumption(t *testing.T, versio
*** 881,886 ****
--- 881,887 ----
  		MaxVersion:   version,
  		CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
  		Certificates: testConfig.Certificates,
+ 		Time:         testTime,
  	}
  
  	issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
*************** func testResumption(t *testing.T, versio
*** 897,902 ****
--- 898,904 ----
  		ClientSessionCache: NewLRUClientSessionCache(32),
  		RootCAs:            rootCAs,
  		ServerName:         "example.golang",
+ 		Time:               testTime,
  	}
  
  	testResumeState := func(test string, didResume bool) {
*************** func testResumption(t *testing.T, versio
*** 944,963 ****
  	}
  
  	// An old session ticket can resume, but the server will provide a ticket encrypted with a fresh key.
! 	serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
  	testResumeState("ResumeWithOldTicket", true)
  	if bytes.Equal(ticket[:ticketKeyNameLen], getTicket()[:ticketKeyNameLen]) {
  		t.Fatal("old first ticket matches the fresh one")
  	}
  
  	// Now the session tickey key is expired, so a full handshake should occur.
! 	serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
  	testResumeState("ResumeWithExpiredTicket", false)
  	if bytes.Equal(ticket, getTicket()) {
  		t.Fatal("expired first ticket matches the fresh one")
  	}
  
! 	serverConfig.Time = func() time.Time { return time.Now() } // reset the time back
  	key1 := randomKey()
  	serverConfig.SetSessionTicketKeys([][32]byte{key1})
  
--- 946,965 ----
  	}
  
  	// An old session ticket can resume, but the server will provide a ticket encrypted with a fresh key.
! 	serverConfig.Time = func() time.Time { return testTime().Add(24*time.Hour + time.Minute) }
  	testResumeState("ResumeWithOldTicket", true)
  	if bytes.Equal(ticket[:ticketKeyNameLen], getTicket()[:ticketKeyNameLen]) {
  		t.Fatal("old first ticket matches the fresh one")
  	}
  
  	// Now the session tickey key is expired, so a full handshake should occur.
! 	serverConfig.Time = func() time.Time { return testTime().Add(24*8*time.Hour + time.Minute) }
  	testResumeState("ResumeWithExpiredTicket", false)
  	if bytes.Equal(ticket, getTicket()) {
  		t.Fatal("expired first ticket matches the fresh one")
  	}
  
! 	serverConfig.Time = func() time.Time { return testTime() } // reset the time back
  	key1 := randomKey()
  	serverConfig.SetSessionTicketKeys([][32]byte{key1})
  
*************** func testResumption(t *testing.T, versio
*** 974,984 ****
  	testResumeState("KeyChangeFinish", true)
  
  	// Age the session ticket a bit, but not yet expired.
! 	serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
  	testResumeState("OldSessionTicket", true)
  	ticket = getTicket()
  	// Expire the session ticket, which would force a full handshake.
! 	serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
  	testResumeState("ExpiredSessionTicket", false)
  	if bytes.Equal(ticket, getTicket()) {
  		t.Fatal("new ticket wasn't provided after old ticket expired")
--- 976,986 ----
  	testResumeState("KeyChangeFinish", true)
  
  	// Age the session ticket a bit, but not yet expired.
! 	serverConfig.Time = func() time.Time { return testTime().Add(24*time.Hour + time.Minute) }
  	testResumeState("OldSessionTicket", true)
  	ticket = getTicket()
  	// Expire the session ticket, which would force a full handshake.
! 	serverConfig.Time = func() time.Time { return testTime().Add(24*8*time.Hour + 2*time.Minute) }
  	testResumeState("ExpiredSessionTicket", false)
  	if bytes.Equal(ticket, getTicket()) {
  		t.Fatal("new ticket wasn't provided after old ticket expired")
*************** func testResumption(t *testing.T, versio
*** 988,994 ****
  	d := 0 * time.Hour
  	for i := 0; i < 13; i++ {
  		d += 12 * time.Hour
! 		serverConfig.Time = func() time.Time { return time.Now().Add(d) }
  		testResumeState("OldSessionTicket", true)
  	}
  	// Expire it (now a little more than 7 days) and make sure a full
--- 990,996 ----
  	d := 0 * time.Hour
  	for i := 0; i < 13; i++ {
  		d += 12 * time.Hour
! 		serverConfig.Time = func() time.Time { return testTime().Add(d) }
  		testResumeState("OldSessionTicket", true)
  	}
  	// Expire it (now a little more than 7 days) and make sure a full
*************** func testResumption(t *testing.T, versio
*** 996,1002 ****
  	// TLS 1.3 since the client should be using a fresh ticket sent over
  	// by the server.
  	d += 12 * time.Hour
! 	serverConfig.Time = func() time.Time { return time.Now().Add(d) }
  	if version == VersionTLS13 {
  		testResumeState("ExpiredSessionTicket", true)
  	} else {
--- 998,1004 ----
  	// TLS 1.3 since the client should be using a fresh ticket sent over
  	// by the server.
  	d += 12 * time.Hour
! 	serverConfig.Time = func() time.Time { return testTime().Add(d) }
  	if version == VersionTLS13 {
  		testResumeState("ExpiredSessionTicket", true)
  	} else {
*************** func testResumption(t *testing.T, versio
*** 1012,1017 ****
--- 1014,1020 ----
  		MaxVersion:   version,
  		CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
  		Certificates: testConfig.Certificates,
+ 		Time:         testTime,
  	}
  	serverConfig.SetSessionTicketKeys([][32]byte{key2})
  
*************** func testVerifyConnection(t *testing.T,
*** 1698,1703 ****
--- 1701,1707 ----
  		serverConfig := &Config{
  			MaxVersion:   version,
  			Certificates: []Certificate{testConfig.Certificates[0]},
+ 			Time:         testTime,
  			ClientCAs:    rootCAs,
  			NextProtos:   []string{"protocol1"},
  		}
*************** func testVerifyConnection(t *testing.T,
*** 1711,1716 ****
--- 1715,1721 ----
  			RootCAs:            rootCAs,
  			ServerName:         "example.golang",
  			Certificates:       []Certificate{testConfig.Certificates[0]},
+ 			Time:               testTime,
  			NextProtos:         []string{"protocol1"},
  		}
  		test.configureClient(clientConfig, &clientCalled)
*************** func testVerifyPeerCertificate(t *testin
*** 1753,1760 ****
  	rootCAs := x509.NewCertPool()
  	rootCAs.AddCert(issuer)
  
- 	now := func() time.Time { return time.Unix(1476984729, 0) }
- 
  	sentinelErr := errors.New("TestVerifyPeerCertificate")
  
  	verifyPeerCertificateCallback := func(called *bool, rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
--- 1758,1763 ----
*************** func testVerifyPeerCertificate(t *testin
*** 2000,2006 ****
  			config.ServerName = "example.golang"
  			config.ClientAuth = RequireAndVerifyClientCert
  			config.ClientCAs = rootCAs
! 			config.Time = now
  			config.MaxVersion = version
  			config.Certificates = make([]Certificate, 1)
  			config.Certificates[0].Certificate = [][]byte{testRSACertificate}
--- 2003,2009 ----
  			config.ServerName = "example.golang"
  			config.ClientAuth = RequireAndVerifyClientCert
  			config.ClientCAs = rootCAs
! 			config.Time = testTime
  			config.MaxVersion = version
  			config.Certificates = make([]Certificate, 1)
  			config.Certificates[0].Certificate = [][]byte{testRSACertificate}
*************** func testVerifyPeerCertificate(t *testin
*** 2017,2023 ****
  		config := testConfig.Clone()
  		config.ServerName = "example.golang"
  		config.RootCAs = rootCAs
! 		config.Time = now
  		config.MaxVersion = version
  		test.configureClient(config, &clientCalled)
  		clientErr := Client(c, config).Handshake()
--- 2020,2026 ----
  		config := testConfig.Clone()
  		config.ServerName = "example.golang"
  		config.RootCAs = rootCAs
! 		config.Time = testTime
  		config.MaxVersion = version
  		test.configureClient(config, &clientCalled)
  		clientErr := Client(c, config).Handshake()
*************** func testGetClientCertificate(t *testing
*** 2330,2336 ****
  		serverConfig.RootCAs = x509.NewCertPool()
  		serverConfig.RootCAs.AddCert(issuer)
  		serverConfig.ClientCAs = serverConfig.RootCAs
! 		serverConfig.Time = func() time.Time { return time.Unix(1476984729, 0) }
  		serverConfig.MaxVersion = version
  
  		clientConfig := testConfig.Clone()
--- 2333,2339 ----
  		serverConfig.RootCAs = x509.NewCertPool()
  		serverConfig.RootCAs.AddCert(issuer)
  		serverConfig.ClientCAs = serverConfig.RootCAs
! 		serverConfig.Time = testTime
  		serverConfig.MaxVersion = version
  
  		clientConfig := testConfig.Clone()
*************** func testResumptionKeepsOCSPAndSCT(t *te
*** 2501,2506 ****
--- 2504,2510 ----
  		ClientSessionCache: NewLRUClientSessionCache(32),
  		ServerName:         "example.golang",
  		RootCAs:            roots,
+ 		Time:               testTime,
  	}
  	serverConfig := testConfig.Clone()
  	serverConfig.MaxVersion = ver
diff -Nrcpad gcc-13-20250508/libgo/go/crypto/tls/handshake_server_test.go gcc-13-20250515/libgo/go/crypto/tls/handshake_server_test.go
*** gcc-13-20250508/libgo/go/crypto/tls/handshake_server_test.go	Thu May  8 22:33:06 2025
--- gcc-13-20250515/libgo/go/crypto/tls/handshake_server_test.go	Thu May 15 22:32:25 2025
*************** func testCrossVersionResume(t *testing.T
*** 483,488 ****
--- 483,489 ----
  	serverConfig := &Config{
  		CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
  		Certificates: testConfig.Certificates,
+ 		Time:         testTime,
  	}
  	clientConfig := &Config{
  		CipherSuites:       []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
*************** func testCrossVersionResume(t *testing.T
*** 490,495 ****
--- 491,497 ----
  		ClientSessionCache: NewLRUClientSessionCache(1),
  		ServerName:         "servername",
  		MinVersion:         VersionTLS10,
+ 		Time:               testTime,
  	}
  
  	// Establish a session at TLS 1.1.
diff -Nrcpad gcc-13-20250508/libgo/go/crypto/tls/handshake_test.go gcc-13-20250515/libgo/go/crypto/tls/handshake_test.go
*** gcc-13-20250508/libgo/go/crypto/tls/handshake_test.go	Thu May  8 22:33:06 2025
--- gcc-13-20250515/libgo/go/crypto/tls/handshake_test.go	Thu May 15 22:32:25 2025
*************** func fromHex(s string) []byte {
*** 429,434 ****
--- 429,439 ----
  	return b
  }
  
+ // testTime is 2016-10-20T17:32:09.000Z, which is within the validity period of
+ // [testRSACertificate], [testRSACertificateIssuer], [testRSA2048Certificate],
+ // [testRSA2048CertificateIssuer], and [testECDSACertificate].
+ var testTime = func() time.Time { return time.Unix(1476984729, 0) }
+ 
  var testRSACertificate = fromHex(" ")
  
  var testRSACertificateIssuer = fromHex(" ")
diff -Nrcpad gcc-13-20250508/libgo/go/crypto/tls/tls_test.go gcc-13-20250515/libgo/go/crypto/tls/tls_test.go
*** gcc-13-20250508/libgo/go/crypto/tls/tls_test.go	Thu May  8 22:33:06 2025
--- gcc-13-20250515/libgo/go/crypto/tls/tls_test.go	Thu May 15 22:32:25 2025
*************** func TestConnectionState(t *testing.T) {
*** 1058,1065 ****
  	rootCAs := x509.NewCertPool()
  	rootCAs.AddCert(issuer)
  
- 	now := func() time.Time { return time.Unix(1476984729, 0) }
- 
  	const alpnProtocol = "golang"
  	const serverName = "example.golang"
  	var scts = [][]byte{[]byte("dummy sct 1"), []byte("dummy sct 2")}
--- 1058,1063 ----
*************** func TestConnectionState(t *testing.T) {
*** 1075,1081 ****
  		}
  		t.Run(name, func(t *testing.T) {
  			config := &Config{
! 				Time:         now,
  				Rand:         zeroSource{},
  				Certificates: make([]Certificate, 1),
  				MaxVersion:   v,
--- 1073,1079 ----
  		}
  		t.Run(name, func(t *testing.T) {
  			config := &Config{
! 				Time:         testTime,
  				Rand:         zeroSource{},
  				Certificates: make([]Certificate, 1),
  				MaxVersion:   v,
diff -Nrcpad gcc-13-20250508/libstdc++-v3/ChangeLog gcc-13-20250515/libstdc++-v3/ChangeLog
*** gcc-13-20250508/libstdc++-v3/ChangeLog	Thu May  8 22:33:11 2025
--- gcc-13-20250515/libstdc++-v3/ChangeLog	Thu May 15 22:32:28 2025
***************
*** 1,3 ****
--- 1,20 ----
+ 2025-05-12  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* doc/xml/manual/status_cxx2023.xml: Update status of proposals
+ 	implemented for GCC 13.
+ 	* doc/html/manual/status.html: Regenerate.
+ 
+ 2025-05-08  Richard Biener  <rguenther@suse.de>
+ 
+ 	Backported from master:
+ 	2023-11-07  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR libstdc++/112351
+ 	* src/c++98/locale.cc (locale::facet::_S_initialize_once):
+ 	Check whether _S_c_locale is already initialized.
+ 	(locale::facet::_S_get_c_locale): Always perform non-threadsafe
+ 	init when threadsafe init failed.
+ 
  2025-04-23  Jakub Jelinek  <jakub@redhat.com>
  
  	Backported from master:
diff -Nrcpad gcc-13-20250508/libstdc++-v3/doc/html/manual/status.html gcc-13-20250515/libstdc++-v3/doc/html/manual/status.html
*** gcc-13-20250508/libstdc++-v3/doc/html/manual/status.html	Thu May  8 22:33:12 2025
--- gcc-13-20250515/libstdc++-v3/doc/html/manual/status.html	Thu May 15 22:32:29 2025
*************** or any notes about the implementation.
*** 1895,1905 ****
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0533r9.pdf" target="_top">
          P0533R9
          </a>
!       </td><td align="center"> </td><td align="left"> <code class="code">__cpp_lib_constexpr_cmath &gt;= 202202L</code> </td></tr><tr bgcolor="#C8B0B0"><td align="left"> Deprecate std::aligned_storage and std::aligned_union </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf" target="_top">
          P1413R3
          </a>
!       </td><td align="center"> </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left"> A type trait to detect reference binding to temporary </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2255r2.html" target="_top">
          P2255R2
          </a>
--- 1895,1905 ----
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0533r9.pdf" target="_top">
          P0533R9
          </a>
!       </td><td align="center"> </td><td align="left"> <code class="code">__cpp_lib_constexpr_cmath &gt;= 202202L</code> </td></tr><tr><td align="left"> Deprecate std::aligned_storage and std::aligned_union </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf" target="_top">
          P1413R3
          </a>
!       </td><td align="center"> 13.1 </td><td align="left"> </td></tr><tr bgcolor="#B0B0B0"><td align="left"> A type trait to detect reference binding to temporary </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2255r2.html" target="_top">
          P2255R2
          </a>
*************** or any notes about the implementation.
*** 1990,1996 ****
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2508r1.html" target="_top">
          P2508R1
          </a>
!       </td><td align="center"> 13.1 (feature test macro not defined)</td><td align="left"> <code class="code">__cpp_lib_format &gt;= 202207L</code> </td></tr><tr bgcolor="#C8B0B0"><td align="left">
  	Clarify handling of encodings in localized formatting of chrono types
        </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2419r2.html" target="_top">
--- 1990,1996 ----
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2508r1.html" target="_top">
          P2508R1
          </a>
!       </td><td align="center"> 13.1 (feature test macro not updated)</td><td align="left"> <code class="code">__cpp_lib_format &gt;= 202207L</code> </td></tr><tr bgcolor="#C8B0B0"><td align="left">
  	Clarify handling of encodings in localized formatting of chrono types
        </td><td align="left">
          <a class="link" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2419r2.html" target="_top">
diff -Nrcpad gcc-13-20250508/libstdc++-v3/doc/xml/manual/status_cxx2023.xml gcc-13-20250515/libstdc++-v3/doc/xml/manual/status_cxx2023.xml
*** gcc-13-20250508/libstdc++-v3/doc/xml/manual/status_cxx2023.xml	Thu May  8 22:33:12 2025
--- gcc-13-20250515/libstdc++-v3/doc/xml/manual/status_cxx2023.xml	Thu May 15 22:32:29 2025
*************** or any notes about the implementation.
*** 472,485 ****
      </row>
  
      <row>
-       <?dbhtml bgcolor="#C8B0B0" ?>
        <entry> Deprecate std::aligned_storage and std::aligned_union </entry>
        <entry>
          <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf">
          P1413R3
          </link>
        </entry>
!       <entry align="center"> </entry>
        <entry />
      </row>
  
--- 472,484 ----
      </row>
  
      <row>
        <entry> Deprecate std::aligned_storage and std::aligned_union </entry>
        <entry>
          <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf">
          P1413R3
          </link>
        </entry>
!       <entry align="center"> 13.1 </entry>
        <entry />
      </row>
  
*************** or any notes about the implementation.
*** 717,723 ****
          P2508R1
          </link>
        </entry>
!       <entry align="center"> 13.1 (feature test macro not defined)</entry>
        <entry> <code>__cpp_lib_format &gt;= 202207L</code> </entry>
      </row>
  
--- 716,722 ----
          P2508R1
          </link>
        </entry>
!       <entry align="center"> 13.1 (feature test macro not updated)</entry>
        <entry> <code>__cpp_lib_format &gt;= 202207L</code> </entry>
      </row>
  
